From 5250fdaf57ec3a813fb5d9bdfdaff9284457cba4 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 17 Jun 2009 12:52:49 +0200 Subject: [PATCH] Fix bug #38 - Pid file support. --- src/main.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 322d613..e393ad6 100644 --- a/src/main.c +++ b/src/main.c @@ -29,6 +29,7 @@ static const char* arg_uid = 0; static const char* arg_gid = 0; static const char* arg_config = 0; static const char* arg_log = 0; +static const char* arg_pid = 0; static int arg_log_syslog = 0; @@ -215,6 +216,7 @@ void print_usage(char* program) #ifndef WIN32 " -u Run as given user\n" " -g Run with given group permissions\n" + " -p Store pid in file (process id)\n" #endif " -V Show version number.\n" ); @@ -226,7 +228,7 @@ void print_usage(char* program) void parse_command_line(int argc, char** argv) { int opt; - while ((opt = getopt(argc, argv, "vqfc:l:hu:g:VCsSL")) != -1) + while ((opt = getopt(argc, argv, "vqfc:l:hu:g:VCsSLp:")) != -1) { switch (opt) { @@ -286,6 +288,10 @@ void parse_command_line(int argc, char** argv) arg_gid = optarg; break; + case 'p': + arg_pid = optarg; + break; + default: print_usage(argv[0]); break; @@ -387,6 +393,33 @@ int drop_privileges() return 0; } + +int pidfile_create() +{ + if (arg_pid) + { + FILE* pidfile = fopen(arg_pid, "w"); + if (!pidfile) + { + hub_log(log_fatal, "Unable to write pid file: %s\n", arg_pid); + return -1; + } + + fprintf(pidfile, "%d", (int) getpid()); + fclose(pidfile); + } + return 0; +} + +int pidfile_destroy() +{ + if (arg_pid) + { + return unlink(arg_pid); + } + return 0; +} + #endif /* WIN32 */ @@ -422,11 +455,19 @@ int main(int argc, char** argv) } } + if (pidfile_create() == -1) + return -1; + if (drop_privileges() == -1) return -1; #endif /* WIN32 */ ret = main_loop(); + +#ifndef WIN32 + pidfile_destroy(); +#endif + return ret; }