[sheepdog] [PATCH] add option to create pid file
Dietmar Maurer
dietmar at proxmox.com
Mon Jul 16 14:06:15 CEST 2012
This is useful for init.d scripts.
Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
sheep/sheep.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 45 insertions(+), 1 deletions(-)
diff --git a/sheep/sheep.c b/sheep/sheep.c
index 7d1e853..675e729 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -19,6 +19,10 @@
#include <signal.h>
#include <linux/limits.h>
#include <sys/syslog.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
#include "sheep_priv.h"
#include "trace/trace.h"
@@ -44,10 +48,11 @@ static struct option const long_options[] = {
{"vnodes", required_argument, NULL, 'v'},
{"enable-cache", no_argument, NULL, 'w'},
{"zone", required_argument, NULL, 'z'},
+ {"pidfile", required_argument, NULL, 'P'},
{NULL, 0, NULL, 0},
};
-static const char *short_options = "c:dDfghl:op:v:wy:z:";
+static const char *short_options = "c:dDfghl:op:P:v:wy:z:";
static void usage(int status)
{
@@ -68,6 +73,7 @@ Options:\n\
-l, --loglevel specify the level of logging detail\n\
-o, --stdout log to stdout instead of shared logger\n\
-p, --port specify the TCP port on which to listen\n\
+ -P, --pidfile create a pid file\n\
-v, --vnodes specify the number of virtual nodes\n\
-w, --enable-cache enable object cache\n\
-y, --myaddr specify the address advertised to other sheep\n\
@@ -91,6 +97,31 @@ Available log levels:\n\
7 SDOG_DEBUG debugging messages\n");
}
+static int create_pidfile(const char *filename)
+{
+ int fd = -1;
+ int len;
+ char buffer[128];
+
+ if ((fd = open(filename, O_RDWR|O_CREAT|O_SYNC, 0600)) == -1) {
+ return -1;
+ }
+
+ if (lockf(fd, F_TLOCK, 0) == -1) {
+ close(fd);
+ return -1;
+ }
+
+ len = snprintf(buffer, sizeof(buffer), "%d\n", getpid());
+ if (write(fd, buffer, len) != len) {
+ close(fd);
+ return -1;
+ }
+
+ /* keep pidfile open & locked forever */
+ return 0;
+}
+
static struct cluster_info __sys;
struct cluster_info *sys = &__sys;
@@ -110,6 +141,7 @@ int main(int argc, char **argv)
char *p;
struct cluster_driver *cdrv;
int enable_write_cache = 0; /* disabled by default */
+ char *pid_file = NULL;
signal(SIGPIPE, SIG_IGN);
@@ -124,6 +156,9 @@ int main(int argc, char **argv)
exit(1);
}
break;
+ case 'P':
+ pid_file = optarg;
+ break;
case 'f':
is_daemon = 0;
break;
@@ -264,6 +299,11 @@ int main(int argc, char **argv)
if (ret)
exit(1);
+ if (pid_file && (create_pidfile(pid_file) != 0)) {
+ fprintf(stderr, "failed to pid file '%s' - %s\n", pid_file, strerror(errno));
+ exit(1);
+ }
+
if (chdir(dir) < 0) {
fprintf(stderr, "failed to chdir to %s: %m\n", dir);
exit(1);
@@ -279,5 +319,9 @@ int main(int argc, char **argv)
leave_cluster();
log_close();
+ if (pid_file) {
+ unlink(pid_file);
+ }
+
return 0;
}
--
1.7.2.5
More information about the sheepdog
mailing list