Implements PID file support.
Thanks to Thierry Fournier for the original patch.
This commit is contained in:
parent
7ccb36d330
commit
e7c2380260
1 changed files with 63 additions and 2 deletions
|
@ -472,6 +472,58 @@ cli_init_unix(uid_t use_uid, gid_t use_gid)
|
||||||
die("chmod: %m");
|
die("chmod: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PID file
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *pid_file;
|
||||||
|
static int pid_fd;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
open_pid_file(void)
|
||||||
|
{
|
||||||
|
if (!pid_file)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pid_fd = open(pid_file, O_WRONLY|O_CREAT, 0664);
|
||||||
|
if (pid_fd < 0)
|
||||||
|
die("Cannot create PID file %s: %m", pid_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
write_pid_file(void)
|
||||||
|
{
|
||||||
|
int pl, rv;
|
||||||
|
char ps[24];
|
||||||
|
|
||||||
|
if (!pid_file)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* We don't use PID file for uniqueness, so no need for locking */
|
||||||
|
|
||||||
|
pl = bsnprintf(ps, sizeof(ps), "%ld\n", (long) getpid());
|
||||||
|
if (pl < 0)
|
||||||
|
bug("PID buffer too small");
|
||||||
|
|
||||||
|
rv = ftruncate(pid_fd, 0);
|
||||||
|
if (rv < 0)
|
||||||
|
die("fruncate: %m");
|
||||||
|
|
||||||
|
rv = write(pid_fd, ps, pl);
|
||||||
|
if(rv < 0)
|
||||||
|
die("write: %m");
|
||||||
|
|
||||||
|
close(pid_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
unlink_pid_file(void)
|
||||||
|
{
|
||||||
|
if (pid_file)
|
||||||
|
unlink(pid_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shutdown
|
* Shutdown
|
||||||
*/
|
*/
|
||||||
|
@ -496,6 +548,7 @@ async_shutdown(void)
|
||||||
void
|
void
|
||||||
sysdep_shutdown_done(void)
|
sysdep_shutdown_done(void)
|
||||||
{
|
{
|
||||||
|
unlink_pid_file();
|
||||||
unlink(path_control_socket);
|
unlink(path_control_socket);
|
||||||
log_msg(L_FATAL "Shutdown completed");
|
log_msg(L_FATAL "Shutdown completed");
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -548,7 +601,7 @@ signal_init(void)
|
||||||
* Parsing of command-line arguments
|
* Parsing of command-line arguments
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char *opt_list = "c:dD:ps:u:g:";
|
static char *opt_list = "c:dD:ps:P:u:g:";
|
||||||
static int parse_and_exit;
|
static int parse_and_exit;
|
||||||
char *bird_name;
|
char *bird_name;
|
||||||
static char *use_user;
|
static char *use_user;
|
||||||
|
@ -557,7 +610,7 @@ static char *use_group;
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s [-c <config-file>] [-d] [-D <debug-file>] [-p] [-s <control-socket>] [-u <user>] [-g <group>]\n", bird_name);
|
fprintf(stderr, "Usage: %s [-c <config-file>] [-d] [-D <debug-file>] [-p] [-s <control-socket>] [-P <pid-file>] [-u <user>] [-g <group>]\n", bird_name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,6 +709,9 @@ parse_args(int argc, char **argv)
|
||||||
case 's':
|
case 's':
|
||||||
path_control_socket = optarg;
|
path_control_socket = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'P':
|
||||||
|
pid_file = optarg;
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
use_user = optarg;
|
use_user = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -709,6 +765,9 @@ main(int argc, char **argv)
|
||||||
if (use_uid)
|
if (use_uid)
|
||||||
drop_uid(use_uid);
|
drop_uid(use_uid);
|
||||||
|
|
||||||
|
if (!parse_and_exit)
|
||||||
|
open_pid_file();
|
||||||
|
|
||||||
protos_build();
|
protos_build();
|
||||||
proto_build(&proto_unix_kernel);
|
proto_build(&proto_unix_kernel);
|
||||||
proto_build(&proto_unix_iface);
|
proto_build(&proto_unix_iface);
|
||||||
|
@ -733,6 +792,8 @@ main(int argc, char **argv)
|
||||||
dup2(0, 2);
|
dup2(0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_pid_file();
|
||||||
|
|
||||||
signal_init();
|
signal_init();
|
||||||
|
|
||||||
#ifdef LOCAL_DEBUG
|
#ifdef LOCAL_DEBUG
|
||||||
|
|
Loading…
Reference in a new issue