unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* make-network-process(:nowait t) on MS-Windows
@ 2005-11-24 15:26 Kyotaro HORIGUCHI
  2005-11-30  8:43 ` Kyotaro HORIGUCHI
  0 siblings, 1 reply; 4+ messages in thread
From: Kyotaro HORIGUCHI @ 2005-11-24 15:26 UTC (permalink / raw)


make-network-process<f> with parameter `:nowait t' returns nil
instead of process when evaluating the sample lisp code below on
MS-Windows. It seems to have worked once, but does not now.

http://lists.gnu.org/archive/html/emacs-devel/2002-05/msg00147.html

The following patch make this work again.

-- 
Kyotaro HORIGUCHI



==== sample lisp code
(defun my-filter (pro string)
  (goto-char (point-max))
  (insert "FIL: " string))

(defun my-sentinel (pro string)
  (goto-char (point-max))
  (insert "SEN: " string))

(make-network-process
 :name "foo"
 :buffer (current-buffer)
 :host "localhost"
 :service "smtp"
 :nowait t
 :filter 'my-filter
 :sentinel 'my-sentinel)


==== patch to make make-network-process work.
Index: w32.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/w32.c,v
retrieving revision 1.97
diff -r1.97 w32.c
154a155,160
> typedef struct {
>   unsigned int fd_count;
>   SOCKET fd_array[FD_SETSIZE];
> } pfn_fd_set;
> 
> 
2697a2704
> int (PASCAL *pfn_select) (int nfds, pfn_fd_set *readfds, pfn_fd_set *writefds, pfn_fd_set *excepfds, const struct timeval *timeout);
2779a2787
>       LOAD_PROC( select );
2853a2862
>     case WSAEWOULDBLOCK:	h_errno = EINPROGRESS; break;
3137a3147,3211
> }
> 
> int
> sys_select_socket (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
> {
>   int i, j, k, rc, cfds;
>   pfn_fd_set *fds[3];
>   fd_set *efds[3];
> 
>   if (winsock_lib == NULL)
>     {
>       h_errno = ENOTSOCK;
>       return SOCKET_ERROR;
>     }
> 
>   check_errno ();
> 
>   cfds = 0;
>   efds[0] = readfds;
>   efds[1] = writefds;
>   efds[2] = exceptfds;
> 
>   for (i = 0 ; i < 3 ; i++)
>     {
>       fds[i] = NULL;
>       if (efds[i])
> 	{
> 	  fds[i] = (pfn_fd_set*)alloca (sizeof (pfn_fd_set));
> 	  fds[i]->fd_count = 0;
> 	  for (j = 0 ; j < nfds ; j++)
> 	    if (FD_ISSET (j, efds[i]))
> 	      {
> 		if (! (fd_info[j].flags & FILE_SOCKET))
> 		  {
> 		    h_errno = ENOTSOCK;
> 		    return SOCKET_ERROR;
> 		  }
> 	      
> 		fds[i]->fd_array[fds[i]->fd_count++] = SOCK_HANDLE (j);
> 		cfds++;
> 	      }
> 	  FD_ZERO (efds[i]);
> 	}
>     }
> 
>   if (cfds == 0)
>     return 0;
> 
>   rc = pfn_select (nfds, fds[0], fds[1], fds[2], timeout);
> 
>   if (rc > 0)
>     for (i = 0 ; i < 3 ; i++)
>       if (fds[i])
> 	for (j = 0 ; j < fds[i]->fd_count ; j++)
> 	  {
> 	    for (k = 0 ;
> 		 k < nfds && fds[i]->fd_array [j] != SOCK_HANDLE (k) ;
> 		 k++);
> 	    if (k < nfds)
> 	      FD_SET (k, efds[i]);
> 	  }
> 
>   if (rc == SOCKET_ERROR)
>     set_errno ();
>   return rc;
Index: w32proc.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/w32proc.c,v
retrieving revision 1.65
diff -r1.65 w32proc.c
1058c1058
<   int i, nh, nc, nr;
---
>   int i, nh, nc, nr, nw;
1074c1074
<   if (rfds == NULL || wfds != NULL || efds != NULL)
---
>   if ((rfds == NULL && wfds == NULL) || efds != NULL)
1082a1083
>   nw = 0;
1186a1188,1198
>   if (wfds)
>     {
>       /* Assume this socket is waiting for connection of
> 	 non-blocking socket. */
>       struct timeval tm = {0, 0};
>       nw = sys_select_socket (nfds, NULL, wfds, NULL, &tm);
>       
>       if (nw < 0)
> 	return nw;
>     }
> 
1327a1340
>   nr += nw;

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-12-01 10:07 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-24 15:26 make-network-process(:nowait t) on MS-Windows Kyotaro HORIGUCHI
2005-11-30  8:43 ` Kyotaro HORIGUCHI
2005-12-01  6:07   ` Richard M. Stallman
2005-12-01 10:07     ` Jason Rumney

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).