summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2006-12-16 22:11:39 +0000
committerArthur de Jong <arthur@arthurdejong.org>2006-12-16 22:11:39 +0000
commit33bec5ddc3153365a8500586f15ee3dcc3240994 (patch)
tree20596df18ea03c260f084177cbe645e607f4abf6
parent1f346957724bc386fc6603137843a4fe4a0367ed (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.c42
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)
{