[Python-checkins] python/dist/src/Modules socketmodule.c, 1.290, 1.291

loewis at users.sourceforge.net loewis at users.sourceforge.net
Thu Jun 3 05:24:44 EDT 2004


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17722
Modified Files:
	socketmodule.c 
Log Message:
Patch #929192: Improvements to bluetooth support.
Added setbdaddr and makebdaddr.
Extended makesockaddr to understand Bluetooth addresses.
Changed getsockaddr to expect the Bluetooth addresses as a string, 
not a six element tuple.
Reformatted some of the Bluetooth code to be more consistent with PEP 7.
Index: socketmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v
retrieving revision 1.290
retrieving revision 1.291
diff -C2 -d -r1.290 -r1.291
*** socketmodule.c	2 Jun 2004 12:35:29 -0000	1.290
--- socketmodule.c	3 Jun 2004 09:24:42 -0000	1.291
***************
*** 859,862 ****
--- 859,907 ----
 
 
+ #ifdef USE_BLUETOOTH
+ /* Convert a string representation of a Bluetooth address into a numeric
+ address. Returns the length (6), or raises an exception and returns -1 if
+ an error occurred. */
+ 
+ static int
+ setbdaddr(char *name, bdaddr_t *bdaddr)
+ {
+ 	unsigned int b0, b1, b2, b3, b4, b5;
+ 	char ch;
+ 	int n;
+ 
+ 	n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
+ 		 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
+ 	if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
+ 		bdaddr->b[0] = b0;
+ 		bdaddr->b[1] = b1;
+ 		bdaddr->b[2] = b2;
+ 		bdaddr->b[3] = b3;
+ 		bdaddr->b[4] = b4;
+ 		bdaddr->b[5] = b5;
+ 		return 6;
+ 	} else {
+ 		PyErr_SetString(socket_error, "bad bluetooth address");
+ 		return -1;
+ 	}
+ }
+ 
+ /* Create a string representation of the Bluetooth address. This is always a
+ string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
+ value (zero padded if necessary). */
+ 
+ static PyObject *
+ makebdaddr(bdaddr_t *bdaddr)
+ {
+ 	char buf[(6 * 2) + 5 + 1];
+ 
+ 	sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
+ 		bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
+ 		bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
+ 	return PyString_FromString(buf);
+ }
+ #endif
+ 
+ 
 /* Create an object representing the given socket address,
 suitable for passing it back to bind(), connect() etc.
***************
*** 866,870 ****
 /*ARGSUSED*/
 static PyObject *
! makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
 {
 	if (addrlen == 0) {
--- 911,915 ----
 /*ARGSUSED*/
 static PyObject *
! makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
 {
 	if (addrlen == 0) {
***************
*** 921,924 ****
--- 966,1012 ----
 #endif
 
+ #ifdef USE_BLUETOOTH
+ 	case AF_BLUETOOTH:
+ 		switch (proto) {
+ 
+ 		case BTPROTO_L2CAP:
+ 		{
+ 			struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
+ 			PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
+ 			PyObject *ret = NULL;
+ 			if (addrobj) {
+ 				ret = Py_BuildValue("Oi",
+ 						 addrobj,
+ 						 _BT_L2_MEMB(a, psm));
+ 				Py_DECREF(addrobj);
+ 			}
+ 			return ret;
+ 		}
+ 
+ 		case BTPROTO_RFCOMM:
+ 		{
+ 			struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
+ 			PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
+ 			PyObject *ret = NULL;
+ 			if (addrobj) {
+ 				ret = Py_BuildValue("Oi",
+ 						 addrobj,
+ 						 _BT_RC_MEMB(a, channel));
+ 				Py_DECREF(addrobj);
+ 			}
+ 			return ret;
+ 		}
+ 
+ #if !defined(__FreeBSD__)
+ 		case BTPROTO_SCO:
+ 		{
+ 			struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
+ 			return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
+ 		}
+ #endif
+ 
+ 		}
+ #endif
+ 
 #ifdef HAVE_NETPACKET_PACKET_H
 	case AF_PACKET:
***************
*** 1055,1115 ****
 	case AF_BLUETOOTH:
 	{
! 		switch( s->sock_proto )
 		{
! 			case BTPROTO_L2CAP:
! 			{
! 				struct sockaddr_l2* addr = (struct sockaddr_l2*)_BT_SOCKADDR_MEMB(s, l2);
! 				bdaddr_t* bdaddr = &_BT_L2_MEMB(addr, bdaddr);
! 
! 				_BT_L2_MEMB(addr, 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], &_BT_L2_MEMB(addr, 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*)_BT_SOCKADDR_MEMB(s, rc);
! 				bdaddr_t* bdaddr = &_BT_RC_MEMB(addr, bdaddr);
 
! 				_BT_RC_MEMB(addr, 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], &_BT_RC_MEMB(addr, channel)) )
! 				{
! 					PyErr_SetString(socket_error, "getsockaddrarg: wrong format");
! 					return 0;
! 				}
 
! 				*addr_ret = (struct sockaddr *) addr;
! 				*len_ret = sizeof *addr;
! 				return 1;
 			}
! #if !defined(__FreeBSD__)
! 			case BTPROTO_SCO:
! 			{
! 				struct sockaddr_sco* addr = (struct sockaddr_sco*)_BT_SOCKADDR_MEMB(s, sco);
! 				bdaddr_t* bdaddr = &_BT_SCO_MEMB(addr, bdaddr);
 
! 				_BT_SCO_MEMB(addr, 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;
! 			}
! #endif
! 			default:
! 			{
! 				PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
 				return 0;
 			}
 		}
 	}
--- 1143,1209 ----
 	case AF_BLUETOOTH:
 	{
! 		switch (s->sock_proto) {
! 		case BTPROTO_L2CAP:
 		{
! 			struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
! 			char *straddr;
 
! 			_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
! 			if (!PyArg_ParseTuple(args, "si", &straddr,
! 					 &_BT_L2_MEMB(addr, psm))) {
! 				PyErr_SetString(socket_error, "getsockaddrarg: "
! 						"wrong format");
! 				return 0;
 			}
! 			if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
! 				return 0;
 
! 			*addr_ret = (struct sockaddr *) addr;
! 			*len_ret = sizeof *addr;
! 			return 1;
! 		}
! 		case BTPROTO_RFCOMM:
! 		{
! 			struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
! 			char *straddr;
 
! 			_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
! 			if (!PyArg_ParseTuple(args, "si", &straddr,
! 					 &_BT_RC_MEMB(addr, channel))) {
! 				PyErr_SetString(socket_error, "getsockaddrarg: "
! 						"wrong format");
! 				return 0;
 			}
! 			if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
! 				return 0;
 
! 			*addr_ret = (struct sockaddr *) addr;
! 			*len_ret = sizeof *addr;
! 			return 1;
! 		}
! #if !defined(__FreeBSD__)
! 		case BTPROTO_SCO:
! 		{
! 			struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
! 			char *straddr;
 
! 			_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
! 			straddr = PyString_AsString(args);
! 			if (straddr == NULL) {
! 				PyErr_SetString(socket_error, "getsockaddrarg: "
! 						"wrong format");
 				return 0;
 			}
+ 			if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
+ 				return 0;
+ 
+ 			*addr_ret = (struct sockaddr *) addr;
+ 			*len_ret = sizeof *addr;
+ 			return 1;
+ 		}
+ #endif
+ 		default:
+ 			PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
+ 			return 0;
 		}
 	}
***************
*** 1194,1219 ****
 		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;
! 			}
 #if !defined(__FreeBSD__)
! 			case BTPROTO_SCO:
! 			{
! 				*len_ret = sizeof (struct sockaddr_sco);
! 				return 1;
! 			}
 #endif
! 			default:
! 			{
! 				PyErr_SetString(socket_error, "getsockaddrlen: unknown BT protocol");
! 				return 0;
! 			}
 		}
 	}
--- 1288,1308 ----
 		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;
 #if !defined(__FreeBSD__)
! 		case BTPROTO_SCO:
! 			*len_ret = sizeof (struct sockaddr_sco);
! 			return 1;
 #endif
! 		default:
! 			PyErr_SetString(socket_error, "getsockaddrlen: "
! 					"unknown BT protocol");
! 			return 0;
! 
 		}
 	}
***************
*** 1292,1296 ****
 	}
 	addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
! 			 addrlen);
 	if (addr == NULL)
 		goto finally;
--- 1381,1385 ----
 	}
 	addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
! 			 addrlen, s->sock_proto);
 	if (addr == NULL)
 		goto finally;
***************
*** 1755,1759 ****
 	if (res < 0)
 		return s->errorhandler();
! 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
 }
 
--- 1844,1849 ----
 	if (res < 0)
 		return s->errorhandler();
! 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
! 			 s->sock_proto);
 }
 
***************
*** 1783,1787 ****
 	if (res < 0)
 		return s->errorhandler();
! 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
 }
 
--- 1873,1878 ----
 	if (res < 0)
 		return s->errorhandler();
! 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
! 			 s->sock_proto);
 }
 
***************
*** 2038,2042 ****
 
 	if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
! 				 addrlen)))
 		goto finally;
 
--- 2129,2133 ----
 
 	if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
! 				 addrlen, s->sock_proto)))
 		goto finally;
 
***************
*** 3260,3264 ****
 	for (res = res0; res; res = res->ai_next) {
 		PyObject *addr =
! 			makesockaddr(-1, res->ai_addr, res->ai_addrlen);
 		if (addr == NULL)
 			goto err;
--- 3351,3355 ----
 	for (res = res0; res; res = res->ai_next) {
 		PyObject *addr =
! 			makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
 		if (addr == NULL)
 			goto err;
***************
*** 3718,3723 ****
 #endif
 	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
 
--- 3809,3814 ----
 #endif
 	PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
! 	PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
! 	PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
 #endif
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /