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