diff options
Diffstat (limited to 'winsup/cygserver')
32 files changed, 0 insertions, 15950 deletions
diff --git a/winsup/cygserver/ChangeLog b/winsup/cygserver/ChangeLog deleted file mode 100644 index d7c7ed9d9..000000000 --- a/winsup/cygserver/ChangeLog +++ /dev/null @@ -1,612 +0,0 @@ -2009-08-18 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (CXXFLAGS): Allow override. - -2009-03-26 Yaakov Selkowitz <yselkowitz@cygwin.com> - - * README: Remove "How to use" section, as CYGWIN="server" is - no longer required. - -2009-03-20 Corinna Vinschen <corinna@vinschen.de> - - * cygserver-config: Remove misleading text describing the - "CYGWIN=server" setting for the client. - -2009-02-23 Sjors Gielen <mailinglist@dazjorz.com> - - * Makefile.in: Add DESTDIR functionality. - -2009-01-21 Corinna Vinschen <corinna@vinschen.de> - - * client.cc (allow_server): Remove variable. - (client_request_get_version::client_request_get_version): Drop checking - allow_server. - -2009-01-03 Christopher Faylor <me+cygwin@cgf.cx> - - * Makefile.in (CFLAGS): Look in cygwin's build directory for header - files. - -2008-12-15 Corinna Vinschen <corinna@vinschen.de> - - * setpwd.cc (client_request_setpwd::serve): Don't treat removing - non-existant private data as error. - -2008-12-15 Corinna Vinschen <corinna@vinschen.de> - - * setpwd.cc (client_request_setpwd::serve): Explicitely erase password - buffer content after usage. - -2008-11-26 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (OBJS): Add setpwd.o. - * README: Explain new service to store passwords in the LSA registry - area. - * bsd_helper.cc (get_token_info): Make externally available. - * bsd_helper.h (get_token_info): Declare. - * client.cc (client_request::handle_request): Add case for - CYGSERVER_REQUEST_SETPWD request. - * setpwd.cc: New file implementing the CYGSERVER_REQUEST_SETPWD - request. - -2008-10-30 Christopher Faylor <me+cygwin@cgf.cx> - - * Makefile.in: Use -static-libgcc when creating cygserver.exe. - -2008-04-30 Corinna Vinschen <corinna@vinschen.de> - - * sysv_msg.cc: Add fix from upstream version 1.65. - (msgsnd): Call msleep with timeout value. Handle EWOULDBLOCK. Make - sure it's clear from where msleep has been called in debug output. - (msgrcv): Make sure it's clear from where msleep has been called in - debug output. - -2008-02-06 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc: Replace %E __small_printf format specifier with %lu - and call to GetLastError throughout. - * bsd_mutex.cc: Ditto. - * sysv_sem.cc (semget): Replace %X __small_printf format specifier - with %llx. - -2008-02-06 Corinna Vinschen <corinna@vinschen.de> - - Remove dependency from Cygwin internal code. - * Makefile.in (CYGWIN_OBJS): Remove smallprint.o. - (cygserver.exe): Remove strfuncs.o - (strfuncs.o): Drop rule. - * bsd_log.cc (_vlog): Use snprintf/vsnprintf instead of - __small_sprintf/__small_vsprintf. - * sysv_sem.cc (seminit): Use sys_malloc instead of malloc. Use - snprintf instead of __small_sprintf. - (semunload): Free the above allocated sema_mtx names here. - -2008-02-03 Brian Dessent <brian@dessent.net> - - * Makefile.in: Don't link strfuncs.o from the Cygwin build dir. - Build it again with __OUTSIDE_CYGWIN__ defined. - -2007-11-05 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc (tunable_params): Add kern.ipc.shm_allow_removed as - bool parameter. - * cygserver.conf: Add a description for the kern.ipc.shm_allow_removed - parameter. - * sysv_shm.cc (shminit): Set shm_allow_removed variable according to - kern.ipc.shm_allow_removed setting. - -2007-08-02 Corinna Vinschen <corinna@vinschen.de> - - * smallprint.c: Remove. - -2007-08-02 Christopher Faylor <me+cygwin@cgf.cx> - - * Makefile.in: Add -lntdll to link line. - (CYGWIN_OBJS): Include strfuncs.o. - -2007-08-02 Corinna Vinschen <corinna@vinschen.de> - - * smallprint.c: New file. - * Makefile.in (OBJS): Add smallprint.o. - (CYGWIN_OBJS): Remove smallprint.o from Cygwin dir. - -2007-07-21 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc: Drop unnecessary security.h include. - -2007-02-23 Corinna Vinschen <corinna@vinschen.de> - - Throughout remove using wincap. - * Makefile.in (OBJS): Remove wincap.o. - * README: Don't mention 9x. - * bsd_mutex.cc (_mtx_unlock): Drop checking for 9x error codes. - * cygserver.cc (server_submission_loop::request_loop): Add FIXME - comment. - * wincap.cc: Remove. - * wincap.h: Remove. - * woutsup.h: Don't include wincap.h. - -2007-02-22 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (OBJS): Drop transport_sockets.o. - * sysv_shm.cc (shmget_allocate_segment): Remove spurious cast. - * transport.cc: Don't include transport_sockets.h. - (create_server_transport): Always create transport_layer_pipes. - * transport_sockets.cc: Remove. - * transport_sockets.h: Remove. - -2006-05-24 Christopher Faylor <cgf@timesys.com> - - * configure.in: Update to newer autoconf. - (thanks to Steve Ellcey) - * configure: Regenerate. - * aclocal.m4: New file. - -2006-01-12 Corinna Vinschen <corinna@vinschen.de> - - * wincap.cc: New file. - * wincap.h: New file. - * Makefile.in: Accomodate having our own wincap implementation now. - -2006-01-09 Corinna Vinschen <corinna@vinschen.de> - - Check FreeBSD upstream changes and apply important patches. - * sysv_sem.cc (__semctl): Check copyin return value (from 1.76). - * sysv_shm.cc (shminit): Actually use the iterating variable in the - for loop when trying to avoid overflow (from 1.102). - -2005-11-10 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc (securityinit): New function. Move initialization - of security related variables from ipcinit here. - * bsd_helper.h (securityinit): Add prototype. - * cygserver.cc (main): Call securityinit right after wincap.init. - -2005-11-10 Corinna Vinschen <corinna@vinschen.de> - - * bsd_log.cc (_vpanic): LOG_EMERG is overkill, use LOG_CRIT. - -2005-11-09 Corinna Vinschen <corinna@vinschen.de> - - * process.cc (process_cache::process): Fix maximum process condition. - -2005-10-24 Corinna Vinschen <corinna@vinschen.de> - - * README: Add description for new -p/--process-cache option. - * bsd_helper.cc (default_tun_check): Add kern.srv.process_cache_size - entry to tunable_params. Set max value of kern.srv.request_threads - to 310. - * cygserver.cc (SERVER_VERSION): Set to 1.20. - (print_usage): Print usage of new parameter -p. - (main): Add process cache parameter handling. Accomodate new max - value of request threads. - * cygserver.conf: Add kern.srv.process_cache_size tunable parameter. - Accomodate new max value of kern.srv.request_threads. - * process.cc: Fix a comment. - (process_cache::process_cache): Add max process cache size parameter. - Change _cache_add_trigger to manual reset event. - (struct pcache_wait_t): New struct used as parameter to - pcache_wait_thread. - (pcache_wait_thread): New thread function used for threaded process - cache. - (process_cache::wait_for_processes): Use threaded waiting if number - of processes to wait for is bigger than 62. Always check all processes - to avoid race under heavy load. - (process_cache::sync_wait_array): Remove useless assert. Reset - _cache_add_trigger right at the start since it's manual reset now. - Accomodate threaded waiting. - * process.h (process_cache::process_cache): Add max_procs parameter. - (process_cache::_max_process_count): New member. - (process_cache::_wait_array: Raise to allow up to 5 wait threads. - (process_cache::_process_array): Ditto. - -2005-08-08 Christopher Faylor <cgf@timesys.com> - - * cygserver.cc (main): Call wincap.init() earlier to avoid a NULL - dereference. - -2005-06-14 Corinna Vinschen <corinna@vinschen.de> - - * sysv_sem.cc (semu_list): Define static to avoid gcc 4.x compiler - warning. - -2005-04-08 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (msleep_cnt): Remove. - (msleep_max_cnt): Remove. - (msleep_arr): Remove. - (class msleep_sync_array): New class to encapsulate msleep/wakeup - thread synchronization. - (msleep_sync): New object pointer. - (msleep_init): Initialize new msleep_sync object. - (_mutex): Just call msleep_sync->enter() and msleep_sync->leave() for - thread synchronization. Improve debug output a bit more. - (wakeup): Just call msleep_sync->wakeup(). - (wakeup_all): Whitespace fix. - -2005-04-06 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc (ipcexit_hookthread): Fix whitespace and handle leak. - * bsd_mutex.cc: Include stdlib.h, sys/msg.h and sys/sem.h. - (mtx_init): Initialize lock counter to 0. - (_mtx_lock): Increment and log mutex lock counter. - (mtx_owned): Add winpid argument. Return true only if mutex is - actually owned by process winpid. - (_mtx_assert): Add winpid argument accordingly. - (_mtx_unlock): Log owner and lock count. - (MSLEEP_MUTEX): Remove. - (MSLEEP_SEM): Ditto. - (MSLEEP_EVENT): Ditto. - (msleep_event_name): Ditto. - (msleep_cs): New global critical section. - (msleep_cnt): New global variable indicating msleep record usage. - (msleep_max_cnt): New global variable indicating msleep record size. - (msleep_arr): New global pointer to msleep records. - (msleep_init): Initialize msleep_cs. Allocate msleep_arr array. - (_msleep): Rewrite using new msleep_cs/msleep_arr based thread - synchronization. Don't be shy with debug output. - (wakeup): Rewrite using new msleep_cs/msleep_arr based thread - synchronization. - * bsd_mutex.h (struct mtx): Add lock counter for better debugging. - (mtx_owned): Declare with winpid argument. - (_mtx_assert): Ditto. - (mtx_assert): Define with winpid argument. - * cygserver.cc (version): Remove. - (SERVER_VERSION): New define, decoupling server version information - from source code control system. - (print_version): Simplify printing server version. - * process.cc (process::process): Fix wrong bracketing (and handle leak). - (process::~process): Only try to close _signal_arrived if valid. - * sysv_sem.cc: Include sys/smallprint.h. - (semundo_clear): Define with additional struct thread pointer argument. - Accomodate throughout. - (SEMUNDO_LOCKASSERT): Define with winpid argument. Accomodate - throughout. - (struct sem_undo): Define un_proc as pid_t on Cygwin. Accomodate - throughout. - (seminit): Improve debugging by adding the semid to the mutex name. - (semget): Correctly print key value as 64 bit hex value in debug - output. - (semexit_myhook): Remove Cygwin specific unlocking of mutexes owned - by exiting process. Keep semaphore global lock throughout whole - function to avoid races. - * sysv_shm.cc (GIANT_REQUIRED): Define empty on Cygwin. We know that - Giant is locked. - -2005-04-01 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Whitespace fix. - * process.cc (process::process): Handle invalid signal_arrived values - more gracefully. - -2004-12-30 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc: Include limits.h. - (MSLEEP_MUTEX): New define for third parameter to msleep_event_name. - (MSLEEP_SEM): Ditto. - (MSLEEP_EVENT): Ditto. - (msleep_event_name): Add third parameter to allow multiple - synchronization objects per ident. - (_msleep): Implement new synchronization technique to make sure - that all threads have been woken up by a corresponding wakeup call. - (wakeup): Ditto. - -2004-10-18 Corinna Vinschen <corinna@vinschen.de> - - * sysv_sem.cc: Redefine offsetof to circumvent build problems with - gcc 3.4. - -2004-10-04 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Simplify event creation. Revert change from - 2004-08-24. It should be unnecessary now. - * msg.cc (client_request_msg::serve): Release process critical - section as early as possible. - * sem.cc (client_request_sem::serve): Ditto. - * shm.cc (client_request_shm::serve): Ditto. - * process.cc: Use hold and release method calls instead of - EnterCriticalSection/LeaveCriticalSection calls throughout. - * process.h (_hold): Rename from hold. Take filename and linenumber - parameter for logging. Define matching hold macro. - (release): Ditto. - -2004-10-01 Corinna Vinschen <corinna@vinschen.de> - - * sysv_sem.cc: Update to FreeBSD version 1.69. - 1.68: Reduce the overhead of semop() by using the kernel stack - instead of malloc'd memory to store the operations array if it - is small enough to fit. - 1.69: Adjust the number of processes waiting on a semaphore properly - if we're woken up in the middle of sleeping. - -2004-09-23 Corinna Vinschen <corinna@vinschen.de> - - * sysv_shm.cc (kern_shmat): Avoid compiler warning. - -2004-09-21 Corinna Vinschen <corinna@vinschen.de> - - * sysv_shm.cc (vm_object_reference): remove Cygwin specific define. - (vm_map_find): Ditto. - (vm_map_inherit): Ditto. - (kern_shmat): On Cygwin, take shmaddr just as is. Don't call vm - system calls on Cygwin. Add comment. - -2004-09-15 Corinna Vinschen <corinna@vinschen.de> - - Fix copyright throughout. - Eliminate use of _impure_ptr outside Cygwin. - * bsd_helper.cc: Include errno.h instead of cygerrno.h. - * bsd_mutex.cc : Ditto. - * client.cc: Ditto. - * cygserver.cc: Ditto. - * process.cc: Don't build functions inside Cygwin. Don't include - cygerrno.h. Don't set errno. - * transport_pipes.cc (SET_ERRNO): New define. Use througout. - * transport_sockets.cc (SET_ERRNO): Ditto. - (GET_ERRNO): Ditto. - -2004-09-06 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Disable resetting event object for now. - -2004-08-31 Corinna Vinschen <corinna@vinschen.de> - - * sysv_shm.cc (kern_shmat): Add debug_printf's. - -2004-08-24 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Release process object while waiting. - -2004-08-03 Corinna Vinschen <corinna@vinschen.de> - - * transport.cc (transport_layer_base::~transport_layer_base): Resurrect. - * transport.h (transport_layer_base::~transport_layer_base): Ditto. - -2004-07-30 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Reset event object and close it before - entering mutex. Turn order of conditional for better readability. - -2004-07-26 Corinna Vinschen <corinna@vinschen.de> - - * cygserver.conf: Describe relation between shmmaxpgs and SHMMAX. - -2004-07-20 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc: Whitespace fixes. - * bsd_mutex.cc: Ditto. - -2004-07-19 Corinna Vinschen <corinna@vinschen.de> - - * transport.cc (transport_layer_base::~transport_layer_base): Remove. - * transport.h (transport_layer_base::~transport_layer_base): Ditto. - -2004-07-19 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (win_priority): Actually calculate p from priority. - -2004-06-03 Corinna Vinschen <corinna@vinschen.de> - - * shm.cc (shmget): Explicitely set td_retval[0] to -1 on error. - -2004-03-30 Corinna Vinschen <corinna@vinschen.de> - - * sysv_shm.cc (shmget): Allow to retrieve shared memory segments - by shmid when IPC_KEY_IS_SHMID is set. - -2004-03-02 Corinna Vinschen <corinna@vinschen.de> - - * sysv_sem.cc (semundo_adjust): Check for process id instead of - process struct pointer, which isn't fixed under Cygwin. - (semexit_myhook): Ditto. Adjust debug print statements to print - Cygwin and Windows PIDs instead of process pointer under Cygwin. - -2004-02-07 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (win_priority): Move to msleep helper function section. - (set_priority): Ditto. Fix formatting. - (_msleep): Cleanup obj formatting. Rearrange obj order. - -2004-02-06 Corinna Vinschen <corinna@vinschen.de> - - * bsd_mutex.cc (_msleep): Handle PCATCH using signal_arrived event. - * client.cc: Include sigproc.h. - * msg.cc (client_request_msg::serve): Accomodate third parameter to - process::process. - * sem.cc (client_request_sem::serve): Ditto. - * shm.cc (client_request_shm::serve): Ditto. - * process.cc (process::process): Duplicate signal_arrived into - Cygserver process space. - (process::~process): Close _signal_arrived handle. - (process_cache::process): Add signal_arrived handling. - * process.h (process::process): Add signal_arrived parameter. - (process:signal_arrived): New read accessor. - (process:_signal_arrived): New member. - (process_cache::process): Add signal_arrived parameter. - -2004-01-16 Corinna Vinschen <corinna@vinschen.de> - - * process.h (cleanup_routine::~cleanup_routine): Make pure virtual - function to avoid miscompilation with certain versions of gcc. - * process.cc (cleanup_routine::~cleanup_routine): Remove. - -2003-12-26 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (CFLAGS, CXXFLAGS): Remove unneeded include. - (CYGWIN_LIB): Delete. - (cygserver.exe target): Add -L$(cygwin_build) to the link line to force - linker to use build tree version of the library. Remove specific - inclusion of libcygwin.a from the link line. - -2003-12-16 Corinna Vinschen <corinna@vinschen.de> - - * bsd_helper.cc (tunable_params): Add entries for kern.ipc.msgmnb and - kern.ipc.msgtql. Raise max value for kern.ipc.msgseg to 65535. - * cygserver.conf: Add kern.ipc.msgmnb and kern.ipc.msgtql. - * sysv_msg.cc (msginit): Add TUNABLE_INT_FETCH call for - kern.ipc.msgmnb and kern.ipc.msgtql. - -2003-11-26 Corinna Vinschen <corinna@vinschen.de> - - * cygserver.cc (main): Move call to ipcinit() up before installing - any threads. - * sysv_sem.cc: Update to FreeBSD version 1.67. - (seminit): Initialize semaphore sequence numbers to 0. - -2003-11-26 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (CYGWIN_LIB): Variable pointing to libcygwin.a in - the parallel cygwin dir. - (cygserver.exe): Depend on and link against $CYGWIN_LIB. - -2003-11-25 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (CXXFLAGS): Remove duplicate options handled in - Makefile.common. - -2003-11-22 Corinna Vinschen <corinna@vinschen.de> - - * msg.cc (client_request_msg::serve): Add default case to msgop switch. - * sem.cc (client_request_sem::serve): Add default case to semop switch. - * shm.cc (client_request_shm::serve): Add default case to shmop switch. - -2003-11-21 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (install): Explicitely create directories. Install - README to $(prefix)/share/doc/Cygwin. - * README: New file. - -2003-11-21 Corinna Vinschen <corinna@vinschen.de> - - * cygserver.cc (print_usage): Fix scrambled output. - -2003-11-20 Corinna Vinschen <corinna@vinschen.de> - - * cygserver-config: Slightly modify printed message. - -2003-11-20 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (install): Install cygserver-config script to bindir. - * cygserver-config: New script. - -2003-11-19 Corinna Vinschen <corinna@vinschen.de> - - Don't use safe_new but new throughout. Fix copyright dates - throughout. - * Makefile.in: Accomodate all new files and name changes. - Add a *.d dependency. - (sbindir): Add. - (etcdir): Drop in favor of more appropriate sysconfdir definition. - (sysconfdir): Add. - (CXXFLAGS): Add -MMD flag. Add SYSCONFDIR definition. - (.SUFFIXES): Add. - (install): Add action items. - (libclean): New target. - (fullclean): Ditto. - * bsd_helper.cc: New file. - * bsd_helper.h: Ditto. - * bsd_log.cc: Ditto. - * bsd_log.h: Ditto. - * bsd_mutex.cc: Ditto. - * bsd_mutex.h: Ditto. - * client.cc: Rearrange to build as less as possible if - __INSIDE_CYGWIN__. - (client_request::handle_request): Add Message Queue and Semaphore - handling. - * cygserver.cc: Rearrange to build as less as possible if - __INSIDE_CYGWIN__. Use new debug/log/panic logging functions. - (DEF_CONFIG_FILE): New definition for configuration file. Use - throughout. - (getfunc): Remove. - (__cygserver__printf): Remove. - (client_request_attach_tty::serve): Return error if impersonation - fails. - (print_usage): Pump up help message. - (print_version): Add output of default configuration file. - (main): Accommodate new options. Allow overwrite of threading options - from config file. Call several new initialization functions. Drop - printing dots. Don't define SIGHANDLE inline. - * cygserver.conf: New file. - * cygserver_process.h: Rename to process.h. - * cygserver_transport.h: Rename to transport.h. - * cygserver_transport_pipes.h: Rename to transport_pipes.h. - * cygserver_transport_sockets.h: Rename to transport_sockets.h. - * msg.cc: Rewrite. - * sem.cc: Rewrite. - * shm.cc: Rewrite. - * sysv_msg.cc: New file, derived from FreeBSD version 1.52. - * sysv_sem.cc: New file, derived from FreeBSD version 1.66. - * sysv_shm.cc: New file, derived from FreeBSD version 1.89. - * threaded_queue.cc: Rearrange to build as less as possible if - __INSIDE_CYGWIN__. - * transport.cc (transport_layer_base::impersonate_client): Define bool. - (transport_layer_base::revert_to_self): Ditto. - * transport.h (transport_layer_base::impersonate_client): Declare bool. - (transport_layer_base::revert_to_self): Ditto. - * transport_pipes.cc (transport_layer_pipes::transport_layer_pipes): - Don't call init_security. - (init_security): Remove. - (transport_layer_pipes::accept): Use global sec_all_nih. - (transport_layer_pipes::connect): Ditto. - (transport_layer_pipes::impersonate_client): Define bool. - (transport_layer_pipes::revert_to_self): Ditt. - * transport_pipes.h (transport_layer_pipes::impersonate_client): Declare - bool. - (transport_layer_pipes::revert_to_self): Ditto. - * woutsup.h: Include bsd compatibility headers. - (SIGHANDLE): Add definition. - (__cygserver__printf): Remove definition. - (__noop_printf): Ditto. - (debug_printf): Define using debug. - (syscall_printf): Define using log. - (system_printf): Ditto. - Drop all other _printf definitions. - -2003-10-22 Corinna Vinschen <corinna@vinschen.de> - - Accomodate moving cygserver header files from cygwin/include/cygwin - to here and cygwin dir. - * Makefile.in (EXEEXT): Drop as unused. - (EXEEXT_FOR_BUILD): Ditto. - (all): Don't build libcygserver.a. - * cygserver_process.h: Moved from cygwin/include/cygwin to here. - * cygserver_transport.h: Ditto. - * cygserver_transport_pipes.h: Ditto. - * cygserver_transport_sockets.h: Ditto. - * ipc.h: Moved to ../cygwin and renamed to cygserver_ipc.h. - * shm.h: Moved to ../cygwin and renamed to cygserver_shm.h. - -2003-08-30 Christopher Faylor <cgf@redhat.com> - - * msg.cc: New file. - * sem.cc: Ditto. - -2003-08-30 Christopher Faylor <cgf@redhat.com> - - * threaded_queue.h: New file. - -2003-08-25 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Build libcygserver.a. - * client.cc: Rename allow_daemon to allow_server. - -2003-07-25 Christopher Faylor <cgf@redhat.com> - - * configure.in: Use 'install-sh -c'. - * configure: Regenerate. - -2003-07-25 Christopher Faylor <cgf@redhat.com> - - * configure.in: Always use install-sh. - * configure: Regenerate. - -2003-07-01 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (OBJS): Move some more files from cygwin directory. - * woutsup.h: Define _MT_SAFE. - -2003-07-01 Christopher Faylor <cgf@redhat.com> - - * configure.in: First pass. - * Makefile.in: Ditto. - * configure: Generate. diff --git a/winsup/cygserver/Makefile.in b/winsup/cygserver/Makefile.in deleted file mode 100644 index d1bab9d5e..000000000 --- a/winsup/cygserver/Makefile.in +++ /dev/null @@ -1,91 +0,0 @@ -# Makefile for Cygwin server -# Copyright 2003, 2006, 2007, 2008, 2009 Red Hat, Inc. - -# This file is part of Cygwin. - -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -SHELL:=@SHELL@ - -srcdir:=@srcdir@ -VPATH:=@srcdir@ - -DESTDIR= -prefix:=${DESTDIR}@prefix@ -exec_prefix:=${DESTDIR}@exec_prefix@ -bindir:=${DESTDIR}@bindir@ -sbindir:=${DESTDIR}@sbindir@ -sysconfdir:=${DESTDIR}@sysconfdir@ -program_transform_name:=@program_transform_name@ - -INSTALL:=@INSTALL@ -INSTALL_PROGRAM:=@INSTALL_PROGRAM@ -INSTALL_DATA:=@INSTALL_DATA@ - -CC:=@CC@ -CC_FOR_TARGET:=$(CC) -CXX:=@CXX@ -CXX_FOR_TARGET:=$(CXX) -AR:=@AR@ - -include $(srcdir)/../Makefile.common - -CFLAGS:=@CFLAGS@ -override CXXFLAGS=@CXXFLAGS@ -override CXXFLAGS+=-MMD -DHAVE_DECL_GETOPT=0 -D__OUTSIDE_CYGWIN__ -DSYSCONFDIR="\"$(sysconfdir)\"" - -.SUFFIXES: .c .cc .a .o .d - -OBJS:= cygserver.o client.o process.o msg.o sem.o shm.o threaded_queue.o \ - transport.o transport_pipes.o \ - bsd_helper.o bsd_log.o bsd_mutex.o \ - sysv_msg.o sysv_sem.o sysv_shm.o setpwd.o -LIBOBJS:=${patsubst %.o,lib%.o,$(OBJS)} - -CYGWIN_OBJS:=$(cygwin_build)/version.o - -CYGWIN_LIB:=$(cygwin_build)/libcygwin.a - -all: cygserver.exe - -install: all $(updir1)/mkinstalldirs cygserver.conf cygserver-config README - $(updir1)/mkinstalldirs $(DESTDIR)$(sbindir) - $(updir1)/mkinstalldirs $(DESTDIR)$(bindir) - $(updir1)/mkinstalldirs $(DESTDIR)$(sysconfdir)/defaults/etc - $(updir1)/mkinstalldirs $(DESTDIR)$(prefix)/share/doc/Cygwin - $(INSTALL_PROGRAM) cygserver.exe $(DESTDIR)$(sbindir)/cygserver.exe - $(INSTALL_PROGRAM) $(srcdir)/cygserver-config $(DESTDIR)$(bindir)/cygserver-config - $(INSTALL_DATA) $(srcdir)/cygserver.conf $(DESTDIR)$(sysconfdir)/defaults/etc/cygserver.conf - $(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(prefix)/share/doc/Cygwin/cygserver.README - -clean: - rm -f $(OBJS) ${patsubst %.o,%.d,$(OBJS)} cygserver.exe - -libclean: - rm -f $(LIBOBJS) ${patsubst %.o,%.d,$(LIBOBJS)} libcygserver.a - -fullclean: clean libclean - -cygserver.exe: $(CYGWIN_LIB) $(OBJS) $(CYGWIN_OBJS) - $(CXX) -o $@ ${wordlist 2,999,$^} -static-libgcc -L$(cygwin_build) -lntdll - -$(cygwin_build)/%.o: $(cygwin_source)/%.cc - @$(MAKE) -C $(@D) $(@F) - -$(cygwin_build)/%.o: $(cygwin_source)/%.c - @$(MAKE) -C $(@D) $(@F) - -Makefile: Makefile.in configure - -lib%.o: %.cc - ${filter-out -D__OUTSIDE_CYGWIN__, $(COMPILE_CXX)} -c -I$(updir)/cygwin -I$(bupdir)/cygwin -o $(@D)/${basename $(@F)}$o $< - -libcygserver.a: $(LIBOBJS) - $(AR) crus $@ $? - -deps:=${wildcard *.d} -ifneq (,$(deps)) -include $(deps) -endif diff --git a/winsup/cygserver/README b/winsup/cygserver/README deleted file mode 100644 index b667cb08a..000000000 --- a/winsup/cygserver/README +++ /dev/null @@ -1,198 +0,0 @@ -What is Cygserver? - - Cygserver is a program which is designed to run as a background service. - It provides Cygwin applications with services which require security - arbitration or which need to persist while no other cygwin application - is running. - - The implemented services so far are: - - - Control slave tty/pty handle dispersal from tty owner to other - processes without compromising the owner processes' security. - - XSI IPC Message Queues. - - XSI IPC Semaphores. - - XSI IPC Shared Memory. - - Allows non-privileged users to store obfuscated passwords in the - registry to be used for setuid(2) to create user tokens with network - credentials. This service is used by `passwd -R'. Using the stored - passwords in setuid(2) does not require running cygserver. The - registry storage is the same as Windows uses to store passwords for - accounts running Windows services. - - -Cygserver command line options: - - Options to Cygserver take the normal UNIX-style `-X' or `--longoption' form. - Nearly all options have a counterpart in the configuration file (see below) - so setting them on the command line isn't really necessary. Command line - options override settings from the Cygserver configuration file. - - The one-character options are prepended by a single dash, the long variants - are prepended with two dashes. Arguments to options are marked in angle - brackets below. These are not part of the actual syntax but are used only to - denote the arguments. Note that all arguments are required. Cygserver - has no options with optional arguments. - - The options recognized are: - - -f, --config-file <file> - - Use <file> as configuration file instead of the default configuration - line. The default configuration file is /etc/cygserver.conf, typically. - The --help and --version options will print the default configuration - pathname. - - This option has no counterpart in the configuration file, for obvious - reasons. - - -c, --cleanup-threads <num> - - Number of threads started to perform cleanup tasks. Default is 2. - Configuration file option: kern.srv.cleanup_threads - - -r, --request-threads <num> - - Number of threads started to serve application requests. Default is 10. - The -c and -r options can be used to play with Cygserver's performance - under heavy load conditions or on slow machines. - Configuration file option: kern.srv.request_threads - - -p, --process-cache <num> - - Number of processes which can connect concurrently to cygserver. - Default is 62. Each process connected to cygserver is a synchronization - object which has to be maintained. The data structure to maintain these - processes is the so-called "process cache". In theory, an arbitrary - number of processes could connect to cygserver, but due to the need to - synchronize, the higher the number of connected processes, the more - synchronization overhead exists. By using this option, you can set an - upper limit to the synchronization effort. If more than 62 processes - try to connect to cygserver concurrently, two additional synchronization - threads are necessary, and one for each further 62 concurrent - processes. So, useful values for the --process-cache option are 62, 124, - 186, 248, 310. 310 is the maximum value. - Configuration file option: kern.srv.process_cache_size - - NOTE: The number of child processes of a single parent process is limited - to 256. So in case of taking advantage of a process cache size beyond 256, - keep in mind that not all of these processes can be child processes of one - single parent process. - - -d, --debug - - Log debug messages to stderr. These will clutter your stderr output with - a lot of information, typically only useful to developers. - - -e, --stderr - - Force logging to stderr. This is the default if stderr is connected to - a tty. Otherwise, the default is logging to the system log. By using - the -e, -E, -y, -Y options (or the appropriate settings in the - configuration file), you can explicitely set the logging output as you - like, even to both, stderr and syslog. - Configuration file option: kern.log.stderr - - -E, --no-stderr - - Don't log to stderr. Configuration file option: kern.log.stderr - - -y, --syslog - - Force logging to the system log. This is the default, if stderr is not - connected to a tty, e. g. redirected to a file. - - -Y, --no-syslog - - Don't log to syslog. Configuration file option: kern.log.syslog - - -l, --log-level <level> - - Set the verbosity level of the logging output. Valid values are between - 1 and 7. The default level is 6, which is relatively chatty. If you set - it to 1, you will get only messages which are printed under severe conditions, - which will result in stopping Cygserver itself. - Configuration file option: kern.log.level - - -m, --no-sharedmem - - Don't start XSI IPC Shared Memory support. If you don't need XSI IPC - Shared Memory support, you can switch it off here. - Configuration file option: kern.srv.sharedmem - - -q, --no-msgqueues - - Don't start XSI IPC Message Queues. - Configuration file option: kern.srv.msgqueues - - -s, --no-semaphores - - Don't start XSI IPC Semaphores. - Configuration file option: kern.srv.semaphores - - -S, --shutdown - - Shutdown a running daemon and exit. Other methods are sending a SIGHUP - to the Cygserver PID or, if running as service under NT, calling - `net stop cygserver' or `cygrunsrv -E cygserver'. - - -h, --help - - Output usage information and exit. - - -v, --version - - Output version information and exit. - - -How to start Cygserver: - - Before you run Cygserver for the first time, you should run the - /usr/bin/cygserver-config script once. It creates the default - configuration file and, upon request, installs Cygserver as service - when running under NT. The script only performs a default install, - with no further options given to Cygserver when running as service. - Due to the wide configurability by changing the configuration file, - that's typically not necessary. - - It's best practice to run Cygserver as a service under LocalSystem - account. This is the way it is installed for you by the - /usr/bin/cygserver-config script. - - -The Cygserver configuration file: - - Cygserver has many options, which allow to customize the server - to your needs. Customization is accomplished by editing the configuration - file, which is by default /etc/cygserver.conf. This file is read only - once on startup of Cygserver. There's no option to re-read the file on - runtime by, say, sending a signal to Cygserver. - - The configuration file determines how Cygserver operates. There are - options which set the number of threads running in parallel, options - for setting how and what to log and options to set various maximum - values for the IPC services. - - The default configuration file delivered with Cygserver is installed - to /etc/defaults/etc. The /usr/bin/cygserver-config script copies it to - /etc, giving you the option to overwrite an already existing file or to - leave it alone. Therefore, the /etc file is safe to be changed by you, - since it will not be overwritten by a later update installation. - - The default configuration file contains many comments which describe - everything needed to understand the settings. A comment at the start of the - file describes the syntax rules for the file. The default options are shown - in the file but are commented out. - - It is generally a good idea to uncomment only options which you intend to - change from the default values. Since reading the options file on Cygserver - startup doesn't take much time, it's also considered good practice to keep - all other comments in the file. This keeps you from searching for clues - in other sources. - - -If you have problems with Cygserver, or you have found a bug, or you -think you have found a bug, or you don't understand configuration file -options, the mailing list <cygwin@cygwin.com> is the right place to ask -questions. - -Have fun! diff --git a/winsup/cygserver/aclocal.m4 b/winsup/cygserver/aclocal.m4 deleted file mode 100644 index ecef4244c..000000000 --- a/winsup/cygserver/aclocal.m4 +++ /dev/null @@ -1,875 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4-p6 - -dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# lib-prefix.m4 serial 4 (gettext-0.14.2) -dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. - -dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and -dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't -dnl require excessive bracketing. -ifdef([AC_HELP_STRING], -[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], -[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) - -dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed -dnl to access previously installed libraries. The basic assumption is that -dnl a user will want packages to use other packages he previously installed -dnl with the same --prefix option. -dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate -dnl libraries, but is otherwise very convenient. -AC_DEFUN([AC_LIB_PREFIX], -[ - AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_HOST]) - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_LIB_ARG_WITH([lib-prefix], -[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib - --without-lib-prefix don't search for libraries in includedir and libdir], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/lib" - fi - fi -]) - if test $use_additional = yes; then - dnl Potentially add $additional_includedir to $CPPFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's already present in $CPPFLAGS, - dnl 3. if it's /usr/local/include and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - for x in $CPPFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $CPPFLAGS. - CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" - fi - fi - fi - fi - dnl Potentially add $additional_libdir to $LDFLAGS. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's already present in $LDFLAGS, - dnl 3. if it's /usr/local/lib and we are using GCC on Linux, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/lib"; then - haveit= - for x in $LDFLAGS; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test "X$additional_libdir" = "X/usr/local/lib"; then - if test -n "$GCC"; then - case $host_os in - linux*) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LDFLAGS. - LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" - fi - fi - fi - fi - fi -]) - -dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, -dnl acl_final_exec_prefix, containing the values to which $prefix and -dnl $exec_prefix will expand at the end of the configure script. -AC_DEFUN([AC_LIB_PREPARE_PREFIX], -[ - dnl Unfortunately, prefix and exec_prefix get only finally determined - dnl at the end of configure. - if test "X$prefix" = "XNONE"; then - acl_final_prefix="$ac_default_prefix" - else - acl_final_prefix="$prefix" - fi - if test "X$exec_prefix" = "XNONE"; then - acl_final_exec_prefix='${prefix}' - else - acl_final_exec_prefix="$exec_prefix" - fi - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" - prefix="$acl_save_prefix" -]) - -dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the -dnl variables prefix and exec_prefix bound to the values they will have -dnl at the end of the configure script. -AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], -[ - acl_save_prefix="$prefix" - prefix="$acl_final_prefix" - acl_save_exec_prefix="$exec_prefix" - exec_prefix="$acl_final_exec_prefix" - $1 - exec_prefix="$acl_save_exec_prefix" - prefix="$acl_save_prefix" -]) - -# lib-link.m4 serial 6 (gettext-0.14.3) -dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl From Bruno Haible. - -AC_PREREQ(2.50) - -dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and -dnl augments the CPPFLAGS variable. -AC_DEFUN([AC_LIB_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - define([Name],[translit([$1],[./-], [___])]) - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - ac_cv_lib[]Name[]_libs="$LIB[]NAME" - ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" - ac_cv_lib[]Name[]_cppflags="$INC[]NAME" - ]) - LIB[]NAME="$ac_cv_lib[]Name[]_libs" - LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" - INC[]NAME="$ac_cv_lib[]Name[]_cppflags" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the - dnl results of this search when this library appears as a dependency. - HAVE_LIB[]NAME=yes - undefine([Name]) - undefine([NAME]) -]) - -dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) -dnl searches for libname and the libraries corresponding to explicit and -dnl implicit dependencies, together with the specified include files and -dnl the ability to compile and link the specified testcode. If found, it -dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and -dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and -dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs -dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. -AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], -[ - AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) - AC_REQUIRE([AC_LIB_RPATH]) - define([Name],[translit([$1],[./-], [___])]) - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - - dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME - dnl accordingly. - AC_LIB_LINKFLAGS_BODY([$1], [$2]) - - dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, - dnl because if the user has installed lib[]Name and not disabled its use - dnl via --without-lib[]Name-prefix, he wants to use it. - ac_save_CPPFLAGS="$CPPFLAGS" - AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) - - AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ - ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIB[]NAME" - AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) - LIBS="$ac_save_LIBS" - ]) - if test "$ac_cv_lib[]Name" = yes; then - HAVE_LIB[]NAME=yes - AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) - AC_MSG_CHECKING([how to link with lib[]$1]) - AC_MSG_RESULT([$LIB[]NAME]) - else - HAVE_LIB[]NAME=no - dnl If $LIB[]NAME didn't lead to a usable library, we don't need - dnl $INC[]NAME either. - CPPFLAGS="$ac_save_CPPFLAGS" - LIB[]NAME= - LTLIB[]NAME= - fi - AC_SUBST([HAVE_LIB]NAME) - AC_SUBST([LIB]NAME) - AC_SUBST([LTLIB]NAME) - undefine([Name]) - undefine([NAME]) -]) - -dnl Determine the platform dependent parameters needed to use rpath: -dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, -dnl hardcode_direct, hardcode_minus_L. -AC_DEFUN([AC_LIB_RPATH], -[ - dnl Tell automake >= 1.10 to complain if config.rpath is missing. - m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) - AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS - AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld - AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host - AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir - AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ - CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ - ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh - . ./conftest.sh - rm -f ./conftest.sh - acl_cv_rpath=done - ]) - wl="$acl_cv_wl" - libext="$acl_cv_libext" - shlibext="$acl_cv_shlibext" - hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" - hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" - hardcode_direct="$acl_cv_hardcode_direct" - hardcode_minus_L="$acl_cv_hardcode_minus_L" - dnl Determine whether the user wants rpath handling at all. - AC_ARG_ENABLE(rpath, - [ --disable-rpath do not hardcode runtime library paths], - :, enable_rpath=yes) -]) - -dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and -dnl the libraries corresponding to explicit and implicit dependencies. -dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. -AC_DEFUN([AC_LIB_LINKFLAGS_BODY], -[ - define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], - [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) - dnl By default, look in $includedir and $libdir. - use_additional=yes - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - AC_LIB_ARG_WITH([lib$1-prefix], -[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib - --without-lib$1-prefix don't search for lib$1 in includedir and libdir], -[ - if test "X$withval" = "Xno"; then - use_additional=no - else - if test "X$withval" = "X"; then - AC_LIB_WITH_FINAL_PREFIX([ - eval additional_includedir=\"$includedir\" - eval additional_libdir=\"$libdir\" - ]) - else - additional_includedir="$withval/include" - additional_libdir="$withval/lib" - fi - fi -]) - dnl Search the library and its dependencies in $additional_libdir and - dnl $LDFLAGS. Using breadth-first-seach. - LIB[]NAME= - LTLIB[]NAME= - INC[]NAME= - rpathdirs= - ltrpathdirs= - names_already_handled= - names_next_round='$1 $2' - while test -n "$names_next_round"; do - names_this_round="$names_next_round" - names_next_round= - for name in $names_this_round; do - already_handled= - for n in $names_already_handled; do - if test "$n" = "$name"; then - already_handled=yes - break - fi - done - if test -z "$already_handled"; then - names_already_handled="$names_already_handled $name" - dnl See if it was already located by an earlier AC_LIB_LINKFLAGS - dnl or AC_LIB_HAVE_LINKFLAGS call. - uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` - eval value=\"\$HAVE_LIB$uppername\" - if test -n "$value"; then - if test "$value" = yes; then - eval value=\"\$LIB$uppername\" - test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" - eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" - else - dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined - dnl that this library doesn't exist. So just drop it. - : - fi - else - dnl Search the library lib$name in $additional_libdir and $LDFLAGS - dnl and the already constructed $LIBNAME/$LTLIBNAME. - found_dir= - found_la= - found_so= - found_a= - if test $use_additional = yes; then - if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then - found_dir="$additional_libdir" - found_so="$additional_libdir/lib$name.$shlibext" - if test -f "$additional_libdir/lib$name.la"; then - found_la="$additional_libdir/lib$name.la" - fi - else - if test -f "$additional_libdir/lib$name.$libext"; then - found_dir="$additional_libdir" - found_a="$additional_libdir/lib$name.$libext" - if test -f "$additional_libdir/lib$name.la"; then - found_la="$additional_libdir/lib$name.la" - fi - fi - fi - fi - if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - case "$x" in - -L*) - dir=`echo "X$x" | sed -e 's/^X-L//'` - if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then - found_dir="$dir" - found_so="$dir/lib$name.$shlibext" - if test -f "$dir/lib$name.la"; then - found_la="$dir/lib$name.la" - fi - else - if test -f "$dir/lib$name.$libext"; then - found_dir="$dir" - found_a="$dir/lib$name.$libext" - if test -f "$dir/lib$name.la"; then - found_la="$dir/lib$name.la" - fi - fi - fi - ;; - esac - if test "X$found_dir" != "X"; then - break - fi - done - fi - if test "X$found_dir" != "X"; then - dnl Found the library. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" - if test "X$found_so" != "X"; then - dnl Linking with a shared library. We attempt to hardcode its - dnl directory into the executable's runpath, unless it's the - dnl standard /usr/lib. - if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then - dnl No hardcoding is needed. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $found_dir" - fi - dnl The hardcoding into $LIBNAME is system dependent. - if test "$hardcode_direct" = yes; then - dnl Using DIR/libNAME.so during linking hardcodes DIR into the - dnl resulting binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then - dnl Use an explicit option to hardcode DIR into the resulting - dnl binary. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $found_dir" - fi - else - dnl Rely on "-L$found_dir". - dnl But don't add it if it's already contained in the LDFLAGS - dnl or the already constructed $LIBNAME - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$found_dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" - fi - if test "$hardcode_minus_L" != no; then - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" - else - dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH - dnl here, because this doesn't fit in flags passed to the - dnl compiler. So give up. No hardcoding. This affects only - dnl very old systems. - dnl FIXME: Not sure whether we should use - dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" - dnl here. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - fi - fi - fi - fi - else - if test "X$found_a" != "X"; then - dnl Linking with a static library. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" - else - dnl We shouldn't come here, but anyway it's good to have a - dnl fallback. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" - fi - fi - dnl Assume the include files are nearby. - additional_includedir= - case "$found_dir" in - */lib | */lib/) - basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` - additional_includedir="$basedir/include" - ;; - esac - if test "X$additional_includedir" != "X"; then - dnl Potentially add $additional_includedir to $INCNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/include, - dnl 2. if it's /usr/local/include and we are using GCC on Linux, - dnl 3. if it's already present in $CPPFLAGS or the already - dnl constructed $INCNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_includedir" != "X/usr/include"; then - haveit= - if test "X$additional_includedir" = "X/usr/local/include"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - for x in $CPPFLAGS $INC[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-I$additional_includedir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_includedir"; then - dnl Really add $additional_includedir to $INCNAME. - INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" - fi - fi - fi - fi - fi - dnl Look for dependencies. - if test -n "$found_la"; then - dnl Read the .la file. It defines the variables - dnl dlname, library_names, old_library, dependency_libs, current, - dnl age, revision, installed, dlopen, dlpreopen, libdir. - save_libdir="$libdir" - case "$found_la" in - */* | *\\*) . "$found_la" ;; - *) . "./$found_la" ;; - esac - libdir="$save_libdir" - dnl We use only dependency_libs. - for dep in $dependency_libs; do - case "$dep" in - -L*) - additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` - dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. - dnl But don't add it - dnl 1. if it's the standard /usr/lib, - dnl 2. if it's /usr/local/lib and we are using GCC on Linux, - dnl 3. if it's already present in $LDFLAGS or the already - dnl constructed $LIBNAME, - dnl 4. if it doesn't exist as a directory. - if test "X$additional_libdir" != "X/usr/lib"; then - haveit= - if test "X$additional_libdir" = "X/usr/local/lib"; then - if test -n "$GCC"; then - case $host_os in - linux* | gnu* | k*bsd*-gnu) haveit=yes;; - esac - fi - fi - if test -z "$haveit"; then - haveit= - for x in $LDFLAGS $LIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LIBNAME. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" - fi - fi - haveit= - for x in $LDFLAGS $LTLIB[]NAME; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X-L$additional_libdir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - if test -d "$additional_libdir"; then - dnl Really add $additional_libdir to $LTLIBNAME. - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" - fi - fi - fi - fi - ;; - -R*) - dir=`echo "X$dep" | sed -e 's/^X-R//'` - if test "$enable_rpath" != no; then - dnl Potentially add DIR to rpathdirs. - dnl The rpathdirs will be appended to $LIBNAME at the end. - haveit= - for x in $rpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - rpathdirs="$rpathdirs $dir" - fi - dnl Potentially add DIR to ltrpathdirs. - dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. - haveit= - for x in $ltrpathdirs; do - if test "X$x" = "X$dir"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - ltrpathdirs="$ltrpathdirs $dir" - fi - fi - ;; - -l*) - dnl Handle this in the next round. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` - ;; - *.la) - dnl Handle this in the next round. Throw away the .la's - dnl directory; it is already contained in a preceding -L - dnl option. - names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` - ;; - *) - dnl Most likely an immediate library name. - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" - ;; - esac - done - fi - else - dnl Didn't find the library; assume it is in the system directories - dnl known to the linker and runtime loader. (All the system - dnl directories known to the linker should also be known to the - dnl runtime loader, otherwise the system is severely misconfigured.) - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" - fi - fi - fi - done - done - if test "X$rpathdirs" != "X"; then - if test -n "$hardcode_libdir_separator"; then - dnl Weird platform: only the last -rpath option counts, the user must - dnl pass all path elements in one option. We can arrange that for a - dnl single library, but not when more than one $LIBNAMEs are used. - alldirs= - for found_dir in $rpathdirs; do - alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" - done - dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. - acl_save_libdir="$libdir" - libdir="$alldirs" - eval flag=\"$hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - else - dnl The -rpath options are cumulative. - for found_dir in $rpathdirs; do - acl_save_libdir="$libdir" - libdir="$found_dir" - eval flag=\"$hardcode_libdir_flag_spec\" - libdir="$acl_save_libdir" - LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" - done - fi - fi - if test "X$ltrpathdirs" != "X"; then - dnl When using libtool, the option that works for both libraries and - dnl executables is -R. The -R options are cumulative. - for found_dir in $ltrpathdirs; do - LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" - done - fi -]) - -dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, -dnl unless already present in VAR. -dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes -dnl contains two or three consecutive elements that belong together. -AC_DEFUN([AC_LIB_APPENDTOVAR], -[ - for element in [$2]; do - haveit= - for x in $[$1]; do - AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) - if test "X$x" = "X$element"; then - haveit=yes - break - fi - done - if test -z "$haveit"; then - [$1]="${[$1]}${[$1]:+ }$element" - fi - done -]) - -# lib-ld.m4 serial 3 (gettext-0.13) -dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl Subroutines of libtool.m4, -dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision -dnl with libtool.m4. - -dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. -AC_DEFUN([AC_LIB_PROG_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - acl_cv_prog_gnu_ld=yes ;; -*) - acl_cv_prog_gnu_ld=no ;; -esac]) -with_gnu_ld=$acl_cv_prog_gnu_ld -]) - -dnl From libtool-1.4. Sets the variable LD. -AC_DEFUN([AC_LIB_PROG_LD], -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -# Prepare PATH_SEPARATOR. -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]* | [A-Za-z]:[\\/]*)] - [re_direlt='/[^/][^/]*/\.\./'] - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(acl_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - acl_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break ;; - *) - test "$with_gnu_ld" != yes && break ;; - esac - fi - done - IFS="$ac_save_ifs" -else - acl_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$acl_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_LIB_PROG_LD_GNU -]) - -dnl This provides configure definitions used by all the winsup -dnl configure.in files. - -# FIXME: We temporarily define our own version of AC_PROG_CC. This is -# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We -# are probably using a cross compiler, which will not be able to fully -# link an executable. This should really be fixed in autoconf -# itself. - -AC_DEFUN([LIB_AC_PROG_CC_GNU], -[AC_CACHE_CHECK(whether we are using GNU C, ac_cv_prog_gcc, -[dnl The semicolon is to pacify NeXT's syntax-checking cpp. -cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if AC_TRY_COMMAND(${CC-cc} -E conftest.c) | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi])]) - -AC_DEFUN([LIB_AC_PROG_CC], -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_TOOL(CC, gcc, gcc) -: ${CC:=gcc} -AC_PROG_CC -test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -]) - -AC_DEFUN([LIB_AC_PROG_CXX], -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_TOOL(CXX, g++, g++) -if test -z "$CXX"; then - AC_CHECK_TOOL(CXX, g++, c++, , , ) - : ${CXX:=g++} - AC_PROG_CXX - test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -fi - -CXXFLAGS='$(CFLAGS)' -]) - diff --git a/winsup/cygserver/bsd_helper.cc b/winsup/cygserver/bsd_helper.cc deleted file mode 100644 index 6dabdc87e..000000000 --- a/winsup/cygserver/bsd_helper.cc +++ /dev/null @@ -1,691 +0,0 @@ -/* bsd_helper.cc - - Copyright 2003, 2004, 2005, 2007 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#include <errno.h> -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <sys/smallprint.h> -#include <sys/cygwin.h> -#include <sys/ipc.h> -#include <sys/param.h> -#include <sys/msg.h> -#include <sys/queue.h> -#include <malloc.h> -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> - -#include "cygserver.h" -#include "process.h" -#include "cygserver_ipc.h" -#include "cygserver_msg.h" -#include "cygserver_sem.h" -#include "cygserver_shm.h" - -/* - * Copy a piece of memory from the client process into the server process. - * Returns an error code. - */ -int -win_copyin (struct thread *td, const void *client_src, - void *server_tgt, size_t len) -{ - if (!ReadProcessMemory (td->client->handle (), client_src, server_tgt, - len, NULL)) - return cygwin_internal (CW_GET_ERRNO_FROM_WINERROR, - GetLastError (), EINVAL); - return 0; -} - -/* - * Copy a piece of memory from the server process into the client process. - * Returns an error code. - */ -int -win_copyout (struct thread *td, const void *server_src, - void *client_tgt, size_t len) -{ - if (!WriteProcessMemory (td->client->handle (), client_tgt, server_src, - len, NULL)) - return cygwin_internal (CW_GET_ERRNO_FROM_WINERROR, - GetLastError (), EINVAL); - return 0; -} - -#define enter_critical_section(c) _enter_critical_section((c),__FILE__,__LINE__) -static void -_enter_critical_section (LPCRITICAL_SECTION pcs, const char *file, int line) -{ - _log (file, line, LOG_DEBUG, "Try enter critical section(%p)", pcs); - EnterCriticalSection (pcs); - _log (file, line, LOG_DEBUG, "Entered critical section(%p)", pcs); -} - -#define leave_critical_section(c) _leave_critical_section((c),__FILE__,__LINE__) -static void -_leave_critical_section (LPCRITICAL_SECTION pcs, const char *file, int line) -{ - LeaveCriticalSection (pcs); - _log (file, line, LOG_DEBUG, "Left critical section(%p)", pcs); -} - -CRITICAL_SECTION ipcht_cs; - -struct ipc_hookthread_storage { - HANDLE process_hdl; - proc ipcblk; -}; - -struct ipc_hookthread { - SLIST_ENTRY (ipc_hookthread) sht_next; - HANDLE thread; - DWORD winpid; - struct vmspace vmspace; -}; -static SLIST_HEAD (, ipc_hookthread) ipcht_list; /* list of hook threads */ - -static HANDLE ipcexit_event; - -struct vmspace * -ipc_p_vmspace (struct proc *proc) -{ - struct vmspace *ret = NULL; - ipc_hookthread *ipcht_entry; - enter_critical_section (&ipcht_cs); - SLIST_FOREACH (ipcht_entry, &ipcht_list, sht_next) - { - if (ipcht_entry->winpid == proc->winpid) - { - ret = proc->p_vmspace = &ipcht_entry->vmspace; - break; - } - } - leave_critical_section (&ipcht_cs); - return ret; -} - -static DWORD WINAPI -ipcexit_hookthread (const LPVOID param) -{ - ipc_hookthread_storage *shs = (ipc_hookthread_storage *) param; - HANDLE obj[2] = { ipcexit_event, shs->process_hdl }; - switch (WaitForMultipleObjects (2, obj, FALSE, INFINITE)) - { - case WAIT_OBJECT_0: - /* Cygserver shutdown. */ - /*FALLTHRU*/ - case WAIT_OBJECT_0 + 1: - /* Process exited. Call semexit_myhook to handle SEM_UNDOs for the - exiting process and shmexit_myhook to keep track of shared - memory. */ - if (Giant.owner == shs->ipcblk.winpid) - mtx_unlock (&Giant); - if (support_semaphores == TUN_TRUE) - semexit_myhook (NULL, &shs->ipcblk); - if (support_sharedmem == TUN_TRUE) - { - _mtx_lock (&Giant, shs->ipcblk.winpid, __FILE__, __LINE__); - ipc_p_vmspace (&shs->ipcblk); - shmexit_myhook (shs->ipcblk.p_vmspace); - mtx_unlock (&Giant); - } - break; - default: - /* FIXME: Panic? */ - break; - } - CloseHandle (shs->process_hdl); - ipc_hookthread *ipcht_entry, *sav_entry; - enter_critical_section (&ipcht_cs); - SLIST_FOREACH_SAFE (ipcht_entry, &ipcht_list, sht_next, sav_entry) - { - if (ipcht_entry->winpid == shs->ipcblk.winpid) - { - SLIST_REMOVE (&ipcht_list, ipcht_entry, ipc_hookthread, sht_next); - CloseHandle (ipcht_entry->thread); - delete ipcht_entry; - } - } - leave_critical_section (&ipcht_cs); - delete shs; - return 0; -} - -/* Deletes all pending hook threads. Called by ipcunload() which in turn - is called by the cygserver main routine. */ -static void -ipcexit_dispose_hookthreads (void) -{ - SetEvent (ipcexit_event); - ipc_hookthread *ipcht_entry; - enter_critical_section (&ipcht_cs); - SLIST_FOREACH (ipcht_entry, &ipcht_list, sht_next) - { - WaitForSingleObject (ipcht_entry->thread, 1000); - /* Don't bother removing the linked list on cygserver shutdown. */ - /* FIXME: Error handling? */ - } - leave_critical_section (&ipcht_cs); -} - -/* Creates the per process wait thread. Called by semget() under locked - Giant mutex condition. */ -int -ipcexit_creat_hookthread (struct thread *td) -{ - ipc_hookthread *ipcht_entry; - int ret = -1; - enter_critical_section (&ipcht_cs); - SLIST_FOREACH (ipcht_entry, &ipcht_list, sht_next) - { - if (ipcht_entry->winpid == td->ipcblk->winpid) - ret = 0; - } - leave_critical_section (&ipcht_cs); - if (!ret) - return 0; - - DWORD tid; - ipc_hookthread_storage *shs = new ipc_hookthread_storage; - if (!DuplicateHandle (GetCurrentProcess (), td->client->handle (), - GetCurrentProcess (), &shs->process_hdl, - 0, FALSE, DUPLICATE_SAME_ACCESS)) - { - log (LOG_CRIT, "failed to duplicate process handle, error = %lu", - GetLastError ()); - return cygwin_internal (CW_GET_ERRNO_FROM_WINERROR, - GetLastError (), ENOMEM); - } - shs->ipcblk = *td->ipcblk; - HANDLE thread = CreateThread (NULL, 0, ipcexit_hookthread, shs, 0, &tid); - if (!thread) - { - log (LOG_CRIT, "failed to create thread, error = %lu", GetLastError ()); - return cygwin_internal (CW_GET_ERRNO_FROM_WINERROR, - GetLastError (), ENOMEM); - } - ipcht_entry = new ipc_hookthread; - ipcht_entry->thread = thread; - ipcht_entry->winpid = td->ipcblk->winpid; - ipcht_entry->vmspace.vm_map = NULL; - ipcht_entry->vmspace.vm_shm = NULL; - enter_critical_section (&ipcht_cs); - SLIST_INSERT_HEAD (&ipcht_list, ipcht_entry, sht_next); - leave_critical_section (&ipcht_cs); - return 0; -} - -/* - * Need the admins group SID to compare with groups in client token. - */ -PSID admininstrator_group_sid; - -static void -init_admin_sid (void) -{ - SID_IDENTIFIER_AUTHORITY nt_auth = {SECURITY_NT_AUTHORITY}; - if (! AllocateAndInitializeSid (&nt_auth, 2, 32, 544, 0, 0, 0, 0, 0, 0, - &admininstrator_group_sid)) - panic ("failed to create well known sids, error = %lu", - GetLastError ()); -} - -SECURITY_DESCRIPTOR sec_all_nih_sd; -SECURITY_ATTRIBUTES sec_all_nih = { sizeof (SECURITY_ATTRIBUTES), - &sec_all_nih_sd, - FALSE }; - -void -securityinit () -{ - InitializeSecurityDescriptor (&sec_all_nih_sd, SECURITY_DESCRIPTOR_REVISION); - SetSecurityDescriptorDacl (&sec_all_nih_sd, TRUE, 0, FALSE); - init_admin_sid (); -} - -/* Global vars, determining whether the IPC stuff should be started or not. */ -tun_bool_t support_sharedmem = TUN_UNDEF; -tun_bool_t support_msgqueues = TUN_UNDEF; -tun_bool_t support_semaphores = TUN_UNDEF; - -void -ipcinit () -{ - mtx_init (&Giant, "Giant", NULL, MTX_DEF); - msleep_init (); - ipcexit_event = CreateEvent (NULL, TRUE, FALSE, NULL); - if (!ipcexit_event) - panic ("Failed to create ipcexit event object"); - InitializeCriticalSection (&ipcht_cs); - if (support_msgqueues == TUN_TRUE) - msginit (); - if (support_semaphores == TUN_TRUE) - seminit (); - if (support_sharedmem == TUN_TRUE) - shminit (); -} - -int -ipcunload () -{ - ipcexit_dispose_hookthreads (); - CloseHandle (ipcexit_event); - wakeup_all (); - if (support_semaphores == TUN_TRUE) - semunload (); - if (support_sharedmem == TUN_TRUE) - shmunload (); - if (support_msgqueues == TUN_TRUE) - msgunload (); - mtx_destroy (&Giant); - return 0; -} - -/* - * Helper function to find a gid in a list of gids. - */ -static bool -is_grp_member (gid_t grp, gid_t *grplist, int listsize) -{ - if (grplist) - for (; listsize > 0; --listsize) - if (grp == grplist[listsize - 1]) - return true; - return false; -} - -/* - * Helper function to get a specific token information from a token. - * This function mallocs the necessary buffer spcae by itself. It - * must be free'd by the calling function. - */ -void * -get_token_info (HANDLE tok, TOKEN_INFORMATION_CLASS tic) -{ - void *buf; - DWORD size; - - if (!GetTokenInformation (tok, tic, NULL, 0, &size) - && GetLastError () != ERROR_INSUFFICIENT_BUFFER) - return NULL; - if (!(buf = malloc (size))) - return NULL; - if (!GetTokenInformation (tok, tic, buf, size, &size)) - { - free (buf); - return NULL; - } - return buf; -} - -/* - * Check if client user helds "mode" permission when accessing object - * associated with "perm" permission record. - * Returns an error code. - */ -int -ipcperm (struct thread *td, ipc_perm *perm, unsigned int mode) -{ - proc *p = td->ipcblk; - - if (!suser (td)) - return 0; - if (mode & IPC_M) - { - return (p->uid != perm->cuid && p->uid != perm->uid) - ? EACCES : 0; - } - if (p->uid != perm->cuid && p->uid != perm->uid) - { - /* If the user is a member of the creator or owner group, test - against group bits, otherwise against other bits. */ - mode >>= p->gid != perm->gid && p->gid != perm->cgid - && !is_grp_member (perm->gid, p->gidlist, p->gidcnt) - && !is_grp_member (perm->cgid, p->gidlist, p->gidcnt) - ? 6 : 3; - } - return (mode & perm->mode) != mode ? EACCES : 0; -} - -/* - * Check for client user being superuser. - * Returns an error code. - */ -int -suser (struct thread *td) -{ - /* This value has been set at ImpersonateNamedPipeClient() time - using the token information. See adjust_identity_info() below. */ - return td->ipcblk->is_admin ? 0 : EACCES; -} - -/* - * Retrieves user and group info from impersonated token and creates the - * correct uid, gid, gidlist and is_admin entries in p from that. - */ -bool -adjust_identity_info (struct proc *p) -{ - HANDLE tok; - - if (!OpenThreadToken (GetCurrentThread (), TOKEN_READ, TRUE, &tok)) - { - debug ("Failed to open worker thread access token for pid %d, winpid %d", - p->cygpid, p->winpid); - return false; - } - - /* Get uid from user SID in token. */ - PTOKEN_USER user; - if (!(user = (PTOKEN_USER)get_token_info (tok, TokenUser))) - goto faulty; - p->uid = cygwin_internal (CW_GET_UID_FROM_SID, user->User.Sid); - free (user); - if (p->uid == (uid_t)-1) - log (LOG_WARNING, "WARNING: User not found in /etc/passwd! Using uid -1!"); - - /* Get gid from primary group SID in token. */ - PTOKEN_PRIMARY_GROUP pgrp; - if (!(pgrp = (PTOKEN_PRIMARY_GROUP)get_token_info (tok, TokenPrimaryGroup))) - goto faulty; - p->gid = cygwin_internal (CW_GET_GID_FROM_SID, pgrp->PrimaryGroup); - free (pgrp); - if (p->gid == (gid_t)-1) - log (LOG_WARNING,"WARNING: Group not found in /etc/passwd! Using gid -1!"); - - /* Generate gid list from token group's SID list. Also look if the token - has an enabled admin group SID. That means, the process has admin - privileges. That knowledge is used in suser(). */ - PTOKEN_GROUPS gsids; - if (!(gsids = (PTOKEN_GROUPS)get_token_info (tok, TokenGroups))) - goto faulty; - if (gsids->GroupCount) - { - p->gidlist = (gid_t *) calloc (gsids->GroupCount, sizeof (gid_t)); - if (p->gidlist) - p->gidcnt = gsids->GroupCount; - } - for (DWORD i = 0; i < gsids->GroupCount; ++i) - { - if (p->gidlist) - p->gidlist[i] = cygwin_internal (CW_GET_GID_FROM_SID, - gsids->Groups[i].Sid); - if (EqualSid (gsids->Groups[i].Sid, admininstrator_group_sid) - && (gsids->Groups[i].Attributes & SE_GROUP_ENABLED)) - p->is_admin = true; - } - free (gsids); - - CloseHandle (tok); - return true; - -faulty: - CloseHandle (tok); - log (LOG_CRIT, "Failed to get token information for pid %d, winpid %d", - p->cygpid, p->winpid); - return false; -} - -/* - * Windows wrapper implementation of the VM functions called by sysv_shm.cc. - */ - -vm_object_t -_vm_pager_allocate (int size, int shmflg) -{ - /* Create the file mapping object with full access for everyone. This is - necessary to allow later calls to shmctl(..., IPC_SET,...) to - change the access rights and ownership of a shared memory region. - The access rights are tested at the beginning of every shm... function. - Note that this does not influence the actual read or write access - defined in a call to shmat. */ - vm_object_t object = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_all_nih, - PAGE_READWRITE, 0, size, NULL); - if (!object) - panic ("CreateFileMapping in _vm_pager_allocate failed, %lu", GetLastError ()); - return object; -} - -vm_object_t -vm_object_duplicate (struct thread *td, vm_object_t object) -{ - vm_object_t dup_object; - if (!DuplicateHandle (GetCurrentProcess (), object, - td->client->handle (), &dup_object, - 0, TRUE, DUPLICATE_SAME_ACCESS)) - panic ("!DuplicateHandle in vm_object_duplicate failed, %lu", GetLastError ()); - return dup_object; -} - -void -vm_object_deallocate (vm_object_t object) -{ - if (object) - CloseHandle (object); -} - -/* - * Tunable parameters are read from a system wide cygserver.conf file. - * On the first call to tunable_int_fetch, the file is read and the - * parameters are set accordingly. Each parameter has default, max and - * min settings. - */ - -enum tun_params_type { - TUN_NULL, - TUN_INT, - TUN_BOOL -}; - -union tun_value { - long ival; - tun_bool_t bval; -}; - -struct tun_struct { - const char *name; - tun_params_type type; - union tun_value value; - union tun_value min; - union tun_value max; - void (*check_func)(tun_struct *, char *, const char *); -}; - -static void -default_tun_check (tun_struct *that, char *value, const char *fname) -{ - char *c = NULL; - tun_value val; - switch (that->type) - { - case TUN_INT: - val.ival = strtoul (value, &c, 10); - if (!val.ival || (c && *c)) - panic ("Error in config file %s: Value of parameter %s malformed", - fname, that->name); - if (val.ival < that->min.ival || val.ival > that->max.ival) - panic ("Error in config file %s: Value of parameter %s must be " - "between %lu and %lu", - fname, that->name, that->min.ival, that->max.ival); - if (that->value.ival) - panic ("Error in config file %s: Parameter %s set twice.\n", - fname, that->name); - that->value.ival = val.ival; - break; - case TUN_BOOL: - if (!strcasecmp (value, "no") || !strcasecmp (value, "n") - || !strcasecmp (value, "false") || !strcasecmp (value, "f") - || !strcasecmp (value, "0")) - val.bval = TUN_FALSE; - else if (!strcasecmp (value, "yes") || !strcasecmp (value, "y") - || !strcasecmp (value, "true") || !strcasecmp (value, "t") - || !strcasecmp (value, "1")) - val.bval = TUN_TRUE; - else - panic ("Error in config file %s: Value of parameter %s malformed\n" - "Allowed values: \"yes\", \"no\", \"y\", \"n\", \"true\", \"false\", \"t\", \"f\", \"1\" and \"0\"", fname, that->name); - that->value.bval = val.bval; - break; - default: - /* Shouldn't happen. */ - panic ("Internal error: Wrong type of tunable parameter"); - break; - } -} - -static tun_struct tunable_params[] = -{ - /* SRV */ - { "kern.srv.cleanup_threads", TUN_INT, {0}, {1}, {32}, default_tun_check}, - { "kern.srv.request_threads", TUN_INT, {0}, {1}, {310}, default_tun_check}, - { "kern.srv.process_cache_size", TUN_INT, {0}, {1}, {310}, default_tun_check}, - { "kern.srv.sharedmem", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - { "kern.srv.msgqueues", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - { "kern.srv.semaphores", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - - /* LOG */ - { "kern.log.syslog", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - { "kern.log.stderr", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - { "kern.log.debug", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - { "kern.log.level", TUN_INT, {0}, {1}, {7}, default_tun_check}, - - /* MSG */ - { "kern.ipc.msgseg", TUN_INT, {0}, {256}, {65535}, default_tun_check}, - { "kern.ipc.msgssz", TUN_INT, {0}, {8}, {1024}, default_tun_check}, - { "kern.ipc.msgmnb", TUN_INT, {0}, {1}, {65535}, default_tun_check}, - { "kern.ipc.msgmni", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.msgtql", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - - /* SEM */ - //{ "kern.ipc.semmap", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semmni", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semmns", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semmnu", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semmsl", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semopm", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semume", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - //{ "kern.ipc.semusz", TUN_INT, {0}, {1}, {1024}, default_tun_check}, - { "kern.ipc.semvmx", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - { "kern.ipc.semaem", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - - /* SHM */ - { "kern.ipc.shmmaxpgs", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - //{ "kern.ipc.shmmin", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - { "kern.ipc.shmmni", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - { "kern.ipc.shmseg", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - { "kern.ipc.shm_allow_removed", TUN_BOOL, {TUN_UNDEF}, {TUN_FALSE}, {TUN_TRUE}, default_tun_check}, - //{ "kern.ipc.shm_use_phys", TUN_INT, {0}, {1}, {32767}, default_tun_check}, - { NULL, TUN_NULL, {0}, {0}, {0}, NULL} -}; - -#define skip_whitespace(c) while (*(c) && isspace (*(c))) ++(c) -#define skip_nonwhitespace(c) while (*(c) && !isspace (*(c)) && *(c) != '#') ++(c) -#define end_of_content(c) (!*(c) || *(c) == '#') - -void -tunable_param_init (const char *config_file, bool force) -{ - FILE *fp = fopen (config_file, "rt"); - if (!fp) - { - if (force) - panic ("can't open config file %s\n", config_file); - return; - } - char line[1024]; - while (fgets (line, 1024, fp)) - { - char *c = strrchr (line, '\n'); - if (!c) - panic ("Line too long in confg file %s\n", config_file); - /* Overwrite trailing NL. */ - *c = '\0'; - c = line; - skip_whitespace (c); - if (end_of_content (c)) - continue; - /* So we are on the first character of a parameter name. */ - char *name = c; - /* Find end of name. */ - skip_nonwhitespace (c); - if (end_of_content (c)) - { - *c++ = '\0'; - panic ("Error in config file %s: Parameter %s has no value.\n", - config_file, name); - } - /* Mark end of name. */ - *c++ = '\0'; - skip_whitespace (c); - if (end_of_content (c)) - panic ("Error in config file %s: Parameter %s has no value.\n", - config_file, name); - /* Now we are on the first character of a parameter's value. */ - char *value = c; - /* This only works for simple parameters. If complex string parameters - are added at one point, the scanning routine must be changed here. */ - /* Find end of value. */ - skip_nonwhitespace (c); - /* Mark end of value. */ - *c++ = '\0'; - /* Now look if name is one from our list. */ - tun_struct *s; - for (s = &tunable_params[0]; s->name; ++s) - if (!strcmp (name, s->name)) - { - /* Now read value and check for validity. check_func doesn't - return on error. */ - s->check_func (s, value, config_file); - break; - } - if (!s->name) - panic ("Error in config file %s: Unknown parameter %s.\n", - config_file, name); - } - fclose (fp); -} - -void -tunable_int_fetch (const char *name, long *tunable_target) -{ - tun_struct *s; - for (s = &tunable_params[0]; s->name; ++s) - if (!strcmp (name, s->name)) - break; - if (!s) /* Not found */ - return; - if (s->type != TUN_INT) /* Wrong type */ - return; - if (!s->value.ival) /* Not set in config file */ - return; - *tunable_target = s->value.ival; - debug ("\nSet %s to %lu\n", name, *tunable_target); -} - -void -tunable_bool_fetch (const char *name, tun_bool_t *tunable_target) -{ - tun_struct *s; - const char *tun_bool_val_string[] = { "undefined", "no", "yes" }; - for (s = &tunable_params[0]; s->name; ++s) - if (!strcmp (name, s->name)) - break; - if (!s) /* Not found */ - return; - if (s->type != TUN_BOOL) /* Wrong type */ - return; - if (!s->value.ival) /* Not set in config file */ - return; - *tunable_target = s->value.bval; - debug ("\nSet %s to %s\n", name, tun_bool_val_string[*tunable_target]); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/bsd_helper.h b/winsup/cygserver/bsd_helper.h deleted file mode 100644 index 045898573..000000000 --- a/winsup/cygserver/bsd_helper.h +++ /dev/null @@ -1,66 +0,0 @@ -/* bsd_helper.h: Helps integrating BSD kernel code - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifndef _BSD_HELPER_H -#define _BSD_HELPER_H - -#include <sys/types.h> -#include <sys/syslog.h> - -enum tun_bool_t { - TUN_UNDEF = 0, - TUN_FALSE = 1, - TUN_TRUE = 2 -}; - -#define TUNABLE_INT_FETCH(a,b) tunable_int_fetch((a),(b)) -#define TUNABLE_BOOL_FETCH(a,b) tunable_bool_fetch((a),(b)) - -#define sys_malloc(a,b,c) (malloc(a)?:(panic("malloc failed in %s, line %d"),(void*)NULL)) -#define sys_free(a,b) free(a) - -#define jail_sysvipc_allowed true -#define jailed(a) false - -extern const char *__progname; - -/* Global vars, determining whether the IPC stuff should be started or not. */ -extern tun_bool_t support_sharedmem; -extern tun_bool_t support_msgqueues; -extern tun_bool_t support_semaphores; - -extern SECURITY_ATTRIBUTES sec_all_nih; - -void securityinit (void); - -int win_copyin (struct thread *, const void *, void *, size_t); -int win_copyout (struct thread *, const void *, void *, size_t); -#define copyin(a,b,c) win_copyin((td),(a),(b),(c)) -#define copyout(a,b,c) win_copyout((td),(a),(b),(c)) - -void *get_token_info (HANDLE, TOKEN_INFORMATION_CLASS); -int ipcperm (struct thread *, struct ipc_perm *, unsigned int); -int suser (struct thread *); -bool adjust_identity_info (struct proc *p); - -struct vmspace *ipc_p_vmspace (struct proc *); -int ipcexit_creat_hookthread(struct thread *); -void ipcinit (void); -int ipcunload (void); - -vm_object_t _vm_pager_allocate (int, int); -#define vm_pager_allocate(a,b,s,c,d) _vm_pager_allocate((s),(mode)) -vm_object_t vm_object_duplicate (struct thread *td, vm_object_t object); -void vm_object_deallocate (vm_object_t object); - -void tunable_param_init (const char *, bool); -void tunable_int_fetch (const char *, long *); -void tunable_bool_fetch (const char *, tun_bool_t *); - -#endif /* _BSD_HELPER_H */ diff --git a/winsup/cygserver/bsd_log.cc b/winsup/cygserver/bsd_log.cc deleted file mode 100644 index 78dcdb00c..000000000 --- a/winsup/cygserver/bsd_log.cc +++ /dev/null @@ -1,95 +0,0 @@ -/* bsd_log.cc - - Copyright 2003, 2004 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <stdio.h> -#include <stdlib.h> - -long log_level = 8; /* Illegal value. Don't change! */ -tun_bool_t log_debug = TUN_UNDEF; -tun_bool_t log_syslog = TUN_UNDEF; -tun_bool_t log_stderr = TUN_UNDEF; - -void -loginit (tun_bool_t opt_stderr, tun_bool_t opt_syslog) -{ - if (log_debug == TUN_UNDEF) - TUNABLE_BOOL_FETCH ("kern.log.debug", &log_debug); - if (log_debug == TUN_UNDEF) - log_debug = TUN_FALSE; - - if (opt_stderr != TUN_UNDEF) - log_stderr = opt_stderr; - else - TUNABLE_BOOL_FETCH ("kern.log.stderr", &log_stderr); - if (log_stderr == TUN_UNDEF) - log_stderr = TUN_FALSE; - - if (opt_syslog != TUN_UNDEF) - log_syslog = opt_syslog; - else - TUNABLE_BOOL_FETCH ("kern.log.syslog", &log_syslog); - if (log_syslog == TUN_UNDEF) - log_syslog = TUN_FALSE; - - if (log_level == 8) - TUNABLE_INT_FETCH ("kern.log.level", &log_level); - if (log_level == 8) - log_level = 6; -} - -void -_vlog (const char *file, int line, int level, - const char *fmt, va_list ap) -{ - char buf[16384]; - char *pos; - - if ((level == LOG_DEBUG && log_debug != TUN_TRUE) - || (level != LOG_DEBUG && level >= log_level)) - return; - pos = stpcpy (buf, "cygserver: "); - if (file && log_debug == TUN_TRUE) - pos += snprintf (pos, 16384 - (pos - buf), "%s, line %d: ", file, line); - vsnprintf (pos, 16384 - (pos - buf), fmt, ap); - if (log_syslog == TUN_TRUE && level != LOG_DEBUG) - syslog (level, buf); - if (log_stderr == TUN_TRUE || level == LOG_DEBUG) - { - fputs (buf, stderr); - fputc ('\n', stderr); - } -} - -void -_log (const char *file, int line, int level, const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - _vlog (file, line, level, fmt, ap); -} - -void -_vpanic (const char *file, int line, const char *fmt, va_list ap) -{ - _vlog (file, line, LOG_CRIT, fmt, ap); - exit (1); -} - -void -_panic (const char *file, int line, const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - _vpanic (file, line, fmt, ap); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/bsd_log.h b/winsup/cygserver/bsd_log.h deleted file mode 100644 index 48573182a..000000000 --- a/winsup/cygserver/bsd_log.h +++ /dev/null @@ -1,33 +0,0 @@ -/* bsd_log.h: Helps integrating BSD kernel code - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifndef _BSD_LOG_H -#define _BSD_LOG_H - -#include <sys/types.h> -#include <sys/syslog.h> - -extern long log_level; -extern tun_bool_t log_debug; -extern tun_bool_t log_syslog; -extern tun_bool_t log_stderr; - -void loginit (tun_bool_t, tun_bool_t); -void _vlog (const char *, int, int, const char *, va_list); -void _log (const char *, int, int, const char *, ...); -void _vpanic (const char *, int, const char *, va_list) __attribute__ ((noreturn)); -void _panic (const char *, int, const char *, ...) __attribute__ ((noreturn)); -#define vlog(l,f,a) _vlog(NULL,0,(l),(f),(a)) -#define log(l,f,...) _log(NULL,0,(l),(f),##__VA_ARGS__) -#define vdebug(f,a) _vlog(__FILE__,__LINE__,LOG_DEBUG,(f),(a)) -#define debug(f,...) _log(__FILE__,__LINE__,LOG_DEBUG,(f),##__VA_ARGS__) -#define vpanic(f,a) _vpanic(__FILE__,__LINE__,(f),(a)) -#define panic(f,...) _panic(__FILE__,__LINE__,(f),##__VA_ARGS__) - -#endif /* _BSD_LOG_H */ diff --git a/winsup/cygserver/bsd_mutex.cc b/winsup/cygserver/bsd_mutex.cc deleted file mode 100644 index d4cad5678..000000000 --- a/winsup/cygserver/bsd_mutex.cc +++ /dev/null @@ -1,386 +0,0 @@ -/* bsd_mutex.cc - - Copyright 2003, 2004, 2005, 2007 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#include <errno.h> -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <sys/smallprint.h> -#include <limits.h> -#include <stdlib.h> -#include <sys/msg.h> -#include <sys/sem.h> - -#include "process.h" -#include "cygserver_ipc.h" - -/* A BSD kernel global mutex. */ -struct mtx Giant; - -void -mtx_init (mtx *m, const char *name, const void *, int) -{ - m->name = name; - m->owner = 0; - m->cnt = 0; - /* Can't use Windows Mutexes here since Windows Mutexes are only - unlockable by the lock owner. */ - m->h = CreateSemaphore (NULL, 1, 1, NULL); - if (!m->h) - panic ("couldn't allocate %s mutex, %lu\n", name, GetLastError ()); -} - -void -_mtx_lock (mtx *m, DWORD winpid, const char *file, int line) -{ - _log (file, line, LOG_DEBUG, "Try locking mutex %s (%u) (hold: %u)", - m->name, winpid, m->owner); - if (WaitForSingleObject (m->h, INFINITE) != WAIT_OBJECT_0) - _panic (file, line, "wait for %s in %d failed, %lu", m->name, winpid, - GetLastError ()); - m->owner = winpid; - _log (file, line, LOG_DEBUG, "Locked mutex %s/%u (%u)", - m->name, ++m->cnt, winpid); -} - -int -mtx_owned (mtx *m, DWORD winpid) -{ - return m->owner == winpid; -} - -void -_mtx_assert (mtx *m, int what, DWORD winpid, const char *file, int line) -{ - switch (what) - { - case MA_OWNED: - if (!mtx_owned (m, winpid)) - _panic (file, line, "Mutex %s not owned", m->name); - break; - case MA_NOTOWNED: - if (mtx_owned (m, winpid)) - _panic (file, line, "Mutex %s is owned", m->name); - break; - default: - break; - } -} - -void -_mtx_unlock (mtx *m, const char *file, int line) -{ - DWORD owner = m->owner; - unsigned long cnt = m->cnt; - m->owner = 0; - /* Cautiously check if mtx_destroy has been called (shutdown). - In that case, m->h is NULL. */ - if (m->h && !ReleaseSemaphore (m->h, 1, NULL)) - { - /* Check if the semaphore was already on it's max value. */ - if (GetLastError () != ERROR_TOO_MANY_POSTS) - _panic (file, line, "release of mutex %s failed, %lu", m->name, - GetLastError ()); - } - _log (file, line, LOG_DEBUG, "Unlocked mutex %s/%u (owner: %u)", - m->name, cnt, owner); -} - -void -mtx_destroy (mtx *m) -{ - HANDLE tmp = m->h; - m->h = NULL; - if (tmp) - CloseHandle (tmp); -} - -/* - * Helper functions for msleep/wakeup. - */ - -static int -win_priority (int priority) -{ - int p = (int)((priority) & PRIO_MASK) - PZERO; - /* Generating a valid priority value is a bit tricky. The only valid - values on NT4 are -15, -2, -1, 0, 1, 2, 15. */ - switch (p) - { - case -15: case -14: case -13: case -12: case -11: - return THREAD_PRIORITY_IDLE; - case -10: case -9: case -8: case -7: case -6: - return THREAD_PRIORITY_LOWEST; - case -5: case -4: case -3: case -2: case -1: - return THREAD_PRIORITY_BELOW_NORMAL; - case 0: - return THREAD_PRIORITY_NORMAL; - case 1: case 2: case 3: case 4: case 5: - return THREAD_PRIORITY_ABOVE_NORMAL; - case 6: case 7: case 8: case 9: case 10: - return THREAD_PRIORITY_HIGHEST; - case 11: case 12: case 13: case 14: case 15: - return THREAD_PRIORITY_TIME_CRITICAL; - } - return THREAD_PRIORITY_NORMAL; -} - -/* - * Sets the thread priority, returns the old priority. - */ -static int -set_priority (int priority) -{ - int old_prio = GetThreadPriority (GetCurrentThread ()); - if (!SetThreadPriority (GetCurrentThread (), win_priority (priority))) - log (LOG_WARNING, - "Warning: Setting thread priority to %d failed with error %lu\n", - win_priority (priority), GetLastError ()); - return old_prio; -} - -/* - * Original description from BSD code: - * - * General sleep call. Suspends the current process until a wakeup is - * performed on the specified identifier. The process will then be made - * runnable with the specified priority. Sleeps at most timo/hz seconds - * (0 means no timeout). If pri includes PCATCH flag, signals are checked - * before and after sleeping, else signals are not checked. Returns 0 if - * awakened, EWOULDBLOCK if the timeout expires. If PCATCH is set and a - * signal needs to be delivered, ERESTART is returned if the current system - * call should be restarted if possible, and EINTR is returned if the system - * call should be interrupted by the signal (return EINTR). - * - * The mutex argument is exited before the caller is suspended, and - * entered before msleep returns. If priority includes the PDROP - * flag the mutex is not entered before returning. - */ -static HANDLE msleep_glob_evt; - -class msleep_sync_array -{ - enum msleep_action { - MSLEEP_ENTER = 0, - MSLEEP_LEAVE, - MSLEEP_WAKEUP - }; - - CRITICAL_SECTION cs; - long cnt; - long max_cnt; - struct msleep_record { - void *ident; - HANDLE wakeup_evt; - LONG threads; - } *a; - - int find_ident (void *ident, msleep_action action) - { - int i; - for (i = 0; i < cnt; ++i) - if (a[i].ident == ident) - return i; - if (i >= max_cnt) - panic ("ident %x not found and run out of slots.", ident); - if (i >= cnt && action == MSLEEP_LEAVE) - panic ("ident %x not found (%d).", ident, action); - return i; - } - - HANDLE first_entry (int i, void *ident) - { - debug ("New ident %x, index %d", ident, i); - a[i].ident = ident; - a[i].wakeup_evt = CreateEvent (NULL, TRUE, FALSE, NULL); - if (!a[i].wakeup_evt) - panic ("CreateEvent failed: %lu", GetLastError ()); - debug ("i = %d, CreateEvent: %x", i, a[i].wakeup_evt); - a[i].threads = 1; - ++cnt; - return a[i].wakeup_evt; - } - - HANDLE next_entry (int i) - { - if (a[i].ident && WaitForSingleObject (a[i].wakeup_evt, 0) != WAIT_OBJECT_0) - { - ++a[i].threads; - return a[i].wakeup_evt; - } - return NULL; - } - -public: - - msleep_sync_array (int count) : cnt (0), max_cnt (count) - { - InitializeCriticalSection (&cs); - if (!(a = new msleep_record[count])) - panic ("Allocating msleep records failed: %d", errno); - } - - HANDLE enter (void *ident) - { - HANDLE evt = NULL; - while (!evt) - { - EnterCriticalSection (&cs); - int i = find_ident (ident, MSLEEP_ENTER); - if (i >= cnt) - evt = first_entry (i, ident); - else if (!(evt = next_entry (i))) - { - /* wakeup has been called, so sleep to wait until all - formerly waiting threads have left and retry. */ - LeaveCriticalSection (&cs); - Sleep (1L); - } - } - LeaveCriticalSection (&cs); - return evt; - } - - void leave (void *ident) - { - EnterCriticalSection (&cs); - int i = find_ident (ident, MSLEEP_LEAVE); - if (--a[i].threads == 0) - { - debug ("i = %d, CloseEvent: %x", i, a[i].wakeup_evt); - CloseHandle (a[i].wakeup_evt); - a[i].ident = NULL; - --cnt; - if (i < cnt) - a[i] = a[cnt]; - } - LeaveCriticalSection (&cs); - } - - void wakeup (void *ident) - { - EnterCriticalSection (&cs); - int i = find_ident (ident, MSLEEP_WAKEUP); - if (i < cnt && a[i].ident) - SetEvent (a[i].wakeup_evt); - LeaveCriticalSection (&cs); - } -}; - -static msleep_sync_array *msleep_sync; - -void -msleep_init (void) -{ - extern struct msginfo msginfo; - extern struct seminfo seminfo; - - msleep_glob_evt = CreateEvent (NULL, TRUE, FALSE, NULL); - if (!msleep_glob_evt) - panic ("CreateEvent in msleep_init failed: %lu", GetLastError ()); - long msgmni = support_msgqueues ? msginfo.msgmni : 0; - long semmni = support_semaphores ? seminfo.semmni : 0; - TUNABLE_INT_FETCH ("kern.ipc.msgmni", &msgmni); - TUNABLE_INT_FETCH ("kern.ipc.semmni", &semmni); - debug ("Try allocating msgmni (%d) + semmni (%d) msleep records", - msgmni, semmni); - msleep_sync = new msleep_sync_array (msgmni + semmni); - if (!msleep_sync) - panic ("Allocating msleep records in msleep_init failed: %d", errno); -} - -int -_msleep (void *ident, struct mtx *mtx, int priority, - const char *wmesg, int timo, struct thread *td) -{ - int ret = -1; - - HANDLE evt = msleep_sync->enter (ident); - - if (mtx) - mtx_unlock (mtx); - int old_priority = set_priority (priority); - HANDLE obj[4] = - { - evt, - msleep_glob_evt, - td->client->handle (), - td->client->signal_arrived () - }; - /* PCATCH handling. If PCATCH is given and signal_arrived is a valid - handle, then it's used in the WaitFor call and EINTR is returned. */ - int obj_cnt = 3; - if ((priority & PCATCH) - && td->client->signal_arrived () != INVALID_HANDLE_VALUE) - obj_cnt = 4; - switch (WaitForMultipleObjects (obj_cnt, obj, FALSE, timo ?: INFINITE)) - { - case WAIT_OBJECT_0: /* wakeup() has been called. */ - ret = 0; - debug ("msleep wakeup called for %d", td->td_proc->winpid); - break; - case WAIT_OBJECT_0 + 1: /* Shutdown event (triggered by wakeup_all). */ - priority |= PDROP; - /*FALLTHRU*/ - case WAIT_OBJECT_0 + 2: /* The dependent process has exited. */ - debug ("msleep process exit or shutdown for %d", td->td_proc->winpid); - ret = EIDRM; - break; - case WAIT_OBJECT_0 + 3: /* Signal for calling process arrived. */ - debug ("msleep process got signal for %d", td->td_proc->winpid); - ret = EINTR; - break; - case WAIT_TIMEOUT: - ret = EWOULDBLOCK; - break; - default: - /* There's a chance that a process has been terminated before - WaitForMultipleObjects has been called. In this case the handles - might be invalid. The error code returned is ERROR_INVALID_HANDLE. - Since we can trust the values of these handles otherwise, we - treat an ERROR_INVALID_HANDLE as a normal process termination and - hope for the best. */ - if (GetLastError () != ERROR_INVALID_HANDLE) - panic ("wait in msleep (%s) failed, %lu", wmesg, GetLastError ()); - debug ("wait in msleep (%s) failed for %d, %lu", wmesg, - td->td_proc->winpid, GetLastError ()); - ret = EIDRM; - break; - } - - msleep_sync->leave (ident); - - set_priority (old_priority); - - if (mtx && !(priority & PDROP)) - mtx_lock (mtx); - return ret; -} - -/* - * Make all threads sleeping on the specified identifier runnable. - */ -int -wakeup (void *ident) -{ - msleep_sync->wakeup (ident); - return 0; -} - -/* - * Wakeup all sleeping threads. Only called in the context of cygserver - * shutdown. - */ -void -wakeup_all (void) -{ - SetEvent (msleep_glob_evt); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/bsd_mutex.h b/winsup/cygserver/bsd_mutex.h deleted file mode 100644 index c9f501576..000000000 --- a/winsup/cygserver/bsd_mutex.h +++ /dev/null @@ -1,52 +0,0 @@ -/* bsd_mutex.h: BSD Mutex helper - - Copyright 2003, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ -#ifndef _BSD_MUTEX_H -#define _BSD_MUTEX_H - -#define MTX_DEF 0 - -#define MA_OWNED 1 -#define MA_NOTOWNED 2 - -#define PZERO (0x20) -#define PRIO_MASK (0x1f) -#define PDROP 0x1000 -#define PCATCH 0x2000 -#define PLOCK 0x3000 - -struct mtx { - HANDLE h; - const char *name; - DWORD owner; - unsigned long cnt; -}; - -/* Some BSD kernel global mutex. */ -extern struct mtx Giant; - -void mtx_init (mtx *, const char *, const void *, int); -void _mtx_lock (mtx *, DWORD winpid, const char *, int); -#define mtx_lock(m) _mtx_lock((m), (td->ipcblk->winpid), __FILE__, __LINE__) -int mtx_owned (mtx *, DWORD); -void _mtx_assert(mtx *, int, DWORD winpid, const char *, int); -#define mtx_assert(m,w,p) _mtx_assert((m),(w),(p),__FILE__,__LINE__) -void _mtx_unlock (mtx *, const char *, int); -#define mtx_unlock(m) _mtx_unlock((m),__FILE__,__LINE__) - -void mtx_destroy (mtx *); - -void msleep_init (void); -int _msleep (void *, struct mtx *, int, const char *, int, struct thread *); -#define msleep(i,m,p,w,t) _msleep((i),(m),(p),(w),(t),(td)) -#define tsleep(i,p,w,t) _msleep((i),NULL,(p),(w),(t),(td)) -int wakeup (void *); -void wakeup_all (void); - -#endif /* _BSD_MUTEX_H */ diff --git a/winsup/cygserver/client.cc b/winsup/cygserver/client.cc deleted file mode 100644 index 6c3303a24..000000000 --- a/winsup/cygserver/client.cc +++ /dev/null @@ -1,538 +0,0 @@ -/* client.cc - - Copyright 2001, 2002, 2003, 2004, 2008, 2009 Red Hat Inc. - - Written by Egor Duda <deo@logos-m.ru> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* to allow this to link into cygwin and the .dll, a little magic is needed. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#else -#include "winsup.h" -#endif - -#include <assert.h> -#include <errno.h> -#include <stdio.h> -#include <unistd.h> - -#include "sigproc.h" - -#include "cygserver_msg.h" -#include "cygserver_sem.h" -#include "cygserver_shm.h" -#include "cygserver_setpwd.h" - -#include "cygserver.h" -#include "transport.h" - -int cygserver_running = CYGSERVER_UNKNOWN; // Nb: inherited by children. - -client_request_get_version::client_request_get_version () - : client_request (CYGSERVER_REQUEST_GET_VERSION, &version, sizeof (version)) -{ - msglen (0); // No parameters for request. - - // verbose: syscall_printf ("created"); -} - -/* - * client_request_get_version::check_version () - * - * The major version and API version numbers must match exactly. An - * older than expected minor version number is accepted (as long as - * the first numbers match, that is). - */ - -#ifdef __INSIDE_CYGWIN__ - -bool -client_request_get_version::check_version () const -{ - const bool ok = (version.major == CYGWIN_SERVER_VERSION_MAJOR - && version.api == CYGWIN_SERVER_VERSION_API - && version.minor <= CYGWIN_SERVER_VERSION_MINOR); - - if (!ok) - syscall_printf (("incompatible version of cygwin server: " - "client version %d.%d.%d.%d, " - "server version %ld.%ld.%ld.%ld"), - CYGWIN_SERVER_VERSION_MAJOR, - CYGWIN_SERVER_VERSION_API, - CYGWIN_SERVER_VERSION_MINOR, - CYGWIN_SERVER_VERSION_PATCH, - version.major, - version.api, - version.minor, - version.patch); - - return ok; -} - -client_request_attach_tty::client_request_attach_tty (DWORD nmaster_pid, - HANDLE nfrom_master, - HANDLE nto_master) - : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req)) -{ - req.pid = GetCurrentProcessId (); - req.master_pid = nmaster_pid; - req.from_master = nfrom_master; - req.to_master = nto_master; - - syscall_printf (("created: pid = %lu, master_pid = %lu, " - "from_master = %lu, to_master = %lu"), - req.pid, req.master_pid, req.from_master, req.to_master); -} -#endif /* __INSIDE_CYGWIN__ */ - -/* - * client_request_attach_tty::send () - * - * Wraps the base method to provide error handling support. If the - * reply contains a body but is flagged as an error, close any handles - * that have been returned by cygserver and then discard the message - * body, i.e. the client either sees a successful result with handles - * or an unsuccessful result with no handles. - */ - -void -client_request_attach_tty::send (transport_layer_base * const conn) -{ - client_request::send (conn); - - if (msglen () && error_code ()) - { - if (from_master ()) - CloseHandle (from_master ()); - if (to_master ()) - CloseHandle (to_master ()); - msglen (0); - } -} - -client_request::header_t::header_t (const request_code_t request_code, - const size_t msglen) - : msglen (msglen), - request_code (request_code) -{ - assert (request_code >= 0 && request_code < CYGSERVER_REQUEST_LAST); -} - -// FIXME: also check write and read result for -1. - -void -client_request::send (transport_layer_base * const conn) -{ - assert (conn); - assert (!(msglen () && !_buf)); // i.e., msglen () implies _buf - assert (msglen () <= _buflen); - - { - const ssize_t count = conn->write (&_header, sizeof (_header)); - - if (count != sizeof (_header)) - { - assert (errno); - error_code (errno); - syscall_printf (("request header write failure: " - "only %ld bytes sent of %ld, " - "error = %d(%lu)"), - count, sizeof (_header), - errno, GetLastError ()); - return; - } - } - - if (msglen ()) - { - const ssize_t count = conn->write (_buf, msglen ()); - - if (count == -1 || (size_t) count != msglen ()) - { - assert (errno); - error_code (errno); - syscall_printf (("request body write failure: " - "only %ld bytes sent of %ld, " - "error = %d(%lu)"), - count, msglen (), - errno, GetLastError ()); - return; - } - } - - // verbose: syscall_printf ("request sent (%ld + %ld bytes)", - // sizeof (_header), msglen ()); - - { - const ssize_t count = conn->read (&_header, sizeof (_header)); - - if (count != sizeof (_header)) - { - assert (errno); - error_code (errno); - syscall_printf (("reply header read failure: " - "only %ld bytes received of %ld, " - "error = %d(%lu)"), - count, sizeof (_header), - errno, GetLastError ()); - return; - } - } - - if (msglen () && !_buf) - { - system_printf ("no client buffer for reply body: %ld bytes needed", - msglen ()); - error_code (EINVAL); - return; - } - - if (msglen () > _buflen) - { - system_printf (("client buffer too small for reply body: " - "have %ld bytes and need %ld"), - _buflen, msglen ()); - error_code (EINVAL); - return; - } - - if (msglen ()) - { - const ssize_t count = conn->read (_buf, msglen ()); - - if (count == -1 || (size_t) count != msglen ()) - { - assert (errno); - error_code (errno); - syscall_printf (("reply body read failure: " - "only %ld bytes received of %ld, " - "error = %d(%lu)"), - count, msglen (), - errno, GetLastError ()); - return; - } - } - - // verbose: syscall_printf ("reply received (%ld + %ld bytes)", - // sizeof (_header), msglen ()); -} - -#ifdef __OUTSIDE_CYGWIN__ - -client_request_attach_tty::client_request_attach_tty () - : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req)) -{ -} - -/* - * client_request::handle_request () - * - * A server-side method. - * - * This is a factory method for the client_request subclasses. It - * reads the incoming request header and, based on its request code, - * creates an instance of the appropriate class. - * - * FIXME: If the incoming packet is malformed, the server drops it on - * the floor. Should it try and generate some sort of reply for the - * client? As it is, the client will simply get a broken connection. - * - * FIXME: also check write and read result for -1. - */ - -/* static */ void -client_request::handle_request (transport_layer_base *const conn, - process_cache *const cache) -{ - // verbose: debug_printf ("about to read"); - - header_t header; - - { - const ssize_t count = conn->read (&header, sizeof (header)); - - if (count != sizeof (header)) - { - syscall_printf (("request header read failure: " - "only %ld bytes received of %ld, " - "error = %d(%lu)"), - count, sizeof (header), - errno, GetLastError ()); - return; - } - - // verbose: debug_printf ("got header (%ld)", count); - } - - client_request *req = NULL; - - switch (header.request_code) - { - case CYGSERVER_REQUEST_GET_VERSION: - req = new client_request_get_version; - break; - case CYGSERVER_REQUEST_SHUTDOWN: - req = new client_request_shutdown; - break; - case CYGSERVER_REQUEST_ATTACH_TTY: - req = new client_request_attach_tty; - break; - case CYGSERVER_REQUEST_MSG: - req = new client_request_msg; - break; - case CYGSERVER_REQUEST_SEM: - req = new client_request_sem; - break; - case CYGSERVER_REQUEST_SHM: - req = new client_request_shm; - break; - case CYGSERVER_REQUEST_SETPWD: - req = new client_request_setpwd; - break; - default: - syscall_printf ("unknown request code %d received: request ignored", - header.request_code); - return; - } - - assert (req); - - req->msglen (header.msglen); - req->handle (conn, cache); - - delete req; -} - -/* - * client_request::handle () - * - * A server-side method. - * - * At this point, the header of an incoming request has been read and - * an appropriate client_request object constructed. This method has - * to read the request body into its buffer, if there is such a body, - * then perform the request and send back the results to the client. - * - * FIXME: If the incoming packet is malformed, the server drops it on - * the floor. Should it try and generate some sort of reply for the - * client? As it is, the client will simply get a broken connection. - * - * FIXME: also check write and read result for -1. - */ - -void -client_request::handle (transport_layer_base *const conn, - process_cache *const cache) -{ - if (msglen () && !_buf) - { - system_printf ("no buffer for request body: %ld bytes needed", - msglen ()); - error_code (EINVAL); - return; - } - - if (msglen () > _buflen) - { - system_printf (("buffer too small for request body: " - "have %ld bytes and need %ld"), - _buflen, msglen ()); - error_code (EINVAL); - return; - } - - if (msglen ()) - { - const ssize_t count = conn->read (_buf, msglen ()); - - if (count == -1 || (size_t) count != msglen ()) - { - assert (errno); - error_code (errno); - syscall_printf (("request body read failure: " - "only %ld bytes received of %ld, " - "error = %d(%lu)"), - count, msglen (), - errno, GetLastError ()); - return; - } - } - - // verbose: syscall_printf ("request received (%ld + %ld bytes)", - // sizeof (_header), msglen ()); - - error_code (0); // Overwrites the _header.request_code field. - - /* - * This is not allowed to fail. We must return ENOSYS at a minimum - * to the client. - */ - serve (conn, cache); - - { - const ssize_t count = conn->write (&_header, sizeof (_header)); - - if (count != sizeof (_header)) - { - assert (errno); - error_code (errno); - syscall_printf (("reply header write failure: " - "only %ld bytes sent of %ld, " - "error = %d(%lu)"), - count, sizeof (_header), - errno, GetLastError ()); - return; - } - } - - if (msglen ()) - { - const ssize_t count = conn->write (_buf, msglen ()); - - if (count == -1 || (size_t) count != msglen ()) - { - assert (errno); - error_code (errno); - syscall_printf (("reply body write failure: " - "only %ld bytes sent of %ld, " - "error = %d(%lu)"), - count, msglen (), - errno, GetLastError ()); - return; - } - } - - // verbose: syscall_printf ("reply sent (%ld + %ld bytes)", - // sizeof (_header), msglen ()); -} - -/* The server side implementation of make_request. Very simple. */ -int -client_request::make_request () -{ - transport_layer_base *const transport = create_server_transport (); - assert (transport); - if (transport->connect () == -1) - { - if (errno) - error_code (errno); - else - error_code (ENOSYS); - delete transport; - return -1; - } - send (transport); - delete transport; - return 0; -} -#endif /* __OUTSIDE_CYGWIN__ */ - -client_request::client_request (request_code_t const id, - void * const buf, - size_t const buflen) - : _header (id, buflen), - _buf (buf), - _buflen (buflen) -{ - assert ((!_buf && !_buflen) || (_buf && _buflen)); -} - -client_request::~client_request () -{} - -#ifdef __INSIDE_CYGWIN__ -int -client_request::make_request () -{ - assert (cygserver_running == CYGSERVER_UNKNOWN \ - || cygserver_running == CYGSERVER_OK \ - || cygserver_running == CYGSERVER_UNAVAIL); - - if (cygserver_running == CYGSERVER_UNKNOWN) - cygserver_init (); - - assert (cygserver_running == CYGSERVER_OK \ - || cygserver_running == CYGSERVER_UNAVAIL); - - /* Don't retry every request if the server's not there */ - if (cygserver_running == CYGSERVER_UNAVAIL) - { - syscall_printf ("cygserver un-available"); - error_code (ENOSYS); - return -1; - } - - transport_layer_base *const transport = create_server_transport (); - - assert (transport); - - if (transport->connect () == -1) - { - if (errno) - error_code (errno); - else - error_code (ENOSYS); - delete transport; - return -1; - } - - // verbose: debug_printf ("connected to server %p", transport); - - send (transport); - - delete transport; - - return 0; -} - -bool -check_cygserver_available () -{ - assert (cygserver_running == CYGSERVER_UNKNOWN \ - || cygserver_running == CYGSERVER_UNAVAIL); - - cygserver_running = CYGSERVER_OK; // For make_request (). - - client_request_get_version req; - - /* This indicates that we failed to connect to cygserver at all but - * that's fine as cygwin doesn't need it to be running. - */ - if (req.make_request () == -1) - return false; - - /* We connected to the server but something went wrong after that - * (in sending the message, in cygserver itself, or in receiving the - * reply). - */ - if (req.error_code ()) - { - syscall_printf ("failure in cygserver version request: %d", - req.error_code ()); - syscall_printf ("process will continue without cygserver support"); - return false; - } - - return req.check_version (); -} - -void -cygserver_init () -{ - assert (cygserver_running == CYGSERVER_UNKNOWN \ - || cygserver_running == CYGSERVER_OK \ - || cygserver_running == CYGSERVER_UNAVAIL); - - if (cygserver_running == CYGSERVER_OK) - return; - - if (!check_cygserver_available ()) - cygserver_running = CYGSERVER_UNAVAIL; -} -#endif /* __INSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/configure b/winsup/cygserver/configure deleted file mode 100755 index 383421fc6..000000000 --- a/winsup/cygserver/configure +++ /dev/null @@ -1,5240 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. -# -# Copyright (C) 2003 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -exec 6>&1 - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_config_libobj_dir=. -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= - -ac_unique_file="cygserver.cc" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC ac_ct_CC CFLAGS LDFLAGS CPPFLAGS EXEEXT OBJEXT CXX ac_ct_CXX CXXFLAGS all_host install_host AR ac_ct_AR AS ac_ct_AS RANLIB ac_ct_RANLIB LD ac_ct_LD NM ac_ct_NM DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES ALLOCA CPP EGREP SET_MAKE LIBOBJS LTLIBOBJS' -ac_subst_files='' - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -ac_prev= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_option in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; - - -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "enable_$ac_feature='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "with_$ac_package='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi -fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -_ACEOF - - cat <<_ACEOF -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-debugging Build a cygwin DLL which has more consistency checking for debugging - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a - nonstandard directory <lib dir> - CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have - headers in a nonstandard directory <include dir> - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -_ACEOF -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - ac_popdir=`pwd` - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd "$ac_popdir" - done -fi - -test -n "$ac_init_help" && exit 0 -if $ac_init_version; then - cat <<\_ACEOF - -Copyright (C) 2003 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit 0 -fi -exec 5>config.log -cat >&5 <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was - - $ $0 $@ - -_ACEOF -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_sep= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -{ - (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) - sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; - *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - sed "/^$/d" confdefs.h | sort - echo - fi - test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status - ' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; - esac - fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" - case $ac_old_set,$ac_new_set in - set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - - - - - - - - - - - - - - - - -ac_aux_dir= -for ac_dir in ../.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ../.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in ../.. $srcdir/../.." >&2;} - { (exit 1); exit 1; }; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - - -INSTALL=`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi -fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} - { (exit 1); exit 1; }; } - -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 -build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 -host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking target system type" >&5 -echo $ECHO_N "checking target system type... $ECHO_C" >&6 -if test "${ac_cv_target+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_target_alias=$target_alias -test "x$ac_cv_target_alias" = "x" && - ac_cv_target_alias=$ac_cv_host_alias -ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -echo "$as_me:$LINENO: result: $ac_cv_target" >&5 -echo "${ECHO_T}$ac_cv_target" >&6 -target=$ac_cv_target -target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_CC" && ac_cv_prog_ac_ct_CC="gcc" -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - -: ${CC:=gcc} -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CC" && break -done - - CC=$ac_ct_CC -fi - -fi - - -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 - (eval $ac_compiler --version </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 - (eval $ac_compiler -v </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 - (eval $ac_compiler -V </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext - break;; - * ) - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } -fi - -ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 - -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -rm -f a.out a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; - * ) break;; - esac -done -else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cc_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_stdc=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext -done -rm -f conftest.$ac_ext conftest.$ac_objext -CC=$ac_save_CC - -fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; - *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; -esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include <stdlib.h> -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable cc found in \$PATH" >&5 -echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} - { (exit 1); exit 1; }; } - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. -set dummy ${ac_tool_prefix}g++; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="${ac_tool_prefix}g++" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CXX"; then - ac_ct_CXX=$CXX - # Extract the first word of "g++", so it can be a program name with args. -set dummy g++; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="g++" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_CXX" && ac_cv_prog_ac_ct_CXX="g++" -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CXX=$ac_ct_CXX -else - CXX="$ac_cv_prog_CXX" -fi - -if test -z "$CXX"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. -set dummy ${ac_tool_prefix}g++; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="${ac_tool_prefix}g++" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CXX"; then - ac_ct_CXX=$CXX - # Extract the first word of "g++", so it can be a program name with args. -set dummy g++; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="g++" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_CXX" && ac_cv_prog_ac_ct_CXX="c++" -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CXX=$ac_ct_CXX -else - CXX="$ac_cv_prog_CXX" -fi - - : ${CXX:=g++} - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CXX" && break -done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - - CXX=$ac_ct_CXX -fi - - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 - (eval $ac_compiler --version </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 - (eval $ac_compiler -v </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 - (eval $ac_compiler -V </dev/null >&5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include <stdlib.h> -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable cc found in \$PATH" >&5 -echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -fi - -CXXFLAGS='$(CFLAGS)' - - -case "$with_cross_host" in - ""|*cygwin*) - all_host="all_host" - install_host="install_host" - ;; - *) - all_host= - install_host= - ;; -esac - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar" -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - AR=$ac_ct_AR -else - AR="$ac_cv_prog_AR" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AS+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AS="${ac_tool_prefix}as" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - echo "$as_me:$LINENO: result: $AS" >&5 -echo "${ECHO_T}$AS" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_AS+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AS="as" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="as" -fi -fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 -echo "${ECHO_T}$ac_ct_AS" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - AS=$ac_ct_AS -else - AS="$ac_cv_prog_AS" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="ranlib" -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - RANLIB=$ac_ct_RANLIB -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. -set dummy ${ac_tool_prefix}ld; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$LD"; then - ac_cv_prog_LD="$LD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LD="${ac_tool_prefix}ld" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -LD=$ac_cv_prog_LD -if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_LD"; then - ac_ct_LD=$LD - # Extract the first word of "ld", so it can be a program name with args. -set dummy ld; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_LD"; then - ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LD="ld" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld" -fi -fi -ac_ct_LD=$ac_cv_prog_ac_ct_LD -if test -n "$ac_ct_LD"; then - echo "$as_me:$LINENO: result: $ac_ct_LD" >&5 -echo "${ECHO_T}$ac_ct_LD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - LD=$ac_ct_LD -else - LD="$ac_cv_prog_LD" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. -set dummy ${ac_tool_prefix}nm; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$NM"; then - ac_cv_prog_NM="$NM" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NM="${ac_tool_prefix}nm" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -NM=$ac_cv_prog_NM -if test -n "$NM"; then - echo "$as_me:$LINENO: result: $NM" >&5 -echo "${ECHO_T}$NM" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_NM"; then - ac_ct_NM=$NM - # Extract the first word of "nm", so it can be a program name with args. -set dummy nm; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_NM"; then - ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NM="nm" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_NM" && ac_cv_prog_ac_ct_NM="nm" -fi -fi -ac_ct_NM=$ac_cv_prog_ac_ct_NM -if test -n "$ac_ct_NM"; then - echo "$as_me:$LINENO: result: $ac_ct_NM" >&5 -echo "${ECHO_T}$ac_ct_NM" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - NM=$ac_ct_NM -else - NM="$ac_cv_prog_NM" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_DLLTOOL+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - echo "$as_me:$LINENO: result: $DLLTOOL" >&5 -echo "${ECHO_T}$DLLTOOL" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="dlltool" -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 -echo "${ECHO_T}$ac_ct_DLLTOOL" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - DLLTOOL=$ac_ct_DLLTOOL -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. -set dummy ${ac_tool_prefix}windres; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_WINDRES+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$WINDRES"; then - ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_WINDRES="${ac_tool_prefix}windres" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -WINDRES=$ac_cv_prog_WINDRES -if test -n "$WINDRES"; then - echo "$as_me:$LINENO: result: $WINDRES" >&5 -echo "${ECHO_T}$WINDRES" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_WINDRES"; then - ac_ct_WINDRES=$WINDRES - # Extract the first word of "windres", so it can be a program name with args. -set dummy windres; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_WINDRES+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_WINDRES"; then - ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_WINDRES="windres" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_WINDRES" && ac_cv_prog_ac_ct_WINDRES="windres" -fi -fi -ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES -if test -n "$ac_ct_WINDRES"; then - echo "$as_me:$LINENO: result: $ac_ct_WINDRES" >&5 -echo "${ECHO_T}$ac_ct_WINDRES" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - WINDRES=$ac_ct_WINDRES -else - WINDRES="$ac_cv_prog_WINDRES" -fi - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep - - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo "$as_me:$LINENO: checking for working alloca.h" >&5 -echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 -if test "${ac_cv_working_alloca_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <alloca.h> -int -main () -{ -char *p = (char *) alloca (2 * sizeof (int)); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_working_alloca_h=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_working_alloca_h=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 -echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 -if test $ac_cv_working_alloca_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA_H 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking for alloca" >&5 -echo $ECHO_N "checking for alloca... $ECHO_C" >&6 -if test "${ac_cv_func_alloca_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include <malloc.h> -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include <alloca.h> -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int -main () -{ -char *p = (char *) alloca (1); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_alloca_works=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_alloca_works=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 -echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 - -if test $ac_cv_func_alloca_works = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA 1 -_ACEOF - -else - # The SVR3 libPW and SVR4 libucb both contain incompatible functions -# that cause trouble. Some versions do not even contain alloca or -# contain a buggy version. If you still want to use their alloca, -# use ar to extract alloca.o from them instead of compiling alloca.c. - -ALLOCA=alloca.$ac_objext - -cat >>confdefs.h <<\_ACEOF -#define C_ALLOCA 1 -_ACEOF - - -echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 -echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 -if test "${ac_cv_os_cray+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if defined(CRAY) && ! defined(CRAY2) -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 -echo "${ECHO_T}$ac_cv_os_cray" >&6 -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. - For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - <limits.h> exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi - - done -fi - -echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 -echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 -if test "${ac_cv_c_stack_direction+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int -find_stack_direction () -{ - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; -} - -int -main () -{ - exit (find_stack_direction () < 0); -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_stack_direction=1 -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_c_stack_direction=-1 -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 -echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 - -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF - - -fi - -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.make <<\_ACEOF -all: - @echo 'ac_maketemp="$(MAKE)"' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftest.make -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - SET_MAKE= -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -# Test for builtin mem* functions. - - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include <string.h> -void foo(char *s, int c, size_t n) -{ - __builtin_memset(s, c, n); -} - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - use_builtin_memset=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -use_builtin_memset=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -if test $use_builtin_memset = "yes"; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_BUILTIN_MEMSET 1 -_ACEOF - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Check whether --enable-debugging or --disable-debugging was given. -if test "${enable_debugging+set}" = set; then - enableval="$enable_debugging" - case "${enableval}" in -yes) cat >>confdefs.h <<\_ACEOF -#define DEBUGGING 1 -_ACEOF - ;; -no) ;; -esac - -fi; - - ac_config_files="$ac_config_files Makefile" -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -{ - (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} | - sed ' - t clear - : clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then we branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -cat >confdef2opt.sed <<\_ACEOF -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g -t quote -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g -t quote -d -: quote -s,[ `~#$^&*(){}\\|;'"<>?],\\&,g -s,\[,\\&,g -s,\],\\&,g -s,\$,$$,g -p -_ACEOF -# We use echo to avoid assuming a particular line-breaking character. -# The extra dot is to prevent the shell from consuming trailing -# line-breaks from the sub-command output. A line-break within -# single-quotes doesn't work because, if this script is created in a -# platform that uses two characters for line-breaks (e.g., DOS), tr -# would break. -ac_LF_and_DOT=`echo; echo .` -DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` -rm -f confdef2opt.sed - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - -exec 6>&1 - -# Open the log real soon, to keep \$[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 -_ACEOF - -# Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF - -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTIONS] [FILE]... - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to <bug-autoconf@gnu.org>." -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2003 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` - ac_shift=: - ;; - -*) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; - esac - - case $ac_option in - # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" - ac_need_defaults=false;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF - - - - - -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_config_target in $ac_config_targets -do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. -$debug || -{ - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} - -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF - -# -# CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@target@,$target,;t t -s,@target_cpu@,$target_cpu,;t t -s,@target_vendor@,$target_vendor,;t t -s,@target_os@,$target_os,;t t -s,@CC@,$CC,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@CXX@,$CXX,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@all_host@,$all_host,;t t -s,@install_host@,$install_host,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t -s,@AS@,$AS,;t t -s,@ac_ct_AS@,$ac_ct_AS,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@LD@,$LD,;t t -s,@ac_ct_LD@,$ac_ct_LD,;t t -s,@NM@,$NM,;t t -s,@ac_ct_NM@,$ac_ct_NM,;t t -s,@DLLTOOL@,$DLLTOOL,;t t -s,@ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t -s,@WINDRES@,$WINDRES,;t t -s,@ac_ct_WINDRES@,$ac_ct_WINDRES,;t t -s,@ALLOCA@,$ALLOCA,;t t -s,@CPP@,$CPP,;t t -s,@EGREP@,$EGREP,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi -fi # test -n "$CONFIG_FILES" - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; - esac - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi - diff --git a/winsup/cygserver/configure.in b/winsup/cygserver/configure.in deleted file mode 100644 index f0fd4b01a..000000000 --- a/winsup/cygserver/configure.in +++ /dev/null @@ -1,75 +0,0 @@ -dnl Autoconf configure script for Cygwin. -dnl Copyright 2003 Red Hat, Inc. -dnl -dnl This file is part of Cygwin. -dnl -dnl This software is a copyrighted work licensed under the terms of the -dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for -dnl details. -dnl -dnl Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59)dnl -AC_INIT(cygserver.cc) - -AC_CONFIG_AUX_DIR(../..) - -INSTALL=`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -AC_PROG_INSTALL -AC_CANONICAL_SYSTEM - -LIB_AC_PROG_CC -LIB_AC_PROG_CXX - -case "$with_cross_host" in - ""|*cygwin*) - all_host="all_host" - install_host="install_host" - ;; - *) - all_host= - install_host= - ;; -esac - -AC_SUBST(all_host) -AC_SUBST(install_host) - -AC_CHECK_TOOL(AR, ar, ar) -AC_CHECK_TOOL(AS, as, as) -AC_CHECK_TOOL(RANLIB, ranlib, ranlib) -AC_CHECK_TOOL(LD, ld, ld) -AC_CHECK_TOOL(NM, nm, nm) -AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool) -AC_CHECK_TOOL(WINDRES, windres, windres) - -AC_ALLOCA -AC_PROG_MAKE_SET - -dnl check whether gcc supports __builtin_memset. -# Test for builtin mem* functions. -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -AC_TRY_COMPILE([ -#include <string.h> -void foo(char *s, int c, size_t n) -{ - __builtin_memset(s, c, n); -} -], [ ], -use_builtin_memset=yes, use_builtin_memset=no) -if test $use_builtin_memset = "yes"; then - AC_DEFINE(HAVE_BUILTIN_MEMSET) -fi -AC_LANG_RESTORE - -AC_ARG_ENABLE(debugging, -[ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging], -[case "${enableval}" in -yes) AC_DEFINE(DEBUGGING) ;; -no) ;; -esac -]) - -AC_OUTPUT(Makefile) diff --git a/winsup/cygserver/cygserver-config b/winsup/cygserver/cygserver-config deleted file mode 100755 index f9515e71e..000000000 --- a/winsup/cygserver/cygserver-config +++ /dev/null @@ -1,202 +0,0 @@ -#!/bin/bash -# -# cygserver-config, Copyright 2003 Red Hat Inc. -# -# This file is part of the Cygwin DLL. - -# Directory where the config files are stored -SYSCONFDIR=/etc -LOCALSTATEDIR=/var - -progname=$0 -auto_answer="" - -request() -{ - if [ "${auto_answer}" = "yes" ] - then - echo "$1 (yes/no) yes" - return 0 - elif [ "${auto_answer}" = "no" ] - then - echo "$1 (yes/no) no" - return 1 - fi - - answer="" - while [ "X${answer}" != "Xyes" -a "X${answer}" != "Xno" ] - do - echo -n "$1 (yes/no) " - read -e answer - done - if [ "X${answer}" = "Xyes" ] - then - return 0 - else - return 1 - fi -} - -# Check options - -while : -do - case $# in - 0) - break - ;; - esac - - option=$1 - shift - - case "${option}" in - -d | --debug ) - set -x - ;; - - -y | --yes ) - auto_answer=yes - ;; - - -n | --no ) - auto_answer=no - ;; - - *) - echo "usage: ${progname} [OPTION]..." - echo - echo "This script creates an Cygserver service configuration." - echo - echo "Options:" - echo " --debug -d Enable shell's debug output." - echo " --yes -y Answer all questions with \"yes\" automatically." - echo " --no -n Answer all questions with \"no\" automatically." - echo - exit 1 - ;; - - esac -done - -# Check if running on NT -_sys="`uname`" -_nt=`expr "${_sys}" : "CYGWIN_NT"` - -# Check for running cygserver processes first. -if ps -ef | grep -v grep | grep -q cygserver -then - echo - echo "There is a cygserver already running. Nothing to do, apparently." - echo - exit 1 -fi - -# Check for ${SYSCONFDIR} directory -if [ -e "${SYSCONFDIR}" -a ! -d "${SYSCONFDIR}" ] -then - echo - echo "${SYSCONFDIR} is existant but not a directory." - echo "Cannot create global configuration file." - echo - exit 1 -fi - -# Create it if necessary -if [ ! -e "${SYSCONFDIR}" ] -then - mkdir "${SYSCONFDIR}" - if [ ! -e "${SYSCONFDIR}" ] - then - echo - echo "Creating ${SYSCONFDIR} directory failed" - echo - exit 1 - fi -fi - -# Create /var/log if not already existing -if [ -f ${LOCALSTATEDIR}/log ] -then - echo "Creating ${LOCALSTATEDIR}/log failed!" -else - if [ ! -d ${LOCALSTATEDIR}/log ] - then - mkdir -p ${LOCALSTATEDIR}/log - fi -fi - -# Check if cygserver.conf exists. If yes, ask for overwriting -if [ -f "${SYSCONFDIR}/cygserver.conf" ] -then - if request "Overwrite existing ${SYSCONFDIR}/cygserver.conf file?" - then - rm -f "${SYSCONFDIR}/cygserver.conf" - if [ -f "${SYSCONFDIR}/cygserver.conf" ] - then - echo - echo "Can't overwrite. ${SYSCONFDIR}/cygserver.conf is write protected." - echo - exit 1 - fi - fi -fi - -# Create default cygserver.conf from skeleton files in /etc/defaults/etc -if [ ! -f "${SYSCONFDIR}/cygserver.conf" ] -then - echo "Generating ${SYSCONFDIR}/cygserver.conf file" - cp "${SYSCONFDIR}/defaults/etc/cygserver.conf" "${SYSCONFDIR}/cygserver.conf" - if [ ! -f "${SYSCONFDIR}/cygserver.conf" ] - then - echo - echo "Couldn't create ${SYSCONFDIR}/cygserver.conf." - echo "Perhaps there's no default file in ${SYSCONFDIR}/defaults/etc?" - echo "Reinstalling Cygwin might help." - echo - exit 1 - fi - chmod 664 "${SYSCONFDIR}/cygserver.conf" - chown system.544 "${SYSCONFDIR}/cygserver.conf" -fi - -# On NT ask if cygserver should be installed as service -if [ ${_nt} -gt 0 ] -then - # But only if it is not already installed - if ! cygrunsrv -Q cygserver > /dev/null 2>&1 - then - echo - echo - echo "Warning: The following function requires administrator privileges!" - echo - echo "Do you want to install cygserver as service?" - if request "(Say \"no\" if it's already installed as service)" - then - if ! cygrunsrv -I cygserver -d "CYGWIN cygserver" -p /usr/sbin/cygserver - then - echo - echo "Installation of cygserver as service failed. Please check the" - echo "error messages you got. They might give a clue why it failed." - echo - echo "A good start is either you don't have administrator privileges" - echo "or a missing cygrunsrv binary. Please check for both." - echo - exit 1 - fi - echo - echo "The service has been installed under LocalSystem account." - echo "To start it, call \`net start cygserver' or \`cygrunsrv -S cygserver'." - fi - touch "${LOCALSTATEDIR}/log/cygserver.log" - chown system.544 "${LOCALSTATEDIR}/log/cygserver.log" - fi -fi - -echo -echo "Further configuration options are available by editing the configuration" -echo "file ${SYSCONFDIR}/cygserver.conf. Please read the inline information in that" -echo "file carefully. The best option for the start is to just leave it alone." -echo -echo "Basic Cygserver configuration finished. Have fun!" -echo diff --git a/winsup/cygserver/cygserver.cc b/winsup/cygserver/cygserver.cc deleted file mode 100644 index 262734f95..000000000 --- a/winsup/cygserver/cygserver.cc +++ /dev/null @@ -1,770 +0,0 @@ -/* cygserver.cc - - Copyright 2001, 2002, 2003, 2004, 2005, 2007 Red Hat Inc. - - Written by Egor Duda <deo@logos-m.ru> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <sys/types.h> - -#include <assert.h> -#include <errno.h> -#include <ctype.h> -#include <getopt.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "cygwin_version.h" - -#include "cygserver.h" -#include "process.h" -#include "transport.h" - -#include "cygserver_ipc.h" -#include "cygserver_msg.h" -#include "cygserver_sem.h" - -#define DEF_CONFIG_FILE "" SYSCONFDIR "/cygserver.conf" - -#define SERVER_VERSION "1.20" - -GENERIC_MAPPING access_mapping; - -static bool -setup_privileges () -{ - BOOL rc, ret_val; - HANDLE hToken = NULL; - TOKEN_PRIVILEGES sPrivileges; - - rc = OpenProcessToken (GetCurrentProcess () , TOKEN_ALL_ACCESS , &hToken) ; - if (!rc) - { - debug ("error opening process token (%lu)", GetLastError ()); - return false; - } - rc = LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &sPrivileges.Privileges[0].Luid); - if (!rc) - { - debug ("error getting privilege luid (%lu)", GetLastError ()); - ret_val = false; - goto out; - } - sPrivileges.PrivilegeCount = 1 ; - sPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ; - rc = AdjustTokenPrivileges (hToken, FALSE, &sPrivileges, 0, NULL, NULL) ; - if (!rc) - { - debug ("error adjusting privilege level. (%lu)", GetLastError ()); - ret_val = false; - goto out; - } - - access_mapping.GenericRead = FILE_READ_DATA; - access_mapping.GenericWrite = FILE_WRITE_DATA; - access_mapping.GenericExecute = 0; - access_mapping.GenericAll = FILE_READ_DATA | FILE_WRITE_DATA; - - ret_val = true; - -out: - CloseHandle (hToken); - return ret_val; -} - -int -check_and_dup_handle (HANDLE from_process, HANDLE to_process, - HANDLE from_process_token, - DWORD access, - HANDLE from_handle, - HANDLE *to_handle_ptr, BOOL bInheritHandle = FALSE) -{ - HANDLE local_handle = NULL; - int ret_val = EACCES; - char sd_buf [1024]; - PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR) &sd_buf; - DWORD bytes_needed; - PRIVILEGE_SET ps; - DWORD ps_len = sizeof (ps); - BOOL status; - - if (from_process != GetCurrentProcess ()) - { - if (!DuplicateHandle (from_process, from_handle, - GetCurrentProcess (), &local_handle, - 0, bInheritHandle, - DUPLICATE_SAME_ACCESS)) - { - log (LOG_ERR, "error getting handle(%u) to server (%lu)", - (unsigned int)from_handle, GetLastError ()); - goto out; - } - } else - local_handle = from_handle; - - if (!GetKernelObjectSecurity (local_handle, - (OWNER_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | DACL_SECURITY_INFORMATION), - sd, sizeof (sd_buf), &bytes_needed)) - { - log (LOG_ERR, "error getting handle SD (%lu)", GetLastError ()); - goto out; - } - - MapGenericMask (&access, &access_mapping); - - if (!AccessCheck (sd, from_process_token, access, &access_mapping, - &ps, &ps_len, &access, &status)) - { - log (LOG_ERR, "error checking access rights (%lu)", - GetLastError ()); - goto out; - } - - if (!status) - { - log (LOG_ERR, "access to object denied"); - goto out; - } - - if (!DuplicateHandle (from_process, from_handle, - to_process, to_handle_ptr, - access, bInheritHandle, 0)) - { - log (LOG_ERR, "error getting handle to client (%lu)", GetLastError ()); - goto out; - } - - debug ("Duplicated %p to %p", from_handle, *to_handle_ptr); - - ret_val = 0; - - out: - if (local_handle && from_process != GetCurrentProcess ()) - CloseHandle (local_handle); - - return (ret_val); -} - -/* - * client_request_attach_tty::serve () - */ - -void -client_request_attach_tty::serve (transport_layer_base *const conn, - process_cache *) -{ - assert (conn); - - assert (!error_code ()); - - if (msglen () != sizeof (req)) - { - log (LOG_ERR, "bad request body length: expecting %lu bytes, got %lu", - sizeof (req), msglen ()); - error_code (EINVAL); - msglen (0); - return; - } - - msglen (0); // Until we fill in some fields. - - debug ("pid %ld:(%p,%p) -> pid %ld", req.master_pid, req.from_master, - req.to_master, req.pid); - - debug ("opening process %ld", req.master_pid); - - const HANDLE from_process_handle = - OpenProcess (PROCESS_DUP_HANDLE, FALSE, req.master_pid); - - if (!from_process_handle) - { - log (LOG_ERR, "error opening `from' process, error = %lu", - GetLastError ()); - error_code (EACCES); - return; - } - - debug ("opening process %ld", req.pid); - - const HANDLE to_process_handle = - OpenProcess (PROCESS_DUP_HANDLE, FALSE, req.pid); - - if (!to_process_handle) - { - log (LOG_ERR, "error opening `to' process, error = %lu", - GetLastError ()); - CloseHandle (from_process_handle); - error_code (EACCES); - return; - } - - debug ("Impersonating client"); - if (!conn->impersonate_client ()) - { - CloseHandle (from_process_handle); - CloseHandle (to_process_handle); - error_code (EACCES); - return; - } - - HANDLE token_handle = NULL; - - debug ("about to open thread token"); - const DWORD rc = OpenThreadToken (GetCurrentThread (), - TOKEN_QUERY, - TRUE, - &token_handle); - - debug ("opened thread token, rc=%lu", rc); - if (!conn->revert_to_self ()) - { - CloseHandle (from_process_handle); - CloseHandle (to_process_handle); - error_code (EACCES); - return; - } - - if (!rc) - { - log (LOG_ERR, "error opening thread token, error = %lu", - GetLastError ()); - CloseHandle (from_process_handle); - CloseHandle (to_process_handle); - error_code (EACCES); - return; - } - - // From this point on, a reply body is returned to the client. - - const HANDLE from_master = req.from_master; - const HANDLE to_master = req.to_master; - - req.from_master = NULL; - req.to_master = NULL; - - msglen (sizeof (req)); - - if (from_master) - if (check_and_dup_handle (from_process_handle, to_process_handle, - token_handle, - GENERIC_READ, - from_master, - &req.from_master, TRUE) != 0) - { - log (LOG_ERR, "error duplicating from_master handle, error = %lu", - GetLastError ()); - error_code (EACCES); - } - - if (to_master) - if (check_and_dup_handle (from_process_handle, to_process_handle, - token_handle, - GENERIC_WRITE, - to_master, - &req.to_master, TRUE) != 0) - { - log (LOG_ERR, "error duplicating to_master handle, error = %lu", - GetLastError ()); - error_code (EACCES); - } - - CloseHandle (from_process_handle); - CloseHandle (to_process_handle); - CloseHandle (token_handle); - - debug ("%lu(%lu, %lu) -> %lu(%lu,%lu)", - req.master_pid, from_master, to_master, - req.pid, req.from_master, req.to_master); - - return; -} - -void -client_request_get_version::serve (transport_layer_base *, process_cache *) -{ - assert (!error_code ()); - - if (msglen ()) - log (LOG_ERR, "unexpected request body ignored: %lu bytes", msglen ()); - - msglen (sizeof (version)); - - version.major = CYGWIN_SERVER_VERSION_MAJOR; - version.api = CYGWIN_SERVER_VERSION_API; - version.minor = CYGWIN_SERVER_VERSION_MINOR; - version.patch = CYGWIN_SERVER_VERSION_PATCH; -} - -class server_request : public queue_request -{ -public: - server_request (transport_layer_base *const conn, process_cache *const cache) - : _conn (conn), _cache (cache) - {} - - virtual ~server_request () - { - delete _conn; - } - - virtual void process () - { - client_request::handle_request (_conn, _cache); - } - -private: - transport_layer_base *const _conn; - process_cache *const _cache; -}; - -class server_submission_loop : public queue_submission_loop -{ -public: - server_submission_loop (threaded_queue *const queue, - transport_layer_base *const transport, - process_cache *const cache) - : queue_submission_loop (queue, false), - _transport (transport), - _cache (cache) - { - assert (_transport); - assert (_cache); - } - -private: - transport_layer_base *const _transport; - process_cache *const _cache; - - virtual void request_loop (); -}; - -/* FIXME: this is a little ugly. What we really want is to wait on - * two objects: one for the pipe/socket, and one for being told to - * shutdown. Otherwise this will stay a problem (we won't actually - * shutdown until the request _AFTER_ the shutdown request. And - * sending ourselves a request is ugly - */ -void -server_submission_loop::request_loop () -{ - /* I'd like the accepting thread's priority to be above any "normal" - * thread in the system to avoid overflowing the listen queue (for - * sockets; similar issues exist for named pipes); but, for example, - * a normal priority thread in a foregrounded process is boosted to - * THREAD_PRIORITY_HIGHEST (AFAICT). Thus try to set the current - * thread's priority to a level one above that. This fails on - * win9x/ME so assume any failure in that call is due to that and - * simply call again at one priority level lower. - * FIXME: This looks weird and is an issue on NT, too. Per MSDN, - * THREAD_PRIORITY_HIGHEST + 1 is only a valid priority level if - * the priority class is set to REALTIME_PRIORITY_CLASS. - */ - if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST + 1)) - if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST)) - debug ("failed to raise accept thread priority, error = %lu", - GetLastError ()); - - while (_running) - { - bool recoverable = false; - transport_layer_base *const conn = _transport->accept (&recoverable); - if (!conn && !recoverable) - { - log (LOG_ERR, "fatal error on IPC transport: closing down"); - return; - } - // EINTR probably implies a shutdown request; so back off for a - // moment to let the main thread take control, otherwise the - // server spins here receiving EINTR repeatedly since the signal - // handler in the main thread doesn't get a chance to be called. - if (!conn && errno == EINTR) - { - if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_NORMAL)) - debug ("failed to reset thread priority, error = %lu", - GetLastError ()); - - Sleep (0); - if (!SetThreadPriority (GetCurrentThread (), - THREAD_PRIORITY_HIGHEST + 1)) - if (!SetThreadPriority (GetCurrentThread (), - THREAD_PRIORITY_HIGHEST)) - debug ("failed to raise thread priority, error = %lu", - GetLastError ()); - } - if (conn) - _queue->add (new server_request (conn, _cache)); - } -} - -client_request_shutdown::client_request_shutdown () - : client_request (CYGSERVER_REQUEST_SHUTDOWN) -{ -} - -void -client_request_shutdown::serve (transport_layer_base *, process_cache *) -{ - assert (!error_code ()); - - if (msglen ()) - log (LOG_ERR, "unexpected request body ignored: %lu bytes", msglen ()); - - /* FIXME: link upwards, and then this becomes a trivial method call to - * only shutdown _this queue_ - */ - - kill (getpid (), SIGINT); - - msglen (0); -} - -static sig_atomic_t shutdown_server = false; - -static void -handle_signal (const int signum) -{ - /* any signal makes us die :} */ - - shutdown_server = true; -} - -/* - * print_usage () - */ - -static void -print_usage (const char *const pgm) -{ - log (LOG_NOTICE, "Usage: %s [OPTIONS]\n" -"Configuration option:\n" -" -f, --config-file <file> Use <file> as config file. Default is\n" -" " DEF_CONFIG_FILE "\n" -"\n" -"Performance options:\n" -" -c, --cleanup-threads <num> Number of cleanup threads to use.\n" -" -p, --process-cache <num> Size of process cache.\n" -" -r, --request-threads <num> Number of request threads to use.\n" -"\n" -"Logging options:\n" -" -d, --debug Log debug messages to stderr.\n" -" -e, --stderr Log to stderr (default if stderr is a tty).\n" -" -E, --no-stderr Don't log to stderr (see -y, -Y options).\n" -" -l, --log-level <level> Verbosity of logging (1..7). Default: 6\n" -" -y, --syslog Log to syslog (default if stderr is no tty).\n" -" -Y, --no-syslog Don't log to syslog (See -e, -E options).\n" -"\n" -"Support options:\n" -" -m, --no-sharedmem Don't start XSI Shared Memory support.\n" -" -q, --no-msgqueues Don't start XSI Message Queue support.\n" -" -s, --no-semaphores Don't start XSI Semaphore support.\n" -"\n" -"Miscellaneous:\n" -" -S, --shutdown Shutdown the daemon.\n" -" -h, --help Output usage information and exit.\n" -" -v, --version Output version information and exit." -, pgm); -} - -/* - * print_version () - */ - -static void -print_version () -{ - char buf[200]; - snprintf (buf, sizeof (buf), "%d.%d.%d(%d.%d/%d/%d)-(%d.%d.%d.%d) %s", - cygwin_version.dll_major / 1000, - cygwin_version.dll_major % 1000, - cygwin_version.dll_minor, - cygwin_version.api_major, - cygwin_version.api_minor, - cygwin_version.shared_data, - CYGWIN_SERVER_VERSION_MAJOR, - CYGWIN_SERVER_VERSION_API, - CYGWIN_SERVER_VERSION_MINOR, - CYGWIN_SERVER_VERSION_PATCH, - cygwin_version.mount_registry, - cygwin_version.dll_build_date); - - log (LOG_INFO, "(cygwin) %s\n" - "API version %s\n" - "Copyright 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.\n" - "Compiled on %s\n" - "Default configuration file is %s", - SERVER_VERSION, buf, __DATE__, DEF_CONFIG_FILE); -} - -/* - * main () - */ - -int -main (const int argc, char *argv[]) -{ - const struct option longopts[] = { - {"cleanup-threads", required_argument, NULL, 'c'}, - {"debug", no_argument, NULL, 'd'}, - {"stderr", no_argument, NULL, 'e'}, - {"no-stderr", no_argument, NULL, 'E'}, - {"config-file", required_argument, NULL, 'f'}, - {"help", no_argument, NULL, 'h'}, - {"log-level", required_argument, NULL, 'l'}, - {"no-sharedmem", no_argument, NULL, 'm'}, - {"process-cache", required_argument, NULL, 'p'}, - {"no-msgqueues", no_argument, NULL, 'q'}, - {"request-threads", required_argument, NULL, 'r'}, - {"no-semaphores", no_argument, NULL, 's'}, - {"shutdown", no_argument, NULL, 'S'}, - {"version", no_argument, NULL, 'v'}, - {"syslog", no_argument, NULL, 'y'}, - {"no-syslog", no_argument, NULL, 'Y'}, - {0, no_argument, NULL, 0} - }; - - const char opts[] = "c:deEf:hl:mp:qr:sSvyY"; - - long cleanup_threads = 0; - long request_threads = 0; - long process_cache_size = 0; - bool shutdown = false; - const char *config_file = DEF_CONFIG_FILE; - bool force_config_file = false; - tun_bool_t option_log_stderr = TUN_UNDEF; - tun_bool_t option_log_syslog = TUN_UNDEF; - - char *c = NULL; - - /* Check if we have a terminal. If so, default to stderr logging, - otherwise default to syslog logging. This must be done early - to allow default logging already in option processing state. */ - openlog ("cygserver", LOG_PID, LOG_KERN); - if (isatty (2)) - log_stderr = TUN_TRUE; - else - log_syslog = TUN_TRUE; - - int opt; - - securityinit (); - - opterr = 0; - while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (opt) - { - case 'c': - c = NULL; - cleanup_threads = strtol (optarg, &c, 10); - if (cleanup_threads <= 0 || cleanup_threads > 32 || (c && *c)) - panic ("Number of cleanup threads must be between 1 and 32"); - break; - - case 'd': - log_debug = TUN_TRUE; - break; - - case 'e': - option_log_stderr = TUN_TRUE; - break; - - case 'E': - option_log_stderr = TUN_FALSE; - break; - - case 'f': - config_file = optarg; - force_config_file = true; - break; - - case 'h': - print_usage (getprogname ()); - return 0; - - case 'l': - c = NULL; - log_level = strtoul (optarg, &c, 10); - if (!log_level || log_level > 7 || (c && *c)) - panic ("Log level must be between 1 and 7"); - break; - - case 'm': - support_sharedmem = TUN_FALSE; - break; - - case 'p': - c = NULL; - process_cache_size = strtol (optarg, &c, 10); - if (process_cache_size <= 0 || process_cache_size > 310 || (c && *c)) - panic ("Size of process cache must be between 1 and 310"); - break; - - case 'q': - support_msgqueues = TUN_FALSE; - break; - - case 'r': - c = NULL; - request_threads = strtol (optarg, &c, 10); - if (request_threads <= 0 || request_threads > 310 || (c && *c)) - panic ("Number of request threads must be between 1 and 310"); - break; - - case 's': - support_semaphores = TUN_FALSE; - break; - - case 'S': - shutdown = true; - break; - - case 'v': - print_version (); - return 0; - - case 'y': - option_log_syslog = TUN_TRUE; - break; - - case 'Y': - option_log_syslog = TUN_FALSE; - break; - - case '?': - panic ("unknown option -- %c\n" - "Try `%s --help' for more information.", optopt, getprogname ()); - } - - if (optind != argc) - panic ("Too many arguments"); - - if (shutdown) - { - /* Setting `cygserver_running' stops the request code making a - * version request, which is not much to the point. - */ - cygserver_running = CYGSERVER_OK; - - client_request_shutdown req; - - if (req.make_request () == -1 || req.error_code ()) - panic("Shutdown request failed: %s", strerror (req.error_code ())); - - // FIXME: It would be nice to wait here for the daemon to exit. - - return 0; - } - - SIGHANDLE (SIGHUP); - SIGHANDLE (SIGINT); - SIGHANDLE (SIGTERM); - - tunable_param_init (config_file, force_config_file); - - loginit (option_log_stderr, option_log_syslog); - - log (LOG_INFO, "daemon starting up"); - - if (!cleanup_threads) - TUNABLE_INT_FETCH ("kern.srv.cleanup_threads", &cleanup_threads); - if (!cleanup_threads) - cleanup_threads = 2; - - if (!request_threads) - TUNABLE_INT_FETCH ("kern.srv.request_threads", &request_threads); - if (!request_threads) - request_threads = 10; - - if (!process_cache_size) - TUNABLE_INT_FETCH ("kern.srv.process_cache_size", &process_cache_size); - if (!process_cache_size) - process_cache_size = 62; - - if (support_sharedmem == TUN_UNDEF) - TUNABLE_BOOL_FETCH ("kern.srv.sharedmem", &support_sharedmem); - if (support_sharedmem == TUN_UNDEF) - support_sharedmem = TUN_TRUE; - - if (support_msgqueues == TUN_UNDEF) - TUNABLE_BOOL_FETCH ("kern.srv.msgqueues", &support_msgqueues); - if (support_msgqueues == TUN_UNDEF) - support_msgqueues = TUN_TRUE; - - if (support_semaphores == TUN_UNDEF) - TUNABLE_BOOL_FETCH ("kern.srv.semaphores", &support_semaphores); - if (support_semaphores == TUN_UNDEF) - support_semaphores = TUN_TRUE; - - if (!setup_privileges ()) - panic ("Setting process privileges failed."); - - ipcinit (); - - /*XXXXX*/ - threaded_queue request_queue (request_threads); - - transport_layer_base *const transport = create_server_transport (); - assert (transport); - - process_cache cache (process_cache_size, cleanup_threads); - - server_submission_loop submission_loop (&request_queue, transport, &cache); - - request_queue.add_submission_loop (&submission_loop); - - if (transport->listen () == -1) - return 1; - - cache.start (); - - request_queue.start (); - - log (LOG_NOTICE, "Initialization complete. Waiting for requests."); - - /* TODO: wait on multiple objects - the thread handle for each - * request loop + all the process handles. This should be done by - * querying the request_queue and the process cache for all their - * handles, and then waiting for (say) 30 seconds. after that we - * recreate the list of handles to wait on, and wait again. the - * point of all this abstraction is that we can trivially server - * both sockets and pipes simply by making a new transport, and then - * calling request_queue.process_requests (transport2); - */ - /* WaitForMultipleObjects abort && request_queue && process_queue && signal - -- if signal event then retrigger it - */ - while (!shutdown_server && request_queue.running () && cache.running ()) - { - pause (); - if (ipcunload ()) - { - shutdown_server = false; - log (LOG_WARNING, "Shutdown request received but ignored. " - "Dependent processes still running."); - } - } - - log (LOG_INFO, "Shutdown request received - new requests will be denied"); - request_queue.stop (); - log (LOG_INFO, "All pending requests processed"); - delete transport; - log (LOG_INFO, "No longer accepting requests - cygwin will operate in daemonless mode"); - cache.stop (); - log (LOG_INFO, "All outstanding process-cache activities completed"); - log (LOG_NOTICE, "Shutdown finished."); - - return 0; -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/cygserver.conf b/winsup/cygserver/cygserver.conf deleted file mode 100644 index 589931b11..000000000 --- a/winsup/cygserver/cygserver.conf +++ /dev/null @@ -1,147 +0,0 @@ -# cygserver.conf, Copyright(C) 2003, 2005 Red Hat Inc. -# -# Contains configurable parameters for the cygserver. -# -# The format of this file is easy. Lines beginning with a hash `#' are -# comments and ignored. Lines consisting of only whitespaces are ignored. -# Any other line is a setting for cygserver. -# A setting consists of a name/value pair, separated by whitespace. -# Each line must only consist of one name/value pair. -# Lines must not be longer than 1023 characters. -# -# Some settings can be overridden by a command line switch. If so, it's -# mentioned below. -# -# Settings which are commented out will use the default values. These are -# mentioned below, too. - -# kern.srv.cleanup_threads: No. of cygserver threads used for cleanup tasks. -# Default: 2, Min: 1, Max: 16, command line option -c, --cleanup-threads -#kern.srv.cleanup_threads 2 - -# kern.srv.request_threads: No. of cygserver threads used to serve -# application requests. -# Default: 10, Min: 1, Max: 310, command line option -r, --request-threads -#kern.srv.request_threads 10 - -# kern.srv.process_cache_size: No. of concurrent processes which can be handled -# by Cygserver concurrently. -# Default: 62, Min: 1, Max: 310, command line option -p, --process-cache -#kern.srv.process_cache_size 62 - -# kern.srv.msgqueues: Determines whether XSI Message Queue support should be -# started, "yes" (or "true", "y", "t", "1") or "no" (or "false", "n", "f", "0"). -# These values are valid for all binary type options. -# Default is "yes". Command line option -q, --no-msgqueues -#kern.srv.msgqueues yes - -# kern.srv.semaphores: Determines whether XSI Semaphore support should be -# started. Default is "yes". Command line option -s, --no-semaphores -#kern.srv.semaphores yes - -# kern.srv.sharedmem: Determines whether XSI Shared Memory support should be -# started. Default is "yes". Command line option -m, --no-sharedmem -#kern.srv.sharedmem yes - -# LOGGING - -# kern.log.syslog: Determines whether logging should go to the syslog, -# Default is "yes", if stderr is no tty, "no" otherwise. -# Command line option -y, --syslog or -Y, --no-syslog. -#kern.log.syslog no - -# kern.log.stderr: Determines whether logging should go to stderr, -# Default is "yes", if stderr is a tty, "no" otherwise. -# Command line option -e, --stderr or -E, --no-stderr. -#kern.log.stderr no - -# kern.log.level: Logging level. Valid values are 1 to 7 with a bigger -# value emitting more logging output. Default level is 6. -# Command line option -l, --log-level. -#kern.log.level 6 - -# kern.log.debug: Determines whether debug output should be printed to stderr. -# Default is "no". Command line option -d, --debug -#kern.log.debug no - -# XSI message queue parameters. -# -# Each message is broken up and stored in segments that are msgssz bytes -# long. For efficiency reasons, this should be a power of two. Also, -# it doesn't make sense if it is less than 8 or greater than about 256. - -# kern.ipc.msgseg: Maximum no. of message queue segments hold concurrently. -# Default: 2048, Min: 256, Max: 65535 -#kern.ipc.msgseg 2048 - -# kern.ipc.msgssz: Size of segment in bytes. Must be a power of 2 value. -# Default: 8, Min: 8, Max: 1024 -#kern.ipc.msgssz 8 - -# kern.ipc.msgmnb: Maximum no. of bytes in a single message queue. -# Default: 2048, Min: 1, Max: 65535 -#kern.ipc.msgmnb 2048 - -# kern.ipc.msgmni: Maximum no. of message queue identifiers hold concurrently. -# Default: 40, Min: 1, Max: 1024 -#kern.ipc.msgmni 40 - -# kern.ipc.msgtql: Maximum no. of messages hold concurrently. -# Default: 40, Min: 1, Max: 1024 -#kern.ipc.msgtql 40 - -# XSI semaphore parameters - -# kern.ipc.semmni: Maximum no. of semaphore identifiers hold concurrently. -# Default: 10, Min: 1, Max: 1024 -#kern.ipc.semmni 10 - -# kern.ipc.semmns: Maximum no. of semaphores hold concurrently. -# Default: 60, Min: 1, Max: 1024 -#kern.ipc.semmns 60 - -# kern.ipc.semmnu: Total no. of undo structures hold by server. -# Default: 30, Min: 1, Max: 1024 -#kern.ipc.semmnu 30 - -# kern.ipc.semmsl: Maximum no. of semaphores per semaphore id. -# Default: 60, Min: 1, Max: 1024 -#kern.ipc.semmsl 60 - -# kern.ipc.semopm: Maximum no. of operations per semop call. -# Default: 100, Min: 1, Max: 1024 -#kern.ipc.semopm 100 - -# kern.ipc.semume: Maximum no. of undo entries per process. -# Default: 10, Min: 1, Max: 1024 -#kern.ipc.semume 10 - -# kern.ipc.semvmx: Maximum value of a semaphore. -# Default: 32767, Min: 1, Max: 32767 -#kern.ipc.semvmx 32767 - -# kern.ipc.semaem: Maximum value to adjust on process exit. -# Default: 16384, Min: 1, Max: 32767 -#kern.ipc.semaem 16384 - -# XSI shared memory parameters - -# kern.ipc.shmmaxpgs: Maximum pages available for XSI shared memory. -# Changing shmmaxpgs immediately affects setting SHMMAX. The relation -# between shmmaxpgs and SHMMAX is: SHMMAX = shmmaxpgs * getpagesize(). -# Default: 8192, Min: 1, Max: 32767 -#kern.ipc.shmmaxpgs 8192 - -# kern.ipc.shmmni: Maximum number of shared memory segments, system wide. -# Default: 192, Min: 1, Max: 32767 -#kern.ipc.shmmni 192 - -# kern.ipc.shmseg: Maximum number of shared memory segments per process. -# Default: 128, Min: 1, Max: 32767 -#kern.ipc.shmseg 128 - -# kern.ipc.shm_allow_removed: Determines whether a process is allowed to -# attach to a shared memory segment (using the shmat call) after a successful -# call to shmctl(IPC_RMID). This is a Linux-specific, and therefore -# non-portable feature. Use with care. Default is "no". -#kern.ipc.shm_allow_removed no diff --git a/winsup/cygserver/msg.cc b/winsup/cygserver/msg.cc deleted file mode 100644 index 87df87310..000000000 --- a/winsup/cygserver/msg.cc +++ /dev/null @@ -1,117 +0,0 @@ -/* msg.cc: Single unix specification IPC interface for Cygwin. - - Copyright 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "cygserver.h" -#include "process.h" -#include "transport.h" - -#include "cygserver_ipc.h" -#include "cygserver_msg.h" - -client_request_msg::client_request_msg () - : client_request (CYGSERVER_REQUEST_MSG, - &_parameters, sizeof (_parameters)) -{ -} - -void -client_request_msg::serve (transport_layer_base *const conn, - process_cache *const cache) -{ - if (msglen () != sizeof (_parameters.in)) - { - syscall_printf ("bad request body length: expecting %lu bytes, got %lu", - sizeof (_parameters), msglen ()); - error_code (EINVAL); - msglen (0); - return; - } - if (support_msgqueues == TUN_FALSE) - { - syscall_printf ("Message queue support not started"); - error_code (ENOSYS); - if (_parameters.in.msgop == MSGOP_msgrcv) - _parameters.out.rcv = -1; - else - _parameters.out.ret = -1; - msglen (sizeof (_parameters.out)); - return; - } - process *const client = cache->process (_parameters.in.ipcblk.cygpid, - _parameters.in.ipcblk.winpid, - _parameters.in.ipcblk.signal_arrived); - if (!client) - { - error_code (EAGAIN); - msglen (0); - return; - } - if (!conn->impersonate_client ()) - { - client->release (); - error_code (EACCES); - msglen (0); - return; - } - if (!adjust_identity_info (&_parameters.in.ipcblk)) - { - client->release (); - conn->revert_to_self (); - error_code (EACCES); - msglen (0); - return; - } - /* Early revert_to_self since IPC code runs in kernel mode. */ - conn->revert_to_self (); - /* sysv_msg.cc takes care of itself. */ - client->release (); - thread td = { client, &_parameters.in.ipcblk, {-1, -1} }; - int res; - msgop_t msgop = _parameters.in.msgop; /* Get's overwritten otherwise. */ - switch (msgop) - { - case MSGOP_msgctl: - res = msgctl (&td, &_parameters.in.ctlargs); - break; - case MSGOP_msgget: - res = msgget (&td, &_parameters.in.getargs); - break; - case MSGOP_msgrcv: - res = msgrcv (&td, &_parameters.in.rcvargs); - break; - case MSGOP_msgsnd: - res = msgsnd (&td, &_parameters.in.sndargs); - break; - default: - res = ENOSYS; - td.td_retval[0] = -1; - break; - } - /* Allocated by the call to adjust_identity_info(). */ - if (_parameters.in.ipcblk.gidlist) - free (_parameters.in.ipcblk.gidlist); - error_code (res); - if (msgop == MSGOP_msgrcv) - _parameters.out.rcv = td.td_retval[0]; - else - _parameters.out.ret = td.td_retval[0]; - msglen (sizeof (_parameters.out)); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/process.cc b/winsup/cygserver/process.cc deleted file mode 100644 index cc665d88e..000000000 --- a/winsup/cygserver/process.cc +++ /dev/null @@ -1,500 +0,0 @@ -/* process.cc - - Copyright 2001, 2002, 2003, 2004, 2005 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <sys/types.h> - -#include <assert.h> -#include <stdlib.h> - -#include "process.h" - -/*****************************************************************************/ - -#define elements(ARRAY) (sizeof (ARRAY) / sizeof (*ARRAY)) - -/*****************************************************************************/ - -process_cleanup::~process_cleanup () -{ - delete _process; -} - -void -process_cleanup::process () -{ - _process->cleanup (); -} - -/*****************************************************************************/ - -process::process (const pid_t cygpid, const DWORD winpid, HANDLE signal_arrived) - : _cygpid (cygpid), - _winpid (winpid), - _hProcess (NULL), - _signal_arrived (INVALID_HANDLE_VALUE), - _cleaning_up (false), - _exit_status (STILL_ACTIVE), - _routines_head (NULL), - _next (NULL) -{ - _hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, winpid); - if (!_hProcess) - { - system_printf ("unable to obtain handle for new cache process %d(%lu)", - _cygpid, _winpid); - _hProcess = INVALID_HANDLE_VALUE; - _exit_status = 0; - } - else - debug_printf ("got handle %p for new cache process %d(%lu)", - _hProcess, _cygpid, _winpid); - if (!signal_arrived) - system_printf ("signal_arrived NULL for process %d(%lu)", - _cygpid, _winpid); - else if (signal_arrived != INVALID_HANDLE_VALUE) - { - if (!DuplicateHandle (_hProcess, signal_arrived, - GetCurrentProcess (), &_signal_arrived, - 0, FALSE, DUPLICATE_SAME_ACCESS)) - { - system_printf ("error getting signal_arrived to server (%lu)", - GetLastError ()); - _signal_arrived = INVALID_HANDLE_VALUE; - } - } - InitializeCriticalSection (&_access); - debug ("initialized (%lu)", _cygpid); -} - -process::~process () -{ - debug ("deleting (%lu)", _cygpid); - DeleteCriticalSection (&_access); - if (_signal_arrived && _signal_arrived != INVALID_HANDLE_VALUE) - CloseHandle (_signal_arrived); - CloseHandle (_hProcess); -} - -/* No need to be thread-safe as this is only ever called by - * process_cache::check_and_remove_process (). If it has to be made - * thread-safe later on, it should not use the `access' critical section as - * that is held by the client request handlers for an arbitrary length of time, - * i.e. while they do whatever processing is required for a client request. - */ -DWORD -process::check_exit_code () -{ - if (_hProcess && _hProcess != INVALID_HANDLE_VALUE - && _exit_status == STILL_ACTIVE - && !GetExitCodeProcess (_hProcess, &_exit_status)) - { - system_printf ("failed to retrieve exit code for %d(%lu), error = %lu", - _cygpid, _winpid, GetLastError ()); - _hProcess = INVALID_HANDLE_VALUE; - } - return _exit_status; -} - -bool -process::add (cleanup_routine *const entry) -{ - assert (entry); - - bool res = false; - hold (); - - if (!_cleaning_up) - { - entry->_next = _routines_head; - _routines_head = entry; - res = true; - } - - release (); - return res; -} - -bool -process::remove (const cleanup_routine *const entry) -{ - assert (entry); - - bool res = false; - hold (); - - if (!_cleaning_up) - { - cleanup_routine *previous = NULL; - - for (cleanup_routine *ptr = _routines_head; - ptr; - previous = ptr, ptr = ptr->_next) - { - if (*ptr == *entry) - { - if (previous) - previous->_next = ptr->_next; - else - _routines_head = ptr->_next; - - delete ptr; - res = true; - break; - } - } - } - - release (); - return res; -} - -/* This is single threaded. It's called after the process is removed - * from the cache, but inserts may be attemped by worker threads that - * have a pointer to it. - */ -void -process::cleanup () -{ - hold (); - assert (!is_active ()); - assert (!_cleaning_up); - InterlockedExchange (&_cleaning_up, true); - cleanup_routine *entry = _routines_head; - _routines_head = NULL; - release (); - - while (entry) - { - cleanup_routine *const ptr = entry; - entry = entry->_next; - ptr->cleanup (this); - delete ptr; - } -} - -/*****************************************************************************/ - -void -process_cache::submission_loop::request_loop () -{ - assert (this); - assert (_cache); - assert (_interrupt_event); - - while (_running) - _cache->wait_for_processes (_interrupt_event); -} - -/*****************************************************************************/ - -process_cache::process_cache (const size_t max_procs, - const unsigned int initial_workers) - : _queue (initial_workers), - _submitter (this, &_queue), // true == interruptible - _processes_count (0), - _max_process_count (max_procs), - _processes_head (NULL), - _cache_add_trigger (NULL) -{ - /* there can only be one */ - InitializeCriticalSection (&_cache_write_access); - - _cache_add_trigger = CreateEvent (NULL, // SECURITY_ATTRIBUTES - TRUE, // Manual-reset - FALSE, // Initially non-signalled - NULL); // Anonymous - - if (!_cache_add_trigger) - { - system_printf ("failed to create cache add trigger, error = %lu", - GetLastError ()); - abort (); - } - - _queue.add_submission_loop (&_submitter); -} - -process_cache::~process_cache () -{ - (void) CloseHandle (_cache_add_trigger); - DeleteCriticalSection (&_cache_write_access); -} - -/* This returns the process object to the caller already locked, that - * is, with the object's `access' critical region entered. Thus the - * caller must unlock the object when it's finished with it (via - * process::release ()). It must then not try to access the object - * afterwards, except by going through this routine again, as it may - * have been deleted once it has been unlocked. - */ -class process * -process_cache::process (const pid_t cygpid, const DWORD winpid, - HANDLE signal_arrived) -{ - /* TODO: make this more granular, so a search doesn't involve the - * write lock. - */ - EnterCriticalSection (&_cache_write_access); - class process *previous = NULL; - class process *entry = find (winpid, &previous); - - if (!entry) - { - if (_processes_count >= _max_process_count) - { - LeaveCriticalSection (&_cache_write_access); - system_printf (("process limit (%d processes) reached; " - "new connection refused for %d(%lu)"), - _max_process_count, cygpid, winpid); - return NULL; - } - - entry = new class process (cygpid, winpid, signal_arrived); - if (!entry->is_active ()) - { - LeaveCriticalSection (&_cache_write_access); - delete entry; - return NULL; - } - - if (previous) - { - entry->_next = previous->_next; - previous->_next = entry; - } - else - { - entry->_next = _processes_head; - _processes_head = entry; - } - - _processes_count += 1; - SetEvent (_cache_add_trigger); - } - - entry->hold (); // To be released by the caller. - LeaveCriticalSection (&_cache_write_access); - assert (entry); - assert (entry->_winpid == winpid); - return entry; -} - -struct pcache_wait_t -{ - size_t index; - size_t count; - HANDLE *hdls; -}; - -static DWORD WINAPI -pcache_wait_thread (const LPVOID param) -{ - pcache_wait_t *p = (pcache_wait_t *) param; - - DWORD rc = WaitForMultipleObjects (p->count, p->hdls, FALSE, INFINITE); - ExitThread (rc == WAIT_FAILED ? rc : rc + p->index); -} - -void -process_cache::wait_for_processes (const HANDLE interrupt_event) -{ - // Update `_wait_array' with handles of all current processes. - size_t idx; - const size_t count = sync_wait_array (interrupt_event); - - debug_printf ("waiting on %u objects in total (%u processes)", - count, _processes_count); - - DWORD rc = WAIT_FAILED; - - if (count <= 64) - { - /* If count <= 64, a single WaitForMultipleObjects is sufficient and - we can simply wait in the main thread. */ - rc = WaitForMultipleObjects (count, _wait_array, FALSE, INFINITE); - if (rc == WAIT_FAILED) - { - system_printf ("could not wait on the process handles, error = %lu", - GetLastError ()); - abort (); - } - } - else - { - /* If count > 64 we have to create sub-threads which wait for the - actual wait objects and the main thread waits for the termination - of one of the threads. */ - HANDLE main_wait_array[5] = { NULL }; - DWORD mcount = 0; - - for (idx = 0; idx < count; idx += 64) - { - pcache_wait_t p = { idx, min (count - idx, 64), _wait_array + idx }; - main_wait_array[mcount++] = CreateThread (NULL, 0, pcache_wait_thread, - &p, 0, NULL); - } - - rc = WaitForMultipleObjects (mcount, main_wait_array, FALSE, INFINITE); - if (rc == WAIT_FAILED) - { - system_printf ("could not wait on the process handles, error = %lu", - GetLastError ()); - abort (); - } - - /* Check for error condition on signalled sub-thread. */ - GetExitCodeThread (main_wait_array[rc], &rc); - if (rc == WAIT_FAILED) - { - system_printf ("could not wait on the process handles, error = %lu", - GetLastError ()); - abort (); - } - - /* Wake up all waiting threads. _cache_add_trigger gets reset - in sync_wait_array again. */ - SetEvent (_cache_add_trigger); - WaitForMultipleObjects (mcount, main_wait_array, TRUE, INFINITE); - for (idx = 0; idx < mcount; idx++) - CloseHandle (main_wait_array[idx]); - } - - /* Tell all processes the bad news. This one formerly only checked - processes beginning with the index of the signalled process, but - this can result in processes which are signalled but never removed - under heavy load conditions. */ - for (idx = 0; idx < count; idx++) - if (_process_array[idx]) - check_and_remove_process (idx); -} - -/* - * process_cache::sync_wait_array () - * - * Fill-in the wait array with the handles that the cache needs to wait on. - * These handles are: - * - the process_process_param's interrupt event - * - the process_cache's cache_add_trigger event - * - the handle for each live process in the cache. - * - * Return value: the number of live handles in the array. - */ - -size_t -process_cache::sync_wait_array (const HANDLE interrupt_event) -{ - assert (this); - assert (interrupt_event && interrupt_event != INVALID_HANDLE_VALUE); - - /* Always reset _cache_add_trigger before filling up the array again. */ - ResetEvent (_cache_add_trigger); - - EnterCriticalSection (&_cache_write_access); - - size_t index = 0; - - for (class process *ptr = _processes_head; ptr; ptr = ptr->_next) - { - assert (ptr->_hProcess && ptr->_hProcess != INVALID_HANDLE_VALUE); - assert (ptr->is_active ()); - - _wait_array[index] = ptr->handle (); - _process_array[index++] = ptr; - - if (!ptr->_next || index % 64 == 62) - { - /* Added at the end of each thread's array part for efficiency. */ - _wait_array[index] = interrupt_event; - _process_array[index++] = NULL; - _wait_array[index] = _cache_add_trigger; - _process_array[index++] = NULL; - } - } - - if (!index) - { - /* To get at least *something* to wait for. */ - _wait_array[index] = interrupt_event; - _process_array[index++] = NULL; - _wait_array[index] = _cache_add_trigger; - _process_array[index++] = NULL; - } - - assert (index <= elements (_wait_array)); - - LeaveCriticalSection (&_cache_write_access); - - return index; -} - -void -process_cache::check_and_remove_process (const size_t index) -{ - assert (this); - assert (index < elements (_wait_array) - SPECIALS_COUNT); - - class process *const process = _process_array[index]; - - assert (process); - assert (process->handle () == _wait_array[index]); - - if (process->check_exit_code () == STILL_ACTIVE) - return; - - debug_printf ("process %d(%lu) has left the building ($? = %lu)", - process->_cygpid, process->_winpid, process->_exit_status); - - /* Unlink the process object from the process list. */ - - EnterCriticalSection (&_cache_write_access); - - class process *previous = NULL; - - const class process *const tmp = find (process->_winpid, &previous); - - assert (tmp == process); - assert (previous ? previous->_next == process : _processes_head == process); - - if (previous) - previous->_next = process->_next; - else - _processes_head = process->_next; - - _processes_count -= 1; - LeaveCriticalSection (&_cache_write_access); - - /* Schedule any cleanup tasks for this process. */ - _queue.add (new process_cleanup (process)); -} - -class process * -process_cache::find (const DWORD winpid, class process **previous) -{ - if (previous) - *previous = NULL; - - for (class process *ptr = _processes_head; ptr; ptr = ptr->_next) - if (ptr->_winpid == winpid) - return ptr; - else if (ptr->_winpid > winpid) // The list is sorted by winpid. - return NULL; - else if (previous) - *previous = ptr; - - return NULL; -} - -/*****************************************************************************/ -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/process.h b/winsup/cygserver/process.h deleted file mode 100644 index 4702d2818..000000000 --- a/winsup/cygserver/process.h +++ /dev/null @@ -1,179 +0,0 @@ -/* process.h - - Copyright 2001, 2002, 2003, 2004, 2005 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _PROCESS_H -#define _PROCESS_H - -#include <assert.h> - -#include "threaded_queue.h" - -class process_cleanup : public queue_request -{ -public: - process_cleanup (class process *const theprocess) - : _process (theprocess) - { - assert (_process); - } - - virtual ~process_cleanup (); - - virtual void process (); - -private: - class process *const _process; -}; - -class process; - -class cleanup_routine -{ - friend class process; - -public: - cleanup_routine (void *const key) - : _key (key), - _next (NULL) - {} - - virtual ~cleanup_routine () = 0; - - bool operator== (const cleanup_routine &rhs) const - { - return _key == rhs._key; - } - - void *key () const { return _key; } - - /* MUST BE SYNCHRONOUS */ - virtual void cleanup (class process *) = 0; - -private: - void *const _key; - cleanup_routine *_next; -}; - -class process_cache; - -#define hold() _hold(__FILE__,__LINE__) -#define release() _release(__FILE__,__LINE__) - -class process -{ - friend class process_cache; - friend class process_cleanup; - -public: - process (pid_t cygpid, DWORD winpid, - HANDLE signal_arrived = INVALID_HANDLE_VALUE); - ~process (); - - pid_t cygpid () const { return _cygpid; } - DWORD winpid () const { return _winpid; } - HANDLE handle () const { return _hProcess; } - HANDLE signal_arrived () const { return _signal_arrived; } - - bool is_active () const { return _exit_status == STILL_ACTIVE; } - - void _hold (const char *file, int line) { - _log (file, line, LOG_DEBUG, "Try hold(%lu)", _cygpid); - EnterCriticalSection (&_access); - _log (file, line, LOG_DEBUG, "holding (%lu)", _cygpid); - } - void _release (const char *file, int line) { - _log (file, line, LOG_DEBUG, "leaving (%lu)", _cygpid); - LeaveCriticalSection (&_access); - } - - bool add (cleanup_routine *); - bool remove (const cleanup_routine *); - -private: - const pid_t _cygpid; - const DWORD _winpid; - HANDLE _hProcess; - HANDLE _signal_arrived; - long _cleaning_up; - DWORD _exit_status; // Set in the constructor and in exit_code (). - cleanup_routine *_routines_head; - /* used to prevent races-on-delete */ - CRITICAL_SECTION _access; - class process *_next; - - DWORD check_exit_code (); - void cleanup (); -}; - -class process_cache -{ - // Number of special (i.e., non-process) handles in _wait_array. - // See wait_for_processes () and sync_wait_array () for details. - enum { - SPECIALS_COUNT = 2 - }; - - class submission_loop : public queue_submission_loop - { - public: - submission_loop (process_cache *const cache, threaded_queue *const queue) - : queue_submission_loop (queue, true), - _cache (cache) - { - assert (_cache); - } - - private: - process_cache *const _cache; - - virtual void request_loop (); - }; - - friend class submission_loop; - -public: - process_cache (const size_t max_procs, const unsigned int initial_workers); - ~process_cache (); - - class process *process (pid_t cygpid, DWORD winpid, - HANDLE signal_arrived = INVALID_HANDLE_VALUE); - - bool running () const { return _queue.running (); } - - bool start () { return _queue.start (); } - bool stop () { return _queue.stop (); } - -private: - threaded_queue _queue; - submission_loop _submitter; - - size_t _processes_count; - size_t _max_process_count; - class process *_processes_head; // A list sorted by winpid. - - // Access to the _wait_array and related fields is not thread-safe, - // since they are used solely by wait_for_processes () and its callees. - - HANDLE _wait_array[5 * MAXIMUM_WAIT_OBJECTS]; - class process *_process_array[5 * MAXIMUM_WAIT_OBJECTS]; - - HANDLE _cache_add_trigger; // Actually both add and remove. - CRITICAL_SECTION _cache_write_access; // Actually both read and write access. - - void wait_for_processes (HANDLE interrupt); - size_t sync_wait_array (HANDLE interrupt); - void check_and_remove_process (const size_t index); - - class process *find (DWORD winpid, class process **previous = NULL); -}; - -#endif /* _PROCESS_H */ diff --git a/winsup/cygserver/sem.cc b/winsup/cygserver/sem.cc deleted file mode 100644 index 37d894ef9..000000000 --- a/winsup/cygserver/sem.cc +++ /dev/null @@ -1,107 +0,0 @@ -/* sem.cc: Single unix specification IPC interface for Cygwin. - - Copyright 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "cygserver.h" -#include "process.h" -#include "transport.h" - -#include "cygserver_ipc.h" -#include "cygserver_sem.h" - -client_request_sem::client_request_sem () - : client_request (CYGSERVER_REQUEST_SEM, - &_parameters, sizeof (_parameters)) -{ -} - -void -client_request_sem::serve (transport_layer_base *const conn, - process_cache *const cache) -{ - if (msglen () != sizeof (_parameters.in)) - { - syscall_printf ("bad request body length: expecting %lu bytes, got %lu", - sizeof (_parameters), msglen ()); - error_code (EINVAL); - msglen (0); - return; - } - if (support_semaphores == TUN_FALSE) - { - syscall_printf ("Semaphore support not started"); - error_code (ENOSYS); - _parameters.out.ret = -1; - msglen (sizeof (_parameters.out)); - return; - } - process *const client = cache->process (_parameters.in.ipcblk.cygpid, - _parameters.in.ipcblk.winpid, - _parameters.in.ipcblk.signal_arrived); - if (!client) - { - error_code (EAGAIN); - msglen (0); - return; - } - if (!conn->impersonate_client ()) - { - client->release (); - error_code (EACCES); - msglen (0); - return; - } - if (!adjust_identity_info (&_parameters.in.ipcblk)) - { - client->release (); - conn->revert_to_self (); - error_code (EACCES); - msglen (0); - return; - } - /* Early revert_to_self since IPC code runs in kernel mode. */ - conn->revert_to_self (); - /* sysv_sem.cc takes care of itself. */ - client->release (); - thread td = { client, &_parameters.in.ipcblk, {-1, -1} }; - int res; - switch (_parameters.in.semop) - { - case SEMOP_semctl: - res = semctl (&td, &_parameters.in.ctlargs); - break; - case SEMOP_semget: - res = semget (&td, &_parameters.in.getargs); - break; - case SEMOP_semop: - res = semop (&td, &_parameters.in.opargs); - break; - default: - res = ENOSYS; - td.td_retval[0] = -1; - break; - } - /* Allocated by the call to adjust_identity_info(). */ - if (_parameters.in.ipcblk.gidlist) - free (_parameters.in.ipcblk.gidlist); - error_code (res); - _parameters.out.ret = td.td_retval[0]; - msglen (sizeof (_parameters.out)); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/setpwd.cc b/winsup/cygserver/setpwd.cc deleted file mode 100644 index 8125fd25a..000000000 --- a/winsup/cygserver/setpwd.cc +++ /dev/null @@ -1,104 +0,0 @@ -/* setpwd.cc: Set LSA private data password for current user. - - Copyright 2008 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <wchar.h> - -#include <ntsecapi.h> -#include <ntdef.h> -#include "ntdll.h" - -#include "cygserver.h" -#include "process.h" -#include "transport.h" - -#include "cygserver_setpwd.h" - -client_request_setpwd::client_request_setpwd () - : client_request (CYGSERVER_REQUEST_SETPWD, - &_parameters, sizeof (_parameters)) -{ -} - -void -client_request_setpwd::serve (transport_layer_base *const conn, - process_cache *const cache) -{ - HANDLE tok; - PTOKEN_USER user; - WCHAR sidbuf[128], key_name [128 + wcslen (CYGWIN_LSA_KEY_PREFIX)]; - UNICODE_STRING sid, key, data; - - syscall_printf ("Request to set private data"); - if (msglen () != sizeof (_parameters.in)) - { - syscall_printf ("bad request body length: expecting %lu bytes, got %lu", - sizeof (_parameters), msglen ()); - error_code (EINVAL); - msglen (0); - return; - } - msglen (0); - if (!conn->impersonate_client ()) - { - error_code (EACCES); - return; - } - if (!OpenThreadToken (GetCurrentThread (), TOKEN_READ, TRUE, &tok)) - { - conn->revert_to_self (); - error_code (EACCES); - return; - } - /* Get uid from user SID in token. */ - user = (PTOKEN_USER) get_token_info (tok, TokenUser); - CloseHandle (tok); - conn->revert_to_self (); - if (!user) - { - error_code (EACCES); - return; - } - LSA_OBJECT_ATTRIBUTES oa = { 0, 0, 0, 0, 0, 0 }; - HANDLE lsa; - NTSTATUS status = LsaOpenPolicy (NULL, &oa, POLICY_CREATE_SECRET, &lsa); - if (!NT_SUCCESS (status)) - { - error_code (LsaNtStatusToWinError (status)); - return; - } - RtlInitEmptyUnicodeString (&sid, sidbuf, sizeof sidbuf); - RtlConvertSidToUnicodeString (&sid, user->User.Sid, FALSE); - free (user); - RtlInitEmptyUnicodeString (&key, key_name, sizeof key_name); - RtlAppendUnicodeToString (&key, CYGWIN_LSA_KEY_PREFIX); - RtlAppendUnicodeStringToString (&key, &sid); - RtlInitUnicodeString (&data, _parameters.in.passwd); - status = LsaStorePrivateData (lsa, &key, data.Length ? &data : NULL); - if (data.Length) - memset (data.Buffer, 0, data.Length); - /* Success or we're trying to remove a password entry which doesn't exist. */ - if (NT_SUCCESS (status) - || (data.Length == 0 && status == STATUS_OBJECT_NAME_NOT_FOUND)) - error_code (0); - else - error_code (LsaNtStatusToWinError (status)); - syscall_printf ("Request to set private data returns error %d", error_code ()); - LsaClose (lsa); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/shm.cc b/winsup/cygserver/shm.cc deleted file mode 100644 index 38f2d2ee5..000000000 --- a/winsup/cygserver/shm.cc +++ /dev/null @@ -1,124 +0,0 @@ -/* shm.cc: Single unix specification IPC interface for Cygwin. - - Copyright 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "cygserver.h" -#include "process.h" -#include "transport.h" - -#include "cygserver_ipc.h" -#include "cygserver_shm.h" - -client_request_shm::client_request_shm () - : client_request (CYGSERVER_REQUEST_SHM, - &_parameters, sizeof (_parameters)) -{ -} - -void -client_request_shm::serve (transport_layer_base *const conn, - process_cache *const cache) -{ - if (msglen () != sizeof (_parameters.in)) - { - syscall_printf ("bad request body length: expecting %lu bytes, got %lu", - sizeof (_parameters), msglen ()); - error_code (EINVAL); - msglen (0); - return; - } - if (support_sharedmem == TUN_FALSE) - { - syscall_printf ("Shared memory support not started"); - error_code (ENOSYS); - if (_parameters.in.shmop == SHMOP_shmat) - _parameters.out.ptr = (vm_offset_t)0; - else - _parameters.out.ret = -1; - msglen (sizeof (_parameters.out)); - return; - } - process *const client = cache->process (_parameters.in.ipcblk.cygpid, - _parameters.in.ipcblk.winpid, - _parameters.in.ipcblk.signal_arrived); - if (!client) - { - error_code (EAGAIN); - msglen (0); - return; - } - if (!conn->impersonate_client ()) - { - client->release (); - error_code (EACCES); - msglen (0); - return; - } - if (!adjust_identity_info (&_parameters.in.ipcblk)) - { - client->release (); - conn->revert_to_self (); - error_code (EACCES); - msglen (0); - return; - } - /* Early revert_to_self since IPC code runs in kernel mode. */ - conn->revert_to_self (); - /* sysv_shm.cc takes care of itself. */ - client->release (); - thread td = { client, &_parameters.in.ipcblk, {0, 0} }; - int res; - shmop_t shmop = _parameters.in.shmop; /* Get's overwritten otherwise. */ - switch (shmop) - { - case SHMOP_shmat: - ipc_p_vmspace (td.ipcblk); - res = shmat (&td, &_parameters.in.atargs); - break; - case SHMOP_shmctl: - res = shmctl (&td, &_parameters.in.ctlargs); - break; - case SHMOP_shmdt: - ipc_p_vmspace (td.ipcblk); - res = shmdt (&td, &_parameters.in.dtargs); - break; - case SHMOP_shmget: - res = shmget (&td, &_parameters.in.getargs); - break; - case SHMOP_shmfork: - res = cygwin_shmfork_myhook (&td, &_parameters.in.forkargs); - break; - default: - res = ENOSYS; - td.td_retval[0] = -1; - break; - } - /* Allocated by the call to adjust_identity_info(). */ - if (_parameters.in.ipcblk.gidlist) - free (_parameters.in.ipcblk.gidlist); - error_code (res); - if (shmop == SHMOP_shmat) - _parameters.out.ptr = td.td_retval[0]; - else - _parameters.out.ret = td.td_retval[0]; - if (shmop == SHMOP_shmget) - _parameters.out.obj = td.td_retval[1]; - msglen (sizeof (_parameters.out)); -} -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/sysv_msg.cc b/winsup/cygserver/sysv_msg.cc deleted file mode 100644 index 217cc1d97..000000000 --- a/winsup/cygserver/sysv_msg.cc +++ /dev/null @@ -1,1215 +0,0 @@ -/* - * Implementation of SVID messages - * - * Author: Daniel Boulet - * - * Copyright 1993 Daniel Boulet and RTMX Inc. - * - * This system call was implemented by Daniel Boulet under contract from RTMX. - * - * Redistribution and use in source forms, with and without modification, - * are permitted provided that this entire comment appears intact. - * - * Redistribution in binary form may occur without any restrictions. - * Obviously, it would be nice if you gave credit where credit is due - * but requiring it would be too onerous. - * - * This software is provided ``AS IS'' without any warranties of any kind. - */ - -/* - * This file is heavily changed to become part of Cygwin's cygserver. - */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#include <sys/cdefs.h> -#ifndef __FBSDID -#define __FBSDID(s) const char version[] = (s) -#endif -__FBSDID("$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/kern/sysv_msg.c,v 1.52 2003/11/07 04:47:14 rwatson Exp $"); -/* CV, 2006-01-09: Inspected upstream up to version 1.60. */ - -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <sys/types.h> -#include <sys/sysproto.h> -#include <sys/ipc.h> -#include <sys/param.h> -#include <sys/msg.h> -#include <malloc.h> -#include <errno.h> -#include <time.h> -#include "cygserver.h" -#include "process.h" -#include "cygserver_ipc.h" - -#ifdef __CYGWIN__ -#define MSG_DEBUG -#endif /* __CYGWIN__ */ - -#ifdef MSG_DEBUG -#define DPRINTF(a) debug_printf a -#else -#define DPRINTF(a) -#endif - -static void msg_freehdr(struct msg *msghdr); - -#ifndef __CYGWIN__ -int msgctl(struct thread *, struct msgctl_args *); -int msgget(struct thread *, struct msgget_args *); -int msgsnd(struct thread *, struct msgsnd_args *); -int msgrcv(struct thread *, struct msgrcv_args *); - -static sy_call_t *msgcalls[] = { - (sy_call_t *)msgctl, (sy_call_t *)msgget, - (sy_call_t *)msgsnd, (sy_call_t *)msgrcv -}; -#endif /* __CYGWIN__ */ - - -struct msg { - struct msg *msg_next; /* next msg in the chain */ - long msg_type; /* type of this message */ - /* >0 -> type of this message */ - /* 0 -> free header */ - u_short msg_ts; /* size of this message */ - short msg_spot; /* location of start of msg in buffer */ -}; - - -#ifndef MSGSSZ -#define MSGSSZ 8 /* Each segment must be 2^N long */ -#endif -#ifndef MSGSEG -#define MSGSEG 2048 /* must be less than 32767 */ -#endif -#define MSGMAX (MSGSSZ*MSGSEG) -#ifndef MSGMNB -#define MSGMNB 2048 /* max # of bytes in a queue */ -#endif -#ifndef MSGMNI -#define MSGMNI 40 -#endif -#ifndef MSGTQL -#define MSGTQL 40 -#endif - -/* - * Based on the configuration parameters described in an SVR2 (yes, two) - * config(1m) man page. - * - * Each message is broken up and stored in segments that are msgssz bytes - * long. For efficiency reasons, this should be a power of two. Also, - * it doesn't make sense if it is less than 8 or greater than about 256. - * Consequently, msginit in kern/sysv_msg.c checks that msgssz is a power of - * two between 8 and 1024 inclusive (and panic's if it isn't). - */ -struct msginfo msginfo = { - MSGMAX, /* max chars in a message */ - MSGMNB, /* max chars in a queue */ - MSGMNI, /* # of message queue identifiers */ - MSGTQL, /* max messages in system */ - MSGSSZ, /* size of a message segment */ - /* (must be small power of 2 greater than 4) */ - MSGSEG /* number of message segments */ -}; - -/* - * macros to convert between msqid_ds's and msqid's. - * (specific to this implementation) - */ -#define MSQID(ix,ds) ((ix) & 0xffff | (((ds).msg_perm.seq << 16) & 0xffff0000)) -#define MSQID_IX(id) ((id) & 0xffff) -#define MSQID_SEQ(id) (((id) >> 16) & 0xffff) - -/* - * The rest of this file is specific to this particular implementation. - */ - -struct msgmap { - short next; /* next segment in buffer */ - /* -1 -> available */ - /* 0..(MSGSEG-1) -> index of next segment */ -}; - -#define MSG_LOCKED 01000 /* Is this msqid_ds locked? */ - -static int nfree_msgmaps; /* # of free map entries */ -static short free_msgmaps; /* head of linked list of free map entries */ -static struct msg *free_msghdrs;/* list of free msg headers */ -static char *msgpool; /* MSGMAX byte long msg buffer pool */ -static struct msgmap *msgmaps; /* MSGSEG msgmap structures */ -static struct msg *msghdrs; /* MSGTQL msg headers */ -static struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */ -static struct mtx msq_mtx; /* global mutex for message queues. */ - -#ifdef __CYGWIN__ -static struct msg_info msg_info; -#endif /* __CYGWIN__ */ - -void -msginit() -{ - int i; - - TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg); - TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz); - msginfo.msgmax = msginfo.msgseg * msginfo.msgssz; - TUNABLE_INT_FETCH("kern.ipc.msgmnb", &msginfo.msgmnb); - TUNABLE_INT_FETCH("kern.ipc.msgmni", &msginfo.msgmni); - TUNABLE_INT_FETCH("kern.ipc.msgtql", &msginfo.msgtql); - - msgpool = (char *) sys_malloc(msginfo.msgmax, M_MSG, M_WAITOK); - if (msgpool == NULL) - panic("msgpool is NULL"); - msgmaps = (msgmap *) sys_malloc(sizeof(struct msgmap) * msginfo.msgseg, M_MSG, M_WAITOK); - if (msgmaps == NULL) - panic("msgmaps is NULL"); - msghdrs = (msg *) sys_malloc(sizeof(struct msg) * msginfo.msgtql, M_MSG, M_WAITOK); - if (msghdrs == NULL) - panic("msghdrs is NULL"); - msqids = (msqid_ds *) sys_malloc(sizeof(struct msqid_ds) * msginfo.msgmni, M_MSG, M_WAITOK); - if (msqids == NULL) - panic("msqids is NULL"); - - /* - * msginfo.msgssz should be a power of two for efficiency reasons. - * It is also pretty silly if msginfo.msgssz is less than 8 - * or greater than about 256 so ... - */ - - i = 8; - while (i < 1024 && i != msginfo.msgssz) - i <<= 1; - if (i != msginfo.msgssz) { - DPRINTF(("msginfo.msgssz=%d (0x%x)\n", msginfo.msgssz, - msginfo.msgssz)); - panic("msginfo.msgssz not a small power of 2"); - } - - if (msginfo.msgseg > 32767) { - DPRINTF(("msginfo.msgseg=%d\n", msginfo.msgseg)); - panic("msginfo.msgseg > 32767"); - } - - if (msgmaps == NULL) - panic("msgmaps is NULL"); - - for (i = 0; i < msginfo.msgseg; i++) { - if (i > 0) - msgmaps[i-1].next = i; - msgmaps[i].next = -1; /* implies entry is available */ - } - free_msgmaps = 0; - nfree_msgmaps = msginfo.msgseg; - - if (msghdrs == NULL) - panic("msghdrs is NULL"); - - for (i = 0; i < msginfo.msgtql; i++) { - msghdrs[i].msg_type = 0; - if (i > 0) - msghdrs[i-1].msg_next = &msghdrs[i]; - msghdrs[i].msg_next = NULL; - } - free_msghdrs = &msghdrs[0]; - - if (msqids == NULL) - panic("msqids is NULL"); - - for (i = 0; i < msginfo.msgmni; i++) { - msqids[i].msg_qbytes = 0; /* implies entry is available */ - msqids[i].msg_perm.seq = 0; /* reset to a known value */ - msqids[i].msg_perm.mode = 0; - } - mtx_init(&msq_mtx, "msq", NULL, MTX_DEF); -} - -int -msgunload() -{ - struct msqid_ds *msqptr; - int msqid; - - for (msqid = 0; msqid < msginfo.msgmni; msqid++) { - /* - * Look for an unallocated and unlocked msqid_ds. - * msqid_ds's can be locked by msgsnd or msgrcv while - * they are copying the message in/out. We can't - * re-use the entry until they release it. - */ - msqptr = &msqids[msqid]; - if (msqptr->msg_qbytes != 0 || - (msqptr->msg_perm.mode & MSG_LOCKED) != 0) - break; - } -#ifndef __CYGWIN__ - if (msqid != msginfo.msgmni) - return (EBUSY); -#endif /* __CYGWIN__ */ - - sys_free(msgpool, M_MSG); - sys_free(msgmaps, M_MSG); - sys_free(msghdrs, M_MSG); - sys_free(msqids, M_MSG); - mtx_destroy(&msq_mtx); - return (0); -} - - -#ifndef __CYGWIN__ -static int -sysvmsg_modload(struct module *module, int cmd, void *arg) -{ - int error = 0; - - switch (cmd) { - case MOD_LOAD: - msginit(); - break; - case MOD_UNLOAD: - error = msgunload(); - break; - case MOD_SHUTDOWN: - break; - default: - error = EINVAL; - break; - } - return (error); -} - -static moduledata_t sysvmsg_mod = { - "sysvmsg", - &sysvmsg_modload, - NULL -}; - -SYSCALL_MODULE_HELPER(msgsys); -SYSCALL_MODULE_HELPER(msgctl); -SYSCALL_MODULE_HELPER(msgget); -SYSCALL_MODULE_HELPER(msgsnd); -SYSCALL_MODULE_HELPER(msgrcv); - -DECLARE_MODULE(sysvmsg, sysvmsg_mod, - SI_SUB_SYSV_MSG, SI_ORDER_FIRST); -MODULE_VERSION(sysvmsg, 1); - -/* - * Entry point for all MSG calls - * - * MPSAFE - */ -int -msgsys(thread *td, struct msgsys_args *uap) -{ - int error; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - if (uap->which < 0 || - (unsigned) uap->which >= sizeof(msgcalls)/sizeof(msgcalls[0])) - return (EINVAL); - error = (*msgcalls[uap->which])(td, &uap->a2); - return (error); -} -#endif - -static void -msg_freehdr(struct msg *msghdr) -{ - while (msghdr->msg_ts > 0) { - short next; - if (msghdr->msg_spot < 0 || msghdr->msg_spot >= msginfo.msgseg) - panic("msghdr->msg_spot out of range"); - next = msgmaps[msghdr->msg_spot].next; - msgmaps[msghdr->msg_spot].next = free_msgmaps; - free_msgmaps = msghdr->msg_spot; - nfree_msgmaps++; - msghdr->msg_spot = next; - if (msghdr->msg_ts >= msginfo.msgssz) - msghdr->msg_ts -= msginfo.msgssz; - else - msghdr->msg_ts = 0; - } - if (msghdr->msg_spot != -1) - panic("msghdr->msg_spot != -1"); - msghdr->msg_next = free_msghdrs; - free_msghdrs = msghdr; -} - -#ifndef _SYS_SYSPROTO_H_ -struct msgctl_args { - int msqid; - int cmd; - struct msqid_ds *buf; -}; -#endif - -/* - * MPSAFE - */ -int -msgctl(struct thread *td, struct msgctl_args *uap) -{ - int msqid = uap->msqid; - int cmd = uap->cmd; - struct msqid_ds *user_msqptr = uap->buf; - int rval, error; - struct msqid_ds msqbuf; - register struct msqid_ds *msqptr; - - DPRINTF(("call to msgctl(%d, %d, 0x%x)\n", msqid, cmd, user_msqptr)); - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - -#ifdef __CYGWIN__ - if (cmd == IPC_INFO) { - if (!msqid) { - error = copyout(&msginfo, user_msqptr, - sizeof(struct msginfo)); - td->td_retval[0] = error ? -1 : 0; - return (error); - } - if (msqid > msginfo.msgmni) - msqid = msginfo.msgmni; - error = copyout(msqids, user_msqptr, - msqid * sizeof(struct msqid_ds)); - td->td_retval[0] = error ? -1 : 0; - return (error); - } else if (cmd == MSG_INFO) { - mtx_lock(&msq_mtx); - error = copyout(&msg_info, user_msqptr, - sizeof(struct msg_info)); - td->td_retval[0] = error ? -1 : 0; - mtx_unlock(&msq_mtx); - return (error); - } -#endif /* __CYGWIN__ */ - msqid = IPCID_TO_IX(msqid); - - if (msqid < 0 || msqid >= msginfo.msgmni) { - DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, - msginfo.msgmni)); - return (EINVAL); - } - if (cmd == IPC_SET && - (error = copyin(user_msqptr, &msqbuf, sizeof(msqbuf))) != 0) - return (error); - - msqptr = &msqids[msqid]; - - mtx_lock(&msq_mtx); - if (msqptr->msg_qbytes == 0) { - DPRINTF(("no such msqid\n")); - error = EINVAL; - goto done2; - } - if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { - DPRINTF(("wrong sequence number\n")); - error = EINVAL; - goto done2; - } - - error = 0; - rval = 0; - - switch (cmd) { - - case IPC_RMID: - { - struct msg *msghdr; - if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M))) - goto done2; - /* Free the message headers */ - msghdr = msqptr->msg_first; - while (msghdr != NULL) { - struct msg *msghdr_tmp; - - /* Free the segments of each message */ - msqptr->msg_cbytes -= msghdr->msg_ts; - msqptr->msg_qnum--; - msghdr_tmp = msghdr; - msghdr = msghdr->msg_next; - msg_freehdr(msghdr_tmp); - } - - if (msqptr->msg_cbytes != 0) - panic("msg_cbytes is screwed up"); - if (msqptr->msg_qnum != 0) - panic("msg_qnum is screwed up"); - - msqptr->msg_qbytes = 0; /* Mark it as free */ -#ifdef __CYGWIN__ - msg_info.msg_ids--; -#endif /* __CYGWIN__ */ - - wakeup(msqptr); - } - - break; - - case IPC_SET: - if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M))) - goto done2; - if (msqbuf.msg_qbytes > msqptr->msg_qbytes) { - error = suser(td); - if (error) - goto done2; - } - if (msqbuf.msg_qbytes > (unsigned long) msginfo.msgmnb) { - DPRINTF(("can't increase msg_qbytes beyond %d" - "(truncating)\n", msginfo.msgmnb)); - msqbuf.msg_qbytes = msginfo.msgmnb; /* silently restrict qbytes to system limit */ - } - if (msqbuf.msg_qbytes == 0) { - DPRINTF(("can't reduce msg_qbytes to 0\n")); - error = EINVAL; /* non-standard errno! */ - goto done2; - } - msqptr->msg_perm.uid = msqbuf.msg_perm.uid; /* change the owner */ - msqptr->msg_perm.gid = msqbuf.msg_perm.gid; /* change the owner */ - msqptr->msg_perm.mode = (msqptr->msg_perm.mode & ~0777) | - (msqbuf.msg_perm.mode & 0777); - msqptr->msg_qbytes = msqbuf.msg_qbytes; - msqptr->msg_ctime = time (NULL); - break; - - case IPC_STAT: - if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) { - DPRINTF(("requester doesn't have read access\n")); - goto done2; - } - break; - - default: - DPRINTF(("invalid command %d\n", cmd)); - error = EINVAL; - goto done2; - } - - if (error == 0) - td->td_retval[0] = rval; -done2: - mtx_unlock(&msq_mtx); - if (cmd == IPC_STAT && error == 0) - error = copyout(msqptr, user_msqptr, sizeof(struct msqid_ds)); - return(error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct msgget_args { - key_t key; - int msgflg; -}; -#endif - -/* - * MPSAFE - */ -int -msgget(struct thread *td, struct msgget_args *uap) -{ - int msqid, error = 0; - key_t key = uap->key; - unsigned msgflg = uap->msgflg; - register struct msqid_ds *msqptr = NULL; - - DPRINTF(("msgget(0x%x, 0%o)\n", key, msgflg)); - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - mtx_lock(&msq_mtx); - if (key != IPC_PRIVATE) { - for (msqid = 0; msqid < msginfo.msgmni; msqid++) { - msqptr = &msqids[msqid]; - if (msqptr->msg_qbytes != 0 && - msqptr->msg_perm.key == key) - break; - } - if (msqid < msginfo.msgmni) { - DPRINTF(("found public key\n")); - if ((msgflg & IPC_CREAT) && (msgflg & IPC_EXCL)) { - DPRINTF(("not exclusive\n")); - error = EEXIST; - goto done2; - } - if ((error = ipcperm(td, &msqptr->msg_perm, msgflg & 0700))) { - DPRINTF(("requester doesn't have 0%o access\n", - msgflg & 0700)); - goto done2; - } - goto found; - } - } - - DPRINTF(("need to allocate the msqid_ds\n")); - if (key == IPC_PRIVATE || (msgflg & IPC_CREAT)) { - for (msqid = 0; msqid < msginfo.msgmni; msqid++) { - /* - * Look for an unallocated and unlocked msqid_ds. - * msqid_ds's can be locked by msgsnd or msgrcv while - * they are copying the message in/out. We can't - * re-use the entry until they release it. - */ - msqptr = &msqids[msqid]; - if (msqptr->msg_qbytes == 0 && - (msqptr->msg_perm.mode & MSG_LOCKED) == 0) - break; - } - if (msqid == msginfo.msgmni) { - DPRINTF(("no more msqid_ds's available\n")); - error = ENOSPC; - goto done2; - } - DPRINTF(("msqid %d is available\n", msqid)); - msqptr->msg_perm.key = key; -#ifdef __CYGWIN__ - msqptr->msg_perm.cuid = td->ipcblk->uid; - msqptr->msg_perm.uid = td->ipcblk->uid; - msqptr->msg_perm.cgid = td->ipcblk->gid; - msqptr->msg_perm.gid = td->ipcblk->gid; -#else - msqptr->msg_perm.cuid = cred->cr_uid; - msqptr->msg_perm.uid = cred->cr_uid; - msqptr->msg_perm.cgid = cred->cr_gid; - msqptr->msg_perm.gid = cred->cr_gid; -#endif /* __CYGWIN__ */ - msqptr->msg_perm.mode = (msgflg & 0777); - /* Make sure that the returned msqid is unique */ - msqptr->msg_perm.seq = (msqptr->msg_perm.seq + 1) & 0x7fff; - msqptr->msg_first = NULL; - msqptr->msg_last = NULL; - msqptr->msg_cbytes = 0; - msqptr->msg_qnum = 0; - msqptr->msg_qbytes = msginfo.msgmnb; - msqptr->msg_lspid = 0; - msqptr->msg_lrpid = 0; - msqptr->msg_stime = 0; - msqptr->msg_rtime = 0; - msqptr->msg_ctime = time (NULL); -#ifdef __CYGWIN__ - msg_info.msg_ids++; -#endif /* __CYGWIN__ */ - } else { - DPRINTF(("didn't find it and wasn't asked to create it\n")); - error = ENOENT; - goto done2; - } - -found: - /* Construct the unique msqid */ - td->td_retval[0] = IXSEQ_TO_IPCID(msqid, msqptr->msg_perm); -done2: - mtx_unlock(&msq_mtx); - return (error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct msgsnd_args { - int msqid; - const void *msgp; - size_t msgsz; - int msgflg; -}; -#endif - -/* - * MPSAFE - */ -int -msgsnd(struct thread *td, struct msgsnd_args *uap) -{ - int msqid = uap->msqid; - const void *user_msgp = uap->msgp; - size_t msgsz = uap->msgsz; - int msgflg = uap->msgflg; - int segs_needed, error = 0; - register struct msqid_ds *msqptr; - register struct msg *msghdr; - short next; - - DPRINTF(("call to msgsnd(%d, 0x%x, %d, %d)\n", msqid, user_msgp, msgsz, - msgflg)); - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - mtx_lock(&msq_mtx); - msqid = IPCID_TO_IX(msqid); - - if (msqid < 0 || msqid >= msginfo.msgmni) { - DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, - msginfo.msgmni)); - error = EINVAL; - goto done2; - } - - msqptr = &msqids[msqid]; - if (msqptr->msg_qbytes == 0) { - DPRINTF(("no such message queue id\n")); - error = EINVAL; - goto done2; - } - if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { - DPRINTF(("wrong sequence number\n")); - error = EINVAL; - goto done2; - } - - if ((error = ipcperm(td, &msqptr->msg_perm, IPC_W))) { - DPRINTF(("requester doesn't have write access\n")); - goto done2; - } - - segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz; - DPRINTF(("msgsz=%d, msgssz=%d, segs_needed=%d\n", msgsz, msginfo.msgssz, - segs_needed)); - for (;;) { - int need_more_resources = 0; - - /* - * check msgsz - * (inside this loop in case msg_qbytes changes while we sleep) - */ - - if (msgsz > msqptr->msg_qbytes) { - DPRINTF(("msgsz > msqptr->msg_qbytes\n")); - error = EINVAL; - goto done2; - } - - if (msqptr->msg_perm.mode & MSG_LOCKED) { - DPRINTF(("msqid is locked\n")); - need_more_resources = 1; - } - if (msgsz + msqptr->msg_cbytes > msqptr->msg_qbytes) { - DPRINTF(("msgsz + msg_cbytes > msg_qbytes\n")); - need_more_resources = 1; - } - if (segs_needed > nfree_msgmaps) { - DPRINTF(("segs_needed > nfree_msgmaps\n")); - need_more_resources = 1; - } - if (free_msghdrs == NULL) { - DPRINTF(("no more msghdrs\n")); - need_more_resources = 1; - } - - if (need_more_resources) { - int we_own_it; - - if ((msgflg & IPC_NOWAIT) != 0) { - DPRINTF(("need more resources but caller " - "doesn't want to wait\n")); - error = EAGAIN; - goto done2; - } - - if ((msqptr->msg_perm.mode & MSG_LOCKED) != 0) { - DPRINTF(("we don't own the msqid_ds\n")); - we_own_it = 0; - } else { - /* Force later arrivals to wait for our - request */ - DPRINTF(("we own the msqid_ds\n")); - msqptr->msg_perm.mode |= MSG_LOCKED; - we_own_it = 1; - } - DPRINTF(("goodnight\n")); - error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH, - "msgsnd", 50); - DPRINTF(("good morning, error=%d\n", error)); - if (we_own_it) - msqptr->msg_perm.mode &= ~MSG_LOCKED; - if (error == EWOULDBLOCK) { - DPRINTF(("timed out\n")); - continue; - } - if (error != 0) { - DPRINTF(("msgsnd: interrupted system call\n")); -#ifdef __CYGWIN__ - if (error != EIDRM) -#endif /* __CYGWIN__ */ - error = EINTR; - goto done2; - } - - /* - * Make sure that the msq queue still exists - */ - - if (msqptr->msg_qbytes == 0) { - DPRINTF(("msqid deleted\n")); - error = EIDRM; - goto done2; - } - - } else { - DPRINTF(("got all the resources that we need\n")); - break; - } - } - - /* - * We have the resources that we need. - * Make sure! - */ - - if (msqptr->msg_perm.mode & MSG_LOCKED) - panic("msg_perm.mode & MSG_LOCKED"); - if (segs_needed > nfree_msgmaps) - panic("segs_needed > nfree_msgmaps"); - if (msgsz + msqptr->msg_cbytes > msqptr->msg_qbytes) - panic("msgsz + msg_cbytes > msg_qbytes"); - if (free_msghdrs == NULL) - panic("no more msghdrs"); - - /* - * Re-lock the msqid_ds in case we page-fault when copying in the - * message - */ - - if ((msqptr->msg_perm.mode & MSG_LOCKED) != 0) - panic("msqid_ds is already locked"); - msqptr->msg_perm.mode |= MSG_LOCKED; - - /* - * Allocate a message header - */ - - msghdr = free_msghdrs; - free_msghdrs = msghdr->msg_next; - msghdr->msg_spot = -1; - msghdr->msg_ts = msgsz; - - /* - * Allocate space for the message - */ - - while (segs_needed > 0) { - if (nfree_msgmaps <= 0) - panic("not enough msgmaps"); - if (free_msgmaps == -1) - panic("nil free_msgmaps"); - next = free_msgmaps; - if (next <= -1) - panic("next too low #1"); - if (next >= msginfo.msgseg) - panic("next out of range #1"); - DPRINTF(("allocating segment %d to message\n", next)); - free_msgmaps = msgmaps[next].next; - nfree_msgmaps--; - msgmaps[next].next = msghdr->msg_spot; - msghdr->msg_spot = next; - segs_needed--; - } - - /* - * Copy in the message type - */ - - mtx_unlock(&msq_mtx); - if ((error = copyin(user_msgp, &msghdr->msg_type, - sizeof(msghdr->msg_type))) != 0) { - mtx_lock(&msq_mtx); - DPRINTF(("error %d copying the message type\n", error)); - msg_freehdr(msghdr); - msqptr->msg_perm.mode &= ~MSG_LOCKED; - wakeup(msqptr); - goto done2; - } - mtx_lock(&msq_mtx); - user_msgp = (const char *)user_msgp + sizeof(msghdr->msg_type); - - /* - * Validate the message type - */ - - if (msghdr->msg_type < 1) { - msg_freehdr(msghdr); - msqptr->msg_perm.mode &= ~MSG_LOCKED; - wakeup(msqptr); - DPRINTF(("mtype (%d) < 1\n", msghdr->msg_type)); - error = EINVAL; - goto done2; - } - - /* - * Copy in the message body - */ - - next = msghdr->msg_spot; - while (msgsz > 0) { - size_t tlen; - if (msgsz > (unsigned long) msginfo.msgssz) - tlen = msginfo.msgssz; - else - tlen = msgsz; - if (next <= -1) - panic("next too low #2"); - if (next >= msginfo.msgseg) - panic("next out of range #2"); - mtx_unlock(&msq_mtx); - if ((error = copyin(user_msgp, &msgpool[next * msginfo.msgssz], - tlen)) != 0) { - mtx_lock(&msq_mtx); - DPRINTF(("error %d copying in message segment\n", - error)); - msg_freehdr(msghdr); - msqptr->msg_perm.mode &= ~MSG_LOCKED; - wakeup(msqptr); - goto done2; - } - mtx_lock(&msq_mtx); - msgsz -= tlen; - user_msgp = (const char *)user_msgp + tlen; - next = msgmaps[next].next; - } - if (next != -1) - panic("didn't use all the msg segments"); - - /* - * We've got the message. Unlock the msqid_ds. - */ - - msqptr->msg_perm.mode &= ~MSG_LOCKED; - - /* - * Make sure that the msqid_ds is still allocated. - */ - - if (msqptr->msg_qbytes == 0) { - msg_freehdr(msghdr); - wakeup(msqptr); - error = EIDRM; - goto done2; - } - - /* - * Put the message into the queue - */ - - if (msqptr->msg_first == NULL) { - msqptr->msg_first = msghdr; - msqptr->msg_last = msghdr; - } else { - msqptr->msg_last->msg_next = msghdr; - msqptr->msg_last = msghdr; - } - msqptr->msg_last->msg_next = NULL; - - msqptr->msg_cbytes += msghdr->msg_ts; - msqptr->msg_qnum++; - msqptr->msg_lspid = td->td_proc->p_pid; - msqptr->msg_stime = time (NULL); - -#ifdef __CYGWIN__ - msg_info.msg_num++; - msg_info.msg_tot += uap->msgsz; -#endif /* __CYGWIN__ */ - - wakeup(msqptr); - td->td_retval[0] = 0; -done2: - mtx_unlock(&msq_mtx); - return (error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct msgrcv_args { - int msqid; - void *msgp; - size_t msgsz; - long msgtyp; - int msgflg; -}; -#endif - -/* - * MPSAFE - */ -int -msgrcv(struct thread *td, struct msgrcv_args *uap) -{ - int msqid = uap->msqid; - void *user_msgp = uap->msgp; - size_t msgsz = uap->msgsz; - long msgtyp = uap->msgtyp; - int msgflg = uap->msgflg; - size_t len; - register struct msqid_ds *msqptr; - register struct msg *msghdr; - int error = 0; - short next; - - DPRINTF(("call to msgrcv(%d, 0x%x, %d, %ld, %d)\n", msqid, user_msgp, - msgsz, msgtyp, msgflg)); - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - msqid = IPCID_TO_IX(msqid); - - if (msqid < 0 || msqid >= msginfo.msgmni) { - DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, - msginfo.msgmni)); - return (EINVAL); - } - - msqptr = &msqids[msqid]; - mtx_lock(&msq_mtx); - if (msqptr->msg_qbytes == 0) { - DPRINTF(("no such message queue id\n")); - error = EINVAL; - goto done2; - } - if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { - DPRINTF(("wrong sequence number\n")); - error = EINVAL; - goto done2; - } - - if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) { - DPRINTF(("requester doesn't have read access\n")); - goto done2; - } - - msghdr = NULL; - while (msghdr == NULL) { - if (msgtyp == 0) { - msghdr = msqptr->msg_first; - if (msghdr != NULL) { - if (msgsz < msghdr->msg_ts && - (msgflg & MSG_NOERROR) == 0) { - DPRINTF(("first message on the queue " - "is too big (want %d, got %d)\n", - msgsz, msghdr->msg_ts)); - error = E2BIG; - goto done2; - } - if (msqptr->msg_first == msqptr->msg_last) { - msqptr->msg_first = NULL; - msqptr->msg_last = NULL; - } else { - msqptr->msg_first = msghdr->msg_next; - if (msqptr->msg_first == NULL) - panic("msg_first/last screwed up #1"); - } - } - } else { - struct msg *previous; - struct msg **prev; - - previous = NULL; - prev = &(msqptr->msg_first); - while ((msghdr = *prev) != NULL) { - /* - * Is this message's type an exact match or is - * this message's type less than or equal to - * the absolute value of a negative msgtyp? - * Note that the second half of this test can - * NEVER be true if msgtyp is positive since - * msg_type is always positive! - */ - - if (msgtyp == msghdr->msg_type || - msghdr->msg_type <= -msgtyp) { - DPRINTF(("found message type %d, " - "requested %d\n", - msghdr->msg_type, msgtyp)); - if (msgsz < msghdr->msg_ts && - (msgflg & MSG_NOERROR) == 0) { - DPRINTF(("requested message " - "on the queue is too big " - "(want %d, got %d)\n", - msgsz, msghdr->msg_ts)); - error = E2BIG; - goto done2; - } - *prev = msghdr->msg_next; - if (msghdr == msqptr->msg_last) { - if (previous == NULL) { - if (prev != - &msqptr->msg_first) - panic("msg_first/last screwed up #2"); - msqptr->msg_first = - NULL; - msqptr->msg_last = - NULL; - } else { - if (prev == - &msqptr->msg_first) - panic("msg_first/last screwed up #3"); - msqptr->msg_last = - previous; - } - } - break; - } - previous = msghdr; - prev = &(msghdr->msg_next); - } - } - - /* - * We've either extracted the msghdr for the appropriate - * message or there isn't one. - * If there is one then bail out of this loop. - */ - - if (msghdr != NULL) - break; - - /* - * Hmph! No message found. Does the user want to wait? - */ - - if ((msgflg & IPC_NOWAIT) != 0) { - DPRINTF(("no appropriate message found (msgtyp=%d)\n", - msgtyp)); - /* The SVID says to return ENOMSG. */ - error = ENOMSG; - goto done2; - } - - /* - * Wait for something to happen - */ - - DPRINTF(("msgrcv: goodnight\n")); - error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH, - "msgrcv", 0); - DPRINTF(("msgrcv: good morning (error=%d)\n", error)); - - if (error != 0) { - DPRINTF(("msgrcv: interrupted system call\n")); -#ifdef __CYGWIN__ - if (error != EIDRM) -#endif /* __CYGWIN__ */ - error = EINTR; - goto done2; - } - - /* - * Make sure that the msq queue still exists - */ - - if (msqptr->msg_qbytes == 0 || - msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { - DPRINTF(("msqid deleted\n")); - error = EIDRM; - goto done2; - } - } - - /* - * Return the message to the user. - * - * First, do the bookkeeping (before we risk being interrupted). - */ - - msqptr->msg_cbytes -= msghdr->msg_ts; - msqptr->msg_qnum--; - msqptr->msg_lrpid = td->td_proc->p_pid; - msqptr->msg_rtime = time (NULL); - - /* - * Make msgsz the actual amount that we'll be returning. - * Note that this effectively truncates the message if it is too long - * (since msgsz is never increased). - */ - - DPRINTF(("found a message, msgsz=%d, msg_ts=%d\n", msgsz, - msghdr->msg_ts)); - if (msgsz > msghdr->msg_ts) - msgsz = msghdr->msg_ts; - - /* - * Return the type to the user. - */ - - mtx_unlock(&msq_mtx); - error = copyout(&(msghdr->msg_type), user_msgp, - sizeof(msghdr->msg_type)); - mtx_lock(&msq_mtx); - if (error != 0) { - DPRINTF(("error (%d) copying out message type\n", error)); - msg_freehdr(msghdr); - wakeup(msqptr); - goto done2; - } - user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type); - - /* - * Return the segments to the user - */ - - next = msghdr->msg_spot; - for (len = 0; len < msgsz; len += msginfo.msgssz) { - size_t tlen; - - if (msgsz - len > (unsigned long) msginfo.msgssz) - tlen = msginfo.msgssz; - else - tlen = msgsz - len; - if (next <= -1) - panic("next too low #3"); - if (next >= msginfo.msgseg) - panic("next out of range #3"); - mtx_unlock(&msq_mtx); - error = copyout(&msgpool[next * msginfo.msgssz], - user_msgp, tlen); - mtx_lock(&msq_mtx); - if (error != 0) { - DPRINTF(("error (%d) copying out message segment\n", - error)); - msg_freehdr(msghdr); - wakeup(msqptr); - goto done2; - } - user_msgp = (char *)user_msgp + tlen; - next = msgmaps[next].next; - } - - /* - * Done, return the actual number of bytes copied out. - */ - -#ifdef __CYGWIN__ - msg_info.msg_num--; - msg_info.msg_tot -= msgsz; -#endif /* __CYGWIN__ */ - - msg_freehdr(msghdr); - wakeup(msqptr); - td->td_retval[0] = msgsz; -done2: - mtx_unlock(&msq_mtx); - return (error); -} - -#ifndef __CYGWIN__ -static int -sysctl_msqids(SYSCTL_HANDLER_ARGS) -{ - - return (SYSCTL_OUT(req, msqids, - sizeof(struct msqid_ds) * msginfo.msgmni)); -} - -SYSCTL_DECL(_kern_ipc); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgmax, CTLFLAG_RD, &msginfo.msgmax, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgmni, CTLFLAG_RDTUN, &msginfo.msgmni, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgmnb, CTLFLAG_RD, &msginfo.msgmnb, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgtql, CTLFLAG_RD, &msginfo.msgtql, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgssz, CTLFLAG_RDTUN, &msginfo.msgssz, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, msgseg, CTLFLAG_RDTUN, &msginfo.msgseg, 0, ""); -SYSCTL_PROC(_kern_ipc, OID_AUTO, msqids, CTLFLAG_RD, - NULL, 0, sysctl_msqids, "", "Message queue IDs"); -#endif /* __CYGWIN__ */ -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/sysv_sem.cc b/winsup/cygserver/sysv_sem.cc deleted file mode 100644 index 499c1f9e2..000000000 --- a/winsup/cygserver/sysv_sem.cc +++ /dev/null @@ -1,1389 +0,0 @@ -/* - * Implementation of SVID semaphores - * - * Author: Daniel Boulet - * - * This software is provided ``AS IS'' without any warranties of any kind. - */ - -/* - * This file is heavily changed to become part of Cygwin's cygserver. - */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#include <stdio.h> -#include <sys/cygwin.h> -#include <sys/cdefs.h> -#ifndef __FBSDID -#define __FBSDID(s) const char version[] = (s) -#endif -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/kern/sysv_sem.c,v 1.70 2004/05/30 20:34:58 phk Exp $"); -/* CV, 2006-01-09: Inspected upstream up to version 1.78. */ - -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <sys/types.h> -#include <sys/ipc.h> - -#include <sys/param.h> -#include <sys/sysproto.h> -#include <sys/lock.h> -#include <sys/sem.h> -#include <sys/queue.h> -#include <malloc.h> -#include <errno.h> -#include <time.h> -#include "cygserver.h" -#include "process.h" -#include "cygserver_ipc.h" -#include <sys/smallprint.h> - -#ifdef __CYGWIN__ -#define __semctl semctl -#define __semctl_args semctl_args -#define SEM_DEBUG -#endif /* __CYGWIN__ */ - -#ifdef SEM_DEBUG -#define DPRINTF(a) debug_printf a -#else -#define DPRINTF(a) -#endif - -static int semvalid(int semid, struct semid_ds *semaptr); - -static struct sem_undo *semu_alloc(struct thread *td); -static int semundo_adjust(struct thread *td, struct sem_undo **supptr, - int semid, int semnum, int adjval); -static void semundo_clear(int semid, int semnum, struct thread *td); - -#ifndef _SYS_SYSPROTO_H_ -struct __semctl_args; -int __semctl(struct thread *td, struct __semctl_args *uap); -struct semget_args; -int semget(struct thread *td, struct semget_args *uap); -struct semop_args; -int semop(struct thread *td, struct semop_args *uap); -#endif - -#ifndef __CYGWIN__ -/* XXX casting to (sy_call_t *) is bogus, as usual. */ -static sy_call_t *semcalls[] = { - (sy_call_t *)__semctl, (sy_call_t *)semget, - (sy_call_t *)semop -}; -#endif - -static struct mtx sem_mtx; /* semaphore global lock */ -static int semtots = 0; -static int semtot = 0; -static struct semid_ds *sema; /* semaphore id pool */ -static struct mtx *sema_mtx; /* semaphore id pool mutexes*/ -static struct sem *sem; /* semaphore pool */ -static SLIST_HEAD(, sem_undo) semu_list; /* list of active undo structures */ -static int *semu; /* undo structure pool */ -#ifndef __CYGWIN__ -static eventhandler_tag semexit_tag; -#endif /* __CYGWIN__ */ - -#define SEMUNDO_MTX sem_mtx -#define SEMUNDO_LOCK() mtx_lock(&SEMUNDO_MTX); -#define SEMUNDO_HOOKLOCK() _mtx_lock(&SEMUNDO_MTX, p->winpid, __FILE__, __LINE__); -#define SEMUNDO_UNLOCK() mtx_unlock(&SEMUNDO_MTX); -#define SEMUNDO_LOCKASSERT(how,pid) mtx_assert(&SEMUNDO_MTX, (how), (pid)); - -struct sem { - u_short semval; /* semaphore value */ - pid_t sempid; /* pid of last operation */ - u_short semncnt; /* # awaiting semval > cval */ - u_short semzcnt; /* # awaiting semval = 0 */ -}; - -/* - * Undo structure (one per process) - */ -struct undo { - short un_adjval; /* adjust on exit values */ - short un_num; /* semaphore # */ - int un_id; /* semid */ -} un_ent[1]; /* undo entries */ - -struct sem_undo { - SLIST_ENTRY(sem_undo) un_next; /* ptr to next active undo structure */ -#ifdef __CYGWIN__ - DWORD un_proc; /* owner of this structure */ -#else - struct proc *un_proc; /* owner of this structure */ -#endif - short un_cnt; /* # of active entries */ - struct undo un_ent[1]; /* undo entries */ -}; - -/* - * Configuration parameters - */ -#ifndef SEMMNI -#define SEMMNI 10 /* # of semaphore identifiers */ -#endif -#ifndef SEMMNS -#define SEMMNS 60 /* # of semaphores in system */ -#endif -#ifndef SEMUME -#define SEMUME 10 /* max # of undo entries per process */ -#endif -#ifndef SEMMNU -#define SEMMNU 30 /* # of undo structures in system */ -#endif - -/* shouldn't need tuning */ -#ifndef SEMMAP -#define SEMMAP 30 /* # of entries in semaphore map */ -#endif -#ifndef SEMMSL -#define SEMMSL SEMMNS /* max # of semaphores per id */ -#endif -#ifndef SEMOPM -#define SEMOPM 100 /* max # of operations per semop call */ -#endif - -#ifndef SEMVMX -#define SEMVMX 32767 /* semaphore maximum value */ -#endif -#ifndef SEMAEM -#define SEMAEM 16384 /* adjust on exit max value */ -#endif - -#ifdef __CYGWIN__ -/* gcc 3.4 defines a new offsetof which is different for C++. Since this - file is just a derived plain-C file, we need to revert to the plain-C - definition of offsetof. */ -#ifdef offsetof -#undef offsetof -#endif -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#endif /* __CYGWIN__ */ -/* - * Due to the way semaphore memory is allocated, we have to ensure that - * SEMUSZ is properly aligned. - */ - -#define SEM_ALIGN(bytes) (((bytes) + (sizeof(long) - 1)) & ~(sizeof(long) - 1)) - -/* actual size of an undo structure */ -#define SEMUSZ SEM_ALIGN(offsetof(struct sem_undo, un_ent[SEMUME])) - -/* - * Macro to find a particular sem_undo vector - */ -#define SEMU(ix) \ - ((struct sem_undo *)(((intptr_t)semu)+ix * seminfo.semusz)) - -/* - * semaphore info struct - */ -struct seminfo seminfo = { - SEMMNI, /* # of semaphore identifiers */ - SEMMNS, /* # of semaphores in system */ - SEMMSL, /* max # of semaphores per id */ - SEMOPM, /* max # of operations per semop call */ - SEMMNU, /* # of undo structures in system */ - SEMUME, /* max # of undo entries per process */ - SEMVMX, /* semaphore maximum value */ - SEMAEM, /* adjust on exit max value */ - SEMMAP, /* # of entries in semaphore map */ - SEMUSZ /* size in bytes of undo structure */ -}; - -#ifndef __CYGWIN__ -SYSCTL_DECL(_kern_ipc); -SYSCTL_INT(_kern_ipc, OID_AUTO, semmap, CTLFLAG_RW, &seminfo.semmap, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semmni, CTLFLAG_RDTUN, &seminfo.semmni, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semmns, CTLFLAG_RDTUN, &seminfo.semmns, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semmnu, CTLFLAG_RDTUN, &seminfo.semmnu, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semmsl, CTLFLAG_RW, &seminfo.semmsl, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semopm, CTLFLAG_RDTUN, &seminfo.semopm, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semume, CTLFLAG_RDTUN, &seminfo.semume, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semusz, CTLFLAG_RDTUN, &seminfo.semusz, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semvmx, CTLFLAG_RW, &seminfo.semvmx, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, semaem, CTLFLAG_RW, &seminfo.semaem, 0, ""); -SYSCTL_PROC(_kern_ipc, OID_AUTO, sema, CTLFLAG_RD, - NULL, 0, sysctl_sema, "", ""); -#endif /* __CYGWIN__ */ - -void -seminit(void) -{ - int i; - - TUNABLE_INT_FETCH("kern.ipc.semmap", &seminfo.semmap); - TUNABLE_INT_FETCH("kern.ipc.semmni", &seminfo.semmni); - TUNABLE_INT_FETCH("kern.ipc.semmns", &seminfo.semmns); - TUNABLE_INT_FETCH("kern.ipc.semmnu", &seminfo.semmnu); - TUNABLE_INT_FETCH("kern.ipc.semmsl", &seminfo.semmsl); - TUNABLE_INT_FETCH("kern.ipc.semopm", &seminfo.semopm); - TUNABLE_INT_FETCH("kern.ipc.semume", &seminfo.semume); - TUNABLE_INT_FETCH("kern.ipc.semusz", &seminfo.semusz); - TUNABLE_INT_FETCH("kern.ipc.semvmx", &seminfo.semvmx); - TUNABLE_INT_FETCH("kern.ipc.semaem", &seminfo.semaem); - -#ifdef __CYGWIN__ - /* It's too dangerous a setting to leave it alone. - Keep that clean here. */ - seminfo.semusz = SEM_ALIGN(offsetof(struct sem_undo, - un_ent[seminfo.semume])); -#endif /* __CYGWIN__ */ - - sem = (struct sem *) sys_malloc(sizeof(struct sem) * seminfo.semmns, M_SEM, M_WAITOK); - sema = (struct semid_ds *) sys_malloc(sizeof(struct semid_ds) * seminfo.semmni, M_SEM, - M_WAITOK); - sema_mtx = (struct mtx *) sys_malloc(sizeof(struct mtx) * seminfo.semmni, M_SEM, - M_WAITOK | M_ZERO); - semu = (int *) sys_malloc(seminfo.semmnu * seminfo.semusz, M_SEM, M_WAITOK); - - for (i = 0; i < seminfo.semmni; i++) { - sema[i].sem_base = 0; - sema[i].sem_perm.mode = 0; - sema[i].sem_perm.seq = 0; - } - for (i = 0; i < seminfo.semmni; i++) - { - char *buf = (char *) sys_malloc(16, M_SEM, M_WAITOK); - snprintf(buf, 16, "semid[%d]", i); - mtx_init(&sema_mtx[i], buf, NULL, MTX_DEF); - } - for (i = 0; i < seminfo.semmnu; i++) { - struct sem_undo *suptr = SEMU(i); -#ifdef __CYGWIN__ - suptr->un_proc = 0; -#else - suptr->un_proc = NULL; -#endif - } - SLIST_INIT(&semu_list); - mtx_init(&sem_mtx, "sem", NULL, MTX_DEF); -#ifndef __CYGWIN__ - semexit_tag = EVENTHANDLER_REGISTER(process_exit, semexit_myhook, NULL, - EVENTHANDLER_PRI_ANY); -#endif /* __CYGWIN__ */ -} - -int -semunload(void) -{ -#ifndef __CYGWIN__ /* Would result in being unable to shutdown the - server gracefully. */ - if (semtot != 0) - return (EBUSY); - - EVENTHANDLER_DEREGISTER(process_exit, semexit_tag); -#endif /* __CYGWIN__ */ - sys_free(sem, M_SEM); - sys_free(sema, M_SEM); - sys_free(semu, M_SEM); - for (int i = 0; i < seminfo.semmni; i++) { - sys_free((void *) sema_mtx[i].name, M_SEM); - mtx_destroy(&sema_mtx[i]); - } - mtx_destroy(&sem_mtx); - return (0); -} - -#ifndef __CYGWIN__ -static int -sysvsem_modload(struct module *module, int cmd, void *arg) -{ - int error = 0; - - switch (cmd) { - case MOD_LOAD: - seminit(); - break; - case MOD_UNLOAD: - error = semunload(); - break; - case MOD_SHUTDOWN: - break; - default: - error = EINVAL; - break; - } - return (error); -} - -static moduledata_t sysvsem_mod = { - "sysvsem", - &sysvsem_modload, - NULL -}; - -SYSCALL_MODULE_HELPER(semsys); -SYSCALL_MODULE_HELPER(__semctl); -SYSCALL_MODULE_HELPER(semget); -SYSCALL_MODULE_HELPER(semop); - -DECLARE_MODULE(sysvsem, sysvsem_mod, - SI_SUB_SYSV_SEM, SI_ORDER_FIRST); -MODULE_VERSION(sysvsem, 1); - -/* - * Entry point for all SEM calls - * - * MPSAFE - */ -int -semsys(td, uap) - struct thread *td; - /* XXX actually varargs. */ - struct semsys_args /* { - int which; - int a2; - int a3; - int a4; - int a5; - } */ *uap; -{ - int error; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - if (uap->which < 0 || - uap->which >= sizeof(semcalls)/sizeof(semcalls[0])) - return (EINVAL); - error = (*semcalls[uap->which])(td, &uap->a2); - return (error); -} -#endif /* __CYGWIN__ */ - -/* - * Allocate a new sem_undo structure for a process - * (returns ptr to structure or NULL if no more room) - */ - -static struct sem_undo * -semu_alloc(struct thread *td) -{ - int i; - struct sem_undo *suptr; - struct sem_undo **supptr; - int attempt; - - SEMUNDO_LOCKASSERT(MA_OWNED, td->td_proc->winpid); - /* - * Try twice to allocate something. - * (we'll purge an empty structure after the first pass so - * two passes are always enough) - */ - - for (attempt = 0; attempt < 2; attempt++) { - /* - * Look for a free structure. - * Fill it in and return it if we find one. - */ - - for (i = 0; i < seminfo.semmnu; i++) { - suptr = SEMU(i); -#ifdef __CYGWIN__ - if (suptr->un_proc == 0) { -#else - if (suptr->un_proc == NULL) { -#endif - SLIST_INSERT_HEAD(&semu_list, suptr, un_next); - suptr->un_cnt = 0; - suptr->un_proc = td->td_proc->winpid; - return(suptr); - } - } - - /* - * We didn't find a free one, if this is the first attempt - * then try to free a structure. - */ - - if (attempt == 0) { - /* All the structures are in use - try to free one */ - int did_something = 0; - - SLIST_FOREACH_PREVPTR(suptr, supptr, &semu_list, - un_next) { - if (suptr->un_cnt == 0) { -#ifdef __CYGWIN__ - suptr->un_proc = 0; -#else - suptr->un_proc = NULL; -#endif - did_something = 1; - *supptr = SLIST_NEXT(suptr, un_next); - break; - } - } - - /* If we didn't free anything then just give-up */ - if (!did_something) - return(NULL); - } else { - /* - * The second pass failed even though we freed - * something after the first pass! - * This is IMPOSSIBLE! - */ - panic("semu_alloc - second attempt failed"); - } - } - return (NULL); -} - -/* - * Adjust a particular entry for a particular proc - */ - -static int -semundo_adjust(struct thread *td, struct sem_undo **supptr, int semid, - int semnum, int adjval) -{ - struct proc *p = td->td_proc; - struct sem_undo *suptr; - struct undo *sunptr; - int i; - - SEMUNDO_LOCKASSERT(MA_OWNED, td->td_proc->winpid); - /* Look for and remember the sem_undo if the caller doesn't provide - it */ - - suptr = *supptr; - if (suptr == NULL) { - SLIST_FOREACH(suptr, &semu_list, un_next) { -#ifdef __CYGWIN__ - if (suptr->un_proc == p->winpid) { -#else - if (suptr->un_proc == p) { -#endif - *supptr = suptr; - break; - } - } - if (suptr == NULL) { - if (adjval == 0) - return(0); - suptr = semu_alloc(td); - if (suptr == NULL) - return(ENOSPC); - *supptr = suptr; - } - } - - /* - * Look for the requested entry and adjust it (delete if adjval becomes - * 0). - */ - sunptr = &suptr->un_ent[0]; - for (i = 0; i < suptr->un_cnt; i++, sunptr++) { - if (sunptr->un_id != semid || sunptr->un_num != semnum) - continue; - if (adjval != 0) { - adjval += sunptr->un_adjval; - if (adjval > seminfo.semaem || adjval < -seminfo.semaem) - return (ERANGE); - } - sunptr->un_adjval = adjval; - if (sunptr->un_adjval == 0) { - suptr->un_cnt--; - if (i < suptr->un_cnt) - suptr->un_ent[i] = - suptr->un_ent[suptr->un_cnt]; - } - return(0); - } - - /* Didn't find the right entry - create it */ - if (adjval == 0) - return(0); - if (adjval > seminfo.semaem || adjval < -seminfo.semaem) - return (ERANGE); - if (suptr->un_cnt != seminfo.semume) { - sunptr = &suptr->un_ent[suptr->un_cnt]; - suptr->un_cnt++; - sunptr->un_adjval = adjval; - sunptr->un_id = semid; sunptr->un_num = semnum; - } else - return(EINVAL); - return(0); -} - -static void -semundo_clear(int semid, int semnum, struct thread *td) -{ - struct sem_undo *suptr; - - SEMUNDO_LOCKASSERT(MA_OWNED, td->td_proc->winpid); - SLIST_FOREACH(suptr, &semu_list, un_next) { - struct undo *sunptr = &suptr->un_ent[0]; - int i = 0; - - while (i < suptr->un_cnt) { - if (sunptr->un_id == semid) { - if (semnum == -1 || sunptr->un_num == semnum) { - suptr->un_cnt--; - if (i < suptr->un_cnt) { - suptr->un_ent[i] = - suptr->un_ent[suptr->un_cnt]; - continue; - } - } - if (semnum != -1) - break; - } - i++, sunptr++; - } - } -} - -static int -semvalid(int semid, struct semid_ds *semaptr) -{ - - return ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 || - semaptr->sem_perm.seq != IPCID_TO_SEQ(semid) ? EINVAL : 0); -} - -/* - * Note that the user-mode half of this passes a union, not a pointer - */ -#ifndef _SYS_SYSPROTO_H_ -struct __semctl_args { - int semid; - int semnum; - int cmd; - union semun *arg; -}; -#endif - -/* - * MPSAFE - */ -int -__semctl(struct thread *td, struct __semctl_args *uap) -{ - int semid = uap->semid; - int semnum = uap->semnum; - int cmd = uap->cmd; - u_short *array; - union semun *arg = uap->arg; - union semun real_arg; -#ifndef __CYGWIN__ - struct ucred *cred = td->td_ucred; -#endif - int i, rval, error; - struct semid_ds sbuf; - struct semid_ds *semaptr; - struct mtx *sema_mtxp; - u_short usval, count; - - DPRINTF(("call to semctl(%d, %d, %d, 0x%x)\n", - semid, semnum, cmd, arg)); - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - array = NULL; - - switch(cmd) { -#ifdef __CYGWIN__ - case IPC_INFO: - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - return (error); - if (!semid) { - error = copyout(&seminfo, real_arg.buf, - sizeof(struct seminfo)); - td->td_retval[0] = error ? -1 : 0; - return (error); - } - if (semid > seminfo.semmni) - semid = seminfo.semmni; - error = copyout(sema, real_arg.buf, - semid * sizeof(struct semid_ds)); - td->td_retval[0] = error ? -1 : 0; - return (error); - case SEM_INFO: - if (!(error = copyin(arg, &real_arg, sizeof(real_arg)))) { - struct sem_info sem_info; - sem_info.sem_ids = semtots; - sem_info.sem_num = semtot; - error = copyout(&sem_info, real_arg.buf, - sizeof(struct sem_info)); - } - td->td_retval[0] = error ? -1 : 0; - return (error); - -#endif /* __CYGWIN__ */ - case SEM_STAT: - if (semid < 0 || semid >= seminfo.semmni) - return (EINVAL); - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - return (error); - semaptr = &sema[semid]; - sema_mtxp = &sema_mtx[semid]; - mtx_lock(sema_mtxp); - if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0) { - error = EINVAL; - goto done2; - } - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - mtx_unlock(sema_mtxp); - error = copyout(semaptr, real_arg.buf, sizeof(struct semid_ds)); - rval = IXSEQ_TO_IPCID(semid,semaptr->sem_perm); - if (error == 0) - td->td_retval[0] = rval; - return (error); - } - - semid = IPCID_TO_IX(semid); - if (semid < 0 || semid >= seminfo.semmni) - return (EINVAL); - - semaptr = &sema[semid]; - sema_mtxp = &sema_mtx[semid]; - - error = 0; - rval = 0; - - switch (cmd) { - case IPC_RMID: - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_M))) - goto done2; -#ifdef __CYGWIN__ - semaptr->sem_perm.cuid = td->ipcblk->uid; - semaptr->sem_perm.uid = td->ipcblk->uid; -#else - semaptr->sem_perm.cuid = cred->cr_uid; - semaptr->sem_perm.uid = cred->cr_uid; -#endif - semtot -= semaptr->sem_nsems; - semtots--; - for (i = semaptr->sem_base - sem; i < semtot; i++) - sem[i] = sem[i + semaptr->sem_nsems]; - for (i = 0; i < seminfo.semmni; i++) { - if ((sema[i].sem_perm.mode & SEM_ALLOC) && - sema[i].sem_base > semaptr->sem_base) - sema[i].sem_base -= semaptr->sem_nsems; - } - semaptr->sem_perm.mode = 0; - SEMUNDO_LOCK(); - semundo_clear(semid, -1, td); - SEMUNDO_UNLOCK(); - wakeup(semaptr); - break; - - case IPC_SET: - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - goto done2; - if ((error = copyin(real_arg.buf, &sbuf, sizeof(sbuf))) != 0) - goto done2; - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_M))) - goto done2; - semaptr->sem_perm.uid = sbuf.sem_perm.uid; - semaptr->sem_perm.gid = sbuf.sem_perm.gid; - semaptr->sem_perm.mode = (semaptr->sem_perm.mode & ~0777) | - (sbuf.sem_perm.mode & 0777); - semaptr->sem_ctime = time (NULL); - break; - - case IPC_STAT: - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - goto done2; - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - sbuf = *semaptr; - mtx_unlock(sema_mtxp); - error = copyout(semaptr, real_arg.buf, - sizeof(struct semid_ds)); - break; - - case GETNCNT: - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - if (semnum < 0 || semnum >= semaptr->sem_nsems) { - error = EINVAL; - goto done2; - } - rval = semaptr->sem_base[semnum].semncnt; - break; - - case GETPID: - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - if (semnum < 0 || semnum >= semaptr->sem_nsems) { - error = EINVAL; - goto done2; - } - rval = semaptr->sem_base[semnum].sempid; - break; - - case GETVAL: - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - if (semnum < 0 || semnum >= semaptr->sem_nsems) { - error = EINVAL; - goto done2; - } - rval = semaptr->sem_base[semnum].semval; - break; - - case GETALL: - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - goto done2; - array = (u_short *) sys_malloc(sizeof(*array) * semaptr->sem_nsems, M_TEMP, - M_WAITOK); - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - for (i = 0; i < semaptr->sem_nsems; i++) - array[i] = semaptr->sem_base[i].semval; - mtx_unlock(sema_mtxp); - error = copyout(array, real_arg.array, - i * sizeof(real_arg.array[0])); - break; - - case GETZCNT: - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) - goto done2; - if (semnum < 0 || semnum >= semaptr->sem_nsems) { - error = EINVAL; - goto done2; - } - rval = semaptr->sem_base[semnum].semzcnt; - break; - - case SETVAL: - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - goto done2; - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_W))) - goto done2; - if (semnum < 0 || semnum >= semaptr->sem_nsems) { - error = EINVAL; - goto done2; - } - if (real_arg.val < 0 || real_arg.val > seminfo.semvmx) { - error = ERANGE; - goto done2; - } - semaptr->sem_base[semnum].semval = real_arg.val; - SEMUNDO_LOCK(); - semundo_clear(semid, semnum, td); - SEMUNDO_UNLOCK(); - wakeup(semaptr); - break; - - case SETALL: - mtx_lock(sema_mtxp); -raced: - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - count = semaptr->sem_nsems; - mtx_unlock(sema_mtxp); - if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) - goto done2; - array = (u_short *) sys_malloc(sizeof(*array) * count, M_TEMP, M_WAITOK); - error = copyin(real_arg.array, array, count * sizeof(*array)); - if (error) - break; - mtx_lock(sema_mtxp); - if ((error = semvalid(uap->semid, semaptr)) != 0) - goto done2; - /* we could have raced? */ - if (count != semaptr->sem_nsems) { - sys_free(array, M_TEMP); - array = NULL; - goto raced; - } - if ((error = ipcperm(td, &semaptr->sem_perm, IPC_W))) - goto done2; - for (i = 0; i < semaptr->sem_nsems; i++) { - usval = array[i]; - if (usval > seminfo.semvmx) { - error = ERANGE; - break; - } - semaptr->sem_base[i].semval = usval; - } - SEMUNDO_LOCK(); - semundo_clear(semid, -1, td); - SEMUNDO_UNLOCK(); - wakeup(semaptr); - break; - - default: - error = EINVAL; - break; - } - - if (error == 0) - td->td_retval[0] = rval; -done2: - if (mtx_owned(sema_mtxp, td->td_proc->winpid)) - mtx_unlock(sema_mtxp); - if (array != NULL) - sys_free(array, M_TEMP); - return(error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct semget_args { - key_t key; - int nsems; - int semflg; -}; -#endif - -/* - * MPSAFE - */ -int -semget(struct thread *td, struct semget_args *uap) -{ - int semid, error = 0; - key_t key = uap->key; - int nsems = uap->nsems; - int semflg = uap->semflg; -#ifndef __CYGWIN__ - struct ucred *cred = td->td_ucred; -#endif - - DPRINTF(("semget(0x%llx, %d, 0%o)\n", key, nsems, semflg)); - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - mtx_lock(&Giant); - if (key != IPC_PRIVATE) { - for (semid = 0; semid < seminfo.semmni; semid++) { - if ((sema[semid].sem_perm.mode & SEM_ALLOC) && - sema[semid].sem_perm.key == key) - break; - } - if (semid < seminfo.semmni) { - DPRINTF(("found public key\n")); - if ((error = ipcperm(td, &sema[semid].sem_perm, - semflg & 0700))) { - goto done2; - } - if (nsems > 0 && sema[semid].sem_nsems < nsems) { - DPRINTF(("too small\n")); - error = EINVAL; - goto done2; - } - if ((semflg & IPC_CREAT) && (semflg & IPC_EXCL)) { - DPRINTF(("not exclusive\n")); - error = EEXIST; - goto done2; - } - goto found; - } - } - - DPRINTF(("need to allocate the semid_ds\n")); - if (key == IPC_PRIVATE || (semflg & IPC_CREAT)) { - if (nsems <= 0 || nsems > seminfo.semmsl) { - DPRINTF(("nsems out of range (0<%d<=%d)\n", nsems, - seminfo.semmsl)); - error = EINVAL; - goto done2; - } - if (nsems > seminfo.semmns - semtot) { - DPRINTF(( - "not enough semaphores left (need %d, got %d)\n", - nsems, seminfo.semmns - semtot)); - error = ENOSPC; - goto done2; - } - for (semid = 0; semid < seminfo.semmni; semid++) { - if ((sema[semid].sem_perm.mode & SEM_ALLOC) == 0) - break; - } - if (semid == seminfo.semmni) { - DPRINTF(("no more semid_ds's available\n")); - error = ENOSPC; - goto done2; - } - DPRINTF(("semid %d is available\n", semid)); - sema[semid].sem_perm.key = key; -#ifdef __CYGWIN__ - sema[semid].sem_perm.cuid = td->ipcblk->uid; - sema[semid].sem_perm.uid = td->ipcblk->uid; - sema[semid].sem_perm.cgid = td->ipcblk->gid; - sema[semid].sem_perm.gid = td->ipcblk->gid; -#else - sema[semid].sem_perm.cuid = cred->cr_uid; - sema[semid].sem_perm.uid = cred->cr_uid; - sema[semid].sem_perm.cgid = cred->cr_gid; - sema[semid].sem_perm.gid = cred->cr_gid; -#endif - sema[semid].sem_perm.mode = (semflg & 0777) | SEM_ALLOC; - sema[semid].sem_perm.seq = - (sema[semid].sem_perm.seq + 1) & 0x7fff; - sema[semid].sem_nsems = nsems; - sema[semid].sem_otime = 0; - sema[semid].sem_ctime = time (NULL); - sema[semid].sem_base = &sem[semtot]; - semtot += nsems; - semtots++; - bzero(sema[semid].sem_base, - sizeof(sema[semid].sem_base[0])*nsems); - DPRINTF(("sembase = 0x%x, next = 0x%x\n", sema[semid].sem_base, - &sem[semtot])); - } else { - DPRINTF(("didn't find it and wasn't asked to create it\n")); - error = ENOENT; - goto done2; - } - -found: - td->td_retval[0] = IXSEQ_TO_IPCID(semid, sema[semid].sem_perm); -done2: -#ifdef __CYGWIN__ - if (!error) - ipcexit_creat_hookthread (td); -#endif - mtx_unlock(&Giant); - return (error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct semop_args { - int semid; - struct sembuf *sops; - size_t nsops; -}; -#endif - -/* - * MPSAFE - */ -int -semop(struct thread *td, struct semop_args *uap) -{ -#define SMALL_SOPS 8 - struct sembuf small_sops[SMALL_SOPS]; - int semid = uap->semid; - size_t nsops = uap->nsops; - struct sembuf *sops; - struct semid_ds *semaptr; - struct sembuf *sopptr = 0; - struct sem *semptr = 0; - struct sem_undo *suptr; - struct mtx *sema_mtxp; - size_t i, j, k; - int error; - int do_wakeup, do_undos; - - DPRINTF(("call to semop(%d, 0x%x, %u)\n", semid, uap->sops, nsops)); - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - semid = IPCID_TO_IX(semid); /* Convert back to zero origin */ - - if (semid < 0 || semid >= seminfo.semmni) - return (EINVAL); - - /* Allocate memory for sem_ops */ - if (nsops <= SMALL_SOPS) - sops = small_sops; - else if (nsops <= (unsigned long) seminfo.semopm) - sops = (struct sembuf *) sys_malloc(nsops * sizeof(*sops), M_SEM, M_WAITOK); - else { - DPRINTF(("too many sops (max=%d, nsops=%d)\n", seminfo.semopm, - nsops)); - return (E2BIG); - } - if ((error = copyin(uap->sops, sops, nsops * sizeof(sops[0]))) != 0) { - DPRINTF(("error = %d from copyin(%08x, %08x, %d)\n", error, - uap->sops, sops, nsops * sizeof(sops[0]))); - if (sops != small_sops) - sys_free(sops, M_SEM); - return (error); - } - - semaptr = &sema[semid]; - sema_mtxp = &sema_mtx[semid]; - mtx_lock(sema_mtxp); - if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0) { - error = EINVAL; - goto done2; - } - if (semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) { - error = EINVAL; - goto done2; - } - /* - * Initial pass thru sops to see what permissions are needed. - * Also perform any checks that don't need repeating on each - * attempt to satisfy the request vector. - */ - j = 0; /* permission needed */ - do_undos = 0; - for (i = 0; i < nsops; i++) { - sopptr = &sops[i]; - if (sopptr->sem_num >= semaptr->sem_nsems) { - error = EFBIG; - goto done2; - } - if (sopptr->sem_flg & SEM_UNDO && sopptr->sem_op != 0) - do_undos = 1; - j |= (sopptr->sem_op == 0) ? SEM_R : SEM_A; - } - - if ((error = ipcperm(td, &semaptr->sem_perm, j))) { - DPRINTF(("error = %d from ipaccess\n", error)); - goto done2; - } - - /* - * Loop trying to satisfy the vector of requests. - * If we reach a point where we must wait, any requests already - * performed are rolled back and we go to sleep until some other - * process wakes us up. At this point, we start all over again. - * - * This ensures that from the perspective of other tasks, a set - * of requests is atomic (never partially satisfied). - */ - for (;;) { - do_wakeup = 0; - error = 0; /* error return if necessary */ - - for (i = 0; i < nsops; i++) { - sopptr = &sops[i]; - semptr = &semaptr->sem_base[sopptr->sem_num]; - - DPRINTF(( - "semop: semaptr=%x, sem_base=%x, " - "semptr=%x, sem[%d]=%d : op=%d, flag=%s\n", - semaptr, semaptr->sem_base, semptr, - sopptr->sem_num, semptr->semval, sopptr->sem_op, - (sopptr->sem_flg & IPC_NOWAIT) ? - "nowait" : "wait")); - - if (sopptr->sem_op < 0) { - if (semptr->semval + sopptr->sem_op < 0) { - DPRINTF(("semop: can't do it now\n")); - break; - } else { - semptr->semval += sopptr->sem_op; - if (semptr->semval == 0 && - semptr->semzcnt > 0) - do_wakeup = 1; - } - } else if (sopptr->sem_op == 0) { - if (semptr->semval != 0) { - DPRINTF(("semop: not zero now\n")); - break; - } - } else if (semptr->semval + sopptr->sem_op > - seminfo.semvmx) { - error = ERANGE; - break; - } else { - if (semptr->semncnt > 0) - do_wakeup = 1; - semptr->semval += sopptr->sem_op; - } - } - - /* - * Did we get through the entire vector? - */ - if (i >= nsops) - goto done; - - /* - * No ... rollback anything that we've already done - */ - DPRINTF(("semop: rollback 0 through %d\n", i-1)); - for (j = 0; j < i; j++) - semaptr->sem_base[sops[j].sem_num].semval -= - sops[j].sem_op; - - /* If we detected an error, return it */ - if (error != 0) - goto done2; - - /* - * If the request that we couldn't satisfy has the - * NOWAIT flag set then return with EAGAIN. - */ - if (sopptr->sem_flg & IPC_NOWAIT) { - error = EAGAIN; - goto done2; - } - - if (sopptr->sem_op == 0) - semptr->semzcnt++; - else - semptr->semncnt++; - - DPRINTF(("semop: good night!\n")); - error = msleep(semaptr, sema_mtxp, (PZERO - 4) | PCATCH, - "semwait", 0); - DPRINTF(("semop: good morning (error=%d)!\n", error)); - /* return code is checked below, after sem[nz]cnt-- */ - - /* - * Make sure that the semaphore still exists - */ - if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 || - semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) { - error = EIDRM; - goto done2; - } - - /* - * The semaphore is still alive. Readjust the count of - * waiting processes. - */ - if (sopptr->sem_op == 0) - semptr->semzcnt--; - else - semptr->semncnt--; - - /* - * Is it really morning, or was our sleep interrupted? - * (Delayed check of msleep() return code because we - * need to decrement sem[nz]cnt either way.) - */ - if (error != 0) { -#ifdef __CYGWIN__ - if (error != EIDRM) -#endif /* __CYGWIN__ */ - error = EINTR; - goto done2; - } - DPRINTF(("semop: good morning!\n")); - } - -done: - /* - * Process any SEM_UNDO requests. - */ - if (do_undos) { - SEMUNDO_LOCK(); - suptr = NULL; - for (i = 0; i < nsops; i++) { - /* - * We only need to deal with SEM_UNDO's for non-zero - * op's. - */ - int adjval; - - if ((sops[i].sem_flg & SEM_UNDO) == 0) - continue; - adjval = sops[i].sem_op; - if (adjval == 0) - continue; - error = semundo_adjust(td, &suptr, semid, - sops[i].sem_num, -adjval); - if (error == 0) - continue; - - /* - * Oh-Oh! We ran out of either sem_undo's or undo's. - * Rollback the adjustments to this point and then - * rollback the semaphore ups and down so we can return - * with an error with all structures restored. We - * rollback the undo's in the exact reverse order that - * we applied them. This guarantees that we won't run - * out of space as we roll things back out. - */ - for (j = 0; j < i; j++) { - k = i - j - 1; - if ((sops[k].sem_flg & SEM_UNDO) == 0) - continue; - adjval = sops[k].sem_op; - if (adjval == 0) - continue; - if (semundo_adjust(td, &suptr, semid, - sops[k].sem_num, adjval) != 0) - panic("semop - can't undo undos"); - } - - for (j = 0; j < nsops; j++) - semaptr->sem_base[sops[j].sem_num].semval -= - sops[j].sem_op; - - DPRINTF(("error = %d from semundo_adjust\n", error)); - SEMUNDO_UNLOCK(); - goto done2; - } /* loop through the sops */ - SEMUNDO_UNLOCK(); - } /* if (do_undos) */ - - /* We're definitely done - set the sempid's and time */ - for (i = 0; i < nsops; i++) { - sopptr = &sops[i]; - semptr = &semaptr->sem_base[sopptr->sem_num]; - semptr->sempid = td->td_proc->p_pid; - } - semaptr->sem_otime = time (NULL); - - /* - * Do a wakeup if any semaphore was up'd whilst something was - * sleeping on it. - */ - if (do_wakeup) { - DPRINTF(("semop: doing wakeup\n")); - wakeup(semaptr); - DPRINTF(("semop: back from wakeup\n")); - } - DPRINTF(("semop: done\n")); - td->td_retval[0] = 0; -done2: - mtx_unlock(sema_mtxp); - if (sops != small_sops) - sys_free(sops, M_SEM); - return (error); -} - -/* - * Go through the undo structures for this process and apply the adjustments to - * semaphores. - */ -void -semexit_myhook(void *arg, struct proc *p) -{ - struct sem_undo *suptr; - struct sem_undo **supptr; - - /* - * Go through the chain of undo vectors looking for one - * associated with this process. - */ - SEMUNDO_HOOKLOCK(); - SLIST_FOREACH_PREVPTR(suptr, supptr, &semu_list, un_next) { -#ifdef __CYGWIN__ - if (suptr->un_proc == p->winpid) -#else - if (suptr->un_proc == p) -#endif - break; - } -#ifndef __CYGWIN__ - SEMUNDO_UNLOCK(); -#endif - - if (suptr == NULL) { - SEMUNDO_UNLOCK(); - return; - } - -#ifdef __CYGWIN__ - DPRINTF(("proc @%u(%u) has undo structure with %d entries\n", - p->cygpid, p->winpid, suptr->un_cnt)); -#else - DPRINTF(("proc @%08x has undo structure with %d entries\n", p, - suptr->un_cnt)); -#endif - - /* - * If there are any active undo elements then process them. - */ - if (suptr->un_cnt > 0) { - int ix; - - for (ix = 0; ix < suptr->un_cnt; ix++) { - int semid = suptr->un_ent[ix].un_id; - int semnum = suptr->un_ent[ix].un_num; - int adjval = suptr->un_ent[ix].un_adjval; - struct semid_ds *semaptr; - struct mtx *sema_mtxp; - - semaptr = &sema[semid]; - sema_mtxp = &sema_mtx[semid]; -#ifdef __CYGWIN__ - _mtx_lock(sema_mtxp, p->winpid, __FILE__, __LINE__); -#else - mtx_lock(sema_mtxp); - SEMUNDO_HOOKLOCK(); -#endif - if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0) - panic("semexit - semid not allocated"); - if (semnum >= semaptr->sem_nsems) - panic("semexit - semnum out of range"); - - DPRINTF(( -#ifdef __CYGWIN__ - "semexit: %u id=%d num=%d(adj=%d) ; sem=%d\n", -#else - "semexit: %08x id=%d num=%d(adj=%d) ; sem=%d\n", -#endif - suptr->un_proc, suptr->un_ent[ix].un_id, - suptr->un_ent[ix].un_num, - suptr->un_ent[ix].un_adjval, - semaptr->sem_base[semnum].semval)); - - if (adjval < 0) { - if (semaptr->sem_base[semnum].semval < -adjval) - semaptr->sem_base[semnum].semval = 0; - else - semaptr->sem_base[semnum].semval += - adjval; - } else - semaptr->sem_base[semnum].semval += adjval; - - wakeup(semaptr); - DPRINTF(("semexit: back from wakeup\n")); - _mtx_unlock(sema_mtxp, __FILE__, __LINE__); -#ifndef __CYGWIN__ - SEMUNDO_UNLOCK(); -#endif - } - } - - /* - * Deallocate the undo vector. - */ - DPRINTF(("removing vector (%u)\n", suptr->un_proc)); -#ifdef __CYGWIN__ - suptr->un_proc = 0; -#else - suptr->un_proc = NULL; -#endif - *supptr = SLIST_NEXT(suptr, un_next); -#ifdef __CYGWIN__ - SEMUNDO_UNLOCK(); -#endif -} - -#ifndef __CYGWIN__ -static int -sysctl_sema(SYSCTL_HANDLER_ARGS) -{ - - return (SYSCTL_OUT(req, sema, - sizeof(struct semid_ds) * seminfo.semmni)); -} -#endif /* __CYGWIN__ */ -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/sysv_shm.cc b/winsup/cygserver/sysv_shm.cc deleted file mode 100644 index 700dbe21d..000000000 --- a/winsup/cygserver/sysv_shm.cc +++ /dev/null @@ -1,1046 +0,0 @@ -/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */ -/* - * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Adam Glass and Charles - * Hannum. - * 4. The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * This file is heavily changed to become part of Cygwin's cygserver. - */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#include <sys/cdefs.h> -#ifndef __FBSDID -#define __FBSDID(s) const char version[] = (s) -#endif -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/kern/sysv_shm.c,v 1.89 2003/11/07 04:47:14 rwatson Exp $"); -/* CV, 2006-01-09: Inspected upstream up to version 1.104. */ - -#define _KERNEL 1 -#define __BSD_VISIBLE 1 -#include <sys/param.h> -#include <sys/lock.h> -#include <sys/shm.h> -#include <malloc.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/sysproto.h> - -#include <errno.h> -#include <time.h> -#include <unistd.h> -#include "cygserver.h" -#include "process.h" -#include "cygserver_ipc.h" - -#ifdef __CYGWIN__ -#ifndef PAGE_SIZE -#define PAGE_SIZE (getpagesize ()) -#endif -#ifndef PAGE_MASK -#define PAGE_MASK (PAGE_SIZE - 1) -#endif -#define btoc(b) (((b) + PAGE_MASK) / PAGE_SIZE) -#define round_page(p) ((((unsigned long)(p)) + PAGE_MASK) & ~(PAGE_MASK)) -#define ACCESSPERMS (0777) -#ifdef __CYGWIN__ -#define GIANT_REQUIRED -#else -#define GIANT_REQUIRED mtx_assert(&Giant, MA_OWNED) -#endif -#define KERN_SUCCESS 0 -#define VM_PROT_READ PROT_READ -#define VM_PROT_WRITE PROT_WRITE -#define VM_INHERIT_SHARE 0 -#define OBJT_PHYS 0 -#define OBJT_SWAP 0 -#define VM_PROT_DEFAULT 0 -#define VM_OBJECT_LOCK(a) -#define vm_object_clear_flag(a,b) -#define vm_object_set_flag(a,b) -#define VM_OBJECT_UNLOCK(a) -#define vm_map_remove(a,b,c) KERN_SUCCESS -typedef int vm_prot_t; -#endif /* __CYGWIN__ */ - -#ifndef __CYGWIN__ -static MALLOC_DEFINE(M_SHM, "shm", "SVID compatible shared memory segments"); - -struct oshmctl_args; -static int oshmctl(struct thread *td, struct oshmctl_args *uap); -#endif /* __CYGWIN__ */ - -static int shmget_allocate_segment(struct thread *td, - struct shmget_args *uap, int mode); -static int shmget_existing(struct thread *td, struct shmget_args *uap, - int mode, int segnum); - -#ifndef __CYGWIN__ -/* XXX casting to (sy_call_t *) is bogus, as usual. */ -static sy_call_t *shmcalls[] = { - (sy_call_t *)shmat, (sy_call_t *)oshmctl, - (sy_call_t *)shmdt, (sy_call_t *)shmget, - (sy_call_t *)shmctl -}; -#endif /* __CYGWIN__ */ - -#define SHMSEG_FREE 0x0200 -#define SHMSEG_REMOVED 0x0400 -#define SHMSEG_ALLOCATED 0x0800 -#define SHMSEG_WANTED 0x1000 - -static int shm_last_free, shm_nused, shm_committed, shmalloced, shm_nattch; -static struct shmid_ds *shmsegs; - -struct shm_handle { - /* vm_offset_t kva; */ - vm_object_t shm_object; -}; - -struct shmmap_state { - vm_offset_t va; - int shmid; -}; - -static void shm_deallocate_segment(struct shmid_ds *); -static int shm_find_segment_by_key(key_t); -static struct shmid_ds *shm_find_segment_by_shmid(int); -static struct shmid_ds *shm_find_segment_by_shmidx(int); -static int shm_delete_mapping(struct vmspace *vm, struct shmmap_state *); -static void shmrealloc(void); - -/* - * Tuneable values. - */ -#ifndef SHMMAXPGS -#define SHMMAXPGS 8192 /* Note: sysv shared memory is swap backed. */ -#endif -#ifndef SHMMAX -#define SHMMAX (SHMMAXPGS*PAGE_SIZE) -#endif -#ifndef SHMMIN -#define SHMMIN 1 -#endif -#ifndef SHMMNI -#define SHMMNI 192 -#endif -#ifndef SHMSEG -#define SHMSEG 128 -#endif -#ifndef SHMALL -#define SHMALL (SHMMAXPGS) -#endif - -struct shminfo shminfo = { - SHMMAX, - SHMMIN, - SHMMNI, - SHMSEG, - SHMALL -}; - -#ifndef __CYGWIN__ -static int shm_use_phys; -#else -static long shm_use_phys; -static long shm_allow_removed; -#endif /* __CYGWIN__ */ - -#ifndef __CYGWIN__ -struct shm_info shm_info; -#endif /* __CYGWIN__ */ - -#ifndef __CYGWIN__ -SYSCTL_DECL(_kern_ipc); -SYSCTL_INT(_kern_ipc, OID_AUTO, shmmax, CTLFLAG_RW, &shminfo.shmmax, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shmmin, CTLFLAG_RW, &shminfo.shmmin, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shmmni, CTLFLAG_RDTUN, &shminfo.shmmni, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shmseg, CTLFLAG_RDTUN, &shminfo.shmseg, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shmall, CTLFLAG_RW, &shminfo.shmall, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shm_use_phys, CTLFLAG_RW, - &shm_use_phys, 0, ""); -SYSCTL_INT(_kern_ipc, OID_AUTO, shm_allow_removed, CTLFLAG_RW, - &shm_allow_removed, 0, ""); -SYSCTL_PROC(_kern_ipc, OID_AUTO, shmsegs, CTLFLAG_RD, - NULL, 0, sysctl_shmsegs, "", ""); -#endif /* __CYGWIN__ */ - -static int -shm_find_segment_by_key(key_t key) -{ - int i; - - for (i = 0; i < shmalloced; i++) - if ((shmsegs[i].shm_perm.mode & SHMSEG_ALLOCATED) && - shmsegs[i].shm_perm.key == key) - return (i); - return (-1); -} - -static struct shmid_ds * -shm_find_segment_by_shmid(int shmid) -{ - int segnum; - struct shmid_ds *shmseg; - - segnum = IPCID_TO_IX(shmid); - if (segnum < 0 || segnum >= shmalloced) - return (NULL); - shmseg = &shmsegs[segnum]; - if ((shmseg->shm_perm.mode & SHMSEG_ALLOCATED) == 0 || - (!shm_allow_removed && - (shmseg->shm_perm.mode & SHMSEG_REMOVED) != 0) || - shmseg->shm_perm.seq != IPCID_TO_SEQ(shmid)) - return (NULL); - return (shmseg); -} - -static struct shmid_ds * -shm_find_segment_by_shmidx(int segnum) -{ - struct shmid_ds *shmseg; - - if (segnum < 0 || segnum >= shmalloced) - return (NULL); - shmseg = &shmsegs[segnum]; - if ((shmseg->shm_perm.mode & SHMSEG_ALLOCATED) == 0 || - (!shm_allow_removed && - (shmseg->shm_perm.mode & SHMSEG_REMOVED) != 0)) - return (NULL); - return (shmseg); -} - -static void -shm_deallocate_segment(struct shmid_ds *shmseg) -{ - struct shm_handle *shm_handle; - size_t size; - - GIANT_REQUIRED; - - shm_handle = shmseg->shm_internal; - vm_object_deallocate(shm_handle->shm_object); - sys_free(shm_handle, M_SHM); - shmseg->shm_internal = NULL; - size = round_page(shmseg->shm_segsz); - shm_committed -= btoc(size); - shm_nused--; - shmseg->shm_perm.mode = SHMSEG_FREE; -} - -static int -shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s) -{ - struct shmid_ds *shmseg; - int segnum, result; - size_t size; - - GIANT_REQUIRED; - - segnum = IPCID_TO_IX(shmmap_s->shmid); - shmseg = &shmsegs[segnum]; - size = round_page(shmseg->shm_segsz); - result = vm_map_remove(&vm->vm_map, shmmap_s->va, shmmap_s->va + size); - if (result != KERN_SUCCESS) - return (EINVAL); - shmmap_s->shmid = -1; - shmseg->shm_dtime = time (NULL); - --shm_nattch; - if ((--shmseg->shm_nattch <= 0) && - (shmseg->shm_perm.mode & SHMSEG_REMOVED)) { - shm_deallocate_segment(shmseg); - shm_last_free = segnum; - } - return (0); -} - -#ifndef _SYS_SYSPROTO_H_ -struct shmdt_args { - const void *shmaddr; -}; -#endif - -/* - * MPSAFE - */ -int -shmdt(struct thread *td, struct shmdt_args *uap) -{ - struct proc *p = td->td_proc; - struct shmmap_state *shmmap_s; - int i; - int error = 0; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - mtx_lock(&Giant); - shmmap_s = p->p_vmspace->vm_shm; - if (shmmap_s == NULL) { - error = EINVAL; - goto done2; - } - for (i = 0; i < shminfo.shmseg; i++, shmmap_s++) { - if (shmmap_s->shmid != -1 && - shmmap_s->va == (vm_offset_t)uap->shmaddr) { - break; - } - } - if (i == shminfo.shmseg) { - error = EINVAL; - goto done2; - } - error = shm_delete_mapping(p->p_vmspace, shmmap_s); -done2: - mtx_unlock(&Giant); - return (error); -} - -#ifndef _SYS_SYSPROTO_H_ -struct shmat_args { - int shmid; - const void *shmaddr; - int shmflg; -}; -#endif - -/* - * MPSAFE - */ -int -kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg) -{ - struct proc *p = td->td_proc; - int i, flags; - struct shmid_ds *shmseg; - struct shmmap_state *shmmap_s = NULL; -#ifndef __CYGWIN__ - struct shm_handle *shm_handle; -#endif - vm_offset_t attach_va; - vm_prot_t prot; - vm_size_t size; -#ifndef __CYGWIN__ - int rv; -#endif - int error = 0; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - mtx_lock(&Giant); - shmmap_s = p->p_vmspace->vm_shm; - if (shmmap_s == NULL) { - size = shminfo.shmseg * sizeof(struct shmmap_state); - shmmap_s = (struct shmmap_state *) sys_malloc(size, M_SHM, M_WAITOK); - for (i = 0; i < shminfo.shmseg; i++) - shmmap_s[i].shmid = -1; - p->p_vmspace->vm_shm = shmmap_s; - } - shmseg = shm_find_segment_by_shmid(shmid); - if (shmseg == NULL) { - error = EINVAL; - goto done2; - } - error = ipcperm(td, &shmseg->shm_perm, - (shmflg & SHM_RDONLY) ? IPC_R : IPC_R|IPC_W); - if (error) - goto done2; - for (i = 0; i < shminfo.shmseg; i++) { - if (shmmap_s->shmid == -1) - break; - shmmap_s++; - } - if (i >= shminfo.shmseg) { - error = EMFILE; - goto done2; - } - size = round_page(shmseg->shm_segsz); -#ifdef VM_PROT_READ_IS_EXEC - prot = VM_PROT_READ | VM_PROT_EXECUTE; -#else - prot = VM_PROT_READ; -#endif - if ((shmflg & SHM_RDONLY) == 0) - prot |= VM_PROT_WRITE; - flags = MAP_ANON | MAP_SHARED; - debug_printf ("shmaddr: %x, shmflg: %x", shmaddr, shmflg); -#ifdef __CYGWIN__ - /* The alignment checks have already been made in the Cygwin DLL - and shmat's only job is to keep record of the attached mem. - These checks break shm on 9x since MapViewOfFileEx apparently - returns memory which isn't aligned to SHMLBA. Go figure! */ - attach_va = (vm_offset_t)shmaddr; -#else - if (shmaddr) { - flags |= MAP_FIXED; - if (shmflg & SHM_RND) { - attach_va = (vm_offset_t)shmaddr & ~(SHMLBA-1); - } else if (((vm_offset_t)shmaddr & (SHMLBA-1)) == 0) { - attach_va = (vm_offset_t)shmaddr; - } else { - error = EINVAL; - goto done2; - } - } else { - /* - * This is just a hint to vm_map_find() about where to - * put it. - */ - attach_va = round_page((vm_offset_t)p->p_vmspace->vm_taddr - + maxtsiz + maxdsiz); - } - - shm_handle = shmseg->shm_internal; - vm_object_reference(shm_handle->shm_object); - rv = vm_map_find(&p->p_vmspace->vm_map, shm_handle->shm_object, - 0, &attach_va, size, (flags & MAP_FIXED)?0:1, prot, prot, 0); - if (rv != KERN_SUCCESS) { - error = ENOMEM; - goto done2; - } - vm_map_inherit(&p->p_vmspace->vm_map, - attach_va, attach_va + size, VM_INHERIT_SHARE); -#endif - - shmmap_s->va = attach_va; - shmmap_s->shmid = shmid; - shmseg->shm_lpid = p->p_pid; - shmseg->shm_atime = time (NULL); - shmseg->shm_nattch++; - shm_nattch++; - td->td_retval[0] = attach_va; -done2: - mtx_unlock(&Giant); - return (error); -} - -int -shmat(struct thread *td, struct shmat_args *uap) -{ - return kern_shmat(td, uap->shmid, uap->shmaddr, uap->shmflg); -} - -#ifndef __CYGWIN__ -struct oshmid_ds { - struct ipc_perm shm_perm; /* operation perms */ - int shm_segsz; /* size of segment (bytes) */ - u_short shm_cpid; /* pid, creator */ - u_short shm_lpid; /* pid, last operation */ - short shm_nattch; /* no. of current attaches */ - time_t shm_atime; /* last attach time */ - time_t shm_dtime; /* last detach time */ - time_t shm_ctime; /* last change time */ - void *shm_handle; /* internal handle for shm segment */ -}; - -struct oshmctl_args { - int shmid; - int cmd; - struct oshmid_ds *ubuf; -}; - -/* - * MPSAFE - */ -static int -oshmctl(struct thread *td, struct oshmctl_args *uap) -{ -#ifdef COMPAT_43 - int error = 0; - struct shmid_ds *shmseg; - struct oshmid_ds outbuf; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - mtx_lock(&Giant); - shmseg = shm_find_segment_by_shmid(uap->shmid); - if (shmseg == NULL) { - error = EINVAL; - goto done2; - } - switch (uap->cmd) { - case IPC_STAT: - error = ipcperm(td, &shmseg->shm_perm, IPC_R); - if (error) - goto done2; - outbuf.shm_perm = shmseg->shm_perm; - outbuf.shm_segsz = shmseg->shm_segsz; - outbuf.shm_cpid = shmseg->shm_cpid; - outbuf.shm_lpid = shmseg->shm_lpid; - outbuf.shm_nattch = shmseg->shm_nattch; - outbuf.shm_atime = shmseg->shm_atime; - outbuf.shm_dtime = shmseg->shm_dtime; - outbuf.shm_ctime = shmseg->shm_ctime; - outbuf.shm_handle = shmseg->shm_internal; - error = copyout(&outbuf, uap->ubuf, sizeof(outbuf)); - if (error) - goto done2; - break; - default: - /* XXX casting to (sy_call_t *) is bogus, as usual. */ - error = ((sy_call_t *)shmctl)(td, uap); - break; - } -done2: - mtx_unlock(&Giant); - return (error); -#else - return (EINVAL); -#endif -} -#endif /* __CYGWIN__ */ - -#ifndef _SYS_SYSPROTO_H_ -struct shmctl_args { - int shmid; - int cmd; - struct shmid_ds *buf; -}; -#endif - -/* - * MPSAFE - */ -int -kern_shmctl(struct thread *td, int shmid, int cmd, void *buf, size_t *bufsz) -{ - int error = 0; - struct shmid_ds *shmseg; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - - mtx_lock(&Giant); - switch (cmd) { - case IPC_INFO: - memcpy(buf, &shminfo, sizeof(shminfo)); - if (bufsz) - *bufsz = sizeof(shminfo); - td->td_retval[0] = shmalloced; - goto done2; - case SHM_INFO: { - struct shm_info shm_info; - shm_info.used_ids = shm_nused; - shm_info.shm_tot = shm_committed * PAGE_SIZE; -#ifdef __CYGWIN__ - shm_info.shm_atts = shm_nattch; -#else - shm_info.shm_rss = 0; /*XXX where to get from ? */ - shm_info.shm_swp = 0; /*XXX where to get from ? */ - shm_info.swap_attempts = 0; /*XXX where to get from ? */ - shm_info.swap_successes = 0; /*XXX where to get from ? */ -#endif /* __CYGWIN__ */ - memcpy(buf, &shm_info, sizeof(shm_info)); - if (bufsz) - *bufsz = sizeof(shm_info); - td->td_retval[0] = shmalloced; - goto done2; - } - } - if (cmd == SHM_STAT) - shmseg = shm_find_segment_by_shmidx(shmid); - else - shmseg = shm_find_segment_by_shmid(shmid); - if (shmseg == NULL) { - error = EINVAL; - goto done2; - } - switch (cmd) { - case SHM_STAT: - case IPC_STAT: - error = ipcperm(td, &shmseg->shm_perm, IPC_R); - if (error) - goto done2; - memcpy(buf, shmseg, sizeof(struct shmid_ds)); - if (bufsz) - *bufsz = sizeof(struct shmid_ds); - if (cmd == SHM_STAT) - td->td_retval[0] = IXSEQ_TO_IPCID(shmid, shmseg->shm_perm); - break; - case IPC_SET: { - struct shmid_ds *shmid; - - shmid = (struct shmid_ds *)buf; - error = ipcperm(td, &shmseg->shm_perm, IPC_M); - if (error) - goto done2; - shmseg->shm_perm.uid = shmid->shm_perm.uid; - shmseg->shm_perm.gid = shmid->shm_perm.gid; - shmseg->shm_perm.mode = - (shmseg->shm_perm.mode & ~ACCESSPERMS) | - (shmid->shm_perm.mode & ACCESSPERMS); - shmseg->shm_ctime = time (NULL); - break; - } - case IPC_RMID: - error = ipcperm(td, &shmseg->shm_perm, IPC_M); - if (error) - goto done2; - shmseg->shm_perm.key = IPC_PRIVATE; - shmseg->shm_perm.mode |= SHMSEG_REMOVED; - if (shmseg->shm_nattch <= 0) { - shm_deallocate_segment(shmseg); - shm_last_free = IPCID_TO_IX(shmid); - } - break; -#if 0 - case SHM_LOCK: - case SHM_UNLOCK: -#endif - default: - error = EINVAL; - break; - } -done2: - mtx_unlock(&Giant); - return (error); -} - -int -shmctl(struct thread *td, struct shmctl_args *uap) -{ - int error = 0; - struct shmid_ds buf; - size_t bufsz; - - /* IPC_SET needs to copyin the buffer before calling kern_shmctl */ - if (uap->cmd == IPC_SET) { - if ((error = copyin(uap->buf, &buf, sizeof(struct shmid_ds)))) - goto done; - } -#ifdef __CYGWIN__ - if (uap->cmd == IPC_INFO && uap->shmid > 0) { - /* Can't use the default kern_shmctl interface. */ - int shmid = uap->shmid; - if (shmid > shminfo.shmmni) - shmid = shminfo.shmmni; - error = copyout(shmsegs, uap->buf, - shmid * sizeof(struct shmid_ds)); - td->td_retval[0] = error ? -1 : 0; - return (error); - } -#endif /* __CYGWIN__ */ - - error = kern_shmctl(td, uap->shmid, uap->cmd, (void *)&buf, &bufsz); - if (error) - goto done; - - /* Cases in which we need to copyout */ - switch (uap->cmd) { - case IPC_INFO: - case SHM_INFO: - case SHM_STAT: - case IPC_STAT: - error = copyout(&buf, uap->buf, bufsz); - break; - } - -done: - if (error) { - /* Invalidate the return value */ - td->td_retval[0] = -1; - } - return (error); -} - - -#ifndef _SYS_SYSPROTO_H_ -struct shmget_args { - key_t key; - size_t size; - int shmflg; -}; -#endif - -static int -shmget_existing(struct thread *td, struct shmget_args *uap, int mode, int segnum) -{ - struct shmid_ds *shmseg; - int error; - - shmseg = &shmsegs[segnum]; - if (shmseg->shm_perm.mode & SHMSEG_REMOVED) { - /* - * This segment is in the process of being allocated. Wait - * until it's done, and look the key up again (in case the - * allocation failed or it was freed). - */ - shmseg->shm_perm.mode |= SHMSEG_WANTED; - error = tsleep(shmseg, PLOCK | PCATCH, "shmget", 0); - if (error) - return (error); - return (EAGAIN); - } - if ((uap->shmflg & (IPC_CREAT | IPC_EXCL)) == (IPC_CREAT | IPC_EXCL)) - return (EEXIST); - error = ipcperm(td, &shmseg->shm_perm, mode); - if (error) - return (error); - if (uap->size && uap->size > shmseg->shm_segsz) - return (EINVAL); - td->td_retval[0] = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm); -#ifdef __CYGWIN__ - td->td_retval[1] = - vm_object_duplicate(td, shmseg->shm_internal->shm_object); -#endif /* __CYGWIN__ */ - return (0); -} - -static int -shmget_allocate_segment(struct thread *td, struct shmget_args *uap, int mode) -{ - int i, segnum, shmid, size; -#ifndef __CYGWIN__ - struct ucred *cred = td->td_ucred; -#endif /* __CYGWIN__ */ - struct shmid_ds *shmseg; - struct shm_handle *shm_handle; - - GIANT_REQUIRED; - - if (uap->size < (unsigned long) shminfo.shmmin || - uap->size > (unsigned long) shminfo.shmmax) - return (EINVAL); - if (shm_nused >= shminfo.shmmni) /* Any shmids left? */ - return (ENOSPC); - size = round_page(uap->size); - if (shm_committed + btoc(size) > shminfo.shmall) - return (ENOMEM); - if (shm_last_free < 0) { - shmrealloc(); /* Maybe expand the shmsegs[] array. */ - for (i = 0; i < shmalloced; i++) - if (shmsegs[i].shm_perm.mode & SHMSEG_FREE) - break; - if (i == shmalloced) - return (ENOSPC); - segnum = i; - } else { - segnum = shm_last_free; - shm_last_free = -1; - } - shmseg = &shmsegs[segnum]; - /* - * In case we sleep in malloc(), mark the segment present but deleted - * so that noone else tries to create the same key. - */ - shmseg->shm_perm.mode = SHMSEG_ALLOCATED | SHMSEG_REMOVED; - shmseg->shm_perm.key = uap->key; - shmseg->shm_perm.seq = (shmseg->shm_perm.seq + 1) & 0x7fff; - shm_handle = (struct shm_handle *) - sys_malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK); - shmid = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm); - - /* - * We make sure that we have allocated a pager before we need - * to. - */ - if (shm_use_phys) { - shm_handle->shm_object = - vm_pager_allocate(OBJT_PHYS, 0, size, VM_PROT_DEFAULT, 0); - } else { - shm_handle->shm_object = - vm_pager_allocate(OBJT_SWAP, 0, size, VM_PROT_DEFAULT, 0); - } - VM_OBJECT_LOCK(shm_handle->shm_object); - vm_object_clear_flag(shm_handle->shm_object, OBJ_ONEMAPPING); - vm_object_set_flag(shm_handle->shm_object, OBJ_NOSPLIT); - VM_OBJECT_UNLOCK(shm_handle->shm_object); - - shmseg->shm_internal = shm_handle; -#ifdef __CYGWIN__ - shmseg->shm_perm.cuid = shmseg->shm_perm.uid = td->ipcblk->uid; - shmseg->shm_perm.cgid = shmseg->shm_perm.gid = td->ipcblk->gid; -#else - shmseg->shm_perm.cuid = shmseg->shm_perm.uid = cred->cr_uid; - shmseg->shm_perm.cgid = shmseg->shm_perm.gid = cred->cr_gid; -#endif /* __CYGWIN__ */ - shmseg->shm_perm.mode = (shmseg->shm_perm.mode & SHMSEG_WANTED) | - (mode & ACCESSPERMS) | SHMSEG_ALLOCATED; - shmseg->shm_segsz = uap->size; - shmseg->shm_cpid = td->td_proc->p_pid; - shmseg->shm_lpid = shmseg->shm_nattch = 0; - shmseg->shm_atime = shmseg->shm_dtime = 0; - shmseg->shm_ctime = time (NULL); - shm_committed += btoc(size); - shm_nused++; - if (shmseg->shm_perm.mode & SHMSEG_WANTED) { - /* - * Somebody else wanted this key while we were asleep. Wake - * them up now. - */ - shmseg->shm_perm.mode &= ~SHMSEG_WANTED; - wakeup(shmseg); - } - td->td_retval[0] = shmid; -#ifdef __CYGWIN__ - td->td_retval[1] = - vm_object_duplicate(td, shmseg->shm_internal->shm_object); -#endif /* __CYGWIN__ */ - return (0); -} - -/* - * MPSAFE - */ -int -shmget(struct thread *td, struct shmget_args *uap) -{ - int segnum, mode; - int error; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - mtx_lock(&Giant); - mode = uap->shmflg & ACCESSPERMS; - if (uap->key != IPC_PRIVATE) { - again: -#ifdef __CYGWIN__ - if (uap->shmflg & IPC_KEY_IS_SHMID) - segnum = shm_find_segment_by_shmid ((int) uap->key) ? - IPCID_TO_IX((int) uap->key) : -1; - else -#endif - segnum = shm_find_segment_by_key(uap->key); - if (segnum >= 0) { - error = shmget_existing(td, uap, mode, segnum); - if (error == EAGAIN) - goto again; - goto done2; - } - if ((uap->shmflg & IPC_CREAT) == 0) { - error = ENOENT; - goto done2; - } - } - error = shmget_allocate_segment(td, uap, mode); -done2: -#ifdef __CYGWIN__ - if (!error) - ipcexit_creat_hookthread (td); - else - td->td_retval[0] = -1; -#endif - mtx_unlock(&Giant); - return (error); -} - -#ifndef __CYGWIN__ -/* - * MPSAFE - */ -int -shmsys(td, uap) - struct thread *td; - /* XXX actually varargs. */ - struct shmsys_args /* { - int which; - int a2; - int a3; - int a4; - } */ *uap; -{ - int error; - - if (!jail_sysvipc_allowed && jailed(td->td_ucred)) - return (ENOSYS); - if (uap->which < 0 || - uap->which >= sizeof(shmcalls)/sizeof(shmcalls[0])) - return (EINVAL); - mtx_lock(&Giant); - error = (*shmcalls[uap->which])(td, &uap->a2); - mtx_unlock(&Giant); - return (error); -} -#endif /* __CYGWIN__ */ - -static void -shmfork_myhook(struct proc *p1, struct proc *p2) -{ - struct shmmap_state *shmmap_s; - size_t size; - int i; - - size = shminfo.shmseg * sizeof(struct shmmap_state); - shmmap_s = (struct shmmap_state *) sys_malloc(size, M_SHM, M_WAITOK); - bcopy(p1->p_vmspace->vm_shm, shmmap_s, size); - p2->p_vmspace->vm_shm = shmmap_s; - for (i = 0; i < shminfo.shmseg; i++, shmmap_s++) - if (shmmap_s->shmid != -1) { - shm_nattch++; - shmsegs[IPCID_TO_IX(shmmap_s->shmid)].shm_nattch++; - } -} - -#ifdef __CYGWIN__ -int cygwin_shmfork_myhook (struct thread *td, struct proc *parent) -{ - ipcexit_creat_hookthread (td); - ipc_p_vmspace (td->ipcblk); - ipc_p_vmspace (parent); - shmfork_myhook (parent, td->ipcblk); - return 0; -} -#endif - -void -shmexit_myhook(struct vmspace *vm) -{ - struct shmmap_state *base, *shm; - int i; - - GIANT_REQUIRED; - - if ((base = vm->vm_shm) != NULL) { - vm->vm_shm = NULL; - for (i = 0, shm = base; i < shminfo.shmseg; i++, shm++) { - if (shm->shmid != -1) - shm_delete_mapping(vm, shm); - } - sys_free(base, M_SHM); - } -} - -static void -shmrealloc(void) -{ - int i; - struct shmid_ds *newsegs; - - if (shmalloced >= shminfo.shmmni) - return; - - newsegs = (struct shmid_ds *) sys_malloc(shminfo.shmmni * sizeof(*newsegs), M_SHM, M_WAITOK); - if (newsegs == NULL) - return; - for (i = 0; i < shmalloced; i++) - bcopy(&shmsegs[i], &newsegs[i], sizeof(newsegs[0])); - for (; i < shminfo.shmmni; i++) { - shmsegs[i].shm_perm.mode = SHMSEG_FREE; - shmsegs[i].shm_perm.seq = 0; - } - sys_free(shmsegs, M_SHM); - shmsegs = newsegs; - shmalloced = shminfo.shmmni; -} - -void -shminit(void) -{ - int i; - tun_bool_t shm_ar; - - TUNABLE_INT_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall); - for (i = PAGE_SIZE; i > 0; i--) { - shminfo.shmmax = shminfo.shmall * i; - if (shminfo.shmmax >= shminfo.shmall) - break; - } - TUNABLE_INT_FETCH("kern.ipc.shmmin", &shminfo.shmmin); - TUNABLE_INT_FETCH("kern.ipc.shmmni", &shminfo.shmmni); - TUNABLE_INT_FETCH("kern.ipc.shmseg", &shminfo.shmseg); - TUNABLE_BOOL_FETCH("kern.ipc.shm_allow_removed", &shm_ar); - if (shm_ar == TUN_TRUE) - shm_allow_removed = 1; - shmalloced = shminfo.shmmni; - shmsegs = (struct shmid_ds *) sys_malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK); - if (shmsegs == NULL) - panic("cannot allocate initial memory for sysvshm"); - for (i = 0; i < shmalloced; i++) { - shmsegs[i].shm_perm.mode = SHMSEG_FREE; - shmsegs[i].shm_perm.seq = 0; - } - shm_last_free = 0; - shm_nused = 0; - shm_committed = 0; -#ifndef __CYGWIN__ - shmexit_hook = &shmexit_myhook; - shmfork_hook = &shmfork_myhook; -#endif /* __CYGWIN__ */ -} - -int -shmunload(void) -{ - - if (shm_nused > 0) - return (EBUSY); - - sys_free(shmsegs, M_SHM); -#ifndef __CYGWIN__ - shmexit_hook = NULL; - shmfork_hook = NULL; -#endif /* __CYGWIN__ */ - return (0); -} - -#ifndef __CYGWIN__ -static int -sysctl_shmsegs(SYSCTL_HANDLER_ARGS) -{ - - return (SYSCTL_OUT(req, shmsegs, shmalloced * sizeof(shmsegs[0]))); -} - -static int -sysvshm_modload(struct module *module, int cmd, void *arg) -{ - int error = 0; - - switch (cmd) { - case MOD_LOAD: - shminit(); - break; - case MOD_UNLOAD: - error = shmunload(); - break; - case MOD_SHUTDOWN: - break; - default: - error = EINVAL; - break; - } - return (error); -} - -static moduledata_t sysvshm_mod = { - "sysvshm", - &sysvshm_modload, - NULL -}; - -SYSCALL_MODULE_HELPER(shmsys); -SYSCALL_MODULE_HELPER(shmat); -SYSCALL_MODULE_HELPER(shmctl); -SYSCALL_MODULE_HELPER(shmdt); -SYSCALL_MODULE_HELPER(shmget); - -DECLARE_MODULE(sysvshm, sysvshm_mod, - SI_SUB_SYSV_SHM, SI_ORDER_FIRST); -MODULE_VERSION(sysvshm, 1); -#endif /* __CYGWIN__ */ -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/threaded_queue.cc b/winsup/cygserver/threaded_queue.cc deleted file mode 100644 index 53dd6fa11..000000000 --- a/winsup/cygserver/threaded_queue.cc +++ /dev/null @@ -1,410 +0,0 @@ -/* threaded_queue.cc - - Copyright 2001, 2002, 2003 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" - -#include <assert.h> -#include <errno.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <stdlib.h> -#include "threaded_queue.h" - -/*****************************************************************************/ - -/* queue_request */ - -queue_request::~queue_request () -{} - -/*****************************************************************************/ - -/* threaded_queue */ - -threaded_queue::threaded_queue (const size_t initial_workers) - : _workers_count (0), - _running (false), - _submitters_head (NULL), - _requests_count (0), - _requests_head (NULL), - _requests_sem (NULL) -{ - InitializeCriticalSection (&_queue_lock); - - // This semaphore's count is the number of requests on the queue. - // The maximum count (129792) is calculated as MAXIMUM_WAIT_OBJECTS - // multiplied by max. threads per process (2028?), which is (a few) - // more requests than could ever be pending with the current design. - - _requests_sem = CreateSemaphore (NULL, // SECURITY_ATTRIBUTES - 0, // Initial count - 129792, // Maximum count - NULL); // Anonymous - - if (!_requests_sem) - { - system_printf (("failed to create the request queue semaphore, " - "error = %lu"), - GetLastError ()); - abort (); - } - - create_workers (initial_workers); -} - -threaded_queue::~threaded_queue () -{ - if (_running) - stop (); - - debug_printf ("deleting all pending queue requests"); - queue_request *reqptr = _requests_head; - while (reqptr) - { - queue_request *const ptr = reqptr; - reqptr = reqptr->_next; - delete ptr; - } - - DeleteCriticalSection (&_queue_lock); - if (_requests_sem) - (void) CloseHandle (_requests_sem); -} - -/* FIXME: return success or failure rather than quitting */ -void -threaded_queue::add_submission_loop (queue_submission_loop *const submitter) -{ - assert (this); - assert (submitter); - assert (submitter->_queue == this); - assert (!submitter->_next); - - submitter->_next = - TInterlockedExchangePointer (&_submitters_head, submitter); - - if (_running) - submitter->start (); -} - -bool -threaded_queue::start () -{ - EnterCriticalSection (&_queue_lock); - const bool was_running = _running; - _running = true; - queue_submission_loop *loopptr = _submitters_head; - LeaveCriticalSection (&_queue_lock); - - if (!was_running) - { - debug_printf ("starting all queue submission loops"); - - while (loopptr) - { - queue_submission_loop *const ptr = loopptr; - loopptr = loopptr->_next; - ptr->start (); - } - } - - return was_running; -} - -bool -threaded_queue::stop () -{ - EnterCriticalSection (&_queue_lock); - const bool was_running = _running; - _running = false; - queue_submission_loop *loopptr = _submitters_head; - LeaveCriticalSection (&_queue_lock); - - if (was_running) - { - debug_printf ("stopping all queue submission loops"); - while (loopptr) - { - queue_submission_loop *const ptr = loopptr; - loopptr = loopptr->_next; - ptr->stop (); - } - - ReleaseSemaphore (_requests_sem, _workers_count, NULL); - while (_workers_count) - { - debug_printf (("waiting for worker threads to terminate: " - "%lu still running"), - _workers_count); - Sleep (1000); - } - debug_printf ("all worker threads have terminated"); - } - - return was_running; -} - -/* FIXME: return success or failure */ -void -threaded_queue::add (queue_request *const therequest) -{ - assert (this); - assert (therequest); - assert (!therequest->_next); - - if (!_workers_count) - { - system_printf ("warning: no worker threads to handle request!"); - // FIXME: And then what? - } - - EnterCriticalSection (&_queue_lock); - if (!_requests_head) - _requests_head = therequest; - else - { - /* Add to the queue end. */ - queue_request *reqptr = _requests_head; - for (; reqptr->_next; reqptr = reqptr->_next) - {} - assert (reqptr); - assert (!reqptr->_next); - reqptr->_next = therequest; - } - - _requests_count += 1; - assert (_requests_count > 0); - LeaveCriticalSection (&_queue_lock); - - (void) ReleaseSemaphore (_requests_sem, 1, NULL); -} - -/*static*/ DWORD WINAPI -threaded_queue::start_routine (const LPVOID lpParam) -{ - class threaded_queue *const queue = (class threaded_queue *) lpParam; - assert (queue); - - queue->worker_loop (); - - const long count = InterlockedDecrement (&queue->_workers_count); - assert (count >= 0); - - if (queue->_running) - debug_printf ("worker loop has exited; thread about to terminate"); - - return 0; -} - -/* Called from the constructor: so no need to be thread-safe until the - * worker threads start to be created; thus the interlocked increment - * of the `_workers_count' field. - */ - -void -threaded_queue::create_workers (const size_t initial_workers) -{ - assert (initial_workers > 0); - - for (unsigned int i = 0; i != initial_workers; i++) - { - const long count = InterlockedIncrement (&_workers_count); - assert (count > 0); - - DWORD tid; - const HANDLE hThread = - CreateThread (NULL, 0, start_routine, this, 0, &tid); - - if (!hThread) - { - system_printf ("failed to create thread, error = %lu", - GetLastError ()); - abort (); - } - - (void) CloseHandle (hThread); - } -} - -void -threaded_queue::worker_loop () -{ - while (true) - { - const DWORD rc = WaitForSingleObject (_requests_sem, INFINITE); - if (rc == WAIT_FAILED) - { - system_printf ("wait for request semaphore failed, error = %lu", - GetLastError ()); - return; - } - assert (rc == WAIT_OBJECT_0); - - EnterCriticalSection (&_queue_lock); - if (!_running) - { - LeaveCriticalSection (&_queue_lock); - return; - } - - assert (_requests_head); - queue_request *const reqptr = _requests_head; - _requests_head = reqptr->_next; - - _requests_count -= 1; - assert (_requests_count >= 0); - LeaveCriticalSection (&_queue_lock); - - assert (reqptr); - reqptr->process (); - delete reqptr; - } -} - -/*****************************************************************************/ - -/* queue_submission_loop */ - -queue_submission_loop::queue_submission_loop (threaded_queue *const queue, - const bool ninterruptible) - : _running (false), - _interrupt_event (NULL), - _queue (queue), - _interruptible (ninterruptible), - _hThread (NULL), - _tid (0), - _next (NULL) -{ - if (_interruptible) - { - // verbose: debug_printf ("creating an interruptible processing thread"); - - _interrupt_event = CreateEvent (NULL, // SECURITY_ATTRIBUTES - FALSE, // Auto-reset - FALSE, // Initially non-signalled - NULL); // Anonymous - - if (!_interrupt_event) - { - system_printf ("failed to create interrupt event, error = %lu", - GetLastError ()); - abort (); - } - } -} - -queue_submission_loop::~queue_submission_loop () -{ - if (_running) - stop (); - if (_interrupt_event) - (void) CloseHandle (_interrupt_event); - if (_hThread) - (void) CloseHandle (_hThread); -} - -bool -queue_submission_loop::start () -{ - assert (this); - assert (!_hThread); - - const bool was_running = _running; - - if (!was_running) - { - _running = true; - - _hThread = CreateThread (NULL, 0, start_routine, this, 0, &_tid); - if (!_hThread) - { - system_printf ("failed to create thread, error = %lu", - GetLastError ()); - abort (); - } - } - - return was_running; -} - -bool -queue_submission_loop::stop () -{ - assert (this); - assert (_hThread && _hThread != INVALID_HANDLE_VALUE); - - const bool was_running = _running; - - if (_running) - { - _running = false; - - if (_interruptible) - { - assert (_interrupt_event - && _interrupt_event != INVALID_HANDLE_VALUE); - - SetEvent (_interrupt_event); - - if (WaitForSingleObject (_hThread, 1000) == WAIT_TIMEOUT) - { - system_printf (("request loop thread %lu failed to shutdown " - "when asked politely: about to get heavy"), - _tid); - - if (!TerminateThread (_hThread, 0)) - { - system_printf (("failed to kill request loop thread %lu" - ", error = %lu"), - _tid, GetLastError ()); - abort (); - } - } - } - else - { - // FIXME: could wait to see if the request loop notices that - // the submission loop is no longer running and shuts down - // voluntarily. - - debug_printf ("killing request loop thread %lu", _tid); - - if (!TerminateThread (_hThread, 0)) - system_printf (("failed to kill request loop thread %lu" - ", error = %lu"), - _tid, GetLastError ()); - } - } - - return was_running; -} - -/*static*/ DWORD WINAPI -queue_submission_loop::start_routine (const LPVOID lpParam) -{ - class queue_submission_loop *const submission_loop = - (class queue_submission_loop *) lpParam; - assert (submission_loop); - - submission_loop->request_loop (); - - debug_printf ("submission loop has exited; thread about to terminate"); - - submission_loop->stop (); - - return 0; -} - -/*****************************************************************************/ -#endif /* __OUTSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/threaded_queue.h b/winsup/cygserver/threaded_queue.h deleted file mode 100644 index 0c3f9913a..000000000 --- a/winsup/cygserver/threaded_queue.h +++ /dev/null @@ -1,127 +0,0 @@ -/* threaded_queue.h - - Copyright 2001, 2002, 2003 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _THREADED_QUEUE_ -#define _THREADED_QUEUE_ - -/*****************************************************************************/ - -/* a specific request */ - -class queue_request -{ -public: - queue_request *_next; - - queue_request () : _next (NULL) {} - virtual ~queue_request (); - - virtual void process () = 0; -}; - -/*****************************************************************************/ - -/* a queue to allocate requests from n submission loops to x worker threads */ - -class queue_submission_loop; - -class threaded_queue -{ -public: - threaded_queue (size_t initial_workers = 1); - ~threaded_queue (); - - void add_submission_loop (queue_submission_loop *); - - bool running () const { return _running; } - - bool start (); - bool stop (); - - void add (queue_request *); - -private: - long _workers_count; - bool _running; - - queue_submission_loop *_submitters_head; - - long _requests_count; // Informational only. - queue_request *_requests_head; - - CRITICAL_SECTION _queue_lock; - HANDLE _requests_sem; // == _requests_count - - static DWORD WINAPI start_routine (LPVOID /* this */); - - void create_workers (size_t initial_workers); - void worker_loop (); -}; - -/*****************************************************************************/ - -/* parameters for a request finding and submitting loop */ - -class queue_submission_loop -{ - friend class threaded_queue; - -public: - queue_submission_loop (threaded_queue *, bool ninterruptible); - virtual ~queue_submission_loop (); - - bool start (); - bool stop (); - - threaded_queue *queue () { return _queue; }; - -protected: - bool _running; - HANDLE _interrupt_event; - threaded_queue *const _queue; - -private: - bool _interruptible; - HANDLE _hThread; - DWORD _tid; - queue_submission_loop *_next; - - static DWORD WINAPI start_routine (LPVOID /* this */); - virtual void request_loop () = 0; -}; - -#ifdef __cplusplus - -/*---------------------------------------------------------------------------* - * Some type-safe versions of the various interlocked functions. - *---------------------------------------------------------------------------*/ - -template <typename T> T * -TInterlockedExchangePointer (T **lvalue, T *rvalue) -{ - return reinterpret_cast<T *> - (InterlockedExchangePointer (reinterpret_cast<void **> (lvalue), - reinterpret_cast<void *> (rvalue))); -} - -template <typename T> T * -TInterlockedCompareExchangePointer (T **lvalue, T *rvalue1, T *rvalue2) -{ - return reinterpret_cast<T *> - (InterlockedCompareExchangePointer (reinterpret_cast<void **> (lvalue), - reinterpret_cast<void *> (rvalue1), - reinterpret_cast<void *> (rvalue2))); -} - -#endif /* __cplusplus */ - -#endif /* _THREADED_QUEUE_ */ diff --git a/winsup/cygserver/transport.cc b/winsup/cygserver/transport.cc deleted file mode 100644 index ff9ce8d80..000000000 --- a/winsup/cygserver/transport.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* transport.cc - - Copyright 2001, 2002, 2003, 2004, 2007 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* to allow this to link into cygwin and the .dll, a little magic is needed. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#else -#include "winsup.h" -#endif - -#include <sys/socket.h> - -#include "transport.h" -#include "transport_pipes.h" - -/* The factory */ -transport_layer_base * -create_server_transport () -{ - return new transport_layer_pipes; -} - -#ifndef __INSIDE_CYGWIN__ - -bool -transport_layer_base::impersonate_client () -{ - return true; -} - -bool -transport_layer_base::revert_to_self () -{ - return true; -} - -#endif /* !__INSIDE_CYGWIN__ */ - -transport_layer_base::~transport_layer_base () -{} diff --git a/winsup/cygserver/transport.h b/winsup/cygserver/transport.h deleted file mode 100644 index 80f50fd06..000000000 --- a/winsup/cygserver/transport.h +++ /dev/null @@ -1,39 +0,0 @@ -/* transport.h - - Copyright 2001, 2002, 2003, 2004 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _TRANSPORT_H -#define _TRANSPORT_H - -class transport_layer_base *create_server_transport (); - -class transport_layer_base -{ -public: -#ifndef __INSIDE_CYGWIN__ - virtual int listen () = 0; - virtual class transport_layer_base *accept (bool *recoverable) = 0; -#endif - - virtual void close () = 0; - virtual ssize_t read (void *buf, size_t len) = 0; - virtual ssize_t write (void *buf, size_t len) = 0; - virtual int connect () = 0; - -#ifndef __INSIDE_CYGWIN__ - virtual bool impersonate_client (); - virtual bool revert_to_self (); -#endif - - virtual ~transport_layer_base (); -}; - -#endif /* _TRANSPORT_H */ diff --git a/winsup/cygserver/transport_pipes.cc b/winsup/cygserver/transport_pipes.cc deleted file mode 100644 index 9fdf75899..000000000 --- a/winsup/cygserver/transport_pipes.cc +++ /dev/null @@ -1,355 +0,0 @@ -/* transport_pipes.cc - - Copyright 2001, 2002, 2003, 2004 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* to allow this to link into cygwin and the .dll, a little magic is needed. */ -#ifdef __OUTSIDE_CYGWIN__ -#include "woutsup.h" -#else -#include "winsup.h" -#endif - -#include <sys/types.h> - -#include <assert.h> -#include <netdb.h> -#include <pthread.h> -#include <unistd.h> - -#include "cygerrno.h" -#include "transport.h" -#include "transport_pipes.h" - -#ifndef __INSIDE_CYGWIN__ -#include "cygserver.h" -#include "cygserver_ipc.h" -#else -#include "security.h" -#endif - -#ifdef __INSIDE_CYGWIN__ -#define SET_ERRNO(err) set_errno (err) -#else -#define SET_ERRNO(err) errno = (err) -#endif - -enum - { - MAX_WAIT_NAMED_PIPE_RETRY = 64, - WAIT_NAMED_PIPE_TIMEOUT = 10 // milliseconds - }; - -#ifndef __INSIDE_CYGWIN__ - -static pthread_once_t pipe_instance_lock_once = PTHREAD_ONCE_INIT; -static CRITICAL_SECTION pipe_instance_lock; -static long pipe_instance = 0; - -static void -initialise_pipe_instance_lock () -{ - assert (pipe_instance == 0); - InitializeCriticalSection (&pipe_instance_lock); -} - -#endif /* !__INSIDE_CYGWIN__ */ - -#ifndef __INSIDE_CYGWIN__ - -transport_layer_pipes::transport_layer_pipes (const HANDLE hPipe) - : _pipe_name (""), - _hPipe (hPipe), - _is_accepted_endpoint (true), - _is_listening_endpoint (false) -{ - assert (_hPipe); - assert (_hPipe != INVALID_HANDLE_VALUE); - -} - -#endif /* !__INSIDE_CYGWIN__ */ - -transport_layer_pipes::transport_layer_pipes () - : _pipe_name ("\\\\.\\pipe\\cygwin_lpc"), - _hPipe (NULL), - _is_accepted_endpoint (false), - _is_listening_endpoint (false) -{ -} - -transport_layer_pipes::~transport_layer_pipes () -{ - close (); -} - -#ifndef __INSIDE_CYGWIN__ - -int -transport_layer_pipes::listen () -{ - assert (!_hPipe); - assert (!_is_accepted_endpoint); - assert (!_is_listening_endpoint); - - _is_listening_endpoint = true; - - /* no-op */ - return 0; -} - -class transport_layer_pipes * -transport_layer_pipes::accept (bool *const recoverable) -{ - assert (!_hPipe); - assert (!_is_accepted_endpoint); - assert (_is_listening_endpoint); - - pthread_once (&pipe_instance_lock_once, &initialise_pipe_instance_lock); - - EnterCriticalSection (&pipe_instance_lock); - - // Read: http://www.securityinternals.com/research/papers/namedpipe.php - // See also the Microsoft security bulletins MS00-053 and MS01-031. - - // FIXME: Remove FILE_CREATE_PIPE_INSTANCE. - - const bool first_instance = (pipe_instance == 0); - - const HANDLE accept_pipe = - CreateNamedPipe (_pipe_name, - (PIPE_ACCESS_DUPLEX - | (first_instance ? FILE_FLAG_FIRST_PIPE_INSTANCE : 0)), - (PIPE_TYPE_BYTE | PIPE_WAIT), - PIPE_UNLIMITED_INSTANCES, - 0, 0, 1000, - &sec_all_nih); - - const bool duplicate = (accept_pipe == INVALID_HANDLE_VALUE - && pipe_instance == 0 - && GetLastError () == ERROR_ACCESS_DENIED); - - if (accept_pipe != INVALID_HANDLE_VALUE) - InterlockedIncrement (&pipe_instance); - - LeaveCriticalSection (&pipe_instance_lock); - - if (duplicate) - { - *recoverable = false; - system_printf ("failed to create named pipe: " - "is the daemon already running?"); - return NULL; - } - - if (accept_pipe == INVALID_HANDLE_VALUE) - { - debug_printf ("error creating pipe (%lu).", GetLastError ()); - *recoverable = true; // FIXME: case analysis? - return NULL; - } - - assert (accept_pipe); - - if (!ConnectNamedPipe (accept_pipe, NULL) - && GetLastError () != ERROR_PIPE_CONNECTED) - { - debug_printf ("error connecting to pipe (%lu)", GetLastError ()); - (void) CloseHandle (accept_pipe); - *recoverable = true; // FIXME: case analysis? - return NULL; - } - - return new transport_layer_pipes (accept_pipe); -} - -#endif /* !__INSIDE_CYGWIN__ */ - -void -transport_layer_pipes::close () -{ - // verbose: debug_printf ("closing pipe %p", _hPipe); - - if (_hPipe) - { - assert (_hPipe != INVALID_HANDLE_VALUE); - -#ifndef __INSIDE_CYGWIN__ - - if (_is_accepted_endpoint) - { - (void) FlushFileBuffers (_hPipe); // Blocks until client reads. - (void) DisconnectNamedPipe (_hPipe); - EnterCriticalSection (&pipe_instance_lock); - (void) CloseHandle (_hPipe); - assert (pipe_instance > 0); - InterlockedDecrement (&pipe_instance); - LeaveCriticalSection (&pipe_instance_lock); - } - else - (void) CloseHandle (_hPipe); - -#else /* __INSIDE_CYGWIN__ */ - - assert (!_is_accepted_endpoint); - (void) ForceCloseHandle (_hPipe); - -#endif /* __INSIDE_CYGWIN__ */ - - _hPipe = NULL; - } -} - -ssize_t -transport_layer_pipes::read (void *const buf, const size_t len) -{ - // verbose: debug_printf ("reading from pipe %p", _hPipe); - - assert (_hPipe); - assert (_hPipe != INVALID_HANDLE_VALUE); - assert (!_is_listening_endpoint); - - DWORD count; - if (!ReadFile (_hPipe, buf, len, &count, NULL)) - { - debug_printf ("error reading from pipe (%lu)", GetLastError ()); - SET_ERRNO (EINVAL); // FIXME? - return -1; - } - - return count; -} - -ssize_t -transport_layer_pipes::write (void *const buf, const size_t len) -{ - // verbose: debug_printf ("writing to pipe %p", _hPipe); - - assert (_hPipe); - assert (_hPipe != INVALID_HANDLE_VALUE); - assert (!_is_listening_endpoint); - - DWORD count; - if (!WriteFile (_hPipe, buf, len, &count, NULL)) - { - debug_printf ("error writing to pipe, error = %lu", GetLastError ()); - SET_ERRNO (EINVAL); // FIXME? - return -1; - } - - return count; -} - -/* - * This routine holds a static variable, assume_cygserver, that is set - * if the transport has good reason to think that cygserver is - * running, i.e. if if successfully connected to it with the previous - * attempt. If this is set, the code tries a lot harder to get a - * connection, making the assumption that any failures are just - * congestion and overloading problems. - */ - -int -transport_layer_pipes::connect () -{ - assert (!_hPipe); - assert (!_is_accepted_endpoint); - assert (!_is_listening_endpoint); - - static bool assume_cygserver = false; - - BOOL rc = TRUE; - int retries = 0; - - while (rc) - { - _hPipe = CreateFile (_pipe_name, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_all_nih, - OPEN_EXISTING, - SECURITY_IMPERSONATION, - NULL); - - if (_hPipe != INVALID_HANDLE_VALUE) - { - assert (_hPipe); -#ifdef __INSIDE_CYGWIN__ - ProtectHandle (_hPipe); -#endif - assume_cygserver = true; - return 0; - } - - _hPipe = NULL; - - if (!assume_cygserver && GetLastError () != ERROR_PIPE_BUSY) - { - debug_printf ("Error opening the pipe (%lu)", GetLastError ()); - return -1; - } - - /* Note: `If no instances of the specified named pipe exist, the - * WaitNamedPipe function returns immediately, regardless of the - * time-out value.' Thus the explicit Sleep if the call fails - * with ERROR_FILE_NOT_FOUND. - */ - while (retries != MAX_WAIT_NAMED_PIPE_RETRY - && !(rc = WaitNamedPipe (_pipe_name, WAIT_NAMED_PIPE_TIMEOUT))) - { - if (GetLastError () == ERROR_FILE_NOT_FOUND) - Sleep (0); // Give the server a chance. - - retries += 1; - } - } - - assert (retries == MAX_WAIT_NAMED_PIPE_RETRY); - - system_printf ("lost connection to cygserver, error = %lu", - GetLastError ()); - - assume_cygserver = false; - - return -1; -} - -#ifndef __INSIDE_CYGWIN__ - -bool -transport_layer_pipes::impersonate_client () -{ - assert (_hPipe); - assert (_hPipe != INVALID_HANDLE_VALUE); - assert (_is_accepted_endpoint); - - if (_hPipe && !ImpersonateNamedPipeClient (_hPipe)) - { - debug_printf ("Failed to Impersonate client, (%lu)", GetLastError ()); - return false; - } - - return true; -} - -bool -transport_layer_pipes::revert_to_self () -{ - assert (_is_accepted_endpoint); - - if (!RevertToSelf ()) - { - debug_printf ("Failed to RevertToSelf, (%lu)", GetLastError ()); - return false; - } - return true; -} - -#endif /* !__INSIDE_CYGWIN__ */ diff --git a/winsup/cygserver/transport_pipes.h b/winsup/cygserver/transport_pipes.h deleted file mode 100644 index 7265a88f8..000000000 --- a/winsup/cygserver/transport_pipes.h +++ /dev/null @@ -1,47 +0,0 @@ -/* transport_pipes.h - - Copyright 2001, 2002, 2003 Red Hat Inc. - - Written by Robert Collins <rbtcollins@hotmail.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _TRANSPORT_PIPES_H -#define _TRANSPORT_PIPES_H - -/* Named pipes based transport, for security on NT */ -class transport_layer_pipes : public transport_layer_base -{ -public: -#ifndef __INSIDE_CYGWIN__ - virtual int listen (); - virtual class transport_layer_pipes *accept (bool *recoverable); -#endif - - virtual void close (); - virtual ssize_t read (void *buf, size_t len); - virtual ssize_t write (void *buf, size_t len); - virtual int connect (); - -#ifndef __INSIDE_CYGWIN__ - virtual bool impersonate_client (); - virtual bool revert_to_self (); -#endif - - transport_layer_pipes (); - virtual ~transport_layer_pipes (); - -private: - const char *const _pipe_name; - HANDLE _hPipe; - const bool _is_accepted_endpoint; - bool _is_listening_endpoint; - - transport_layer_pipes (HANDLE hPipe); -}; - -#endif /* _TRANSPORT_PIPES_H */ diff --git a/winsup/cygserver/woutsup.h b/winsup/cygserver/woutsup.h deleted file mode 100644 index b262ae2a1..000000000 --- a/winsup/cygserver/woutsup.h +++ /dev/null @@ -1,71 +0,0 @@ -/* woutsup.h: for Cygwin code compiled outside the DLL (i.e. cygserver). - - Copyright 2002, 2003, 2007 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define _MT_SAFE 1 - -#ifdef __INSIDE_CYGWIN__ -#error "woutsup.h is not for code being compiled inside the dll" -#endif - -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#endif - -#if _WIN32_WINNT < 0x0500 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#endif - -#define WIN32_LEAN_AND_MEAN 1 -#define _WINGDI_H -#define _WINUSER_H -#define _WINNLS_H -#define _WINVER_H -#define _WINNETWK_H -#define _WINSVC_H -#include <windows.h> -#include <wincrypt.h> -#include <lmcons.h> -#undef _WINGDI_H -#undef _WINUSER_H -#undef _WINNLS_H -#undef _WINVER_H -#undef _WINNETWK_H -#undef _WINSVC_H - -#include "bsd_helper.h" -#include "bsd_log.h" -#include "bsd_mutex.h" - -/* The one function we use from winuser.h most of the time */ -extern "C" DWORD WINAPI GetLastError (void); - -extern int cygserver_running; - -#define SIGHANDLE(SIG) \ - do \ - { \ - struct sigaction act; \ - \ - act.sa_handler = &handle_signal; \ - act.sa_mask = 0; \ - act.sa_flags = 0; \ - \ - if (sigaction (SIG, &act, NULL) == -1) \ - { \ - panic ("failed to install handler for " #SIG ": %s", \ - strerror (errno)); \ - exit (1); \ - } \ - } while (false) - -#define debug_printf(f,...) debug((f),##__VA_ARGS__) -#define syscall_printf(f,...) log(LOG_ERR,(f),##__VA_ARGS__) -#define system_printf(f,...) log(LOG_ERR,(f),##__VA_ARGS__) |