quartz: Sign-compare warnings fix.
[wine] / dlls / ntdll / server.c
1 /*
2  * Wine server communication
3  *
4  * Copyright (C) 1998 Alexandre Julliard
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "config.h"
22 #include "wine/port.h"
23
24 #include <assert.h>
25 #include <ctype.h>
26 #ifdef HAVE_DIRENT_H
27 # include <dirent.h>
28 #endif
29 #include <errno.h>
30 #include <fcntl.h>
31 #include <signal.h>
32 #include <stdarg.h>
33 #include <stdio.h>
34 #include <string.h>
35 #include <sys/types.h>
36 #ifdef HAVE_SYS_SOCKET_H
37 # include <sys/socket.h>
38 #endif
39 #ifdef HAVE_SYS_WAIT_H
40 #include <sys/wait.h>
41 #endif
42 #ifdef HAVE_SYS_UN_H
43 #include <sys/un.h>
44 #endif
45 #ifdef HAVE_SYS_MMAN_H
46 #include <sys/mman.h>
47 #endif
48 #ifdef HAVE_SYS_STAT_H
49 # include <sys/stat.h>
50 #endif
51 #ifdef HAVE_SYS_UIO_H
52 #include <sys/uio.h>
53 #endif
54 #ifdef HAVE_UNISTD_H
55 # include <unistd.h>
56 #endif
57
58 #include "ntstatus.h"
59 #define WIN32_NO_STATUS
60 #include "wine/library.h"
61 #include "wine/pthread.h"
62 #include "wine/server.h"
63 #include "wine/debug.h"
64 #include "ntdll_misc.h"
65
66 WINE_DEFAULT_DEBUG_CHANNEL(server);
67
68 /* Some versions of glibc don't define this */
69 #ifndef SCM_RIGHTS
70 #define SCM_RIGHTS 1
71 #endif
72
73 #define SOCKETNAME "socket"        /* name of the socket file */
74 #define LOCKNAME   "lock"          /* name of the lock file */
75
76 #ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
77 /* data structure used to pass an fd with sendmsg/recvmsg */
78 struct cmsg_fd
79 {
80     struct
81     {
82         size_t len;   /* size of structure */
83         int    level; /* SOL_SOCKET */
84         int    type;  /* SCM_RIGHTS */
85     } header;
86     int fd;          /* fd to pass */
87 };
88 #endif  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
89
90 timeout_t server_start_time = 0;  /* time of server startup */
91
92 extern struct wine_pthread_functions pthread_functions;
93
94 sigset_t server_block_set;  /* signals to block during server calls */
95 static int fd_socket = -1;  /* socket to exchange file descriptors with the server */
96
97 static RTL_CRITICAL_SECTION fd_cache_section;
98 static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
99 {
100     0, 0, &fd_cache_section,
101     { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
102       0, 0, { (DWORD_PTR)(__FILE__ ": fd_cache_section") }
103 };
104 static RTL_CRITICAL_SECTION fd_cache_section = { &critsect_debug, -1, 0, 0, 0, 0 };
105
106
107 #ifdef __GNUC__
108 static void fatal_error( const char *err, ... ) __attribute__((noreturn, format(printf,1,2)));
109 static void fatal_perror( const char *err, ... ) __attribute__((noreturn, format(printf,1,2)));
110 static void server_connect_error( const char *serverdir ) __attribute__((noreturn));
111 #endif
112
113 /* die on a fatal error; use only during initialization */
114 static void fatal_error( const char *err, ... )
115 {
116     va_list args;
117
118     va_start( args, err );
119     fprintf( stderr, "wine: " );
120     vfprintf( stderr, err, args );
121     va_end( args );
122     exit(1);
123 }
124
125 /* die on a fatal error; use only during initialization */
126 static void fatal_perror( const char *err, ... )
127 {
128     va_list args;
129
130     va_start( args, err );
131     fprintf( stderr, "wine: " );
132     vfprintf( stderr, err, args );
133     perror( " " );
134     va_end( args );
135     exit(1);
136 }
137
138
139 /***********************************************************************
140  *           server_exit_thread
141  */
142 void server_exit_thread( int status )
143 {
144     struct wine_pthread_thread_info info;
145     SIZE_T size;
146     int fds[4];
147
148     RtlAcquirePebLock();
149     RemoveEntryList( &NtCurrentTeb()->TlsLinks );
150     RtlReleasePebLock();
151     RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->FlsSlots );
152     RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->TlsExpansionSlots );
153
154     info.stack_base  = NtCurrentTeb()->DeallocationStack;
155     info.teb_base    = NtCurrentTeb();
156     info.teb_sel     = wine_get_fs();
157     info.exit_status = status;
158
159     fds[0] = ntdll_get_thread_data()->wait_fd[0];
160     fds[1] = ntdll_get_thread_data()->wait_fd[1];
161     fds[2] = ntdll_get_thread_data()->reply_fd;
162     fds[3] = ntdll_get_thread_data()->request_fd;
163     pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, NULL );
164
165     size = 0;
166     NtFreeVirtualMemory( GetCurrentProcess(), &info.stack_base, &size, MEM_RELEASE | MEM_SYSTEM );
167     info.stack_size = size;
168
169     size = 0;
170     NtFreeVirtualMemory( GetCurrentProcess(), &info.teb_base, &size, MEM_RELEASE | MEM_SYSTEM );
171     info.teb_size = size;
172
173     close( fds[0] );
174     close( fds[1] );
175     close( fds[2] );
176     close( fds[3] );
177     pthread_functions.exit_thread( &info );
178 }
179
180
181 /***********************************************************************
182  *           server_abort_thread
183  */
184 void server_abort_thread( int status )
185 {
186     pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, NULL );
187     close( ntdll_get_thread_data()->wait_fd[0] );
188     close( ntdll_get_thread_data()->wait_fd[1] );
189     close( ntdll_get_thread_data()->reply_fd );
190     close( ntdll_get_thread_data()->request_fd );
191     pthread_functions.abort_thread( status );
192 }
193
194
195 /***********************************************************************
196  *           server_protocol_error
197  */
198 void server_protocol_error( const char *err, ... )
199 {
200     va_list args;
201
202     va_start( args, err );
203     fprintf( stderr, "wine client error:%x: ", GetCurrentThreadId() );
204     vfprintf( stderr, err, args );
205     va_end( args );
206     server_abort_thread(1);
207 }
208
209
210 /***********************************************************************
211  *           server_protocol_perror
212  */
213 void server_protocol_perror( const char *err )
214 {
215     fprintf( stderr, "wine client error:%x: ", GetCurrentThreadId() );
216     perror( err );
217     server_abort_thread(1);
218 }
219
220
221 /***********************************************************************
222  *           send_request
223  *
224  * Send a request to the server.
225  */
226 static unsigned int send_request( const struct __server_request_info *req )
227 {
228     unsigned int i;
229     int ret;
230
231     if (!req->u.req.request_header.request_size)
232     {
233         if ((ret = write( ntdll_get_thread_data()->request_fd, &req->u.req,
234                           sizeof(req->u.req) )) == sizeof(req->u.req)) return STATUS_SUCCESS;
235
236     }
237     else
238     {
239         struct iovec vec[__SERVER_MAX_DATA+1];
240
241         vec[0].iov_base = (void *)&req->u.req;
242         vec[0].iov_len = sizeof(req->u.req);
243         for (i = 0; i < req->data_count; i++)
244         {
245             vec[i+1].iov_base = (void *)req->data[i].ptr;
246             vec[i+1].iov_len = req->data[i].size;
247         }
248         if ((ret = writev( ntdll_get_thread_data()->request_fd, vec, i+1 )) ==
249             req->u.req.request_header.request_size + sizeof(req->u.req)) return STATUS_SUCCESS;
250     }
251
252     if (ret >= 0) server_protocol_error( "partial write %d\n", ret );
253     if (errno == EPIPE) server_abort_thread(0);
254     if (errno == EFAULT) return STATUS_ACCESS_VIOLATION;
255     server_protocol_perror( "write" );
256 }
257
258
259 /***********************************************************************
260  *           read_reply_data
261  *
262  * Read data from the reply buffer; helper for wait_reply.
263  */
264 static void read_reply_data( void *buffer, size_t size )
265 {
266     int ret;
267
268     for (;;)
269     {
270         if ((ret = read( ntdll_get_thread_data()->reply_fd, buffer, size )) > 0)
271         {
272             if (!(size -= ret)) return;
273             buffer = (char *)buffer + ret;
274             continue;
275         }
276         if (!ret) break;
277         if (errno == EINTR) continue;
278         if (errno == EPIPE) break;
279         server_protocol_perror("read");
280     }
281     /* the server closed the connection; time to die... */
282     server_abort_thread(0);
283 }
284
285
286 /***********************************************************************
287  *           wait_reply
288  *
289  * Wait for a reply from the server.
290  */
291 static inline unsigned int wait_reply( struct __server_request_info *req )
292 {
293     read_reply_data( &req->u.reply, sizeof(req->u.reply) );
294     if (req->u.reply.reply_header.reply_size)
295         read_reply_data( req->reply_data, req->u.reply.reply_header.reply_size );
296     return req->u.reply.reply_header.error;
297 }
298
299
300 /***********************************************************************
301  *           wine_server_call (NTDLL.@)
302  *
303  * Perform a server call.
304  *
305  * PARAMS
306  *     req_ptr [I/O] Function dependent data
307  *
308  * RETURNS
309  *     Depends on server function being called, but usually an NTSTATUS code.
310  *
311  * NOTES
312  *     Use the SERVER_START_REQ and SERVER_END_REQ to help you fill out the
313  *     server request structure for the particular call. E.g:
314  *|     SERVER_START_REQ( event_op )
315  *|     {
316  *|         req->handle = handle;
317  *|         req->op     = SET_EVENT;
318  *|         ret = wine_server_call( req );
319  *|     }
320  *|     SERVER_END_REQ;
321  */
322 unsigned int wine_server_call( void *req_ptr )
323 {
324     struct __server_request_info * const req = req_ptr;
325     sigset_t old_set;
326     unsigned int ret;
327
328     pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, &old_set );
329     ret = send_request( req );
330     if (!ret) ret = wait_reply( req );
331     pthread_functions.sigprocmask( SIG_SETMASK, &old_set, NULL );
332     return ret;
333 }
334
335
336 /***********************************************************************
337  *           server_enter_uninterrupted_section
338  */
339 void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset )
340 {
341     pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, sigset );
342     RtlEnterCriticalSection( cs );
343 }
344
345
346 /***********************************************************************
347  *           server_leave_uninterrupted_section
348  */
349 void server_leave_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset )
350 {
351     RtlLeaveCriticalSection( cs );
352     pthread_functions.sigprocmask( SIG_SETMASK, sigset, NULL );
353 }
354
355
356 /***********************************************************************
357  *           wine_server_send_fd   (NTDLL.@)
358  *
359  * Send a file descriptor to the server.
360  *
361  * PARAMS
362  *     fd [I] file descriptor to send
363  *
364  * RETURNS
365  *     nothing
366  */
367 void wine_server_send_fd( int fd )
368 {
369 #ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
370     struct cmsg_fd cmsg;
371 #endif
372     struct send_fd data;
373     struct msghdr msghdr;
374     struct iovec vec;
375     int ret;
376
377     vec.iov_base = (void *)&data;
378     vec.iov_len  = sizeof(data);
379
380     msghdr.msg_name    = NULL;
381     msghdr.msg_namelen = 0;
382     msghdr.msg_iov     = &vec;
383     msghdr.msg_iovlen  = 1;
384
385 #ifdef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
386     msghdr.msg_accrights    = (void *)&fd;
387     msghdr.msg_accrightslen = sizeof(fd);
388 #else  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
389     cmsg.header.len   = sizeof(cmsg.header) + sizeof(fd);
390     cmsg.header.level = SOL_SOCKET;
391     cmsg.header.type  = SCM_RIGHTS;
392     cmsg.fd           = fd;
393     msghdr.msg_control    = &cmsg;
394     msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
395     msghdr.msg_flags      = 0;
396 #endif  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
397
398     data.tid = GetCurrentThreadId();
399     data.fd  = fd;
400
401     for (;;)
402     {
403         if ((ret = sendmsg( fd_socket, &msghdr, 0 )) == sizeof(data)) return;
404         if (ret >= 0) server_protocol_error( "partial write %d\n", ret );
405         if (errno == EINTR) continue;
406         if (errno == EPIPE) server_abort_thread(0);
407         server_protocol_perror( "sendmsg" );
408     }
409 }
410
411
412 /***********************************************************************
413  *           receive_fd
414  *
415  * Receive a file descriptor passed from the server.
416  */
417 static int receive_fd( obj_handle_t *handle )
418 {
419     struct iovec vec;
420     int ret, fd;
421
422 #ifdef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
423     struct msghdr msghdr;
424
425     fd = -1;
426     msghdr.msg_accrights    = (void *)&fd;
427     msghdr.msg_accrightslen = sizeof(fd);
428 #else  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
429     struct msghdr msghdr;
430     struct cmsg_fd cmsg;
431
432     cmsg.header.len   = sizeof(cmsg.header) + sizeof(fd);
433     cmsg.header.level = SOL_SOCKET;
434     cmsg.header.type  = SCM_RIGHTS;
435     cmsg.fd           = -1;
436     msghdr.msg_control    = &cmsg;
437     msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
438     msghdr.msg_flags      = 0;
439 #endif  /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
440
441     msghdr.msg_name    = NULL;
442     msghdr.msg_namelen = 0;
443     msghdr.msg_iov     = &vec;
444     msghdr.msg_iovlen  = 1;
445     vec.iov_base = (void *)handle;
446     vec.iov_len  = sizeof(*handle);
447
448     for (;;)
449     {
450         if ((ret = recvmsg( fd_socket, &msghdr, 0 )) > 0)
451         {
452 #ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
453             fd = cmsg.fd;
454 #endif
455             if (fd != -1) fcntl( fd, F_SETFD, 1 ); /* set close on exec flag */
456             return fd;
457         }
458         if (!ret) break;
459         if (errno == EINTR) continue;
460         if (errno == EPIPE) break;
461         server_protocol_perror("recvmsg");
462     }
463     /* the server closed the connection; time to die... */
464     server_abort_thread(0);
465 }
466
467
468 /***********************************************************************/
469 /* fd cache support */
470
471 struct fd_cache_entry
472 {
473     int fd;
474     enum server_fd_type type : 6;
475     unsigned int        access : 2;
476     unsigned int        options : 24;
477 };
478
479 #define FD_CACHE_BLOCK_SIZE  (65536 / sizeof(struct fd_cache_entry))
480 #define FD_CACHE_ENTRIES     128
481
482 static struct fd_cache_entry *fd_cache[FD_CACHE_ENTRIES];
483 static struct fd_cache_entry fd_cache_initial_block[FD_CACHE_BLOCK_SIZE];
484
485 static inline unsigned int handle_to_index( obj_handle_t handle, unsigned int *entry )
486 {
487     unsigned long idx = ((unsigned long)handle >> 2) - 1;
488     *entry = idx / FD_CACHE_BLOCK_SIZE;
489     return idx % FD_CACHE_BLOCK_SIZE;
490 }
491
492
493 /***********************************************************************
494  *           add_fd_to_cache
495  *
496  * Caller must hold fd_cache_section.
497  */
498 static int add_fd_to_cache( obj_handle_t handle, int fd, enum server_fd_type type,
499                             unsigned int access, unsigned int options )
500 {
501     unsigned int entry, idx = handle_to_index( handle, &entry );
502     int prev_fd;
503
504     if (entry >= FD_CACHE_ENTRIES)
505     {
506         FIXME( "too many allocated handles, not caching %p\n", handle );
507         return 0;
508     }
509
510     if (!fd_cache[entry])  /* do we need to allocate a new block of entries? */
511     {
512         if (!entry) fd_cache[0] = fd_cache_initial_block;
513         else
514         {
515             void *ptr = wine_anon_mmap( NULL, FD_CACHE_BLOCK_SIZE * sizeof(struct fd_cache_entry),
516                                         PROT_READ | PROT_WRITE, 0 );
517             if (ptr == MAP_FAILED) return 0;
518             fd_cache[entry] = ptr;
519         }
520     }
521     /* store fd+1 so that 0 can be used as the unset value */
522     prev_fd = interlocked_xchg( &fd_cache[entry][idx].fd, fd + 1 ) - 1;
523     fd_cache[entry][idx].type = type;
524     fd_cache[entry][idx].access = access;
525     fd_cache[entry][idx].options = options;
526     if (prev_fd != -1) close( prev_fd );
527     return 1;
528 }
529
530
531 /***********************************************************************
532  *           get_cached_fd
533  *
534  * Caller must hold fd_cache_section.
535  */
536 static inline int get_cached_fd( obj_handle_t handle, enum server_fd_type *type,
537                                  unsigned int *access, unsigned int *options )
538 {
539     unsigned int entry, idx = handle_to_index( handle, &entry );
540     int fd = -1;
541
542     if (entry < FD_CACHE_ENTRIES && fd_cache[entry])
543     {
544         fd = fd_cache[entry][idx].fd - 1;
545         if (type) *type = fd_cache[entry][idx].type;
546         if (access) *access = fd_cache[entry][idx].access;
547         if (options) *options = fd_cache[entry][idx].options;
548     }
549     return fd;
550 }
551
552
553 /***********************************************************************
554  *           server_remove_fd_from_cache
555  */
556 int server_remove_fd_from_cache( obj_handle_t handle )
557 {
558     unsigned int entry, idx = handle_to_index( handle, &entry );
559     int fd = -1;
560
561     if (entry < FD_CACHE_ENTRIES && fd_cache[entry])
562         fd = interlocked_xchg( &fd_cache[entry][idx].fd, 0 ) - 1;
563
564     return fd;
565 }
566
567
568 /***********************************************************************
569  *           server_get_unix_fd
570  *
571  * The returned unix_fd should be closed iff needs_close is non-zero.
572  */
573 int server_get_unix_fd( obj_handle_t handle, unsigned int wanted_access, int *unix_fd,
574                         int *needs_close, enum server_fd_type *type, unsigned int *options )
575 {
576     sigset_t sigset;
577     obj_handle_t fd_handle;
578     int ret = 0, fd;
579     unsigned int access = 0;
580
581     *unix_fd = -1;
582     *needs_close = 0;
583     wanted_access &= FILE_READ_DATA | FILE_WRITE_DATA;
584
585     server_enter_uninterrupted_section( &fd_cache_section, &sigset );
586
587     fd = get_cached_fd( handle, type, &access, options );
588     if (fd != -1) goto done;
589
590     SERVER_START_REQ( get_handle_fd )
591     {
592         req->handle = handle;
593         if (!(ret = wine_server_call( req )))
594         {
595             if (type) *type = reply->type;
596             if (options) *options = reply->options;
597             access = reply->access;
598             if ((fd = receive_fd( &fd_handle )) != -1)
599             {
600                 assert( fd_handle == handle );
601                 *needs_close = (reply->removable ||
602                                 !add_fd_to_cache( handle, fd, reply->type,
603                                                   reply->access, reply->options ));
604             }
605             else ret = STATUS_TOO_MANY_OPENED_FILES;
606         }
607     }
608     SERVER_END_REQ;
609
610 done:
611     server_leave_uninterrupted_section( &fd_cache_section, &sigset );
612     if (!ret && ((access & wanted_access) != wanted_access))
613     {
614         ret = STATUS_ACCESS_DENIED;
615         if (*needs_close) close( fd );
616     }
617     if (!ret) *unix_fd = fd;
618     return ret;
619 }
620
621
622 /***********************************************************************
623  *           wine_server_fd_to_handle   (NTDLL.@)
624  *
625  * Allocate a file handle for a Unix file descriptor.
626  *
627  * PARAMS
628  *     fd      [I] Unix file descriptor.
629  *     access  [I] Win32 access flags.
630  *     attributes [I] Object attributes.
631  *     handle  [O] Address where Wine file handle will be stored.
632  *
633  * RETURNS
634  *     NTSTATUS code
635  */
636 int wine_server_fd_to_handle( int fd, unsigned int access, unsigned int attributes, obj_handle_t *handle )
637 {
638     int ret;
639
640     *handle = 0;
641     wine_server_send_fd( fd );
642
643     SERVER_START_REQ( alloc_file_handle )
644     {
645         req->access     = access;
646         req->attributes = attributes;
647         req->fd         = fd;
648         if (!(ret = wine_server_call( req ))) *handle = reply->handle;
649     }
650     SERVER_END_REQ;
651     return ret;
652 }
653
654
655 /***********************************************************************
656  *           wine_server_handle_to_fd   (NTDLL.@)
657  *
658  * Retrieve the file descriptor corresponding to a file handle.
659  *
660  * PARAMS
661  *     handle  [I] Wine file handle.
662  *     access  [I] Win32 file access rights requested.
663  *     unix_fd [O] Address where Unix file descriptor will be stored.
664  *     options [O] Address where the file open options will be stored. Optional.
665  *
666  * RETURNS
667  *     NTSTATUS code
668  */
669 int wine_server_handle_to_fd( obj_handle_t handle, unsigned int access, int *unix_fd,
670                               unsigned int *options )
671 {
672     int needs_close, ret = server_get_unix_fd( handle, access, unix_fd, &needs_close, NULL, options );
673
674     if (!ret && !needs_close)
675     {
676         if ((*unix_fd = dup(*unix_fd)) == -1) ret = FILE_GetNtStatus();
677     }
678     return ret;
679 }
680
681
682 /***********************************************************************
683  *           wine_server_release_fd   (NTDLL.@)
684  *
685  * Release the Unix file descriptor returned by wine_server_handle_to_fd.
686  *
687  * PARAMS
688  *     handle  [I] Wine file handle.
689  *     unix_fd [I] Unix file descriptor to release.
690  *
691  * RETURNS
692  *     nothing
693  */
694 void wine_server_release_fd( obj_handle_t handle, int unix_fd )
695 {
696     close( unix_fd );
697 }
698
699
700 /***********************************************************************
701  *           start_server
702  *
703  * Start a new wine server.
704  */
705 static void start_server(void)
706 {
707     static int started;  /* we only try once */
708     char *argv[3];
709     static char wineserver[] = "server/wineserver";
710     static char debug[] = "-d";
711
712     if (!started)
713     {
714         int status;
715         int pid = fork();
716         if (pid == -1) fatal_perror( "fork" );
717         if (!pid)
718         {
719             argv[0] = wineserver;
720             argv[1] = TRACE_ON(server) ? debug : NULL;
721             argv[2] = NULL;
722             wine_exec_wine_binary( argv[0], argv, getenv("WINESERVER") );
723             fatal_error( "could not exec wineserver\n" );
724         }
725         waitpid( pid, &status, 0 );
726         status = WIFEXITED(status) ? WEXITSTATUS(status) : 1;
727         if (status == 2) return;  /* server lock held by someone else, will retry later */
728         if (status) exit(status);  /* server failed */
729         started = 1;
730     }
731 }
732
733
734 /***********************************************************************
735  *           setup_config_dir
736  *
737  * Setup the wine configuration dir.
738  */
739 static void setup_config_dir(void)
740 {
741     const char *p, *config_dir = wine_get_config_dir();
742
743     if (chdir( config_dir ) == -1)
744     {
745         if (errno != ENOENT) fatal_perror( "chdir to %s\n", config_dir );
746
747         if ((p = strrchr( config_dir, '/' )) && p != config_dir)
748         {
749             struct stat st;
750             char *tmp_dir;
751
752             if (!(tmp_dir = malloc( p + 1 - config_dir ))) fatal_error( "out of memory\n" );
753             memcpy( tmp_dir, config_dir, p - config_dir );
754             tmp_dir[p - config_dir] = 0;
755             if (!stat( tmp_dir, &st ) && st.st_uid != getuid())
756                 fatal_error( "'%s' is not owned by you, refusing to create a configuration directory there\n",
757                              tmp_dir );
758             free( tmp_dir );
759         }
760
761         mkdir( config_dir, 0777 );
762         if (chdir( config_dir ) == -1) fatal_perror( "chdir to %s\n", config_dir );
763         MESSAGE( "wine: created the configuration directory '%s'\n", config_dir );
764     }
765
766     if (mkdir( "dosdevices", 0777 ) == -1)
767     {
768         if (errno == EEXIST) return;
769         fatal_perror( "cannot create %s/dosdevices\n", config_dir );
770     }
771
772     /* create the drive symlinks */
773
774     mkdir( "drive_c", 0777 );
775     symlink( "../drive_c", "dosdevices/c:" );
776     symlink( "/", "dosdevices/z:" );
777 }
778
779
780 /***********************************************************************
781  *           server_connect_error
782  *
783  * Try to display a meaningful explanation of why we couldn't connect
784  * to the server.
785  */
786 static void server_connect_error( const char *serverdir )
787 {
788     int fd;
789     struct flock fl;
790
791     if ((fd = open( LOCKNAME, O_WRONLY )) == -1)
792         fatal_error( "for some mysterious reason, the wine server never started.\n" );
793
794     fl.l_type   = F_WRLCK;
795     fl.l_whence = SEEK_SET;
796     fl.l_start  = 0;
797     fl.l_len    = 1;
798     if (fcntl( fd, F_GETLK, &fl ) != -1)
799     {
800         if (fl.l_type == F_WRLCK)  /* the file is locked */
801             fatal_error( "a wine server seems to be running, but I cannot connect to it.\n"
802                          "   You probably need to kill that process (it might be pid %d).\n",
803                          (int)fl.l_pid );
804         fatal_error( "for some mysterious reason, the wine server failed to run.\n" );
805     }
806     fatal_error( "the file system of '%s' doesn't support locks,\n"
807           "   and there is a 'socket' file in that directory that prevents wine from starting.\n"
808           "   You should make sure no wine server is running, remove that file and try again.\n",
809                  serverdir );
810 }
811
812
813 /***********************************************************************
814  *           server_connect
815  *
816  * Attempt to connect to an existing server socket.
817  * We need to be in the server directory already.
818  */
819 static int server_connect(void)
820 {
821     const char *serverdir;
822     struct sockaddr_un addr;
823     struct stat st;
824     int s, slen, retry, fd_cwd;
825
826     /* retrieve the current directory */
827     fd_cwd = open( ".", O_RDONLY );
828     if (fd_cwd != -1) fcntl( fd_cwd, F_SETFD, 1 ); /* set close on exec flag */
829
830     setup_config_dir();
831     serverdir = wine_get_server_dir();
832
833     /* chdir to the server directory */
834     if (chdir( serverdir ) == -1)
835     {
836         if (errno != ENOENT) fatal_perror( "chdir to %s", serverdir );
837         start_server();
838         if (chdir( serverdir ) == -1) fatal_perror( "chdir to %s", serverdir );
839     }
840
841     /* make sure we are at the right place */
842     if (stat( ".", &st ) == -1) fatal_perror( "stat %s", serverdir );
843     if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", serverdir );
844     if (st.st_mode & 077) fatal_error( "'%s' must not be accessible by other users\n", serverdir );
845
846     for (retry = 0; retry < 6; retry++)
847     {
848         /* if not the first try, wait a bit to leave the previous server time to exit */
849         if (retry)
850         {
851             usleep( 100000 * retry * retry );
852             start_server();
853             if (lstat( SOCKETNAME, &st ) == -1) continue;  /* still no socket, wait a bit more */
854         }
855         else if (lstat( SOCKETNAME, &st ) == -1) /* check for an already existing socket */
856         {
857             if (errno != ENOENT) fatal_perror( "lstat %s/%s", serverdir, SOCKETNAME );
858             start_server();
859             if (lstat( SOCKETNAME, &st ) == -1) continue;  /* still no socket, wait a bit more */
860         }
861
862         /* make sure the socket is sane (ISFIFO needed for Solaris) */
863         if (!S_ISSOCK(st.st_mode) && !S_ISFIFO(st.st_mode))
864             fatal_error( "'%s/%s' is not a socket\n", serverdir, SOCKETNAME );
865         if (st.st_uid != getuid())
866             fatal_error( "'%s/%s' is not owned by you\n", serverdir, SOCKETNAME );
867
868         /* try to connect to it */
869         addr.sun_family = AF_UNIX;
870         strcpy( addr.sun_path, SOCKETNAME );
871         slen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path) + 1;
872 #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
873         addr.sun_len = slen;
874 #endif
875         if ((s = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" );
876         if (connect( s, (struct sockaddr *)&addr, slen ) != -1)
877         {
878             /* switch back to the starting directory */
879             if (fd_cwd != -1)
880             {
881                 fchdir( fd_cwd );
882                 close( fd_cwd );
883             }
884             fcntl( s, F_SETFD, 1 ); /* set close on exec flag */
885             return s;
886         }
887         close( s );
888     }
889     server_connect_error( serverdir );
890 }
891
892
893 #ifdef __APPLE__
894 #include <mach/mach.h>
895 #include <mach/mach_error.h>
896 #include <servers/bootstrap.h>
897
898 /* send our task port to the server */
899 static void send_server_task_port(void)
900 {
901     mach_port_t bootstrap_port, wineserver_port;
902     kern_return_t kret;
903
904     struct {
905         mach_msg_header_t           header;
906         mach_msg_body_t             body;
907         mach_msg_port_descriptor_t  task_port;
908     } msg;
909
910     if (task_get_bootstrap_port(mach_task_self(), &bootstrap_port) != KERN_SUCCESS) return;
911
912     kret = bootstrap_look_up(bootstrap_port, (char*)wine_get_server_dir(), &wineserver_port);
913     if (kret != KERN_SUCCESS)
914         fatal_error( "cannot find the server port: 0x%08x\n", kret );
915
916     mach_port_deallocate(mach_task_self(), bootstrap_port);
917
918     msg.header.msgh_bits        = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) | MACH_MSGH_BITS_COMPLEX;
919     msg.header.msgh_size        = sizeof(msg);
920     msg.header.msgh_remote_port = wineserver_port;
921     msg.header.msgh_local_port  = MACH_PORT_NULL;
922
923     msg.body.msgh_descriptor_count  = 1;
924     msg.task_port.name              = mach_task_self();
925     msg.task_port.disposition       = MACH_MSG_TYPE_COPY_SEND;
926     msg.task_port.type              = MACH_MSG_PORT_DESCRIPTOR;
927
928     kret = mach_msg_send(&msg.header);
929     if (kret != KERN_SUCCESS)
930         server_protocol_error( "mach_msg_send failed: 0x%08x\n", kret );
931
932     mach_port_deallocate(mach_task_self(), wineserver_port);
933 }
934 #endif  /* __APPLE__ */
935
936 /***********************************************************************
937  *           server_init_process
938  *
939  * Start the server and create the initial socket pair.
940  */
941 void server_init_process(void)
942 {
943     obj_handle_t dummy_handle;
944     const char *env_socket = getenv( "WINESERVERSOCKET" );
945
946     if (env_socket)
947     {
948         fd_socket = atoi( env_socket );
949         if (fcntl( fd_socket, F_SETFD, 1 ) == -1)
950             fatal_perror( "Bad server socket %d", fd_socket );
951         unsetenv( "WINESERVERSOCKET" );
952     }
953     else fd_socket = server_connect();
954
955     /* setup the signal mask */
956     sigemptyset( &server_block_set );
957     sigaddset( &server_block_set, SIGALRM );
958     sigaddset( &server_block_set, SIGIO );
959     sigaddset( &server_block_set, SIGINT );
960     sigaddset( &server_block_set, SIGHUP );
961     sigaddset( &server_block_set, SIGUSR1 );
962     sigaddset( &server_block_set, SIGUSR2 );
963     sigaddset( &server_block_set, SIGCHLD );
964     pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, NULL );
965
966     /* receive the first thread request fd on the main socket */
967     ntdll_get_thread_data()->request_fd = receive_fd( &dummy_handle );
968
969 #ifdef __APPLE__
970     send_server_task_port();
971 #endif
972 }
973
974
975 /***********************************************************************
976  *           server_init_process_done
977  */
978 NTSTATUS server_init_process_done(void)
979 {
980     PEB *peb = NtCurrentTeb()->Peb;
981     IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
982     NTSTATUS status;
983
984     /* Install signal handlers; this cannot be done earlier, since we cannot
985      * send exceptions to the debugger before the create process event that
986      * is sent by REQ_INIT_PROCESS_DONE.
987      * We do need the handlers in place by the time the request is over, so
988      * we set them up here. If we segfault between here and the server call
989      * something is very wrong... */
990     signal_init_process();
991
992     /* Signal the parent process to continue */
993     SERVER_START_REQ( init_process_done )
994     {
995         req->module = peb->ImageBaseAddress;
996         req->entry  = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint;
997         req->gui    = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
998         status = wine_server_call( req );
999     }
1000     SERVER_END_REQ;
1001
1002     return status;
1003 }
1004
1005
1006 /***********************************************************************
1007  *           server_init_thread
1008  *
1009  * Send an init thread request. Return 0 if OK.
1010  */
1011 size_t server_init_thread( int unix_pid, int unix_tid, void *entry_point )
1012 {
1013     int version, ret;
1014     int reply_pipe[2];
1015     struct sigaction sig_act;
1016     size_t info_size;
1017
1018     sig_act.sa_handler = SIG_IGN;
1019     sig_act.sa_flags   = 0;
1020     sigemptyset( &sig_act.sa_mask );
1021
1022     /* ignore SIGPIPE so that we get an EPIPE error instead  */
1023     sigaction( SIGPIPE, &sig_act, NULL );
1024     /* automatic child reaping to avoid zombies */
1025 #ifdef SA_NOCLDWAIT
1026     sig_act.sa_flags |= SA_NOCLDWAIT;
1027 #endif
1028     sigaction( SIGCHLD, &sig_act, NULL );
1029
1030     /* create the server->client communication pipes */
1031     if (pipe( reply_pipe ) == -1) server_protocol_perror( "pipe" );
1032     if (pipe( ntdll_get_thread_data()->wait_fd ) == -1) server_protocol_perror( "pipe" );
1033     wine_server_send_fd( reply_pipe[1] );
1034     wine_server_send_fd( ntdll_get_thread_data()->wait_fd[1] );
1035     ntdll_get_thread_data()->reply_fd = reply_pipe[0];
1036     close( reply_pipe[1] );
1037
1038     /* set close on exec flag */
1039     fcntl( ntdll_get_thread_data()->reply_fd, F_SETFD, 1 );
1040     fcntl( ntdll_get_thread_data()->wait_fd[0], F_SETFD, 1 );
1041     fcntl( ntdll_get_thread_data()->wait_fd[1], F_SETFD, 1 );
1042
1043     SERVER_START_REQ( init_thread )
1044     {
1045         req->unix_pid    = unix_pid;
1046         req->unix_tid    = unix_tid;
1047         req->teb         = NtCurrentTeb();
1048         req->peb         = NtCurrentTeb()->Peb;
1049         req->entry       = entry_point;
1050         req->ldt_copy    = &wine_ldt_copy;
1051         req->reply_fd    = reply_pipe[1];
1052         req->wait_fd     = ntdll_get_thread_data()->wait_fd[1];
1053         req->debug_level = (TRACE_ON(server) != 0);
1054         ret = wine_server_call( req );
1055         NtCurrentTeb()->ClientId.UniqueProcess = ULongToHandle(reply->pid);
1056         NtCurrentTeb()->ClientId.UniqueThread  = ULongToHandle(reply->tid);
1057         info_size         = reply->info_size;
1058         version           = reply->version;
1059         server_start_time = reply->server_start;
1060     }
1061     SERVER_END_REQ;
1062
1063     if (ret) server_protocol_error( "init_thread failed with status %x\n", ret );
1064     if (version != SERVER_PROTOCOL_VERSION)
1065         server_protocol_error( "version mismatch %d/%d.\n"
1066                                "Your %s binary was not upgraded correctly,\n"
1067                                "or you have an older one somewhere in your PATH.\n"
1068                                "Or maybe the wrong wineserver is still running?\n",
1069                                version, SERVER_PROTOCOL_VERSION,
1070                                (version > SERVER_PROTOCOL_VERSION) ? "wine" : "wineserver" );
1071     return info_size;
1072 }