Use a better location than HKCU\Wine for saving the temporary
[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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 "windef.h"
46 #include "winbase.h"
47 #include "winreg.h"
48 #include "winternl.h"
49
50 #include "file.h"
51 #include "handle.h"
52 #include "thread.h"
53 #include "request.h"
54
55 enum pipe_state
56 {
57     ps_idle_server,
58     ps_wait_open,
59     ps_connected_server,
60     ps_wait_disconnect,
61     ps_disconnected_server,
62     ps_wait_connect
63 };
64
65 struct named_pipe;
66
67 struct pipe_server
68 {
69     struct object        obj;        /* object header */
70     struct fd           *fd;         /* pipe file descriptor */
71     struct list          entry;      /* entry in named pipe servers list */
72     enum pipe_state      state;      /* server state */
73     struct pipe_client  *client;     /* client that this server is connected to */
74     struct named_pipe   *pipe;
75     struct timeout_user *flush_poll;
76     struct event        *event;
77     struct list          wait_q;     /* only a single one can be queued */
78     unsigned int         options;    /* pipe options */
79 };
80
81 struct pipe_client
82 {
83     struct object        obj;        /* object header */
84     struct fd           *fd;         /* pipe file descriptor */
85     struct pipe_server  *server;     /* server that this client is connected to */
86     unsigned int         flags;      /* file flags */
87 };
88
89 struct named_pipe
90 {
91     struct object       obj;         /* object header */
92     unsigned int        flags;
93     unsigned int        maxinstances;
94     unsigned int        outsize;
95     unsigned int        insize;
96     unsigned int        timeout;
97     unsigned int        instances;
98     struct list         servers;     /* list of servers using this pipe */
99     struct list         waiters;     /* list of clients waiting to connect */
100 };
101
102 static void named_pipe_dump( struct object *obj, int verbose );
103 static void named_pipe_destroy( struct object *obj );
104
105 static const struct object_ops named_pipe_ops =
106 {
107     sizeof(struct named_pipe),    /* size */
108     named_pipe_dump,              /* dump */
109     no_add_queue,                 /* add_queue */
110     NULL,                         /* remove_queue */
111     NULL,                         /* signaled */
112     NULL,                         /* satisfied */
113     no_signal,                    /* signal */
114     no_get_fd,                    /* get_fd */
115     no_close_handle,              /* close_handle */
116     named_pipe_destroy            /* destroy */
117 };
118
119 /* server end functions */
120 static void pipe_server_dump( struct object *obj, int verbose );
121 static struct fd *pipe_server_get_fd( struct object *obj );
122 static void pipe_server_destroy( struct object *obj);
123 static int pipe_server_flush( struct fd *fd, struct event **event );
124 static int pipe_server_get_info( struct fd *fd );
125
126 static const struct object_ops pipe_server_ops =
127 {
128     sizeof(struct pipe_server),   /* size */
129     pipe_server_dump,             /* dump */
130     default_fd_add_queue,         /* add_queue */
131     default_fd_remove_queue,      /* remove_queue */
132     default_fd_signaled,          /* signaled */
133     no_satisfied,                 /* satisfied */
134     no_signal,                    /* signal */
135     pipe_server_get_fd,           /* get_fd */
136     no_close_handle,              /* close_handle */
137     pipe_server_destroy           /* destroy */
138 };
139
140 static const struct fd_ops pipe_server_fd_ops =
141 {
142     default_fd_get_poll_events,     /* get_poll_events */
143     default_poll_event,           /* poll_event */
144     pipe_server_flush,            /* flush */
145     pipe_server_get_info,         /* get_file_info */
146     default_fd_queue_async,       /* queue_async */
147     default_fd_cancel_async,      /* cancel_async */
148 };
149
150 /* client end functions */
151 static void pipe_client_dump( struct object *obj, int verbose );
152 static struct fd *pipe_client_get_fd( struct object *obj );
153 static void pipe_client_destroy( struct object *obj );
154 static int pipe_client_flush( struct fd *fd, struct event **event );
155 static int pipe_client_get_info( struct fd *fd );
156
157 static const struct object_ops pipe_client_ops =
158 {
159     sizeof(struct pipe_client),   /* size */
160     pipe_client_dump,             /* dump */
161     default_fd_add_queue,         /* add_queue */
162     default_fd_remove_queue,      /* remove_queue */
163     default_fd_signaled,          /* signaled */
164     no_satisfied,                 /* satisfied */
165     no_signal,                    /* signal */
166     pipe_client_get_fd,           /* get_fd */
167     no_close_handle,              /* close_handle */
168     pipe_client_destroy           /* destroy */
169 };
170
171 static const struct fd_ops pipe_client_fd_ops =
172 {
173     default_fd_get_poll_events,   /* get_poll_events */
174     default_poll_event,           /* poll_event */
175     pipe_client_flush,            /* flush */
176     pipe_client_get_info,         /* get_file_info */
177     default_fd_queue_async,       /* queue_async */
178     default_fd_cancel_async       /* cancel_async */
179 };
180
181 static void named_pipe_dump( struct object *obj, int verbose )
182 {
183     struct named_pipe *pipe = (struct named_pipe *) obj;
184     assert( obj->ops == &named_pipe_ops );
185     fprintf( stderr, "Named pipe " );
186     dump_object_name( &pipe->obj );
187     fprintf( stderr, "\n" );
188 }
189
190 static void pipe_server_dump( struct object *obj, int verbose )
191 {
192     struct pipe_server *server = (struct pipe_server *) obj;
193     assert( obj->ops == &pipe_server_ops );
194     fprintf( stderr, "Named pipe server pipe=%p state=%d\n", server->pipe, server->state );
195 }
196
197 static void pipe_client_dump( struct object *obj, int verbose )
198 {
199     struct pipe_client *client = (struct pipe_client *) obj;
200     assert( obj->ops == &pipe_client_ops );
201     fprintf( stderr, "Named pipe client server=%p\n", client->server );
202 }
203
204 static void named_pipe_destroy( struct object *obj)
205 {
206     struct named_pipe *pipe = (struct named_pipe *) obj;
207
208     assert( list_empty( &pipe->servers ) );
209     assert( !pipe->instances );
210     async_terminate_queue( &pipe->waiters, STATUS_HANDLES_CLOSED );
211 }
212
213 static struct fd *pipe_client_get_fd( struct object *obj )
214 {
215     struct pipe_client *client = (struct pipe_client *) obj;
216     if (client->fd)
217         return (struct fd *) grab_object( client->fd );
218     set_error( STATUS_PIPE_DISCONNECTED );
219     return NULL;
220 }
221
222 static struct fd *pipe_server_get_fd( struct object *obj )
223 {
224     struct pipe_server *server = (struct pipe_server *) obj;
225
226     switch(server->state)
227     {
228     case ps_connected_server:
229     case ps_wait_disconnect:
230         assert( server->fd );
231         return (struct fd *) grab_object( server->fd );
232
233     case ps_wait_open:
234     case ps_idle_server:
235         set_error( STATUS_PIPE_LISTENING );
236         break;
237
238     case ps_disconnected_server:
239     case ps_wait_connect:
240         set_error( STATUS_PIPE_DISCONNECTED );
241         break;
242     }
243     return NULL;
244 }
245
246
247 static void notify_empty( struct pipe_server *server )
248 {
249     if (!server->flush_poll)
250         return;
251     assert( server->state == ps_connected_server );
252     assert( server->event );
253     remove_timeout_user( server->flush_poll );
254     server->flush_poll = NULL;
255     set_event( server->event );
256     release_object( server->event );
257     server->event = NULL;
258 }
259
260 static void do_disconnect( struct pipe_server *server )
261 {
262     /* we may only have a server fd, if the client disconnected */
263     if (server->client)
264     {
265         assert( server->client->server == server );
266         assert( server->client->fd );
267         release_object( server->client->fd );
268         server->client->fd = NULL;
269     }
270     assert( server->fd );
271     release_object( server->fd );
272     server->fd = NULL;
273 }
274
275 static void pipe_server_destroy( struct object *obj)
276 {
277     struct pipe_server *server = (struct pipe_server *)obj;
278
279     assert( obj->ops == &pipe_server_ops );
280
281     if (server->fd)
282     {
283         notify_empty( server );
284         do_disconnect( server );
285     }
286
287     if (server->client)
288     {
289         server->client->server = NULL;
290         server->client = NULL;
291     }
292
293     async_terminate_head( &server->wait_q, STATUS_HANDLES_CLOSED );
294
295     assert( server->pipe->instances );
296     server->pipe->instances--;
297
298     list_remove( &server->entry );
299     release_object( server->pipe );
300 }
301
302 static void pipe_client_destroy( struct object *obj)
303 {
304     struct pipe_client *client = (struct pipe_client *)obj;
305     struct pipe_server *server = client->server;
306
307     assert( obj->ops == &pipe_client_ops );
308
309     if (server)
310     {
311         notify_empty( server );
312
313         switch(server->state)
314         {
315         case ps_connected_server:
316             /* Don't destroy the server's fd here as we can't
317                do a successful flush without it. */
318             server->state = ps_wait_disconnect;
319             release_object( client->fd );
320             client->fd = NULL;
321             break;
322         case ps_disconnected_server:
323             server->state = ps_wait_connect;
324             break;
325         case ps_idle_server:
326         case ps_wait_open:
327         case ps_wait_disconnect:
328         case ps_wait_connect:
329             assert( 0 );
330         }
331         assert( server->client );
332         server->client = NULL;
333         client->server = NULL;
334     }
335     assert( !client->fd );
336 }
337
338 static int pipe_data_remaining( struct pipe_server *server )
339 {
340     struct pollfd pfd;
341     int fd;
342
343     assert( server->client );
344
345     fd = get_unix_fd( server->client->fd );
346     if (fd < 0)
347         return 0;
348     pfd.fd = fd;
349     pfd.events = POLLIN;
350     pfd.revents = 0;
351
352     if (0 > poll( &pfd, 1, 0 ))
353         return 0;
354  
355     return pfd.revents&POLLIN;
356 }
357
358 static void check_flushed( void *arg )
359 {
360     struct pipe_server *server = (struct pipe_server*) arg;
361
362     assert( server->event );
363     if (pipe_data_remaining( server ))
364     {
365         struct timeval tv;
366
367         gettimeofday( &tv, NULL );
368         add_timeout( &tv, 100 );
369         server->flush_poll = add_timeout_user( &tv, check_flushed, server );
370     }
371     else
372     {
373         /* notify_empty( server ); */
374         server->flush_poll = NULL;
375         set_event( server->event );
376         release_object( server->event );
377         server->event = NULL;
378     }
379 }
380
381 static int pipe_server_flush( struct fd *fd, struct event **event )
382 {
383     struct pipe_server *server = get_fd_user( fd );
384
385     if (!server)
386         return 0;
387
388     if (server->state != ps_connected_server)
389         return 0;
390
391     /* FIXME: if multiple threads flush the same pipe,
392               maybe should create a list of processes to notify */
393     if (server->flush_poll)
394         return 0;
395
396     if (pipe_data_remaining( server ))
397     {
398         struct timeval tv;
399
400         /* this kind of sux - 
401            there's no unix way to be alerted when a pipe becomes empty */
402         server->event = create_event( NULL, 0, 0, 0 );
403         if (!server->event)
404             return 0;
405         gettimeofday( &tv, NULL );
406         add_timeout( &tv, 100 );
407         server->flush_poll = add_timeout_user( &tv, check_flushed, server );
408         *event = server->event;
409     }
410
411     return 0; 
412 }
413
414 static int pipe_client_flush( struct fd *fd, struct event **event )
415 {
416     /* FIXME: what do we have to do for this? */
417     return 0;
418 }
419
420 static inline int is_overlapped( unsigned int options )
421 {
422     return !(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT));
423 }
424
425 static int pipe_server_get_info( struct fd *fd )
426 {
427     struct pipe_server *server = get_fd_user( fd );
428     int flags = FD_FLAG_AVAILABLE;
429  
430     if (is_overlapped( server->options )) flags |= FD_FLAG_OVERLAPPED;
431
432     return flags;
433 }
434
435 static int pipe_client_get_info( struct fd *fd )
436 {
437     struct pipe_client *client = get_fd_user( fd );
438     int flags = FD_FLAG_AVAILABLE;
439
440     if (is_overlapped( client->flags )) flags |= FD_FLAG_OVERLAPPED;
441
442     return flags;
443 }
444
445 static struct named_pipe *create_named_pipe( const WCHAR *name, size_t len )
446 {
447     struct named_pipe *pipe;
448
449     pipe = create_named_object( sync_namespace, &named_pipe_ops, name, len );
450     if (pipe)
451     {
452         if (get_error() != STATUS_OBJECT_NAME_COLLISION)
453         {
454             /* initialize it if it didn't already exist */
455             pipe->instances = 0;
456             list_init( &pipe->servers );
457             list_init( &pipe->waiters );
458         }
459     }
460     return pipe;
461 }
462
463 static struct named_pipe *open_named_pipe( const WCHAR *name, size_t len )
464 {
465     struct object *obj;
466
467     if ((obj = find_object( sync_namespace, name, len )))
468     {
469         if (obj->ops == &named_pipe_ops) return (struct named_pipe *)obj;
470         release_object( obj );
471         set_error( STATUS_OBJECT_TYPE_MISMATCH );
472     }
473     else set_error( STATUS_OBJECT_NAME_NOT_FOUND );
474
475     return NULL;
476 }
477
478 static struct pipe_server *get_pipe_server_obj( struct process *process,
479                                 obj_handle_t handle, unsigned int access )
480 {
481     struct object *obj;
482     obj = get_handle_obj( process, handle, access, &pipe_server_ops );
483     return (struct pipe_server *) obj;
484 }
485
486 static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options )
487 {
488     struct pipe_server *server;
489
490     server = alloc_object( &pipe_server_ops );
491     if (!server)
492         return NULL;
493
494     server->fd = NULL;
495     server->pipe = pipe;
496     server->state = ps_idle_server;
497     server->client = NULL;
498     server->flush_poll = NULL;
499     server->options = options;
500     list_init( &server->wait_q );
501
502     list_add_head( &pipe->servers, &server->entry );
503     grab_object( pipe );
504
505     return server;
506 }
507
508 static struct pipe_client *create_pipe_client( struct pipe_server *server, unsigned int flags )
509 {
510     struct pipe_client *client;
511
512     client = alloc_object( &pipe_client_ops );
513     if (!client)
514         return NULL;
515
516     client->fd = NULL;
517     client->server = server;
518     client->flags = flags;
519
520     return client;
521 }
522
523 static inline struct pipe_server *find_server( struct named_pipe *pipe, enum pipe_state state )
524 {
525     struct pipe_server *server;
526
527     LIST_FOR_EACH_ENTRY( server, &pipe->servers, struct pipe_server, entry )
528     {
529         if (server->state == state) return (struct pipe_server *)grab_object( server );
530     }
531     return NULL;
532 }
533
534 static inline struct pipe_server *find_server2( struct named_pipe *pipe,
535                                                 enum pipe_state state1, enum pipe_state state2 )
536 {
537     struct pipe_server *server;
538
539     LIST_FOR_EACH_ENTRY( server, &pipe->servers, struct pipe_server, entry )
540     {
541         if (server->state == state1 || server->state == state2)
542             return (struct pipe_server *)grab_object( server );
543     }
544     return NULL;
545 }
546
547 DECL_HANDLER(create_named_pipe)
548 {
549     struct named_pipe *pipe;
550     struct pipe_server *server;
551
552     reply->handle = 0;
553     pipe = create_named_pipe( get_req_data(), get_req_data_size() );
554     if (!pipe)
555         return;
556
557     if (get_error() != STATUS_OBJECT_NAME_COLLISION)
558     {
559         pipe->insize = req->insize;
560         pipe->outsize = req->outsize;
561         pipe->maxinstances = req->maxinstances;
562         pipe->timeout = req->timeout;
563         pipe->flags = req->flags;
564     }
565     else
566     {
567         set_error( 0 );  /* clear the name collision */
568         if (pipe->maxinstances <= pipe->instances)
569         {
570             set_error( STATUS_PIPE_BUSY );
571             release_object( pipe );
572             return;
573         }
574         if ((pipe->maxinstances != req->maxinstances) ||
575             (pipe->timeout != req->timeout) ||
576             (pipe->flags != req->flags))
577         {
578             set_error( STATUS_ACCESS_DENIED );
579             release_object( pipe );
580             return;
581         }
582     }
583
584     server = create_pipe_server( pipe, req->options );
585     if (server)
586     {
587         reply->handle = alloc_handle( current->process, server,
588                                       GENERIC_READ|GENERIC_WRITE, req->inherit );
589         server->pipe->instances++;
590         release_object( server );
591     }
592
593     release_object( pipe );
594 }
595
596 DECL_HANDLER(open_named_pipe)
597 {
598     struct pipe_server *server;
599     struct pipe_client *client;
600     struct named_pipe *pipe;
601     int fds[2];
602
603     pipe = open_named_pipe( get_req_data(), get_req_data_size() );
604     if (!pipe)
605     {
606         set_error( STATUS_NO_SUCH_FILE );
607         return;
608     }
609
610     server = find_server2( pipe, ps_idle_server, ps_wait_open );
611     release_object( pipe );
612
613     if (!server)
614     {
615         set_error( STATUS_PIPE_NOT_AVAILABLE );
616         return;
617     }
618
619     client = create_pipe_client( server, req->flags );
620     if (client)
621     {
622         if (!socketpair( PF_UNIX, SOCK_STREAM, 0, fds ))
623         {
624             int res = 0;
625
626             assert( !client->fd );
627             assert( !server->fd );
628
629             /* for performance reasons, only set nonblocking mode when using
630              * overlapped I/O. Otherwise, we will be doing too much busy
631              * looping */
632             if (is_overlapped( req->flags ))
633                 res = fcntl( fds[1], F_SETFL, O_NONBLOCK );
634             if ((res != -1) && is_overlapped( server->options ))
635                 res = fcntl( fds[0], F_SETFL, O_NONBLOCK );
636
637             client->fd = create_anonymous_fd( &pipe_client_fd_ops,
638                                             fds[1], &client->obj );
639             server->fd = create_anonymous_fd( &pipe_server_fd_ops,
640                                             fds[0], &server->obj );
641             if (client->fd && server->fd && res != 1)
642             {
643                 if (server->state == ps_wait_open)
644                     async_terminate_head( &server->wait_q, STATUS_SUCCESS );
645                 assert( list_empty( &server->wait_q ) );
646                 server->state = ps_connected_server;
647                 server->client = client;
648                 client->server = server;
649                 reply->handle = alloc_handle( current->process, client,
650                                               req->access, req->inherit );
651             }
652         }
653         else
654             file_set_error();
655
656         release_object( client );
657     }
658     release_object( server );
659 }
660
661 DECL_HANDLER(connect_named_pipe)
662 {
663     struct pipe_server *server;
664
665     server = get_pipe_server_obj(current->process, req->handle, 0);
666     if (!server)
667         return;
668
669     switch(server->state)
670     {
671     case ps_idle_server:
672     case ps_wait_connect:
673         assert( !server->fd );
674         server->state = ps_wait_open;
675         create_async( current, NULL, &server->wait_q,
676                       req->func, req->overlapped, NULL );
677         async_terminate_queue( &server->pipe->waiters, STATUS_SUCCESS );
678         break;
679     case ps_connected_server:
680         assert( server->fd );
681         set_error( STATUS_PIPE_CONNECTED );
682         break;
683     case ps_disconnected_server:
684         set_error( STATUS_PIPE_BUSY );
685         break;
686     case ps_wait_disconnect:
687         set_error( STATUS_NO_DATA_DETECTED );
688         break;
689     case ps_wait_open:
690         set_error( STATUS_INVALID_HANDLE );
691         break;
692     }
693
694     release_object(server);
695 }
696
697 DECL_HANDLER(wait_named_pipe)
698 {
699     struct named_pipe *pipe;
700     struct pipe_server *server;
701
702     if (!(pipe = open_named_pipe( get_req_data(), get_req_data_size() )))
703     {
704         set_error( STATUS_PIPE_NOT_AVAILABLE );
705         return;
706     }
707     server = find_server( pipe, ps_wait_open );
708     if (server)
709     {
710         /* there's already a server waiting for a client to connect */
711         thread_queue_apc( current, NULL, req->func, APC_ASYNC_IO,
712                           1, req->overlapped, NULL, (void *)STATUS_SUCCESS );
713         release_object( server );
714     }
715     else
716     {
717         unsigned int timeout;
718         if (req->timeout == NMPWAIT_USE_DEFAULT_WAIT)
719             timeout = pipe->timeout;
720         else
721             timeout = req->timeout;
722
723         if (req->timeout == NMPWAIT_WAIT_FOREVER)
724             create_async( current, NULL, &pipe->waiters,
725                           req->func, req->overlapped, NULL );
726         else
727             create_async( current, &timeout, &pipe->waiters,
728                           req->func, req->overlapped, NULL );
729     }
730
731     release_object( pipe );
732 }
733
734 DECL_HANDLER(disconnect_named_pipe)
735 {
736     struct pipe_server *server;
737
738     reply->fd = -1;
739     server = get_pipe_server_obj( current->process, req->handle, 0 );
740     if (!server)
741         return;
742     switch(server->state)
743     {
744     case ps_connected_server:
745         assert( server->fd );
746         assert( server->client );
747         assert( server->client->fd );
748
749         notify_empty( server );
750
751         /* Dump the client and server fds, but keep the pointers
752            around - client loses all waiting data */
753         server->state = ps_disconnected_server;
754         do_disconnect( server );
755         reply->fd = flush_cached_fd( current->process, req->handle );
756         break;
757
758     case ps_wait_disconnect:
759         assert( !server->client );
760         assert( server->fd );
761         do_disconnect( server );
762         server->state = ps_wait_connect;
763         reply->fd = flush_cached_fd( current->process, req->handle );
764         break;
765
766     case ps_idle_server:
767     case ps_wait_open:
768     case ps_disconnected_server:
769     case ps_wait_connect:
770         set_error( STATUS_PIPE_DISCONNECTED );
771         break;
772     }
773     release_object( server );
774 }
775
776 DECL_HANDLER(get_named_pipe_info)
777 {
778     struct pipe_server *server;
779
780     server = get_pipe_server_obj( current->process, req->handle, 0 );
781     if (!server)
782         return;
783
784     reply->flags        = server->pipe->flags;
785     reply->maxinstances = server->pipe->maxinstances;
786     reply->insize       = server->pipe->insize;
787     reply->outsize      = server->pipe->outsize;
788
789     release_object(server);
790 }