summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Xtranssock.c65
1 files changed, 25 insertions, 40 deletions
diff --git a/Xtranssock.c b/Xtranssock.c
index 6cde146..d11a654 100644
--- a/Xtranssock.c
+++ b/Xtranssock.c
@@ -479,7 +479,8 @@ TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, char *port)
XtransConnInfo ciptr;
int portlen;
struct sockaddr *addr;
- size_t addrlen;
+ struct sockaddr_storage socket_name;
+ socklen_t socket_name_size;
prmsg (3,"SocketReopen(%d,%d,%s)\n", type, fd, port);
@@ -488,62 +489,46 @@ TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, char *port)
return NULL;
}
- portlen = strlen(port) + 1; // include space for trailing null
-#ifdef SOCK_MAXADDRLEN
- if (portlen < 0 || portlen > (SOCK_MAXADDRLEN + 2)) {
- prmsg (1, "SocketReopen: invalid portlen %d\n", portlen);
- return NULL;
- }
- if (portlen < 14) portlen = 14;
-#else
- if (portlen < 0 || portlen > 14) {
- prmsg (1, "SocketReopen: invalid portlen %d\n", portlen);
- return NULL;
- }
-#endif /*SOCK_MAXADDRLEN*/
-
if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
{
prmsg (1, "SocketReopen: malloc(ciptr) failed\n");
return NULL;
}
+ socket_name_size = sizeof(socket_name);
+ if (getsockname(fd, (struct sockaddr*) &socket_name, &socket_name_size) < 0) {
+ prmsg (1, "SocketReopen: getsockname failed\n");
+ return NULL;
+ }
+
ciptr->fd = fd;
+ ciptr->family = AF_UNIX;
- addrlen = portlen + offsetof(struct sockaddr, sa_data);
- if ((addr = calloc (1, addrlen)) == NULL) {
+ if ((ciptr->addr = calloc (1, socket_name_size)) < 0) {
prmsg (1, "SocketReopen: malloc(addr) failed\n");
free (ciptr);
- return NULL;
+ return NULL;
}
- ciptr->addr = (char *) addr;
- ciptr->addrlen = addrlen;
- if ((ciptr->peeraddr = calloc (1, addrlen)) == NULL) {
- prmsg (1, "SocketReopen: malloc(portaddr) failed\n");
- free (addr);
+ if ((ciptr->peeraddr = calloc (1, socket_name_size)) == NULL) {
+ prmsg (1, "SocketReopen: malloc(peeraddr) failed\n");
+ free (ciptr->addr);
free (ciptr);
return NULL;
}
- ciptr->peeraddrlen = addrlen;
- /* Initialize ciptr structure as if it were a normally-opened unix socket */
- ciptr->flags = TRANS_LOCAL | TRANS_NOUNLINK;
-#ifdef BSD44SOCKETS
- addr->sa_len = addrlen;
-#endif
- addr->sa_family = AF_UNIX;
-#ifdef HAS_STRLCPY
- strlcpy(addr->sa_data, port, portlen);
-#else
- strncpy(addr->sa_data, port, portlen);
-#endif
- ciptr->family = AF_UNIX;
- memcpy(ciptr->peeraddr, ciptr->addr, addrlen);
- ciptr->port = rindex(addr->sa_data, ':');
+ memcpy (ciptr->addr, &socket_name, socket_name_size);
+ memcpy (ciptr->peeraddr, &socket_name, socket_name_size);
+
+ ciptr->addrlen = socket_name_size;
+ ciptr->peeraddrlen = socket_name_size;
+
+ /* FIXME: Leak */
+ port = strdup (port);
+ ciptr->port = rindex(port, ':');
if (ciptr->port == NULL) {
- if (is_numeric(addr->sa_data)) {
- ciptr->port = addr->sa_data;
+ if (is_numeric(port)) {
+ ciptr->port = port;
}
} else if (ciptr->port[0] == ':') {
ciptr->port++;