Index: src/tcsd/svrside.c |
diff --git a/src/tcsd/svrside.c b/src/tcsd/svrside.c |
index 27c18bf3fc8e4e817e3cff8e37457d9b679b6c45..59456073df384f62dc7d7b7ba6895951631288c2 100644 |
--- a/src/tcsd/svrside.c |
+++ b/src/tcsd/svrside.c |
@@ -19,6 +19,7 @@ |
#include <sys/wait.h> |
#include <sys/stat.h> |
#include <sys/socket.h> |
+#include <sys/un.h> |
#include <netdb.h> |
#include <pwd.h> |
#if (defined (__OpenBSD__) || defined (__FreeBSD__)) |
@@ -211,11 +212,10 @@ reload_config(void) |
int |
main(int argc, char **argv) |
{ |
- struct sockaddr_in serv_addr, client_addr; |
+ struct sockaddr_un serv_addr, client_addr; |
TSS_RESULT result; |
int sd, newsd, c, option_index = 0; |
unsigned client_len; |
- char *hostname = NULL; |
struct passwd *pwd; |
struct hostent *client_hostent = NULL; |
struct option long_options[] = { |
@@ -245,29 +245,27 @@ main(int argc, char **argv) |
if ((result = tcsd_startup())) |
return (int)result; |
- sd = socket(AF_INET, SOCK_STREAM, 0); |
+ sd = socket(AF_UNIX, SOCK_STREAM, 0); |
if (sd < 0) { |
LogError("Failed socket: %s", strerror(errno)); |
return -1; |
} |
memset(&serv_addr, 0, sizeof (serv_addr)); |
- serv_addr.sin_family = AF_INET; |
- serv_addr.sin_port = htons(tcsd_options.port); |
- |
- /* If no remote_ops are defined, restrict connections to localhost |
- * only at the socket. */ |
- if (tcsd_options.remote_ops[0] == 0) |
- serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
- else |
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); |
+ serv_addr.sun_family = AF_UNIX; |
+ strcpy(serv_addr.sun_path, TCSD_UNIX_SOCKET); |
+ unlink(serv_addr.sun_path); |
c = 1; |
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &c, sizeof(c)); |
- if (bind(sd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { |
+ if (bind(sd, (struct sockaddr *) &serv_addr, |
+ strlen(serv_addr.sun_path) + sizeof (serv_addr.sun_family)) |
+ < 0) { |
LogError("Failed bind: %s", strerror(errno)); |
return -1; |
} |
+ chmod(serv_addr.sun_path, |
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); |
#ifndef SOLARIS |
pwd = getpwnam(TSS_USER_NAME); |
if (pwd == NULL) { |
@@ -314,24 +312,8 @@ main(int argc, char **argv) |
} |
LogDebug("accepted socket %i", newsd); |
- if ((client_hostent = gethostbyaddr((char *) &client_addr.sin_addr, |
- sizeof(client_addr.sin_addr), |
- AF_INET)) == NULL) { |
- char buf[16]; |
- uint32_t addr = htonl(client_addr.sin_addr.s_addr); |
- |
- snprintf(buf, 16, "%d.%d.%d.%d", (addr & 0xff000000) >> 24, |
- (addr & 0x00ff0000) >> 16, (addr & 0x0000ff00) >> 8, |
- addr & 0x000000ff); |
- |
- LogWarn("Host name for connecting IP %s could not be resolved", buf); |
- hostname = strdup(buf); |
- } else { |
- hostname = strdup(client_hostent->h_name); |
- } |
- |
- tcsd_thread_create(newsd, hostname); |
- hostname = NULL; |
+ // We're listening on a domain socket, so just use "localhost" |
+ tcsd_thread_create(newsd, strdup("localhost")); |
if (hup) { |
if (reload_config() != TSS_SUCCESS) |
LogError("Failed reloading config"); |