Make GetTickCount not use the whole Unix epoch (since 1970) any more,
[wine] / server / sock.c
1 /*
2  * Server-side socket management
3  *
4  * Copyright (C) 1999 Marcus Meissner, Ove Kåven
5  *
6  * FIXME: we use read|write access in all cases. Shouldn't we depend that
7  * on the access of the current handle?
8  */
9
10 #include "config.h"
11
12 #include <assert.h>
13 #include <fcntl.h>
14 #include <stdio.h>
15 #include <string.h>
16 #include <stdlib.h>
17 #include <errno.h>
18 #ifdef HAVE_SYS_ERRNO_H
19 # include <sys/errno.h>
20 #endif
21 #include <sys/stat.h>
22 #include <sys/time.h>
23 #include <sys/types.h>
24 #ifdef HAVE_SYS_SOCKET_H
25 # include <sys/socket.h>
26 #endif
27 #include <sys/ioctl.h>
28 #ifdef HAVE_SYS_FILIO_H
29 # include <sys/filio.h>
30 #endif
31 #include <time.h>
32 #include <unistd.h>
33
34 #include "winerror.h"
35 #include "winbase.h"
36 #include "winsock2.h"
37 #include "process.h"
38 #include "handle.h"
39 #include "thread.h"
40 #include "request.h"
41
42 struct sock
43 {
44     struct object       obj;         /* object header */
45     unsigned int        state;       /* status bits */
46     unsigned int        mask;        /* event mask */
47     unsigned int        hmask;       /* held (blocked) events */
48     unsigned int        pmask;       /* pending events */
49     struct event       *event;       /* event object */
50     int                 errors[FD_MAX_EVENTS]; /* event errors */
51 };
52
53 static void sock_dump( struct object *obj, int verbose );
54 static int sock_signaled( struct object *obj, struct thread *thread );
55 static int sock_get_poll_events( struct object *obj );
56 static void sock_poll_event( struct object *obj, int event );
57 static int sock_get_fd( struct object *obj );
58 static void sock_destroy( struct object *obj );
59 static int sock_get_error( int err );
60 static void sock_set_error(void);
61
62 static const struct object_ops sock_ops =
63 {
64     sizeof(struct sock),          /* size */
65     sock_dump,                    /* dump */
66     add_queue,                    /* add_queue */
67     remove_queue,                 /* remove_queue */
68     sock_signaled,                /* signaled */
69     no_satisfied,                 /* satisfied */
70     sock_get_poll_events,         /* get_poll_events */
71     sock_poll_event,              /* poll_event */
72     sock_get_fd,                  /* get_read_fd */
73     sock_get_fd,                  /* get_write_fd */
74     no_flush,                     /* flush */
75     no_get_file_info,             /* get_file_info */
76     sock_destroy                  /* destroy */
77 };
78
79 static void sock_reselect( struct sock *sock )
80 {
81     int ev = sock_get_poll_events( &sock->obj );
82     struct pollfd pfd;
83
84     if (debug_level)
85         fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev);
86
87     if (sock->obj.select == -1) {
88         /* previously unconnected socket, is this reselect supposed to connect it? */
89         if (!sock->state) return;
90         /* ok, it is, attach it to the wineserver's main poll loop */
91         add_select_user( &sock->obj );
92     }
93     /* update condition mask */
94     set_select_events( &sock->obj, ev );
95
96     /* check whether condition is satisfied already */
97     pfd.fd = sock->obj.fd;
98     pfd.events = ev;
99     pfd.revents = 0;
100     poll( &pfd, 1, 0 );
101     if (pfd.revents)
102         sock_poll_event( &sock->obj, pfd.revents);
103 }
104
105 inline static int sock_error(int s)
106 {
107     unsigned int optval = 0, optlen;
108     
109     optlen = sizeof(optval);
110     getsockopt(s, SOL_SOCKET, SO_ERROR, (void *) &optval, &optlen);
111     return optval ? sock_get_error(optval) : 0;
112 }
113
114 static void sock_poll_event( struct object *obj, int event )
115 {
116     struct sock *sock = (struct sock *)obj;
117     unsigned int emask;
118     assert( sock->obj.ops == &sock_ops );
119     if (debug_level)
120         fprintf(stderr, "socket %d select event: %x\n", sock->obj.fd, event);
121     if (sock->state & WS_FD_CONNECT)
122     {
123         /* connecting */
124         if (event & POLLOUT)
125         {
126             /* we got connected */
127             sock->state |= WS_FD_CONNECTED|WS_FD_READ|WS_FD_WRITE;
128             sock->state &= ~WS_FD_CONNECT;
129             sock->pmask |= FD_CONNECT;
130             sock->errors[FD_CONNECT_BIT] = 0;
131             if (debug_level)
132                 fprintf(stderr, "socket %d connection success\n", sock->obj.fd);
133         }
134         else if (event & (POLLERR|POLLHUP))
135         {
136             /* we didn't get connected? */
137             sock->state &= ~WS_FD_CONNECT;
138             sock->pmask |= FD_CONNECT;
139             sock->errors[FD_CONNECT_BIT] = sock_error( sock->obj.fd );
140             if (debug_level)
141                 fprintf(stderr, "socket %d connection failure\n", sock->obj.fd);
142         }
143     } else
144     if (sock->state & WS_FD_LISTENING)
145     {
146         /* listening */
147         if (event & POLLIN)
148         {
149             /* incoming connection */
150             sock->pmask |= FD_ACCEPT;
151             sock->errors[FD_ACCEPT_BIT] = 0;
152             sock->hmask |= FD_ACCEPT;
153         }
154         else if (event & (POLLERR|POLLHUP))
155         {
156             /* failed incoming connection? */
157             sock->pmask |= FD_ACCEPT;
158             sock->errors[FD_ACCEPT_BIT] = sock_error( sock->obj.fd );
159             sock->hmask |= FD_ACCEPT;
160         }
161     } else
162     {
163         /* normal data flow */
164         if (event & POLLIN)
165         {
166             /* incoming data */
167             sock->pmask |= FD_READ;
168             sock->hmask |= FD_READ;
169             sock->errors[FD_READ_BIT] = 0;
170             if (debug_level)
171                 fprintf(stderr, "socket %d is readable\n", sock->obj.fd );
172         }
173         if (event & POLLOUT)
174         {
175             sock->pmask |= FD_WRITE;
176             sock->hmask |= FD_WRITE;
177             sock->errors[FD_WRITE_BIT] = 0;
178             if (debug_level)
179                 fprintf(stderr, "socket %d is writable\n", sock->obj.fd);
180         }
181         if (event & POLLPRI)
182         {
183             sock->pmask |= FD_OOB;
184             sock->hmask |= FD_OOB;
185             sock->errors[FD_OOB_BIT] = 0;
186             if (debug_level)
187                 fprintf(stderr, "socket %d got OOB data\n", sock->obj.fd);
188         }
189         if (((event & POLLERR) || ((event & (POLLIN|POLLHUP)) == POLLHUP))
190             && (sock->state & (WS_FD_READ|WS_FD_WRITE))) {
191             /* socket closing */
192             sock->errors[FD_CLOSE_BIT] = sock_error( sock->obj.fd );
193             sock->state &= ~(WS_FD_CONNECTED|WS_FD_READ|WS_FD_WRITE);
194             sock->pmask |= FD_CLOSE;
195             if (debug_level)
196                 fprintf(stderr, "socket %d aborted by error %d\n",
197                         sock->obj.fd, sock->errors[FD_CLOSE_BIT]);
198         }
199     }
200
201     if (event & (POLLERR|POLLHUP))
202         set_select_events( &sock->obj, -1 );
203     else
204         sock_reselect( sock );
205     /* wake up anyone waiting for whatever just happened */
206     emask = sock->pmask & sock->mask;
207     if (debug_level && emask)
208         fprintf(stderr, "socket %d pending events: %x\n", sock->obj.fd, emask);
209     if (emask && sock->event) {
210         if (debug_level) fprintf(stderr, "signalling event ptr %p\n", sock->event);
211         set_event(sock->event);
212     }
213
214     /* if anyone is stupid enough to wait on the socket object itself,
215      * maybe we should wake them up too, just in case? */
216     wake_up( &sock->obj, 0 );
217 }
218
219 static void sock_dump( struct object *obj, int verbose )
220 {
221     struct sock *sock = (struct sock *)obj;
222     assert( obj->ops == &sock_ops );
223     printf( "Socket fd=%d, state=%x, mask=%x, pending=%x, held=%x\n",
224             sock->obj.fd, sock->state,
225             sock->mask, sock->pmask, sock->hmask );
226 }
227
228 static int sock_signaled( struct object *obj, struct thread *thread )
229 {
230     struct sock *sock = (struct sock *)obj;
231     assert( obj->ops == &sock_ops );
232
233     return check_select_events( sock->obj.fd, sock_get_poll_events( &sock->obj ) );
234 }
235
236 static int sock_get_poll_events( struct object *obj )
237 {
238     struct sock *sock = (struct sock *)obj;
239     unsigned int mask = sock->mask & sock->state & ~sock->hmask;
240     int ev = 0;
241
242     assert( obj->ops == &sock_ops );
243
244     if (sock->state & WS_FD_CONNECT)
245         /* connecting, wait for writable */
246         return POLLOUT;
247     if (sock->state & WS_FD_LISTENING)
248         /* listening, wait for readable */
249         return (sock->hmask & FD_ACCEPT) ? 0 : POLLIN;
250
251     if (mask & FD_READ)  ev |= POLLIN | POLLPRI;
252     if (mask & FD_WRITE) ev |= POLLOUT;
253     return ev;
254 }
255
256 static int sock_get_fd( struct object *obj )
257 {
258     struct sock *sock = (struct sock *)obj;
259     int fd;
260     assert( obj->ops == &sock_ops );
261     fd = dup( sock->obj.fd );
262     if (fd==-1)
263         sock_set_error();
264     return fd;
265 }
266
267 static void sock_destroy( struct object *obj )
268 {
269     struct sock *sock = (struct sock *)obj;
270     assert( obj->ops == &sock_ops );
271
272     /* FIXME: special socket shutdown stuff? */
273     if (sock->event)
274     {
275         /* if the service thread was waiting for the event object,
276          * we should now signal it, to let the service thread
277          * object detect that it is now orphaned... */
278         if (sock->mask & WS_FD_SERVEVENT)
279             set_event( sock->event );
280         /* we're through with it */
281         release_object( sock->event );
282     }
283 }
284
285 /* create a new and unconnected socket */
286 static struct object *create_socket( int family, int type, int protocol )
287 {
288     struct sock *sock;
289     int sockfd;
290
291     sockfd = socket( family, type, protocol );
292     if (debug_level)
293         fprintf(stderr,"socket(%d,%d,%d)=%d\n",family,type,protocol,sockfd);
294     if (sockfd == -1) {
295         sock_set_error();
296         return NULL;
297     }
298     fcntl(sockfd, F_SETFL, O_NONBLOCK); /* make socket nonblocking */
299     if (!(sock = alloc_object( &sock_ops, -1 ))) return NULL;
300     sock->obj.fd = sockfd;
301     sock->state = (type != SOCK_STREAM) ? (WS_FD_READ|WS_FD_WRITE) : 0;
302     sock->mask  = 0;
303     sock->hmask = 0;
304     sock->pmask = 0;
305     sock->event = NULL;
306     sock_reselect( sock );
307     clear_error();
308     return &sock->obj;
309 }
310
311 /* accept a socket (creates a new fd) */
312 static struct object *accept_socket( int handle )
313 {
314     struct sock *acceptsock;
315     struct sock *sock;
316     int acceptfd;
317     struct sockaddr     saddr;
318     int                 slen;
319
320     sock=(struct sock*)get_handle_obj(current->process,handle,
321                                       GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
322     if (!sock)
323         return NULL;
324     /* Try to accept(2). We can't be safe that this an already connected socket 
325      * or that accept() is allowed on it. In those cases we will get -1/errno
326      * return.
327      */
328     slen = sizeof(saddr);
329     acceptfd = accept(sock->obj.fd,&saddr,&slen);
330     if (acceptfd==-1) {
331         sock_set_error();
332         release_object( sock );
333         return NULL;
334     }
335     if (!(acceptsock = alloc_object( &sock_ops, -1 )))
336     {
337         release_object( sock );
338         return NULL;
339     }
340
341     acceptsock->obj.fd = acceptfd;
342     acceptsock->state  = WS_FD_CONNECTED|WS_FD_READ|WS_FD_WRITE;
343     acceptsock->mask   = sock->mask;
344     acceptsock->hmask  = 0;
345     acceptsock->pmask  = 0;
346     acceptsock->event  = NULL;
347     if (sock->event && !(sock->mask & WS_FD_SERVEVENT))
348         acceptsock->event = (struct event *)grab_object( sock->event );
349
350     sock_reselect( acceptsock );
351     clear_error();
352     sock->pmask &= ~FD_ACCEPT;
353     sock->hmask &= ~FD_ACCEPT;
354     release_object( sock );
355     return &acceptsock->obj;
356 }
357
358 /* set the last error depending on errno */
359 static int sock_get_error( int err )
360 {
361     switch (err)
362     {
363         case EINTR:             return WSAEINTR; break;
364         case EBADF:             return WSAEBADF; break;
365         case EPERM:
366         case EACCES:            return WSAEACCES; break;
367         case EFAULT:            return WSAEFAULT; break;
368         case EINVAL:            return WSAEINVAL; break;
369         case EMFILE:            return WSAEMFILE; break;
370         case EWOULDBLOCK:       return WSAEWOULDBLOCK; break;
371         case EINPROGRESS:       return WSAEINPROGRESS; break;
372         case EALREADY:          return WSAEALREADY; break;
373         case ENOTSOCK:          return WSAENOTSOCK; break;
374         case EDESTADDRREQ:      return WSAEDESTADDRREQ; break;
375         case EMSGSIZE:          return WSAEMSGSIZE; break;
376         case EPROTOTYPE:        return WSAEPROTOTYPE; break;
377         case ENOPROTOOPT:       return WSAENOPROTOOPT; break;
378         case EPROTONOSUPPORT:   return WSAEPROTONOSUPPORT; break;
379         case ESOCKTNOSUPPORT:   return WSAESOCKTNOSUPPORT; break;
380         case EOPNOTSUPP:        return WSAEOPNOTSUPP; break;
381         case EPFNOSUPPORT:      return WSAEPFNOSUPPORT; break;
382         case EAFNOSUPPORT:      return WSAEAFNOSUPPORT; break;
383         case EADDRINUSE:        return WSAEADDRINUSE; break;
384         case EADDRNOTAVAIL:     return WSAEADDRNOTAVAIL; break;
385         case ENETDOWN:          return WSAENETDOWN; break;
386         case ENETUNREACH:       return WSAENETUNREACH; break;
387         case ENETRESET:         return WSAENETRESET; break;
388         case ECONNABORTED:      return WSAECONNABORTED; break;
389         case EPIPE:
390         case ECONNRESET:        return WSAECONNRESET; break;
391         case ENOBUFS:           return WSAENOBUFS; break;
392         case EISCONN:           return WSAEISCONN; break;
393         case ENOTCONN:          return WSAENOTCONN; break;
394         case ESHUTDOWN:         return WSAESHUTDOWN; break;
395         case ETOOMANYREFS:      return WSAETOOMANYREFS; break;
396         case ETIMEDOUT:         return WSAETIMEDOUT; break;
397         case ECONNREFUSED:      return WSAECONNREFUSED; break;
398         case ELOOP:             return WSAELOOP; break;
399         case ENAMETOOLONG:      return WSAENAMETOOLONG; break;
400         case EHOSTDOWN:         return WSAEHOSTDOWN; break;
401         case EHOSTUNREACH:      return WSAEHOSTUNREACH; break;
402         case ENOTEMPTY:         return WSAENOTEMPTY; break;
403 #ifdef EPROCLIM
404         case EPROCLIM:          return WSAEPROCLIM; break;
405 #endif
406 #ifdef EUSERS
407         case EUSERS:            return WSAEUSERS; break;
408 #endif
409 #ifdef EDQUOT
410         case EDQUOT:            return WSAEDQUOT; break;
411 #endif
412 #ifdef ESTALE
413         case ESTALE:            return WSAESTALE; break;
414 #endif
415 #ifdef EREMOTE
416         case EREMOTE:           return WSAEREMOTE; break;
417 #endif
418     default: errno=err; perror("sock_set_error"); return ERROR_UNKNOWN; break;
419     }
420 }
421
422 /* set the last error depending on errno */
423 static void sock_set_error(void)
424 {
425     set_error( sock_get_error( errno ) );
426 }
427
428 /* create a socket */
429 DECL_HANDLER(create_socket)
430 {
431     struct object *obj;
432     int s = -1;
433
434     if ((obj = create_socket( req->family, req->type, req->protocol )) != NULL)
435     {
436         s = alloc_handle( current->process, obj, req->access, req->inherit );
437         release_object( obj );
438     }
439     req->handle = s;
440 }
441
442 /* accept a socket */
443 DECL_HANDLER(accept_socket)
444 {
445     struct object *obj;
446     int s = -1;
447
448     if ((obj = accept_socket( req->lhandle )) != NULL)
449     {
450         s = alloc_handle( current->process, obj, req->access, req->inherit );
451         release_object( obj );
452     }
453     req->handle = s;
454 }
455
456 /* set socket event parameters */
457 DECL_HANDLER(set_socket_event)
458 {
459     struct sock *sock;
460     struct event *oevent;
461     unsigned int omask;
462
463     sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
464     if (!sock)
465         return;
466     oevent = sock->event;
467     omask  = sock->mask;
468     sock->mask    = req->mask;
469     sock->event   = get_event_obj( current->process, req->event, EVENT_MODIFY_STATE );
470     if (debug_level && sock->event) fprintf(stderr, "event ptr: %p\n", sock->event);
471     sock_reselect( sock );
472     if (sock->mask)
473         sock->state |= WS_FD_NONBLOCKING;
474
475     /* if a network event is pending, signal the event object 
476        it is possible that FD_CONNECT or FD_ACCEPT network events has happened
477        before a WSAEventSelect() was done on it. 
478        (when dealing with Asynchronous socket)  */
479     if (sock->pmask & sock->mask)
480         set_event(sock->event);
481     
482     if (oevent)
483     {
484         if ((oevent != sock->event) && (omask & WS_FD_SERVEVENT))
485             /* if the service thread was waiting for the old event object,
486              * we should now signal it, to let the service thread
487              * object detect that it is now orphaned... */
488             set_event( oevent );
489         /* we're through with it */
490         release_object( oevent );
491     }
492     release_object( &sock->obj );
493 }
494
495 /* get socket event parameters */
496 DECL_HANDLER(get_socket_event)
497 {
498     struct sock *sock;
499     size_t size;
500
501     sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
502     if (!sock)
503     {
504         req->mask  = 0;
505         req->pmask = 0;
506         req->state = 0;
507         set_error(WSAENOTSOCK);
508         return;
509     }
510     req->mask    = sock->mask;
511     req->pmask   = sock->pmask;
512     req->state   = sock->state;
513     size = min( get_req_data_size(req), sizeof(sock->errors) );
514     memcpy( get_req_data(req), sock->errors, size );
515     set_req_data_size( req, size );
516
517     if (req->service)
518     {
519         if (req->s_event)
520         {
521             struct event *sevent = get_event_obj(current->process, req->s_event, 0);
522             if (sevent == sock->event)
523                 req->s_event = 0;
524             release_object( sevent );
525         }
526         if (!req->s_event)
527         {
528             if (req->c_event)
529             {
530                 struct event *cevent = get_event_obj(current->process, req->c_event, EVENT_MODIFY_STATE);
531                 reset_event( cevent );
532                 release_object( cevent );
533             }
534             sock->pmask = 0;
535             sock_reselect( sock );
536         }
537         else set_error(WSAEINVAL);
538     }
539     release_object( &sock->obj );
540 }
541
542 /* re-enable pending socket events */
543 DECL_HANDLER(enable_socket_event)
544 {
545     struct sock *sock;
546
547     sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
548     if (!sock)
549         return;
550     sock->pmask &= ~req->mask; /* is this safe? */
551     sock->hmask &= ~req->mask;
552     sock->state |= req->sstate;
553     sock->state &= ~req->cstate;
554     sock_reselect( sock );
555
556     /* service trigger */
557     if (req->mask & WS_FD_SERVEVENT)
558     {
559         sock->pmask |= WS_FD_SERVEVENT;
560         if (sock->event) {
561             if (debug_level) fprintf(stderr, "signalling service event ptr %p\n", sock->event);
562             set_event(sock->event);
563         }
564     }
565
566     release_object( &sock->obj );
567 }