emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

make-network-process(:nowait t) on MS-Windows


From: Kyotaro HORIGUCHI
Subject: make-network-process(:nowait t) on MS-Windows
Date: Fri, 25 Nov 2005 00:26:40 +0900 (JST)

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;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]