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>2018-02-21 23:40:01 +0300
committerCorinna Vinschen <corinna@vinschen.de>2018-02-21 23:40:01 +0300
commit859d215b7e006e5fc60f686ec976e997e35d169b (patch)
tree8a0030b5734f2e9c6e2a2023fbf4113e26b2b070 /winsup/cygwin/syslog.cc
parentdff3bc9a86c5d07f97dd62dd3279124b4b576296 (diff)
Cygwin: split out fhandler_socket into inet and local classes
First cut, still incomplete * fhandler_socket is now base class for other socket classes * fhandler_socket_inet handles AF_INET and AF_INET6 sockets * fhandler_socket_local handles AF_LOCAL/AF_UNIX sockets * finally get rid of fdsock by using set_socket_handle in accept4 * align file-related calls (fstat, fstatvfs, fchown, fchmod, facl) to Linux. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/syslog.cc')
-rw-r--r--winsup/cygwin/syslog.cc40
1 files changed, 27 insertions, 13 deletions
diff --git a/winsup/cygwin/syslog.cc b/winsup/cygwin/syslog.cc
index 81717c645..7ea00d7c3 100644
--- a/winsup/cygwin/syslog.cc
+++ b/winsup/cygwin/syslog.cc
@@ -185,17 +185,12 @@ static enum {
static int syslogd_sock = -1;
extern "C" int cygwin_socket (int, int, int);
extern "C" int cygwin_connect (int, const struct sockaddr *, int);
-extern int get_inet_addr (const struct sockaddr *, int,
- struct sockaddr_storage *, int *,
- int * = NULL, int * = NULL);
static void
connect_syslogd ()
{
int fd;
struct sockaddr_un sun;
- struct sockaddr_storage sst;
- int len, type;
if (syslogd_inited != not_inited && syslogd_sock >= 0)
close (syslogd_sock);
@@ -203,20 +198,38 @@ connect_syslogd ()
syslogd_sock = -1;
sun.sun_family = AF_LOCAL;
strncpy (sun.sun_path, _PATH_LOG, sizeof sun.sun_path);
- if (get_inet_addr ((struct sockaddr *) &sun, sizeof sun, &sst, &len, &type))
- return;
- if ((fd = cygwin_socket (AF_LOCAL, type, 0)) < 0)
+ if ((fd = cygwin_socket (AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0)) < 0)
return;
if (cygwin_connect (fd, (struct sockaddr *) &sun, sizeof sun) == 0)
+ syslogd_inited = inited_stream;
+ else
{
- /* connect on a dgram socket always succeeds. We still don't know
- if syslogd is actually listening. */
- if (type == SOCK_DGRAM)
+ close (fd);
+ if ((fd = cygwin_socket (AF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0)) < 0)
+ return;
+ if (cygwin_connect (fd, (struct sockaddr *) &sun, sizeof sun) == 0)
{
+ /*
+ * FIXME
+ *
+ * As soon as AF_LOCAL sockets are using pipes, this code has to
+ * got away.
+ */
+
+ /* connect on a dgram socket always succeeds. We still don't know
+ if syslogd is actually listening. */
+ cygheap_fdget cfd (fd);
+ fhandler_socket_local *const fh = (fhandler_socket_local *)
+ cfd->is_socket ();
tmp_pathbuf tp;
PMIB_UDPTABLE tab = (PMIB_UDPTABLE) tp.w_get ();
DWORD size = 65536;
bool found = false;
+ struct sockaddr_storage sst;
+ int len;
+
+ len = sizeof sst;
+ ::getsockname (fh->get_socket (), (struct sockaddr *) &sst, &len);
struct sockaddr_in *sa = (struct sockaddr_in *) &sst;
if (GetUdpTable (tab, &size, FALSE) == NO_ERROR)
@@ -235,11 +248,12 @@ connect_syslogd ()
return;
}
}
+ syslogd_inited = inited_dgram;
}
- syslogd_inited = type == SOCK_DGRAM ? inited_dgram : inited_stream;
+ else
+ close (fd);
}
syslogd_sock = fd;
- fcntl64 (syslogd_sock, F_SETFD, FD_CLOEXEC);
debug_printf ("found /dev/log, fd = %d, type = %s",
fd, syslogd_inited == inited_stream ? "STREAM" : "DGRAM");
return;