summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpaul <paul>2003-10-24 06:10:16 +0200
committerpaul <paul>2003-10-24 06:10:16 +0200
commite92fbaf27ea028d4def1246b7fadb2096bfa4d8d (patch)
tree82a4635afd48faa6de8a6203bd4af28e404c518c
parent2003-10-24 sowmini.varadhan@sun.com (diff)
downloadfrr-e92fbaf27ea028d4def1246b7fadb2096bfa4d8d.tar.xz
frr-e92fbaf27ea028d4def1246b7fadb2096bfa4d8d.zip
2003-10-24 sowmini.varadhan@sun.com
* lib/pid_output.c: (pid_output) call pid_output_lock if we have fcntl(). (pid_output_lock) grab exclusive write lock on pid file, rather than rely on (fragile) exclusive create.
-rw-r--r--lib/pid_output.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/pid_output.c b/lib/pid_output.c
index 4146244ac..e00e47ac6 100644
--- a/lib/pid_output.c
+++ b/lib/pid_output.c
@@ -21,10 +21,15 @@
*/
#include <zebra.h>
+#include <fcntl.h>
+#include <log.h>
+
+pid_t pid_output_lock(char *);
pid_t
pid_output (char *path)
{
+#ifndef HAVE_FCNTL
FILE *fp;
pid_t pid;
@@ -38,40 +43,44 @@ pid_output (char *path)
return -1;
}
return pid;
+#else
+ return pid_output_lock(path);
+#endif /* HAVE_FCNTL */
}
+#ifdef HAVE_FCNTL
pid_t
pid_output_lock (char *path)
{
int tmp;
int fd;
pid_t pid;
- char buf[16], *p;
+ char buf[16];
+ struct flock lock = { .l_type = F_WRLCK,
+ .l_whence = SEEK_END };
pid = getpid ();
- fd = open (path, O_RDWR | O_CREAT | O_EXCL, 0644);
- if (fd < 0)
- {
- fd = open (path, O_RDONLY);
+ fd = open (path, O_RDWR | O_CREAT, 0644);
if (fd < 0)
- fprintf (stderr, "Can't creat pid lock file, exit\n");
- else
{
- read (fd, buf, sizeof (buf));
- if ((p = index (buf, '\n')) != NULL)
- *p = 0;
- fprintf (stderr, "Another process(%s) running, exit\n", buf);
- }
+ zlog_err( "Can't creat pid lock file %s (%s), exit",
+ path, strerror(errno));
exit (-1);
}
else
{
+ memset (&lock, 0, sizeof(lock));
+
+ if (fcntl(fd, F_SETLK, &lock) < 0)
+ {
+ zlog_err("Could not lock pid_file %s, exit", path);
+ exit (-1);
+ }
+
sprintf (buf, "%d\n", (int) pid);
tmp = write (fd, buf, strlen (buf));
- close (fd);
}
-
return pid;
}
-
+#endif /* HAVE_FCNTL */