summaryrefslogtreecommitdiff
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc53
1 files changed, 27 insertions, 26 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 2e4bf113cbd..5a16073f7d9 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -34,9 +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"
-
extern bool fdsock (cygheap_fdmanip& fd, const device *, SOCKET soc);
extern "C" {
int sscanf (const char *, const char *, ...);
@@ -44,6 +41,16 @@ int sscanf (const char *, const char *, ...);
fhandler_dev_random* entropy_source;
+static void
+secret_event_name (char *buf, short port, int *secret_ptr)
+{
+ __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]);
+}
+
/* cygwin internal: map sockaddr into internet domain address */
static int
get_inet_addr (const struct sockaddr *in, int inlen,
@@ -219,7 +226,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);
@@ -239,8 +246,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);
@@ -250,13 +255,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[MAX_PATH];
+ secret_event_name (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 */;
@@ -291,18 +295,15 @@ 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[MAX_PATH];
+
+ secret_event_name (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 ();
@@ -433,14 +434,14 @@ fhandler_socket::fstat (struct __stat64 *buf)
if (get_socket_type ()) /* fstat */
{
buf->st_dev = 0;
- buf->st_ino = (ino_t) get_handle ();
+ buf->st_ino = (__ino64_t) ((DWORD) get_handle ());
buf->st_mode = S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO;
}
else
{
path_conv spc ("/dev", PC_SYM_NOFOLLOW | PC_NULLEMPTY, NULL);
buf->st_dev = spc.volser ();
- buf->st_ino = (ino_t) get_namehash ();
+ buf->st_ino = get_namehash ();
buf->st_mode &= ~S_IRWXO;
buf->st_rdev = (get_device () << 16) | get_unit ();
}
@@ -553,7 +554,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
if (!get_inet_addr (name, namelen, &sin, &namelen, secret))
return -1;
- if (!is_nonblocking () && !is_connect_pending ())
+ if (winsock2_active && !is_nonblocking () && !is_connect_pending ())
if (!evt.load (get_socket (), FD_CONNECT_BIT))
{
set_winsock_errno ();
@@ -562,7 +563,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
res = ::connect (get_socket (), (sockaddr *) &sin, namelen);
- if (res && !is_nonblocking () && !is_connect_pending () &&
+ if (winsock2_active && res && !is_nonblocking () && !is_connect_pending () &&
WSAGetLastError () == WSAEWOULDBLOCK)
switch (evt.wait ())
{
@@ -673,7 +674,7 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
*len = sizeof (struct sockaddr_in);
- if (!is_nonblocking ())
+ if (winsock2_active && !is_nonblocking ())
{
sock_event evt;
if (!evt.load (get_socket (), FD_ACCEPT_BIT))