[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