diff --git a/ChangeLog b/ChangeLog index 6ee0706..9aa99c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,8 @@ Version - not yet released - Added pidfile.[c|h] from sysklogd written by Martin 'Joey' Schulze + Added pidfile.[c|h] from FreeBSD and modified it to fit in (hoaxter) Added pidfile support, config option is 'pidlogname', the option - is required to start fspd, hope that's ok for most people + is required to start fspd, hope that's ok for most people (hoaxter) + Replaced . file information from INSTALL with a hint to man 1 fspd (hoaxter) Version 2.8.1b19 - 11 Jan 2004 sven has added fspget URL command to setup.sh. diff --git a/server/main.c b/server/main.c index 0262968..f7c9f43 100644 --- a/server/main.c +++ b/server/main.c @@ -27,7 +27,6 @@ static void display_version PROTO0((void)) "Copyright (c) 1991-1996 by A. J. Doherty, 2001-2003 by Radim Kolar.\n" "All of the FSP code is free software with revised BSD license.\n" "Portions copyright by BSD, Wen-King Su, Philip G. Richards, Michael Meskes.\n" - "pidfile.[c|h] is GPL code, copyright Martin Schulze.\n" #ifdef __GNUC__ "Compiled "__DATE__" by GCC "__VERSION__"\n" #endif @@ -270,20 +269,12 @@ int main PROTO2(int, argc, char **, argv) /* Fork and die to drop daemon into background */ /* Added Alban E J Fellows 12 Jan 93 */ /* Moved by JT Traub to only do this if not running under inetd. */ - - /* check the pidlog before we fork */ - if (!check_pid(pidlogname)) { - /* pidfile empty, not existing or prozess already dead */ - } else { - exit(1); /* fspd already running */ - } - if(daemonize) { #if HAVE_FORK pid_t forkpid; forkpid = fork(); if (forkpid == 0) { /* child prozess */ - if (!write_pid(pidlogname)) + if (pidfile(pidlogname)) exit(1);/* cannot write pid file - exit */ } else if (forkpid > 0) { /* father prozess */ _exit(0); @@ -301,7 +292,7 @@ int main PROTO2(int, argc, char **, argv) if(inetd_mode||dbug||shutdowning) break; } - (void) remove_pid(pidlogname); + pidfile_cleanup(pidlogname); shutdown_caches(); destroy_configuration(); exit(0); diff --git a/server/pidfile.c b/server/pidfile.c index e0959a0..5e49511 100644 --- a/server/pidfile.c +++ b/server/pidfile.c @@ -1,130 +1,83 @@ -/* - pidfile.c - interact with pidfiles - Copyright (c) 1995 Martin Schulze - - This file is part of the sysklogd package, a kernel and system log daemon. - - 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA -*/ - -/* - * Sat Aug 19 13:24:33 MET DST 1995: Martin Schulze - * First version (v0.2) released +/*- + * Copyright (c) 1999 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include +#include +#include "pidfile.h" -/* read_pid - * - * Reads the specified pidfile and returns the read pid. - * 0 is returned if either there's no pidfile, it's empty - * or no pid can be read. - */ -int read_pid (char *pidfile) + +static pid_t pidfile_pid; + +int pidfile(char *pidfile_path) { - FILE *f; - int pid; + FILE *f; + int save_errno; + pid_t pid; - if (!(f=fopen(pidfile,"r"))) - return 0; - fscanf(f,"%d", &pid); - fclose(f); - return pid; + if (pidfile_path == NULL) + return (-1); + + if ((f = fopen(pidfile_path, "w")) == NULL) { + save_errno = errno; + free(pidfile_path); + pidfile_path = NULL; + errno = save_errno; + return (-1); + } + + pid = getpid(); + if (fprintf(f, "%ld\n", (long)pid) <= 0 || fclose(f) != 0) { + save_errno = errno; + (void) unlink(pidfile_path); + free(pidfile_path); + pidfile_path = NULL; + errno = save_errno; + return (-1); + } + + pidfile_pid = pid; + return (0); } -/* check_pid - * - * Reads the pid using read_pid and looks up the pid in the process - * table (using /proc) to determine if the process already exists. If - * so 1 is returned, otherwise 0. - */ -int check_pid (char *pidfile) + +void pidfile_cleanup(char *pidfile_path) { - int pid = read_pid(pidfile); - - /* Amazing ! _I_ am already holding the pid file... */ - if ((!pid) || (pid == getpid ())) - return 0; - - /* - * The 'standard' method of doing this is to try and do a 'fake' kill - * of the process. If an ESRCH error is returned the process cannot - * be found -- GW - */ - /* But... errno is usually changed only on error.. */ - if (kill(pid, 0) && errno == ESRCH) - return(0); - - return pid; + (void) unlink(pidfile_path); } - -/* write_pid - * - * Writes the pid to the specified file. If that fails 0 is - * returned, otherwise the pid. - */ -int write_pid (char *pidfile) -{ - FILE *f; - int fd; - int pid; - - if ( ((fd = open(pidfile, O_RDWR|O_CREAT|O_TRUNC, 0644)) == -1) - || ((f = fdopen(fd, "r+")) == NULL) ) { - fprintf(stderr, "Can't open or create %s.\n", pidfile); - return 0; - } - - if (flock(fd, LOCK_EX|LOCK_NB) == -1) { - fscanf(f, "%d", &pid); - fclose(f); - printf("Can't lock, lock is held by pid %d.\n", pid); - return 0; - } - - pid = getpid(); - if (!fprintf(f,"%d\n", pid)) { - printf("Can't write pid , %s.\n", strerror(errno)); - close(fd); - return 0; - } - fflush(f); - - if (flock(fd, LOCK_UN) == -1) { - printf("Can't unlock pidfile %s, %s.\n", pidfile, strerror(errno)); - close(fd); - return 0; - } - close(fd); - - return pid; -} - -/* remove_pid - * - * Remove the the specified file. The result from unlink(2) - * is returned - */ -int remove_pid (char *pidfile) -{ - return unlink (pidfile); -} - diff --git a/server/pidfile.h b/server/pidfile.h index 19d19c1..4f04493 100644 --- a/server/pidfile.h +++ b/server/pidfile.h @@ -1,50 +1,2 @@ -/* - pidfile.h - interact with pidfiles - Copyright (c) 1995 Martin Schulze - - This file is part of the sysklogd package, a kernel and system log daemon. - - 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -*/ - -/* read_pid - * - * Reads the specified pidfile and returns the read pid. - * 0 is returned if either there's no pidfile, it's empty - * or no pid can be read. - */ -int read_pid (char *pidfile); - -/* check_pid - * - * Reads the pid using read_pid and looks up the pid in the process - * table (using /proc) to determine if the process already exists. If - * so 1 is returned, otherwise 0. - */ -int check_pid (char *pidfile); - -/* write_pid - * - * Writes the pid to the specified file. If that fails 0 is - * returned, otherwise the pid. - */ -int write_pid (char *pidfile); - -/* remove_pid - * - * Remove the the specified file. The result from unlink(2) - * is returned - */ -int remove_pid (char *pidfile); +int pidfile(char *); +void pidfile_cleanup(char *);