Fix bug #38 - Pid file support.

This commit is contained in:
root 2009-06-17 12:52:49 +02:00
parent 7ddfd52dc7
commit 5250fdaf57

View File

@ -29,6 +29,7 @@ static const char* arg_uid = 0;
static const char* arg_gid = 0; static const char* arg_gid = 0;
static const char* arg_config = 0; static const char* arg_config = 0;
static const char* arg_log = 0; static const char* arg_log = 0;
static const char* arg_pid = 0;
static int arg_log_syslog = 0; static int arg_log_syslog = 0;
@ -215,6 +216,7 @@ void print_usage(char* program)
#ifndef WIN32 #ifndef WIN32
" -u <user> Run as given user\n" " -u <user> Run as given user\n"
" -g <group> Run with given group permissions\n" " -g <group> Run with given group permissions\n"
" -p <file> Store pid in file (process id)\n"
#endif #endif
" -V Show version number.\n" " -V Show version number.\n"
); );
@ -226,7 +228,7 @@ void print_usage(char* program)
void parse_command_line(int argc, char** argv) void parse_command_line(int argc, char** argv)
{ {
int opt; 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) switch (opt)
{ {
@ -286,6 +288,10 @@ void parse_command_line(int argc, char** argv)
arg_gid = optarg; arg_gid = optarg;
break; break;
case 'p':
arg_pid = optarg;
break;
default: default:
print_usage(argv[0]); print_usage(argv[0]);
break; break;
@ -387,6 +393,33 @@ int drop_privileges()
return 0; 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 */ #endif /* WIN32 */
@ -422,11 +455,19 @@ int main(int argc, char** argv)
} }
} }
if (pidfile_create() == -1)
return -1;
if (drop_privileges() == -1) if (drop_privileges() == -1)
return -1; return -1;
#endif /* WIN32 */ #endif /* WIN32 */
ret = main_loop(); ret = main_loop();
#ifndef WIN32
pidfile_destroy();
#endif
return ret; return ret;
} }