/*************************************************
* SIGALRM handler - crash out *
*************************************************/
+int tmo_noerror = 0;
static void
sigalrm_handler(int sig)
{
sig = sig; /* Keep picky compilers happy */
printf("\nServer timed out\n");
-exit(99);
+exit(tmo_noerror ? 0 : 99);
}
line *s;
FILE *in, *out;
int linebuf = 1;
+char *pidfile = NULL;
char *sockname = NULL;
unsigned char buffer[10240];
/* Sort out the arguments */
+if (argc > 1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")))
+ {
+ printf("Usage: %s [options] port|socket [connection count]\n", argv[0]);
+ puts("Options"
+ "\n\t-d debug"
+ "\n\t-i n n seconds initial delay"
+ "\n\t-noipv4 disable ipv4"
+ "\n\t-noipv6 disable ipv6"
+ "\n\t-oP file write PID to file"
+ "\n\t-t n n seconds timeout"
+ );
+ exit(0);
+ }
while (na < argc && argv[na][0] == '-')
{
if (strcmp(argv[na], "-d") == 0) debug = 1;
- else if (strcmp(argv[na], "-t") == 0) timeout = atoi(argv[++na]);
+ else if (strcmp(argv[na], "-t") == 0)
+ {
+ if (tmo_noerror = ((timeout = atoi(argv[++na])) < 0)) timeout = -timeout;
+ }
else if (strcmp(argv[na], "-i") == 0) initial_pause = atoi(argv[++na]);
else if (strcmp(argv[na], "-noipv4") == 0) use_ipv4 = 0;
else if (strcmp(argv[na], "-noipv6") == 0) use_ipv6 = 0;
+ else if (strcmp(argv[na], "-oP") == 0) pidfile = argv[++na];
else
{
- printf("server: unknown option %s\n", argv[na]);
+ printf("server: unknown option %s, try -h or --help\n", argv[na]);
exit(1);
}
na++;
}
+if (pidfile)
+ {
+ FILE * p;
+ if (!(p = fopen(pidfile, "w")))
+ {
+ fprintf(stderr, "pidfile create failed: %s\n", strerror(errno));
+ exit(1);
+ }
+ fprintf(p, "%ld\n", (long)getpid());
+ fclose(p);
+ }
+
/* This program handles only a fixed number of connections, in sequence. Before
waiting for the first connection, read the standard input, which contains the
script of things to do. A line containing "++++" is treated as end of file.
cr.pid, cr.uid, cr.gid);
--------------*****************/
}
+ fflush(stdout);
if (dup_accept_socket < 0)
{