Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-05-20 19:22:09 +0400
committerCorinna Vinschen <corinna@vinschen.de>2003-05-20 19:22:09 +0400
commitd4f3ce316cf6c5e3f1d7a6af1a2721f851be8879 (patch)
tree4c699da08e72c6dbb03a23f0dfd5fc11572574d4 /winsup/cygwin/fhandler_socket.cc
parent10bada05fa00ade32d000a5605dbe8fc88a98a1b (diff)
* 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.cc43
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 ();