diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2004-01-31 12:34:17 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2004-01-31 12:34:17 (GMT) |
commit | 12af0485f858c8eca9a8c9ed9894a8a60f975b4c (patch) | |
tree | 3126f0ddfe46bfc9d855254230ebaea2723451d2 /Modules/socketmodule.c | |
parent | 4d205e366cc48535f70c1fe939ce726658e46d98 (diff) | |
download | cpython-12af0485f858c8eca9a8c9ed9894a8a60f975b4c.zip cpython-12af0485f858c8eca9a8c9ed9894a8a60f975b4c.tar.gz cpython-12af0485f858c8eca9a8c9ed9894a8a60f975b4c.tar.bz2 |
Patch #874083: Bluetooth support for socket module.
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r-- | Modules/socketmodule.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c7777fd..28e9877 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1012,6 +1012,68 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } #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 case AF_PACKET: { @@ -1085,6 +1147,35 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) } #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 case AF_PACKET: { @@ -3573,6 +3664,16 @@ init_socket(void) /* Amateur Radio X.25 PLP */ PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE); #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 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET); PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET); |