Annotation of embedaddon/quagga/lib/pid_output.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Process id output.
! 3: * Copyright (C) 1998, 1999 Kunihiro Ishiguro
! 4: *
! 5: * This file is part of GNU Zebra.
! 6: *
! 7: * GNU Zebra is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2, or (at your option) any
! 10: * later version.
! 11: *
! 12: * GNU Zebra is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 15: * General Public License for more details.
! 16: *
! 17: * You should have received a copy of the GNU General Public License
! 18: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 19: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 20: * 02111-1307, USA.
! 21: */
! 22:
! 23: #include <zebra.h>
! 24: #include <fcntl.h>
! 25: #include <log.h>
! 26: #include "version.h"
! 27:
! 28: #define PIDFILE_MASK 0644
! 29: #ifndef HAVE_FCNTL
! 30:
! 31: pid_t
! 32: pid_output (const char *path)
! 33: {
! 34: FILE *fp;
! 35: pid_t pid;
! 36: mode_t oldumask;
! 37:
! 38: pid = getpid();
! 39:
! 40: oldumask = umask(0777 & ~PIDFILE_MASK);
! 41: fp = fopen (path, "w");
! 42: if (fp != NULL)
! 43: {
! 44: fprintf (fp, "%d\n", (int) pid);
! 45: fclose (fp);
! 46: umask(oldumask);
! 47: return pid;
! 48: }
! 49: /* XXX Why do we continue instead of exiting? This seems incompatible
! 50: with the behavior of the fcntl version below. */
! 51: zlog_warn("Can't fopen pid lock file %s (%s), continuing",
! 52: path, safe_strerror(errno));
! 53: umask(oldumask);
! 54: return -1;
! 55: }
! 56:
! 57: #else /* HAVE_FCNTL */
! 58:
! 59: pid_t
! 60: pid_output (const char *path)
! 61: {
! 62: int tmp;
! 63: int fd;
! 64: pid_t pid;
! 65: char buf[16];
! 66: struct flock lock;
! 67: mode_t oldumask;
! 68:
! 69: pid = getpid ();
! 70:
! 71: oldumask = umask(0777 & ~PIDFILE_MASK);
! 72: fd = open (path, O_RDWR | O_CREAT, PIDFILE_MASK);
! 73: if (fd < 0)
! 74: {
! 75: zlog_err("Can't create pid lock file %s (%s), exiting",
! 76: path, safe_strerror(errno));
! 77: umask(oldumask);
! 78: exit(1);
! 79: }
! 80: else
! 81: {
! 82: size_t pidsize;
! 83:
! 84: umask(oldumask);
! 85: memset (&lock, 0, sizeof(lock));
! 86:
! 87: lock.l_type = F_WRLCK;
! 88: lock.l_whence = SEEK_SET;
! 89:
! 90: if (fcntl(fd, F_SETLK, &lock) < 0)
! 91: {
! 92: zlog_err("Could not lock pid_file %s, exiting", path);
! 93: exit(1);
! 94: }
! 95:
! 96: sprintf (buf, "%d\n", (int) pid);
! 97: pidsize = strlen(buf);
! 98: if ((tmp = write (fd, buf, pidsize)) != (int)pidsize)
! 99: zlog_err("Could not write pid %d to pid_file %s, rc was %d: %s",
! 100: (int)pid,path,tmp,safe_strerror(errno));
! 101: else if (ftruncate(fd, pidsize) < 0)
! 102: zlog_err("Could not truncate pid_file %s to %u bytes: %s",
! 103: path,(u_int)pidsize,safe_strerror(errno));
! 104: }
! 105: return pid;
! 106: }
! 107:
! 108: #endif /* HAVE_FCNTL */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>