diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-03-14 13:00:09 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-03-14 13:00:09 +0000 |
commit | e02b05b5658fa50e6f94e604fc518a624211b6de (patch) | |
tree | ec094ea9214df18c324b73c7aecf791e79fe9187 /source3/lib | |
parent | c063e9ec3e90508e846dd51e22a643c74c02f7c1 (diff) | |
download | samba-e02b05b5658fa50e6f94e604fc518a624211b6de.tar.gz samba-e02b05b5658fa50e6f94e604fc518a624211b6de.tar.bz2 samba-e02b05b5658fa50e6f94e604fc518a624211b6de.zip |
new files to support starting/stopping the server
(This used to be commit 087981009d57006ff80a0cf50891d4473f86f1bb)
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/pidfile.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/source3/lib/pidfile.c b/source3/lib/pidfile.c new file mode 100644 index 0000000000..8dee7421de --- /dev/null +++ b/source3/lib/pidfile.c @@ -0,0 +1,88 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + pidfile handling + Copyright (C) Andrew Tridgell 1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + + +extern int DEBUGLEVEL; + +#ifndef O_NONBLOCK +#define O_NONBLOCK +#endif + + +/* create a pid file in the lock directory. open it and leave it locked */ +void pidfile_create(char *name) +{ + int fd; + char buf[20]; + pstring pidFile; + + sprintf(pidFile, "%s/%s.pid", lp_lockdir(), name); + + fd = open(pidFile, O_NONBLOCK | O_CREAT | O_WRONLY | O_TRUNC, 0644); + if (fd < 0) { + DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, + strerror(errno))); + exit(1); + } + + if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False) { + DEBUG(0,("ERROR: %s is already running\n", name)); + exit(1); + } + + sprintf(buf, "%u\n", (unsigned int) getpid()); + if (write(fd, buf, strlen(buf)) < 0) { + DEBUG(0,("ERROR: can't write to %s: %s\n", + pidFile, strerror(errno))); + exit(1); + } + /* Leave pid file open & locked for the duration... */ +} + + +/* return the pid in a pidfile. return 0 if the process (or pidfile) + does not exist */ +int pidfile_pid(char *name) +{ + FILE *f; + pstring pidFile; + unsigned ret; + + sprintf(pidFile, "%s/%s.pid", lp_lockdir(), name); + + f = fopen(pidFile, "r"); + if (!f) { + return 0; + } + + if (fscanf(f,"%u", &ret) != 1) { + fclose(f); + return 0; + } + fclose(f); + + if (!process_exists(ret)) return 0; + + return ret; +} + |