[Python-checkins] CVS: python/dist/src/Modules socketmodule.c,1.141.2.5,1.141.2.6

Anthony Baxter anthonybaxter@users.sourceforge.net
Thu, 01 Nov 2001 06:14:28 -0800


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv1667

Modified Files:
      Tag: release21-maint
	socketmodule.c 
Log Message:
partial backport of guido's 1.188.
  Add sendall() method, which loops until all data is written or an
  error occurs, and doesn't return a count.  (This is my second patch
  from SF patch #474307, with small change to the docstring for send().)

the 'partial' is because 1.188 also added a couple of Py_*_ALLOW_THREADS
wrappers around SSL_read and SSL_write, and I want to check those separately.

This is adding a new method to the socket object, which would normally
be a bad thing to do in a bugfix release - however, in this case, it 
allows fixes for a nasty problem that would otherwise have a filthy 
filthy fix to Get It Right. Still to-do is to patch the std library 
modules to use sendall() where appropriate, rather than send().



Index: socketmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v
retrieving revision 1.141.2.5
retrieving revision 1.141.2.6
diff -C2 -d -r1.141.2.5 -r1.141.2.6
*** socketmodule.c	2001/11/01 14:05:52	1.141.2.5
--- socketmodule.c	2001/11/01 14:14:26	1.141.2.6
***************
*** 60,63 ****
--- 60,64 ----
  - s.recvfrom(buflen [,flags]) --> string, sockaddr
  - s.send(string [,flags]) --> nbytes
+ - s.sendall(string [,flags]) # tries to send everything in a loop
  - s.sendto(string, [flags,] sockaddr) --> nbytes
  - s.setblocking(0 | 1) --> None
***************
*** 1422,1430 ****
  
  static char send_doc[] =
! "send(data[, flags])\n\
  \n\
  Send a data string to the socket.  For the optional flags\n\
! argument, see the Unix manual.";
  
  
  /* s.sendto(data, [flags,] sockaddr) method */
--- 1423,1466 ----
  
  static char send_doc[] =
! "send(data[, flags]) -> count\n\
  \n\
  Send a data string to the socket.  For the optional flags\n\
! argument, see the Unix manual.  Return the number of bytes\n\
! sent; this may be less than len(data) if the network is busy.";
! 
! 
! /* s.sendall(data [,flags]) method */
! 
! static PyObject *
! PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
! {
! 	char *buf;
! 	int len, n, flags = 0, total = 0;
! 	if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
! 		return NULL;
! 	Py_BEGIN_ALLOW_THREADS
! 	do {
! 		n = send(s->sock_fd, buf, len, flags);
! 		if (n < 0)
! 			break;
! 		total += n;
! 		buf += n;
! 		len -= n;
! 	} while (len > 0);
! 	Py_END_ALLOW_THREADS
! 	if (n < 0)
! 		return PySocket_Err();
! 	Py_INCREF(Py_None);
! 	return Py_None;
! }
  
+ static char sendall_doc[] =
+ "sendall(data[, flags])\n\
+ \n\
+ Send a data string to the socket.  For the optional flags\n\
+ argument, see the Unix manual.  This calls send() repeatedly\n\
+ until all data is sent.  If an error occurs, it's impossible\n\
+ to tell how much data has been sent.";
+ 
  
  /* s.sendto(data, [flags,] sockaddr) method */
***************
*** 1525,1528 ****
--- 1561,1566 ----
  	{"send",	(PyCFunction)PySocketSock_send, METH_VARARGS,
  			send_doc},
+ 	{"sendall",	(PyCFunction)PySocketSock_sendall, METH_VARARGS,
+ 			sendall_doc},
  	{"sendto",	(PyCFunction)PySocketSock_sendto, METH_VARARGS,
  			sendto_doc},