[Top][All Lists]
[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;
- make-network-process(:nowait t) on MS-Windows,
Kyotaro HORIGUCHI <=