/* -*-c-*-
*
- * $Id: fw.c,v 1.16 2003/11/29 20:36:07 mdw Exp $
+ * $Id$
*
* Port forwarding thingy
*
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: fw.c,v $
- * Revision 1.16 2003/11/29 20:36:07 mdw
- * Privileged outgoing connections.
- *
- * Revision 1.15 2003/11/25 14:46:50 mdw
- * Update docco for new options.
- *
- * Revision 1.14 2003/01/24 20:12:40 mdw
- * Correctly cast uid and gid sentinel values.
- *
- * Revision 1.13 2002/02/22 23:45:20 mdw
- * Add option to change the listen(2) parameter. Receive `fw'-specific
- * code from `conf.c'.
- *
- * Revision 1.12 2002/01/13 14:49:17 mdw
- * Track @dstr_vputf@ change.
- *
- * Revision 1.11 2001/02/03 20:33:26 mdw
- * Fix flags to be unsigned.
- *
- * Revision 1.10 2001/02/03 20:30:03 mdw
- * Support re-reading config files on SIGHUP.
- *
- * Revision 1.9 2001/01/20 11:55:17 mdw
- * Handle select errors more robustly.
- *
- * Revision 1.8 2000/03/23 23:19:19 mdw
- * Fix changed options in parser table.
- *
- * Revision 1.7 2000/03/23 00:37:33 mdw
- * Add option to change user and group after initialization. Naughtily
- * reassign short equivalents of --grammar and --options.
- *
- * Revision 1.6 1999/12/22 15:44:10 mdw
- * Make syslog a separate option, and do it better.
- *
- * Revision 1.5 1999/10/22 22:47:50 mdw
- * Grammar changes. Also, don't enable SIGINT if it's currently ignored.
- *
- * Revision 1.4 1999/10/10 16:46:12 mdw
- * New resolver to initialize. Also, include options for grammar and
- * options references.
- *
- * Revision 1.3 1999/07/26 23:30:42 mdw
- * Major reconstruction work for new design.
- *
- * Revision 1.2 1999/07/03 13:55:17 mdw
- * Various changes. Add configuration grammar to help text. Change to
- * root directory and open syslog when forking into background.
- *
- * Revision 1.1.1.1 1999/07/01 08:56:23 mdw
- * Initial revision.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include "config.h"
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\
scanner sc;
uid_t drop = -1;
gid_t dropg = -1;
+ const char *pidfile = 0;
conffile *cf, **cff = &conffiles;
#define f_bogus 1u
{ "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' },
{ 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;
case 'd':
f |= f_fork;
break;
+ case 'p':
+ pidfile = optarg;
+ break;
case 'l':
f |= f_syslog;
break;
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;