diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2006-12-16 22:11:39 +0000 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2006-12-16 22:11:39 +0000 |
commit | 33bec5ddc3153365a8500586f15ee3dcc3240994 (patch) | |
tree | 20596df18ea03c260f084177cbe645e607f4abf6 | |
parent | 1f346957724bc386fc6603137843a4fe4a0367ed (diff) |
set correct permissions on socket creation and remove socket and pidfile on exit
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/libnss_ldapd@163 ef36b2f9-881f-0410-afb5-c4e39611909c
-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) { |