/*************************************************
* 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);
}
/* Sort out the arguments */
if (argc > 1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")))
{
- printf("Usage: %s [options]\n", argv[0]);
+ 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"
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;
cr.pid, cr.uid, cr.gid);
--------------*****************/
}
+ fflush(stdout);
if (dup_accept_socket < 0)
{
sleep(sleepfor);
}
+ /* If the script line starts with "*data " we expect a numeric argument,
+ and we expect to read (and discard) that many data bytes from the input. */
+
+ else if (strncmp(ss, "*data ", 6) == 0)
+ {
+ int dlen = atoi(ss+6);
+ int n;
+
+ alarm(timeout);
+
+ if (!linebuf)
+ while (dlen > 0)
+ {
+ n = dlen < sizeof(buffer) ? dlen : sizeof(buffer);
+ if ((n = read(dup_accept_socket, CS buffer, n)) == 0)
+ {
+ printf("Unxpected EOF read from client\n");
+ s = s->next;
+ goto END_OFF;
+ }
+ dlen -= n;
+ }
+ else
+ while (dlen-- > 0)
+ if (fgetc(in) == EOF)
+ {
+ printf("Unxpected EOF read from client\n");
+ s = s->next;
+ goto END_OFF;
+ }
+ }
+
/* Otherwise the script line is the start of an input line we are expecting
from the client, or "*eof" indicating we expect the client to close the
connection. Read command line or data lines; the latter are indicated