#include "fattr.h"
#include "file.h"
#include "fw.h"
+#include "mantext.h"
#include "privconn.h"
#include "scan.h"
#include "socket.h"
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)
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\
\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\
");
}
static void grammar(FILE *fp)
{
version(fp);
- pquis(fp, "\n\
-Grammar summary\n\
-\n\
-Basic syntax\n\
- FILE ::= EMPTY | FILE STMT [`;']\n\
- STMT ::= OPTION-STMT | FW-STMT\n\
- FW-STMT ::= `fw' SOURCE OPTIONS [`to'|`->'] TARGET OPTIONS\n\
- OPTIONS ::= `{' OPTION-SEQ `}'\n\
- OPTION-SEQ ::= EMPTY | OPTION-STMT [`;'] OPTION-SEQ\n\
-\n\
-Option syntax\n\
- OPTION-STMT ::= Q-OPTION\n\
- Q-OPTION ::= OPTION\n\
- | PREFIX `.' Q-OPTION\n\
- | PREFIX `{' OPTION-SEQ `}'\n\
- PREFIX ::= WORD\n\
-\n\
-File source and target\n\
- SOURCE ::= FILE\n\
- TARGET ::= FILE\n\
- FILE ::= `file' [`.'] FSPEC [`,' FSPEC]\n\
- FSPEC ::= FD-SPEC | NAME-SPEC | NULL-SPEC\n\
- FD-SPEC ::= [[`:']`fd'[`:']] NUMBER|`stdin'|`stdout'\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\
- NULL-SPEC ::= [`:']`null'[`:']\n\
-\n\
-Exec source and target\n\
- SOURCE ::= EXEC\n\
- TARGET ::= EXEC\n\
- EXEC ::= `exec' [`.'] CMD-SPEC\n\
- CMD-SPEC ::= SHELL-CMD | [PROG-NAME] `[' ARGV0 ARG-SEQ `]'\n\
- ARG-SEQ ::= WORD | ARG-SEQ WORD\n\
- SHELL-CMD ::= WORD\n\
- ARGV0 ::= WORD\n\
-\n\
-Socket source and target\n\
- SOURCE ::= SOCKET-SOURCE\n\
- TARGET ::= SOCKET-TARGET\n\
- SOCKET-SOURCE ::= [`socket'[`.']] [[`:']ADDR-TYPE[`:']] SOURCE-ADDR\n\
- SOCKET-TARGET ::= [`socket'[`.']] [[`:']ADDR-TYPE[`:']] TARGET-ADDR\n\
-\n\
- INET-SOURCE-ADDR ::= [`port'] PORT\n\
- INET-TARGET-ADDR ::= ADDRESS [`:'] PORT\n\
- ADDRESS ::= ADDR-ELT | ADDRESS ADDR-ELT\n\
- ADDR-ELT ::= `.' | WORD\n\
-\n\
- UNIX-SOURCE-ADDR ::= FILE-NAME\n\
- UNIX-TARGET-ADDR ::= FILE-NAME\n\
-");
+ fputs("\nGrammar summary\n\n", fp);
+ fputs(grammar_text, fp);
}
static void options(FILE *fp)
{
version(fp);
- pquis(fp, "\n\
-Options summary\n\
-\n\
-File attributes (`fattr')\n\
- prefix.FATTR.MODE [=] MODE\n\
- prefix.FATTR.OWNER [=] USER\n\
- prefix.FATTR.GROUP [=] GROUP\n\
-\n\
-File options\n\
- file.create [=] yes|no\n\
- file.open [=] no|truncate|append\n\
- file.fattr.*\n\
-\n\
-Exec options\n\
- exec.logging [=] yes|no\n\
- exec.dir [=] FILE-NAME\n\
- exec.root [=] FILE-NAME\n\
- exec.user [=] USER\n\
- exec.group [=] GROUP\n\
- exec.rlimit.LIMIT[.hard|.soft] [=] VALUE\n\
- exec.env.clear\n\
- exec.env.unset VAR\n\
- exec.env.[set] VAR [=] VALUE\n\
-\n\
-Socket options\n\
- socket.conn [=] NUMBER|unlimited|one-shot\n\
- socket.listen [=] NUMBER\n\
- socket.logging [=] yes|no\n\
-\n\
- socket.inet.source.[allow|deny] [host] ADDR [/ ADDR]\n\
- socket.inet.source.[allow|deny] priv-port\n\
- socket.inet.source.addr [=] any|ADDR\n\
- socket.inet.dest.addr [=] any|ADDR\n\
- socket.inet.dest.priv-port [=] yes|no\n\
-\n\
- socket.unix.fattr.*\n\
-");
+ fputs("\nOption summary\n\n", fp);
+ fputs(option_text, fp);
}
/* --- @main@ --- *