diff options
Diffstat (limited to 'server/nslcd.c')
-rw-r--r-- | server/nslcd.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/server/nslcd.c b/server/nslcd.c index ec0bbe4..1dccf37 100644 --- a/server/nslcd.c +++ b/server/nslcd.c @@ -213,20 +213,35 @@ static RETSIGTYPE sigexit_handler(int signum) } + /* do some cleaning up before terminating */ static void exithandler(void) { + /* close socket if it's still in use */ if (nslcd_serversocket >= 0) { if (close(nslcd_serversocket)) log_log(LOG_WARNING,"problem closing server socket (ignored): %s",strerror(errno)); } + /* remove existing named socket */ + if (unlink(NSLCD_SOCKET)<0) + { + log_log(LOG_DEBUG,"unlink() of "NSLCD_SOCKET" failed (ignored): %s", + strerror(errno)); + } + /* remove pidfile */ + if (unlink(NSLCD_PIDFILE)<0) + { + log_log(LOG_DEBUG,"unlink() of "NSLCD_PIDFILE" failed (ignored): %s", + strerror(errno)); + } + /* log exit */ log_log(LOG_INFO,"version %s bailing out",VERSION); } /* returns a socket ready to answer requests from the client, - return <0 on error */ + exit()s on error */ static int open_socket(void) { int sock; @@ -239,20 +254,20 @@ static int open_socket(void) exit(1); } - /* create socket address structure */ - memset(&addr,0,sizeof(struct sockaddr_un)); - addr.sun_family=AF_UNIX; - strcpy(addr.sun_path,NSLCD_SOCKET); - - /* unlink to socket */ + /* remove existing named socket */ if (unlink(NSLCD_SOCKET)<0) { log_log(LOG_DEBUG,"unlink() of "NSLCD_SOCKET" failed (ignored): %s", strerror(errno)); } - /* bind to the socket */ - if (bind(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_un))<0) + /* create socket address structure */ + memset(&addr,0,sizeof(struct sockaddr_un)); + addr.sun_family=AF_UNIX; + strcpy(addr.sun_path,NSLCD_SOCKET); + + /* bind to the named socket */ + if (bind(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_un))) { log_log(LOG_ERR,"bind() to "NSLCD_SOCKET" failed: %s", strerror(errno)); @@ -270,6 +285,15 @@ static int open_socket(void) exit(1); } + /* set permissions of socket so anybody can do requests */ + if (chmod(NSLCD_SOCKET,0666)) + { + log_log(LOG_ERR,"fctnl(F_SETFL,O_NONBLOCK) failed: %s",strerror(errno)); + if (close(sock)) + log_log(LOG_WARNING,"problem closing socket: %s",strerror(errno)); + exit(1); + } + /* start listening for connections */ if (listen(sock,SOMAXCONN)<0) { |