diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-05-20 15:22:09 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-05-20 15:22:09 +0000 |
commit | d4f3ce316cf6c5e3f1d7a6af1a2721f851be8879 (patch) | |
tree | 4c699da08e72c6dbb03a23f0dfd5fc11572574d4 /winsup/cygwin/fhandler_socket.cc | |
parent | 10bada05fa00ade32d000a5605dbe8fc88a98a1b (diff) | |
download | cygnal-d4f3ce316cf6c5e3f1d7a6af1a2721f851be8879.tar.gz cygnal-d4f3ce316cf6c5e3f1d7a6af1a2721f851be8879.tar.bz2 cygnal-d4f3ce316cf6c5e3f1d7a6af1a2721f851be8879.zip |
* fhandler_socket.cc (SECRET_EVENT_NAME): Remove.
(ENTROPY_SOURCE_NAME): Ditto.
(secret_event_name): New static function. Create shared event name
with "Global\" prefix on systems supporting terminal services.
(fhandler_socket::set_connect_secret): Fix conditional.
(fhandler_socket::create_secret_event): Create secret event using
secret_event_name().
(fhandler_socket::close_secret_event): Ditto.
* shared.cc (shared_name): Create shared object name with "Global\"
prefix on systems supporting terminal services.
* wincap.cc: Set has_terminal_services capability throughout.
(wincap_2003): New global object representing Windows 2003 Server
capabilities.
(wincapc::init): Accomodate Windows 2003 Server.
* wincap.h (struct wincaps): Add has_terminal_services capability.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r-- | winsup/cygwin/fhandler_socket.cc | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index c53c3b56c..452299be0 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -34,8 +34,6 @@ #include "wsock_event.h" #include <unistd.h> -#define SECRET_EVENT_NAME "cygwin.local_socket.secret.%d.%08x-%08x-%08x-%08x" -#define ENTROPY_SOURCE_NAME "/dev/urandom" #define ENTROPY_SOURCE_DEV_UNIT 9 extern fhandler_socket *fdsock (int& fd, const char *name, SOCKET soc); @@ -45,6 +43,19 @@ int sscanf (const char *, const char *, ...); fhandler_dev_random* entropy_source; +static char * +secret_event_name (short port, int *secret_ptr) +{ + static NO_COPY char buf[MAX_PATH] = {0}; + + __small_sprintf (buf, "%scygwin.local_socket.secret.%d.%08x-%08x-%08x-%08x", + wincap.has_terminal_services () ? "Global\\" : "", + port, + secret_ptr [0], secret_ptr [1], + secret_ptr [2], secret_ptr [3]); + return buf; +} + /* cygwin internal: map sockaddr into internet domain address */ static int get_inet_addr (const struct sockaddr *in, int inlen, @@ -211,7 +222,7 @@ fhandler_socket::set_connect_secret () delete entropy_source; entropy_source = NULL; } - if (!entropy_source) + if (entropy_source) { size_t len = sizeof (connect_secret); entropy_source->read (connect_secret, len); @@ -231,8 +242,6 @@ fhandler_socket::get_connect_secret (char* buf) HANDLE fhandler_socket::create_secret_event (int* secret) { - char buf [128]; - int* secret_ptr = (secret ? : connect_secret); struct sockaddr_in sin; int sin_len = sizeof (sin); @@ -242,13 +251,12 @@ fhandler_socket::create_secret_event (int* secret) return NULL; } - __small_sprintf (buf, SECRET_EVENT_NAME, sin.sin_port, - secret_ptr [0], secret_ptr [1], - secret_ptr [2], secret_ptr [3]); + char *event_name = secret_event_name (sin.sin_port, + secret ?: connect_secret); LPSECURITY_ATTRIBUTES sec = get_inheritance (true); - secret_event = CreateEvent (sec, FALSE, FALSE, buf); + secret_event = CreateEvent (sec, FALSE, FALSE, event_name); if (!secret_event && GetLastError () == ERROR_ALREADY_EXISTS) - secret_event = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf); + secret_event = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name); if (!secret_event) /* nothing to do */; @@ -283,18 +291,13 @@ fhandler_socket::close_secret_event () int fhandler_socket::check_peer_secret_event (struct sockaddr_in* peer, int* secret) { - char buf [128]; - HANDLE ev; - int* secret_ptr = (secret ? : connect_secret); - - __small_sprintf (buf, SECRET_EVENT_NAME, peer->sin_port, - secret_ptr [0], secret_ptr [1], - secret_ptr [2], secret_ptr [3]); - ev = CreateEvent (&sec_all_nih, FALSE, FALSE, buf); + char *event_name = secret_event_name (peer->sin_port, + secret ?: connect_secret); + HANDLE ev = CreateEvent (&sec_all_nih, FALSE, FALSE, event_name); if (!ev && GetLastError () == ERROR_ALREADY_EXISTS) { - debug_printf ("event \"%s\" already exists", buf); - ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf); + debug_printf ("event \"%s\" already exists", event_name); + ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name); } signal_secret_event (); |