mirror of
https://kernel.googlesource.com/pub/scm/network/tftp/tftp-hpa
synced 2025-04-29 19:39:54 +03:00
Implement the --pidfile option
Setting the umask moved later, right before entering the select loop, so that it does not affect the permissions of the pid file. Signed-off-by: Ferenc Wagner <wferi@niif.hu> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
5a27e30ec2
commit
c86f82532e
2 changed files with 50 additions and 4 deletions
|
@ -133,6 +133,11 @@ system-provided access controls for the user specified via the
|
||||||
.B \-\-user
|
.B \-\-user
|
||||||
option.
|
option.
|
||||||
.TP
|
.TP
|
||||||
|
\fB\-\-pidfile\fP \fIpidfile\fP, \fB\-P\fP \fIpidfile\fP When run in
|
||||||
|
standalone mode, write the process ID of the listening server into
|
||||||
|
\fIpidfile\fP. On normal termination (SIGTERM or SIGINT) the pid file
|
||||||
|
is automatically removed.
|
||||||
|
.TP
|
||||||
\fB\-\-timeout\fP \fItimeout\fP, \fB\-t\fP \fItimeout\fP
|
\fB\-\-timeout\fP \fItimeout\fP, \fB\-t\fP \fItimeout\fP
|
||||||
When run from
|
When run from
|
||||||
.B inetd
|
.B inetd
|
||||||
|
|
|
@ -144,6 +144,13 @@ static void handle_sighup(int sig)
|
||||||
caught_sighup = 1;
|
caught_sighup = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle exit requests by SIGTERM and SIGINT */
|
||||||
|
static volatile sig_atomic_t exit_signal = 0;
|
||||||
|
static void handle_exit(int sig)
|
||||||
|
{
|
||||||
|
exit_signal = sig;
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle timeout signal or timeout event */
|
/* Handle timeout signal or timeout event */
|
||||||
void timer(int sig)
|
void timer(int sig)
|
||||||
{
|
{
|
||||||
|
@ -318,9 +325,10 @@ static struct option long_options[] = {
|
||||||
{ "retransmit", 1, NULL, 'T' },
|
{ "retransmit", 1, NULL, 'T' },
|
||||||
{ "port-range", 1, NULL, 'R' },
|
{ "port-range", 1, NULL, 'R' },
|
||||||
{ "map-file", 1, NULL, 'm' },
|
{ "map-file", 1, NULL, 'm' },
|
||||||
|
{ "pidfile", 1, NULL, 'P' },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
static const char short_options[] = "46cspvVlLa:B:u:U:r:t:T:R:m:";
|
static const char short_options[] = "46cspvVlLa:B:u:U:r:t:T:R:m:P:";
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -352,6 +360,7 @@ int main(int argc, char **argv)
|
||||||
#ifdef WITH_REGEX
|
#ifdef WITH_REGEX
|
||||||
char *rewrite_file = NULL;
|
char *rewrite_file = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
const char *pidfile = NULL;
|
||||||
u_short tp_opcode;
|
u_short tp_opcode;
|
||||||
|
|
||||||
/* basename() is way too much of a pain from a portability standpoint */
|
/* basename() is way too much of a pain from a portability standpoint */
|
||||||
|
@ -475,6 +484,9 @@ int main(int argc, char **argv)
|
||||||
printf("%s\n", TFTPD_CONFIG_STR);
|
printf("%s\n", TFTPD_CONFIG_STR);
|
||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
|
case 'P':
|
||||||
|
pidfile = optarg;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
syslog(LOG_ERR, "Unknown option: '%c'", optopt);
|
syslog(LOG_ERR, "Unknown option: '%c'", optopt);
|
||||||
break;
|
break;
|
||||||
|
@ -507,16 +519,19 @@ int main(int argc, char **argv)
|
||||||
exit(EX_NOUSER);
|
exit(EX_NOUSER);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec_umask || !unixperms)
|
|
||||||
umask(my_umask);
|
|
||||||
|
|
||||||
#ifdef WITH_REGEX
|
#ifdef WITH_REGEX
|
||||||
if (rewrite_file)
|
if (rewrite_file)
|
||||||
rewrite_rules = read_remap_rules(rewrite_file);
|
rewrite_rules = read_remap_rules(rewrite_file);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (pidfile && !standalone) {
|
||||||
|
syslog(LOG_WARNING, "not in standalone mode, ignoring pid file");
|
||||||
|
pidfile = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* If we're running standalone, set up the input port */
|
/* If we're running standalone, set up the input port */
|
||||||
if (standalone) {
|
if (standalone) {
|
||||||
|
FILE *pf;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
if (ai_fam != AF_INET6) {
|
if (ai_fam != AF_INET6) {
|
||||||
#endif
|
#endif
|
||||||
|
@ -702,6 +717,20 @@ int main(int argc, char **argv)
|
||||||
syslog(LOG_ERR, "cannot daemonize: %m");
|
syslog(LOG_ERR, "cannot daemonize: %m");
|
||||||
exit(EX_OSERR);
|
exit(EX_OSERR);
|
||||||
}
|
}
|
||||||
|
set_signal(SIGTERM, handle_exit, 0);
|
||||||
|
set_signal(SIGINT, handle_exit, 0);
|
||||||
|
if (pidfile) {
|
||||||
|
pf = fopen (pidfile, "w");
|
||||||
|
if (!pf) {
|
||||||
|
syslog(LOG_ERR, "cannot open pid file '%s' for writing: %m", pidfile);
|
||||||
|
pidfile = NULL;
|
||||||
|
} else {
|
||||||
|
if (fprintf(pf, "%d\n", getpid()) < 0)
|
||||||
|
syslog(LOG_ERR, "error writing pid file '%s': %m", pidfile);
|
||||||
|
if (fclose(pf))
|
||||||
|
syslog(LOG_ERR, "error closing pid file '%s': %m", pidfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (fd6 > fd4)
|
if (fd6 > fd4)
|
||||||
fdmax = fd6;
|
fdmax = fd6;
|
||||||
else
|
else
|
||||||
|
@ -734,11 +763,23 @@ int main(int argc, char **argv)
|
||||||
lose packets as a result. */
|
lose packets as a result. */
|
||||||
set_signal(SIGHUP, handle_sighup, 0);
|
set_signal(SIGHUP, handle_sighup, 0);
|
||||||
|
|
||||||
|
if (spec_umask || !unixperms)
|
||||||
|
umask(my_umask);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
fd_set readset;
|
fd_set readset;
|
||||||
struct timeval tv_waittime;
|
struct timeval tv_waittime;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
if (exit_signal) { /* happens in standalone mode only */
|
||||||
|
if (pidfile && unlink(pidfile)) {
|
||||||
|
syslog(LOG_WARNING, "error removing pid file '%s': %m", pidfile);
|
||||||
|
exit(EX_OSERR);
|
||||||
|
} else {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (caught_sighup) {
|
if (caught_sighup) {
|
||||||
caught_sighup = 0;
|
caught_sighup = 0;
|
||||||
if (standalone) {
|
if (standalone) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue