X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/7481fc9c5a603e35a6972c0be07d18d507e5dd50..c42fddf370ae87fed818416a21da6f025a033eb3:/fw.c diff --git a/fw.c b/fw.c index 59bc18f..6f886e5 100644 --- a/fw.c +++ b/fw.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: fw.c,v 1.17 2004/04/08 01:36:25 mdw Exp $ + * $Id$ * * Port forwarding thingy * @@ -417,7 +417,7 @@ static void version(FILE *fp) static void usage(FILE *fp) { - pquis(fp, "Usage: $ [-dql] [-f file] [config statements...]\n"); + pquis(fp, "Usage: $ [-dql] [-p PIDFILE] [-f FILE] [CONFIG-STMTS...]\n"); } static void help(FILE *fp) @@ -427,22 +427,7 @@ static void help(FILE *fp) usage(fp); pquis(fp, "\n\ An excessively full-featured port-forwarder, which subsumes large chunks\n\ -of the functionality of inetd, netcat, and normal cat. Options available\n\ -are:\n\ -\n\ --h, --help Display this help message.\n\ --v, --version Display the program's version number.\n\ --u, --usage Display a terse usage summary.\n\ -\n\ --G, --grammar Show a summary of the configuration language.\n\ --O, --options Show a summary of the source and target options.\n\ -\n\ --f, --file=FILE Read configuration from a file.\n\ --q, --quiet Don't emit any logging information.\n\ --d, --daemon Fork into background after initializing.\n\ --l, --syslog Send log output to the system logger.\n\ --s, --setuid=USER Change uid to USER after initializing sources.\n\ --g, --setgid=GRP Change gid to GRP after initializing sources.\n\ +of the functionality of inetd, netcat, and normal cat.\n\ \n\ Configuration may be supplied in one or more configuration files, or on\n\ the command line (or both). If no `-f' option is present, and no\n\ @@ -455,6 +440,26 @@ to be a separate line.\n\ \n\ The grammar is fairly complicated. For a summary, run `$ --grammar'.\n\ For a summary of the various options, run `$ --options'.\n\ +\n\ +Options available are:\n\ +\n\ +Help options:\n\ + -h, --help Display this help message.\n\ + -v, --version Display the program's version number.\n\ + -u, --usage Display a terse usage summary.\n\ +\n\ +Configuration summary:\n\ + -G, --grammar Show a summary of the configuration language.\n\ + -O, --options Show a summary of the source and target options.\n\ +\n\ +Other options:\n\ + -f, --file=FILE Read configuration from a file.\n\ + -q, --quiet Don't emit any logging information.\n\ + -d, --daemon Fork into background after initializing.\n\ + -p, --pidfile=FILE Write process-id to the named FILE.\n\ + -l, --syslog Send log output to the system logger.\n\ + -s, --setuid=USER Change uid to USER after initializing sources.\n\ + -g, --setgid=GRP Change gid to GRP after initializing sources.\n\ "); } @@ -486,7 +491,7 @@ File source and target\n\ FILE ::= `file' [`.'] FSPEC [`,' FSPEC]\n\ FSPEC ::= FD-SPEC | NAME-SPEC | NULL-SPEC\n\ FD-SPEC ::= [[`:']`fd'[`:']] NUMBER|`stdin'|`stdout'\n\ - NAME-SPEC ::= [[`:']`file'[`:']] FILE-NAME\n\ + NAME-SPEC ::= [[`:']`name'[`:']] FILE-NAME\n\ FILE-NAME ::= PATH-SEQ | [ PATH-SEQ ]\n\ PATH-SEQ ::= PATH-ELT | PATH-SEQ PATH-ELT\n\ PATH-ELT ::= `/' | WORD\n\ @@ -577,6 +582,7 @@ int main(int argc, char *argv[]) scanner sc; uid_t drop = -1; gid_t dropg = -1; + const char *pidfile = 0; conffile *cf, **cff = &conffiles; #define f_bogus 1u @@ -620,6 +626,7 @@ int main(int argc, char *argv[]) { "file", OPTF_ARGREQ, 0, 'f' }, { "fork", 0, 0, 'd' }, { "daemon", 0, 0, 'd' }, + { "pidfile", OPTF_ARGREQ, 0, 'p' }, { "syslog", 0, 0, 'l' }, { "log", 0, 0, 'l' }, { "quiet", 0, 0, 'q' }, @@ -632,7 +639,7 @@ int main(int argc, char *argv[]) { 0, 0, 0, 0 } }; - int i = mdwopt(argc, argv, "+hvu GO f:dls:g:", opts, 0, 0, 0); + int i = mdwopt(argc, argv, "+hvu" "GO" "f:dp:ls:g:", opts, 0, 0, 0); if (i < 0) break; @@ -675,6 +682,9 @@ int main(int argc, char *argv[]) case 'd': f |= f_fork; break; + case 'p': + pidfile = optarg; + break; case 'l': f |= f_syslog; break; @@ -786,6 +796,18 @@ int main(int argc, char *argv[]) if (kid != 0) _exit(0); } + if (pidfile) { + FILE *fp = fopen(pidfile, "w"); + if (!fp) { + die(EXIT_FAILURE, "couldn't create pidfile `%s': %s", + pidfile, strerror(errno)); + } + fprintf(fp, "%lu\n", (unsigned long)getpid()); + if (fflush(fp) || ferror(fp) || fclose(fp)) { + die(EXIT_FAILURE, "couldn't write pidfile `%s': %s", + pidfile, strerror(errno)); + } + } if (f & f_syslog) { flags |= FW_SYSLOG;