Annotation of embedaddon/quagga/lib/pid_output.c, revision 1.1.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>