Patch #874083: Bluetooth support for socket module.

This commit is contained in:
Martin v. Löwis 2004-01-31 12:34:17 +00:00
parent 4d205e366c
commit 12af0485f8
7 changed files with 126 additions and 63 deletions

View File

@ -177,6 +177,7 @@ Sebastian Fernandez
Vincent Fiack Vincent Fiack
Russell Finn Russell Finn
Nils Fischbeck Nils Fischbeck
Frederik Fix
Hernán Martínez Foffani Hernán Martínez Foffani
Doug Fort Doug Fort
Martin Franklin Martin Franklin

View File

@ -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.

View File

@ -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)
} }
#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)
/* 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);

View File

@ -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 {
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

60
configure vendored
View File

@ -1,5 +1,5 @@
#! /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*
# 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
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 \
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
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
;; ;;
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
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

View File

@ -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

View File

@ -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 @@
/* 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