server: Move the FSCTL_PIPE_WAIT ioctl implementation to the server.
[wine] / server / named_pipe.c
1 /*
2  * Server-side pipe management
3  *
4  * Copyright (C) 1998 Alexandre Julliard
5  * Copyright (C) 2001 Mike McCormack
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  *
21  * TODO:
22  *   message mode
23  */
24
25 #include "config.h"
26 #include "wine/port.h"
27
28 #include <assert.h>
29 #include <fcntl.h>
30 #include <string.h>
31 #include <stdarg.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <sys/time.h>
35 #include <sys/types.h>
36 #ifdef HAVE_SYS_SOCKET_H
37 #include <sys/socket.h>
38 #endif
39 #include <time.h>
40 #include <unistd.h>
41 #ifdef HAVE_POLL_H
42 #include <poll.h>
43 #endif
44
45 #include "ntstatus.h"
46 #define WIN32_NO_STATUS
47 #include "windef.h"
48 #include "winternl.h"
49 #include "winioctl.h"
50
51 #include "file.h"
52 #include "handle.h"
53 #include "thread.h"
54 #include "request.h"
55
56 enum pipe_state
57 {
58     ps_idle_server,
59     ps_wait_open,
60     ps_connected_server,
61     ps_wait_disconnect,
62     ps_disconnected_server,
63     ps_wait_connect
64 };
65
66 struct named_pipe;
67
68 struct pipe_server
69 {
70     struct object        obj;        /* object header */
71     struct fd           *fd;         /* pipe file descriptor */
72     struct list          entry;      /* entry in named pipe servers list */
73     enum pipe_state      state;      /* server state */
74     struct pipe_client  *client;     /* client that this server is connected to */
75     struct named_pipe   *pipe;
76     struct timeout_user *flush_poll;
77     struct event        *event;
78     struct async_queue  *wait_q;     /* only a single one can be queued */
79     unsigned int         options;    /* pipe options */
80 };
81
82 struct pipe_client
83 {
84     struct object        obj;        /* object header */
85     struct fd           *fd;         /* pipe file descriptor */
86     struct pipe_server  *server;     /* server that this client is connected to */
87     unsigned int         flags;      /* file flags */
88 };
89
90 struct named_pipe
91 {
92     struct object       obj;         /* object header */
93     unsigned int        flags;
94     unsigned int        maxinstances;
95     unsigned int        outsize;
96     unsigned int        insize;
97     unsigned int        instances;
98     timeout_t           timeout;
99     struct list         servers;     /* list of servers using this pipe */
100     struct async_queue *waiters;     /* list of clients waiting to connect */
101 };
102
103 struct named_pipe_device
104 {
105     struct object       obj;         /* object header */
106     struct fd          *fd;          /* pseudo-fd for ioctls */
107     struct namespace   *pipes;       /* named pipe namespace */
108 };
109
110 static void named_pipe_dump( struct object *obj, int verbose );
111 static unsigned int named_pipe_map_access( struct object *obj, unsigned int access );
112 static struct object *named_pipe_open_file( struct object *obj, unsigned int access,
113                                             unsigned int sharing, unsigned int options );
114 static void named_pipe_destroy( struct object *obj );
115
116 static const struct object_ops named_pipe_ops =
117 {
118     sizeof(struct named_pipe),    /* size */
119     named_pipe_dump,              /* dump */
120     no_add_queue,                 /* add_queue */
121     NULL,                         /* remove_queue */
122     NULL,                         /* signaled */
123     NULL,                         /* satisfied */
124     no_signal,                    /* signal */
125     no_get_fd,                    /* get_fd */
126     named_pipe_map_access,        /* map_access */
127     no_lookup_name,               /* lookup_name */
128     named_pipe_open_file,         /* open_file */
129     no_close_handle,              /* close_handle */
130     named_pipe_destroy            /* destroy */
131 };
132
133 /* functions common to server and client */
134 static unsigned int pipe_map_access( struct object *obj, unsigned int access );
135
136 /* server end functions */
137 static void pipe_server_dump( struct object *obj, int verbose );
138 static struct fd *pipe_server_get_fd( struct object *obj );
139 static void pipe_server_destroy( struct object *obj);
140 static void pipe_server_flush( struct fd *fd, struct event **event );
141 static enum server_fd_type pipe_server_get_fd_type( struct fd *fd );
142 static void pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
143                                const void *data, data_size_t size );
144
145 static const struct object_ops pipe_server_ops =
146 {
147     sizeof(struct pipe_server),   /* size */
148     pipe_server_dump,             /* dump */
149     add_queue,                    /* add_queue */
150     remove_queue,                 /* remove_queue */
151     default_fd_signaled,          /* signaled */
152     no_satisfied,                 /* satisfied */
153     no_signal,                    /* signal */
154     pipe_server_get_fd,           /* get_fd */
155     pipe_map_access,              /* map_access */
156     no_lookup_name,               /* lookup_name */
157     no_open_file,                 /* open_file */
158     fd_close_handle,              /* close_handle */
159     pipe_server_destroy           /* destroy */
160 };
161
162 static const struct fd_ops pipe_server_fd_ops =
163 {
164     default_fd_get_poll_events,   /* get_poll_events */
165     default_poll_event,           /* poll_event */
166     pipe_server_flush,            /* flush */
167     pipe_server_get_fd_type,      /* get_fd_type */
168     pipe_server_ioctl,            /* ioctl */
169     default_fd_queue_async,       /* queue_async */
170     default_fd_reselect_async,    /* reselect_async */
171     default_fd_cancel_async,      /* cancel_async */
172 };
173
174 /* client end functions */
175 static void pipe_client_dump( struct object *obj, int verbose );
176 static struct fd *pipe_client_get_fd( struct object *obj );
177 static void pipe_client_destroy( struct object *obj );
178 static void pipe_client_flush( struct fd *fd, struct event **event );
179 static enum server_fd_type pipe_client_get_fd_type( struct fd *fd );
180
181 static const struct object_ops pipe_client_ops =
182 {
183     sizeof(struct pipe_client),   /* size */
184     pipe_client_dump,             /* dump */
185     add_queue,                    /* add_queue */
186     remove_queue,                 /* remove_queue */
187     default_fd_signaled,          /* signaled */
188     no_satisfied,                 /* satisfied */
189     no_signal,                    /* signal */
190     pipe_client_get_fd,           /* get_fd */
191     pipe_map_access,              /* map_access */
192     no_lookup_name,               /* lookup_name */
193     no_open_file,                 /* open_file */
194     fd_close_handle,              /* close_handle */
195     pipe_client_destroy           /* destroy */
196 };
197
198 static const struct fd_ops pipe_client_fd_ops =
199 {
200     default_fd_get_poll_events,   /* get_poll_events */
201     default_poll_event,           /* poll_event */
202     pipe_client_flush,            /* flush */
203     pipe_client_get_fd_type,      /* get_fd_type */
204     default_fd_ioctl,             /* ioctl */
205     default_fd_queue_async,       /* queue_async */
206     default_fd_reselect_async,    /* reselect_async */
207     default_fd_cancel_async       /* cancel_async */
208 };
209
210 static void named_pipe_device_dump( struct object *obj, int verbose );
211 static struct fd *named_pipe_device_get_fd( struct object *obj );
212 static struct object *named_pipe_device_lookup_name( struct object *obj,
213     struct unicode_str *name, unsigned int attr );
214 static struct object *named_pipe_device_open_file( struct object *obj, unsigned int access,
215                                                    unsigned int sharing, unsigned int options );
216 static void named_pipe_device_destroy( struct object *obj );
217 static enum server_fd_type named_pipe_device_get_fd_type( struct fd *fd );
218 static void named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
219                                      const void *data, data_size_t size );
220
221 static const struct object_ops named_pipe_device_ops =
222 {
223     sizeof(struct named_pipe_device), /* size */
224     named_pipe_device_dump,           /* dump */
225     no_add_queue,                     /* add_queue */
226     NULL,                             /* remove_queue */
227     NULL,                             /* signaled */
228     no_satisfied,                     /* satisfied */
229     no_signal,                        /* signal */
230     named_pipe_device_get_fd,         /* get_fd */
231     pipe_map_access,                  /* map_access */
232     named_pipe_device_lookup_name,    /* lookup_name */
233     named_pipe_device_open_file,      /* open_file */
234     fd_close_handle,                  /* close_handle */
235     named_pipe_device_destroy         /* destroy */
236 };
237
238 static const struct fd_ops named_pipe_device_fd_ops =
239 {
240     default_fd_get_poll_events,       /* get_poll_events */
241     default_poll_event,               /* poll_event */
242     no_flush,                         /* flush */
243     named_pipe_device_get_fd_type,    /* get_fd_type */
244     named_pipe_device_ioctl,          /* ioctl */
245     default_fd_queue_async,           /* queue_async */
246     default_fd_reselect_async,        /* reselect_async */
247     default_fd_cancel_async           /* cancel_async */
248 };
249
250 static void named_pipe_dump( struct object *obj, int verbose )
251 {
252     struct named_pipe *pipe = (struct named_pipe *) obj;
253     assert( obj->ops == &named_pipe_ops );
254     fprintf( stderr, "Named pipe " );
255     dump_object_name( &pipe->obj );
256     fprintf( stderr, "\n" );
257 }
258
259 static unsigned int named_pipe_map_access( struct object *obj, unsigned int access )
260 {
261     if (access & GENERIC_READ)    access |= STANDARD_RIGHTS_READ;
262     if (access & GENERIC_WRITE)   access |= STANDARD_RIGHTS_WRITE | FILE_CREATE_PIPE_INSTANCE;
263     if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE;
264     if (access & GENERIC_ALL)     access |= STANDARD_RIGHTS_ALL;
265     return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
266 }
267
268 static void pipe_server_dump( struct object *obj, int verbose )
269 {
270     struct pipe_server *server = (struct pipe_server *) obj;
271     assert( obj->ops == &pipe_server_ops );
272     fprintf( stderr, "Named pipe server pipe=%p state=%d\n", server->pipe, server->state );
273 }
274
275 static void pipe_client_dump( struct object *obj, int verbose )
276 {
277     struct pipe_client *client = (struct pipe_client *) obj;
278     assert( obj->ops == &pipe_client_ops );
279     fprintf( stderr, "Named pipe client server=%p\n", client->server );
280 }
281
282 static void named_pipe_destroy( struct object *obj)
283 {
284     struct named_pipe *pipe = (struct named_pipe *) obj;
285
286     assert( list_empty( &pipe->servers ) );
287     assert( !pipe->instances );
288     free_async_queue( pipe->waiters );
289 }
290
291 static struct fd *pipe_client_get_fd( struct object *obj )
292 {
293     struct pipe_client *client = (struct pipe_client *) obj;
294     if (client->fd)
295         return (struct fd *) grab_object( client->fd );
296     set_error( STATUS_PIPE_DISCONNECTED );
297     return NULL;
298 }
299
300 static struct fd *pipe_server_get_fd( struct object *obj )
301 {
302     struct pipe_server *server = (struct pipe_server *) obj;
303
304     switch(server->state)
305     {
306     case ps_connected_server:
307     case ps_wait_disconnect:
308         assert( server->fd );
309         return (struct fd *) grab_object( server->fd );
310
311     case ps_wait_open:
312     case ps_idle_server:
313         set_error( STATUS_PIPE_LISTENING );
314         break;
315
316     case ps_disconnected_server:
317     case ps_wait_connect:
318         set_error( STATUS_PIPE_DISCONNECTED );
319         break;
320     }
321     return NULL;
322 }
323
324
325 static void notify_empty( struct pipe_server *server )
326 {
327     if (!server->flush_poll)
328         return;
329     assert( server->state == ps_connected_server );
330     assert( server->event );
331     remove_timeout_user( server->flush_poll );
332     server->flush_poll = NULL;
333     set_event( server->event );
334     release_object( server->event );
335     server->event = NULL;
336 }
337
338 static void do_disconnect( struct pipe_server *server )
339 {
340     /* we may only have a server fd, if the client disconnected */
341     if (server->client)
342     {
343         assert( server->client->server == server );
344         assert( server->client->fd );
345         release_object( server->client->fd );
346         server->client->fd = NULL;
347     }
348     assert( server->fd );
349     shutdown( get_unix_fd( server->fd ), SHUT_RDWR );
350     release_object( server->fd );
351     server->fd = NULL;
352 }
353
354 static unsigned int pipe_map_access( struct object *obj, unsigned int access )
355 {
356     if (access & GENERIC_READ)    access |= FILE_GENERIC_READ;
357     if (access & GENERIC_WRITE)   access |= FILE_GENERIC_WRITE;
358     if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
359     if (access & GENERIC_ALL)     access |= FILE_ALL_ACCESS;
360     return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
361 }
362
363 static void pipe_server_destroy( struct object *obj)
364 {
365     struct pipe_server *server = (struct pipe_server *)obj;
366
367     assert( obj->ops == &pipe_server_ops );
368
369     if (server->fd)
370     {
371         notify_empty( server );
372         do_disconnect( server );
373     }
374
375     if (server->client)
376     {
377         server->client->server = NULL;
378         server->client = NULL;
379     }
380
381     free_async_queue( server->wait_q );
382
383     assert( server->pipe->instances );
384     server->pipe->instances--;
385
386     list_remove( &server->entry );
387     release_object( server->pipe );
388 }
389
390 static void pipe_client_destroy( struct object *obj)
391 {
392     struct pipe_client *client = (struct pipe_client *)obj;
393     struct pipe_server *server = client->server;
394
395     assert( obj->ops == &pipe_client_ops );
396
397     if (server)
398     {
399         notify_empty( server );
400
401         switch(server->state)
402         {
403         case ps_connected_server:
404             /* Don't destroy the server's fd here as we can't
405                do a successful flush without it. */
406             server->state = ps_wait_disconnect;
407             release_object( client->fd );
408             client->fd = NULL;
409             break;
410         case ps_disconnected_server:
411             server->state = ps_wait_connect;
412             break;
413         case ps_idle_server:
414         case ps_wait_open:
415         case ps_wait_disconnect:
416         case ps_wait_connect:
417             assert( 0 );
418         }
419         assert( server->client );
420         server->client = NULL;
421         client->server = NULL;
422     }
423     assert( !client->fd );
424 }
425
426 static void named_pipe_device_dump( struct object *obj, int verbose )
427 {
428     assert( obj->ops == &named_pipe_device_ops );
429     fprintf( stderr, "Named pipe device\n" );
430 }
431
432 static struct fd *named_pipe_device_get_fd( struct object *obj )
433 {
434     struct named_pipe_device *device = (struct named_pipe_device *)obj;
435     return (struct fd *)grab_object( device->fd );
436 }
437
438 static struct object *named_pipe_device_lookup_name( struct object *obj, struct unicode_str *name,
439                                                      unsigned int attr )
440 {
441     struct named_pipe_device *device = (struct named_pipe_device*)obj;
442     struct object *found;
443
444     assert( obj->ops == &named_pipe_device_ops );
445     assert( device->pipes );
446
447     if ((found = find_object( device->pipes, name, attr | OBJ_CASE_INSENSITIVE )))
448         name->len = 0;
449
450     return found;
451 }
452
453 static struct object *named_pipe_device_open_file( struct object *obj, unsigned int access,
454                                                    unsigned int sharing, unsigned int options )
455 {
456     return grab_object( obj );
457 }
458
459 static void named_pipe_device_destroy( struct object *obj )
460 {
461     struct named_pipe_device *device = (struct named_pipe_device*)obj;
462     assert( obj->ops == &named_pipe_device_ops );
463     if (device->fd) release_object( device->fd );
464     free( device->pipes );
465 }
466
467 static enum server_fd_type named_pipe_device_get_fd_type( struct fd *fd )
468 {
469     return FD_TYPE_DEVICE;
470 }
471
472 void create_named_pipe_device( struct directory *root, const struct unicode_str *name )
473 {
474     struct named_pipe_device *dev;
475
476     if ((dev = create_named_object_dir( root, name, 0, &named_pipe_device_ops )) &&
477         get_error() != STATUS_OBJECT_NAME_EXISTS)
478     {
479         dev->pipes = NULL;
480         if (!(dev->fd = alloc_pseudo_fd( &named_pipe_device_fd_ops, &dev->obj )) ||
481             !(dev->pipes = create_namespace( 7 )))
482         {
483             release_object( dev );
484             dev = NULL;
485         }
486     }
487     if (dev) make_object_static( &dev->obj );
488 }
489
490 static int pipe_data_remaining( struct pipe_server *server )
491 {
492     struct pollfd pfd;
493     int fd;
494
495     assert( server->client );
496
497     fd = get_unix_fd( server->client->fd );
498     if (fd < 0)
499         return 0;
500     pfd.fd = fd;
501     pfd.events = POLLIN;
502     pfd.revents = 0;
503
504     if (0 > poll( &pfd, 1, 0 ))
505         return 0;
506  
507     return pfd.revents&POLLIN;
508 }
509
510 static void check_flushed( void *arg )
511 {
512     struct pipe_server *server = (struct pipe_server*) arg;
513
514     assert( server->event );
515     if (pipe_data_remaining( server ))
516     {
517         server->flush_poll = add_timeout_user( -TICKS_PER_SEC / 10, check_flushed, server );
518     }
519     else
520     {
521         /* notify_empty( server ); */
522         server->flush_poll = NULL;
523         set_event( server->event );
524         release_object( server->event );
525         server->event = NULL;
526     }
527 }
528
529 static void pipe_server_flush( struct fd *fd, struct event **event )
530 {
531     struct pipe_server *server = get_fd_user( fd );
532
533     if (!server || server->state != ps_connected_server) return;
534
535     /* FIXME: if multiple threads flush the same pipe,
536               maybe should create a list of processes to notify */
537     if (server->flush_poll) return;
538
539     if (pipe_data_remaining( server ))
540     {
541         /* this kind of sux -
542            there's no unix way to be alerted when a pipe becomes empty */
543         server->event = create_event( NULL, NULL, 0, 0, 0 );
544         if (!server->event) return;
545         server->flush_poll = add_timeout_user( -TICKS_PER_SEC / 10, check_flushed, server );
546         *event = server->event;
547     }
548 }
549
550 static void pipe_client_flush( struct fd *fd, struct event **event )
551 {
552     /* FIXME: what do we have to do for this? */
553 }
554
555 static inline int is_overlapped( unsigned int options )
556 {
557     return !(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT));
558 }
559
560 static enum server_fd_type pipe_server_get_fd_type( struct fd *fd )
561 {
562     return FD_TYPE_PIPE;
563 }
564
565 static enum server_fd_type pipe_client_get_fd_type( struct fd *fd )
566 {
567     return FD_TYPE_PIPE;
568 }
569
570 static void pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
571                                const void *data, data_size_t size )
572 {
573     struct pipe_server *server = get_fd_user( fd );
574
575     switch(code)
576     {
577     case FSCTL_PIPE_DISCONNECT:
578         switch(server->state)
579         {
580         case ps_connected_server:
581             assert( server->client );
582             assert( server->client->fd );
583
584             notify_empty( server );
585
586             /* dump the client and server fds, but keep the pointers
587                around - client loses all waiting data */
588             server->state = ps_disconnected_server;
589             do_disconnect( server );
590             break;
591         case ps_wait_disconnect:
592             assert( !server->client );
593             do_disconnect( server );
594             server->state = ps_wait_connect;
595             break;
596         case ps_idle_server:
597         case ps_wait_open:
598         case ps_disconnected_server:
599         case ps_wait_connect:
600             assert(0);  /* shouldn't even get an fd */
601             break;
602         }
603         break;
604     default:
605         default_fd_ioctl( fd, code, async, data, size );
606         break;
607     }
608 }
609
610 static struct named_pipe *create_named_pipe( struct directory *root, const struct unicode_str *name,
611                                              unsigned int attr )
612 {
613     struct object *obj;
614     struct named_pipe *pipe = NULL;
615     struct unicode_str new_name;
616
617     if (!name || !name->len) return alloc_object( &named_pipe_ops );
618
619     if (!(obj = find_object_dir( root, name, attr, &new_name )))
620     {
621         set_error( STATUS_OBJECT_NAME_INVALID );
622         return NULL;
623     }
624     if (!new_name.len)
625     {
626         if (attr & OBJ_OPENIF && obj->ops == &named_pipe_ops)
627             set_error( STATUS_OBJECT_NAME_EXISTS );
628         else
629         {
630             release_object( obj );
631             obj = NULL;
632             if (attr & OBJ_OPENIF)
633                 set_error( STATUS_OBJECT_TYPE_MISMATCH );
634             else
635                 set_error( STATUS_OBJECT_NAME_COLLISION );
636         }
637         return (struct named_pipe *)obj;
638     }
639
640     if (obj->ops != &named_pipe_device_ops)
641         set_error( STATUS_OBJECT_NAME_INVALID );
642     else
643     {
644         struct named_pipe_device *dev = (struct named_pipe_device *)obj;
645         if ((pipe = create_object( dev->pipes, &named_pipe_ops, &new_name, NULL )))
646             clear_error();
647     }
648
649     release_object( obj );
650     return pipe;
651 }
652
653 static struct pipe_server *get_pipe_server_obj( struct process *process,
654                                 obj_handle_t handle, unsigned int access )
655 {
656     struct object *obj;
657     obj = get_handle_obj( process, handle, access, &pipe_server_ops );
658     return (struct pipe_server *) obj;
659 }
660
661 static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options )
662 {
663     struct pipe_server *server;
664
665     server = alloc_object( &pipe_server_ops );
666     if (!server)
667         return NULL;
668
669     server->fd = NULL;
670     server->pipe = pipe;
671     server->state = ps_idle_server;
672     server->client = NULL;
673     server->flush_poll = NULL;
674     server->options = options;
675     server->wait_q = create_async_queue( NULL );
676
677     list_add_head( &pipe->servers, &server->entry );
678     grab_object( pipe );
679
680     return server;
681 }
682
683 static struct pipe_client *create_pipe_client( unsigned int flags )
684 {
685     struct pipe_client *client;
686
687     client = alloc_object( &pipe_client_ops );
688     if (!client)
689         return NULL;
690
691     client->fd = NULL;
692     client->server = NULL;
693     client->flags = flags;
694
695     return client;
696 }
697
698 static struct pipe_server *find_available_server( struct named_pipe *pipe )
699 {
700     struct pipe_server *server;
701
702     LIST_FOR_EACH_ENTRY( server, &pipe->servers, struct pipe_server, entry )
703     {
704         if (server->state == ps_idle_server || server->state == ps_wait_open)
705             return (struct pipe_server *)grab_object( server );
706     }
707     return NULL;
708 }
709
710 static struct object *named_pipe_open_file( struct object *obj, unsigned int access,
711                                             unsigned int sharing, unsigned int options )
712 {
713     struct named_pipe *pipe = (struct named_pipe *)obj;
714     struct pipe_server *server;
715     struct pipe_client *client;
716     int fds[2];
717
718     if (!(server = find_available_server( pipe )))
719     {
720         set_error( STATUS_PIPE_NOT_AVAILABLE );
721         return NULL;
722     }
723
724     if ((client = create_pipe_client( options )))
725     {
726         if (!socketpair( PF_UNIX, SOCK_STREAM, 0, fds ))
727         {
728             int res = 0;
729
730             assert( !client->fd );
731             assert( !server->fd );
732
733             /* for performance reasons, only set nonblocking mode when using
734              * overlapped I/O. Otherwise, we will be doing too much busy
735              * looping */
736             if (is_overlapped( options ))
737                 res = fcntl( fds[1], F_SETFL, O_NONBLOCK );
738             if ((res != -1) && is_overlapped( server->options ))
739                 res = fcntl( fds[0], F_SETFL, O_NONBLOCK );
740
741             if (pipe->insize)
742             {
743                 setsockopt( fds[0], SOL_SOCKET, SO_RCVBUF, &pipe->insize, sizeof(pipe->insize) );
744                 setsockopt( fds[1], SOL_SOCKET, SO_RCVBUF, &pipe->insize, sizeof(pipe->insize) );
745             }
746             if (pipe->outsize)
747             {
748                 setsockopt( fds[0], SOL_SOCKET, SO_SNDBUF, &pipe->outsize, sizeof(pipe->outsize) );
749                 setsockopt( fds[1], SOL_SOCKET, SO_SNDBUF, &pipe->outsize, sizeof(pipe->outsize) );
750             }
751
752             client->fd = create_anonymous_fd( &pipe_client_fd_ops, fds[1], &client->obj, options );
753             server->fd = create_anonymous_fd( &pipe_server_fd_ops, fds[0], &server->obj, server->options );
754             if (client->fd && server->fd && res != 1)
755             {
756                 if (server->state == ps_wait_open)
757                     async_wake_up( server->wait_q, STATUS_SUCCESS );
758                 server->state = ps_connected_server;
759                 server->client = client;
760                 client->server = server;
761             }
762         }
763         else
764             file_set_error();
765     }
766     release_object( server );
767     return &client->obj;
768 }
769
770 static void named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
771                                      const void *data, data_size_t size )
772 {
773     struct named_pipe_device *device = get_fd_user( fd );
774
775     switch(code)
776     {
777     case FSCTL_PIPE_WAIT:
778         {
779             const FILE_PIPE_WAIT_FOR_BUFFER *buffer = data;
780             struct named_pipe *pipe;
781             struct pipe_server *server;
782             struct unicode_str name;
783
784             if (size < sizeof(*buffer) ||
785                 size < FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER, Name[buffer->NameLength/sizeof(WCHAR)]))
786             {
787                 set_error( STATUS_INVALID_PARAMETER );
788                 break;
789             }
790             name.str = buffer->Name;
791             name.len = (buffer->NameLength / sizeof(WCHAR)) * sizeof(WCHAR);
792             if (!(pipe = (struct named_pipe *)find_object( device->pipes, &name, OBJ_CASE_INSENSITIVE )))
793             {
794                 set_error( STATUS_PIPE_NOT_AVAILABLE );
795                 break;
796             }
797             if (!(server = find_available_server( pipe )))
798             {
799                 struct async *async;
800
801                 if (!pipe->waiters && !(pipe->waiters = create_async_queue( NULL )))
802                 {
803                     release_object( pipe );
804                     break;
805                 }
806
807                 if ((async = create_async( current, pipe->waiters, async_data )))
808                 {
809                     timeout_t when = buffer->TimeoutSpecified ? buffer->Timeout.QuadPart : pipe->timeout;
810                     async_set_timeout( async, when, STATUS_IO_TIMEOUT );
811                     release_object( async );
812                     set_error( STATUS_PENDING );
813                 }
814             }
815             else release_object( server );
816
817             release_object( pipe );
818             break;
819         }
820
821     default:
822         default_fd_ioctl( fd, code, async_data, data, size );
823         break;
824     }
825 }
826
827
828 DECL_HANDLER(create_named_pipe)
829 {
830     struct named_pipe *pipe;
831     struct pipe_server *server;
832     struct unicode_str name;
833     struct directory *root = NULL;
834
835     reply->handle = 0;
836     get_req_unicode_str( &name );
837     if (req->rootdir && !(root = get_directory_obj( current->process, req->rootdir, 0 )))
838         return;
839
840     pipe = create_named_pipe( root, &name, req->attributes | OBJ_OPENIF );
841
842     if (root) release_object( root );
843     if (!pipe) return;
844
845     if (get_error() != STATUS_OBJECT_NAME_EXISTS)
846     {
847         /* initialize it if it didn't already exist */
848         pipe->instances = 0;
849         pipe->waiters = NULL;
850         list_init( &pipe->servers );
851         pipe->insize = req->insize;
852         pipe->outsize = req->outsize;
853         pipe->maxinstances = req->maxinstances;
854         pipe->timeout = req->timeout;
855         pipe->flags = req->flags;
856     }
857     else
858     {
859         if (pipe->maxinstances <= pipe->instances)
860         {
861             set_error( STATUS_INSTANCE_NOT_AVAILABLE );
862             release_object( pipe );
863             return;
864         }
865         if ((pipe->maxinstances != req->maxinstances) ||
866             (pipe->timeout != req->timeout) ||
867             (pipe->flags != req->flags))
868         {
869             set_error( STATUS_ACCESS_DENIED );
870             release_object( pipe );
871             return;
872         }
873         clear_error(); /* clear the name collision */
874     }
875
876     server = create_pipe_server( pipe, req->options );
877     if (server)
878     {
879         reply->handle = alloc_handle( current->process, server, req->access, req->attributes );
880         server->pipe->instances++;
881         release_object( server );
882     }
883
884     release_object( pipe );
885 }
886
887 DECL_HANDLER(connect_named_pipe)
888 {
889     struct pipe_server *server;
890     struct async *async;
891
892     server = get_pipe_server_obj(current->process, req->handle, 0);
893     if (!server)
894         return;
895
896     switch(server->state)
897     {
898     case ps_idle_server:
899     case ps_wait_connect:
900         assert( !server->fd );
901         server->state = ps_wait_open;
902         if ((async = create_async( current, server->wait_q, &req->async )))
903         {
904             if (server->pipe->waiters) async_wake_up( server->pipe->waiters, STATUS_SUCCESS );
905             release_object( async );
906             set_error( STATUS_PENDING );
907         }
908         break;
909     case ps_connected_server:
910         assert( server->fd );
911         set_error( STATUS_PIPE_CONNECTED );
912         break;
913     case ps_disconnected_server:
914         set_error( STATUS_PIPE_BUSY );
915         break;
916     case ps_wait_disconnect:
917         set_error( STATUS_NO_DATA_DETECTED );
918         break;
919     case ps_wait_open:
920         set_error( STATUS_INVALID_HANDLE );
921         break;
922     }
923
924     release_object(server);
925 }
926
927 DECL_HANDLER(get_named_pipe_info)
928 {
929     struct pipe_server *server;
930     struct pipe_client *client = NULL;
931
932     server = get_pipe_server_obj( current->process, req->handle, FILE_READ_ATTRIBUTES );
933     if (!server)
934     {
935         clear_error();
936         client = (struct pipe_client *)get_handle_obj( current->process, req->handle,
937                                                        FILE_READ_ATTRIBUTES, &pipe_client_ops );
938         if (!client) return;
939         server = client->server;
940     }
941
942     reply->flags        = server->pipe->flags;
943     reply->maxinstances = server->pipe->maxinstances;
944     reply->instances    = server->pipe->instances;
945     reply->insize       = server->pipe->insize;
946     reply->outsize      = server->pipe->outsize;
947
948     if (client)
949         release_object(client);
950     else
951     {
952         reply->flags |= NAMED_PIPE_SERVER_END;
953         release_object(server);
954     }
955 }