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 25pid_t 26pid_output (char *path) 27{ 28 FILE *fp; 29 pid_t pid; 30 31 pid = getpid(); 32 33 fp = fopen (path, "w"); 34 if (fp != NULL) 35 { 36 fprintf (fp, "%d\n", (int) pid); 37 fclose (fp); 38 return -1; 39 } 40 return pid; 41} 42 43pid_t 44pid_output_lock (char *path) 45{ 46 int tmp; 47 int fd; 48 pid_t pid; 49 char buf[16], *p; 50 51 pid = getpid (); 52 53 fd = open (path, O_RDWR | O_CREAT | O_EXCL, 0644); 54 if (fd < 0) 55 { 56 fd = open (path, O_RDONLY); 57 if (fd < 0) 58 fprintf (stderr, "Can't creat pid lock file, exit\n"); 59 else 60 { 61 read (fd, buf, sizeof (buf)); 62 if ((p = index (buf, '\n')) != NULL) 63 *p = 0; 64 fprintf (stderr, "Another process(%s) running, exit\n", buf); 65 } 66 exit (-1); 67 } 68 else 69 { 70 sprintf (buf, "%d\n", (int) pid); 71 tmp = write (fd, buf, strlen (buf)); 72 close (fd); 73 } 74 75 return pid; 76} 77 78