Commit 12af0485 authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #874083: Bluetooth support for socket module.

parent 4d205e36
...@@ -177,6 +177,7 @@ Sebastian Fernandez ...@@ -177,6 +177,7 @@ Sebastian Fernandez
Vincent Fiack Vincent Fiack
Russell Finn Russell Finn
Nils Fischbeck Nils Fischbeck
Frederik Fix
Hernn Martnez Foffani Hernn Martnez Foffani
Doug Fort Doug Fort
Martin Franklin Martin Franklin
......
...@@ -121,6 +121,9 @@ Core and builtins ...@@ -121,6 +121,9 @@ Core and builtins
Extension modules Extension modules
----------------- -----------------
- The socket module now supports Bluetooth sockets, if the
system has <bluetooth/bluetooth.h>
- Added a collections module containing a new datatype, deque(), - Added a collections module containing a new datatype, deque(),
offering high-performance, thread-safe, memory friendly appends offering high-performance, thread-safe, memory friendly appends
and pops on either side of the deque. and pops on either side of the deque.
......
...@@ -1012,6 +1012,68 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1012,6 +1012,68 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
} }
#endif #endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
case AF_BLUETOOTH:
{
switch( s->sock_proto )
{
case BTPROTO_L2CAP:
{
struct sockaddr_l2* addr = (struct sockaddr_l2*) &(s->sock_addr).bt_l2;
bdaddr_t* bdaddr = &(addr->l2_bdaddr);
addr->l2_family = AF_BLUETOOTH;
if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &addr->l2_psm) )
{
PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
return 0;
}
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr;
return 1;
}
case BTPROTO_RFCOMM:
{
struct sockaddr_rc* addr = (struct sockaddr_rc*) &(s->sock_addr).bt_rc;
bdaddr_t* bdaddr = &(addr->rc_bdaddr);
addr->rc_family = AF_BLUETOOTH;
if( !PyArg_ParseTuple(args, "(iiiiii)i", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5], &addr->rc_channel) )
{
PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
return 0;
}
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr;
return 1;
}
case BTPROTO_SCO:
{
struct sockaddr_sco* addr = (struct sockaddr_sco*) &(s->sock_addr).bt_sco;
bdaddr_t* bdaddr = &(addr->sco_bdaddr);
addr->sco_family = AF_BLUETOOTH;
if( !PyArg_ParseTuple(args, "iiiiii", &bdaddr->b[0], &bdaddr->b[1], &bdaddr->b[2], &bdaddr->b[3], &bdaddr->b[4], &bdaddr->b[5]) )
{
PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
return 0;
}
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr;
return 1;
}
default:
{
PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
return 0;
}
}
}
#endif
#ifdef HAVE_NETPACKET_PACKET_H #ifdef HAVE_NETPACKET_PACKET_H
case AF_PACKET: case AF_PACKET:
{ {
...@@ -1085,6 +1147,35 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) ...@@ -1085,6 +1147,35 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
} }
#endif #endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
case AF_BLUETOOTH:
{
switch(s->sock_proto)
{
case BTPROTO_L2CAP:
{
*len_ret = sizeof (struct sockaddr_l2);
return 1;
}
case BTPROTO_RFCOMM:
{
*len_ret = sizeof (struct sockaddr_rc);
return 1;
}
case BTPROTO_SCO:
{
*len_ret = sizeof (struct sockaddr_sco);
return 1;
}
default:
{
PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
return 0;
}
}
}
#endif
#ifdef HAVE_NETPACKET_PACKET_H #ifdef HAVE_NETPACKET_PACKET_H
case AF_PACKET: case AF_PACKET:
{ {
...@@ -3573,6 +3664,16 @@ init_socket(void) ...@@ -3573,6 +3664,16 @@ init_socket(void)
/* Amateur Radio X.25 PLP */ /* Amateur Radio X.25 PLP */
PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE); PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
#endif #endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue( "iiiiii", 0,0,0,0,0,0 ) );
PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue( "iiiiii", 0,0,0,0xff,0xff,0xff ) );
#endif
#ifdef HAVE_NETPACKET_PACKET_H #ifdef HAVE_NETPACKET_PACKET_H
PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET); PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET); PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
......
...@@ -32,6 +32,13 @@ ...@@ -32,6 +32,13 @@
# undef AF_UNIX # undef AF_UNIX
#endif #endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <bluetooth/l2cap.h>
#include <bluetooth/sco.h>
#endif
#ifdef HAVE_NETPACKET_PACKET_H #ifdef HAVE_NETPACKET_PACKET_H
# include <sys/ioctl.h> # include <sys/ioctl.h>
# include <net/if.h> # include <net/if.h>
...@@ -80,6 +87,11 @@ typedef struct { ...@@ -80,6 +87,11 @@ typedef struct {
struct sockaddr_in6 in6; struct sockaddr_in6 in6;
struct sockaddr_storage storage; struct sockaddr_storage storage;
#endif #endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
struct sockaddr_l2 bt_l2;
struct sockaddr_rc bt_rc;
struct sockaddr_sco bt_sco;
#endif
#ifdef HAVE_NETPACKET_PACKET_H #ifdef HAVE_NETPACKET_PACKET_H
struct sockaddr_ll ll; struct sockaddr_ll ll;
#endif #endif
......
#! /bin/sh #! /bin/sh
# From configure.in Revision: 1.445 . # From configure.in Revision: 1.447 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.57 for python 2.4. # Generated by GNU Autoconf 2.57 for python 2.4.
# #
...@@ -3008,7 +3008,7 @@ rm -f conftest* ...@@ -3008,7 +3008,7 @@ rm -f conftest*
# Check for unsupported systems # Check for unsupported systems
case $ac_sys_system/$ac_sys_release in case $ac_sys_system/$ac_sys_release in
SunOS/4*|Linux*/1*) Linux*/1*)
echo This system \($ac_sys_system/$ac_sys_release\) is no longer supported. echo This system \($ac_sys_system/$ac_sys_release\) is no longer supported.
echo See README for details. echo See README for details.
exit 1;; exit 1;;
...@@ -4347,6 +4347,7 @@ done ...@@ -4347,6 +4347,7 @@ done
for ac_header in dlfcn.h fcntl.h grp.h limits.h langinfo.h \ for ac_header in dlfcn.h fcntl.h grp.h limits.h langinfo.h \
...@@ -4356,7 +4357,7 @@ unistd.h utime.h \ ...@@ -4356,7 +4357,7 @@ unistd.h utime.h \
sys/audioio.h sys/bsdtty.h sys/file.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/audioio.h sys/bsdtty.h sys/file.h sys/lock.h sys/mkdev.h sys/modem.h \
sys/param.h sys/poll.h sys/select.h sys/socket.h sys/time.h sys/times.h \ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/time.h sys/times.h \
sys/un.h sys/utsname.h sys/wait.h pty.h term.h libutil.h \ sys/un.h sys/utsname.h sys/wait.h pty.h term.h libutil.h \
sys/resource.h netpacket/packet.h sysexits.h sys/resource.h netpacket/packet.h sysexits.h bluetooth/bluetooth.h
do do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then if eval "test \"\${$as_ac_Header+set}\" = set"; then
...@@ -9362,7 +9363,7 @@ fi ...@@ -9362,7 +9363,7 @@ fi
echo "$as_me:$LINENO: result: $SO" >&5 echo "$as_me:$LINENO: result: $SO" >&5
echo "${ECHO_T}$SO" >&6 echo "${ECHO_T}$SO" >&6
# LDSHARED is the ld *command* used to create shared library # LDSHARED is the ld *command* used to create shared library
# -- "ld" on SunOS 4.x.x, "cc -G" on SunOS 5.x, "ld -shared" on IRIX 5 # -- "cc -G" on SunOS 5.x, "ld -shared" on IRIX 5
# (Shared libraries in this instance are shared modules to be loaded into # (Shared libraries in this instance are shared modules to be loaded into
# Python, as opposed to building Python itself as a shared library.) # Python, as opposed to building Python itself as a shared library.)
echo "$as_me:$LINENO: checking LDSHARED" >&5 echo "$as_me:$LINENO: checking LDSHARED" >&5
...@@ -9380,7 +9381,6 @@ then ...@@ -9380,7 +9381,6 @@ then
;; ;;
IRIX/5*) LDSHARED="ld -shared";; IRIX/5*) LDSHARED="ld -shared";;
IRIX*/6*) LDSHARED="ld ${SGI_ABI} -shared -all";; IRIX*/6*) LDSHARED="ld ${SGI_ABI} -shared -all";;
SunOS/4*) LDSHARED="ld";;
SunOS/5*) SunOS/5*)
if test "$GCC" = "yes" if test "$GCC" = "yes"
then LDSHARED='$(CC) -shared' then LDSHARED='$(CC) -shared'
...@@ -15518,56 +15518,6 @@ rm -f conftest.$ac_objext conftest.$ac_ext ...@@ -15518,56 +15518,6 @@ rm -f conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $works" >&5 echo "$as_me:$LINENO: result: $works" >&5
echo "${ECHO_T}$works" >&6 echo "${ECHO_T}$works" >&6
if test "$have_prototypes" = yes; then
bad_prototypes=no
echo "$as_me:$LINENO: checking for bad exec* prototypes" >&5
echo $ECHO_N "checking for bad exec* prototypes... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <unistd.h>
int
main ()
{
char **t;execve("@",t,t);
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
cat >>confdefs.h <<\_ACEOF
#define BAD_EXEC_PROTOTYPES 1
_ACEOF
bad_prototypes=yes
fi
rm -f conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $bad_prototypes" >&5
echo "${ECHO_T}$bad_prototypes" >&6
fi
# check if sockaddr has sa_len member # check if sockaddr has sa_len member
echo "$as_me:$LINENO: checking if sockaddr has sa_len member" >&5 echo "$as_me:$LINENO: checking if sockaddr has sa_len member" >&5
echo $ECHO_N "checking if sockaddr has sa_len member... $ECHO_C" >&6 echo $ECHO_N "checking if sockaddr has sa_len member... $ECHO_C" >&6
......
...@@ -918,7 +918,7 @@ unistd.h utime.h \ ...@@ -918,7 +918,7 @@ unistd.h utime.h \
sys/audioio.h sys/bsdtty.h sys/file.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/audioio.h sys/bsdtty.h sys/file.h sys/lock.h sys/mkdev.h sys/modem.h \
sys/param.h sys/poll.h sys/select.h sys/socket.h sys/time.h sys/times.h \ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/time.h sys/times.h \
sys/un.h sys/utsname.h sys/wait.h pty.h term.h libutil.h \ sys/un.h sys/utsname.h sys/wait.h pty.h term.h libutil.h \
sys/resource.h netpacket/packet.h sysexits.h) sys/resource.h netpacket/packet.h sysexits.h bluetooth/bluetooth.h)
AC_HEADER_DIRENT AC_HEADER_DIRENT
AC_HEADER_MAJOR AC_HEADER_MAJOR
......
...@@ -37,6 +37,9 @@ ...@@ -37,6 +37,9 @@
/* Define this if your time.h defines altzone. */ /* Define this if your time.h defines altzone. */
#undef HAVE_ALTZONE #undef HAVE_ALTZONE
/* Define to 1 if you have the <bluetooth/bluetooth.h> header file. */
#undef HAVE_BLUETOOTH_BLUETOOTH_H
/* Define if nice() returns success/failure instead of the new priority. */ /* Define if nice() returns success/failure instead of the new priority. */
#undef HAVE_BROKEN_NICE #undef HAVE_BROKEN_NICE
...@@ -818,16 +821,9 @@ ...@@ -818,16 +821,9 @@
/* Define _OSF_SOURCE to get the makedev macro. */ /* Define _OSF_SOURCE to get the makedev macro. */
#undef _OSF_SOURCE #undef _OSF_SOURCE
/* Define to 2 if the system does not provide POSIX.1 features except with
this defined. */
#undef _POSIX_1_SOURCE
/* Define to activate features from IEEE Stds 1003.1-2001 */ /* Define to activate features from IEEE Stds 1003.1-2001 */
#undef _POSIX_C_SOURCE #undef _POSIX_C_SOURCE
/* Define to 1 if you need to in order for `stat' and other things to work. */
#undef _POSIX_SOURCE
/* Define if you have POSIX threads, and your system does not define that. */ /* Define if you have POSIX threads, and your system does not define that. */
#undef _POSIX_THREADS #undef _POSIX_THREADS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment