$NetBSD: patch-ab,v 1.3 2006/05/12 03:07:14 simonb Exp $ --- nttcp.c.orig 2000-12-18 21:16:54.000000000 +1100 +++ nttcp.c @@ -136,9 +136,9 @@ void syslog(int priority, const char *me #endif /* aix */ /*====================================================================*/ -#if defined(FreeBSD) +#ifndef SIGCLD #define SIGCLD SIGCHLD -#endif /*FreeBSD*/ +#endif /*SIGCLD*/ /*====================================================================*/ #if defined(BSD42) @@ -268,6 +268,7 @@ Usage: nttcp [local options] host [remot \t-n# number of source bufs written to network (default 2048)\n\ \t-u use UDP instead of TCP\n\ \t-g#us gap in micro seconds between UDP packets (default 0s)\n\ +\t-U# run until a number of seconds have elapsed\n\ \t-d set SO_DEBUG in sockopt\n\ \t-D don't buffer TCP writes (sets TCP_NODELAY socket option)\n\ \t-w# set the send buffer space to #kilobytes, which is\n\ @@ -346,6 +347,7 @@ typedef struct { int FixedDataSize; /* if>0: calc BufCnt/BufLen from this */ int Window, SndWin, RcvWin; /* TCP window sizes */ int Verbose; /* ==1: more diagnostics */ + int RunTime; /* approximate runtime in seconds */ char *MulticastChannel; /* we send multicast traffic */ short MulticastPort; int GapLength; /* Gap length between packets */ @@ -496,6 +498,13 @@ void StartTimer() { SysCalls=0; } +int CheckTimer() { + TimeVal now; + + gettimeofday(&now, (struct timezone *)0); + return opt.RunTime < (now.tv_sec - time0.tv_sec); +} + void StopTimer(double *cput, double *realt) { /* delivers in cput: the amount of cpu time in seconds * in realt: the real time in seconds @@ -878,6 +887,7 @@ void InitOptions(Options *opt) { opt->Verbose=0; /* ==1: more diagnostics */ opt->GapLength=0; /* no delay, send as fast as possible */ opt->inetd= 0; /* ==1: run in inetd mode */ + opt->RunTime = 0; /* run effectively forever (ie BufCnt is limiting factor) */ opt->Service= GetService(); /* the service-port to listen to */ opt->MulticastChannel= NULL; opt->MulticastPort= 0; @@ -1013,6 +1023,10 @@ void ParseOptions(int *ac, char **av[], #endif /*MULTICAST*/ break; } + case 'U': + GetSizeValue(&argc, &argv, &opt->RunTime, 1000000000, + "runtime"); + break; default: { strcpy(MsgBuf, "unknown option: "); strncat(MsgBuf, argv[0], sizeof(MsgBuf)-strlen(MsgBuf)-1); @@ -1427,6 +1441,10 @@ int main(int argc, char *argv[]) { sprintf(OptBuf, "-g%d", opt.GapLength); StrVecAppend(RemOpt, OptBuf); } + if (opt.RunTime > 0) { + sprintf(OptBuf, "-U%d", opt.RunTime); + StrVecAppend(RemOpt, OptBuf); + } if (opt.MulticastChannel) { sprintf(OptBuf, "-m%s:%d", opt.MulticastChannel, opt.MulticastPort); @@ -1781,9 +1799,17 @@ int main(int argc, char *argv[]) { else Pattern(buf, opt.BufLen); StartTimer(); - while (n-- && Nwrite(fd, buf, opt.BufLen) == opt.BufLen) { + while (Nwrite(fd, buf, opt.BufLen) == opt.BufLen) { nBytes+= opt.BufLen; nBuffer++; + if (opt.RunTime == 0) { + if (--n == 0) + break; + } else { + /* XXX: tune how often to check if timer has expired? */ + if ((nBuffer % 100 == 0) && CheckTimer()) + break; + } } StopTimer(&cput, &realt); opt.GapLength= 0; @@ -1797,9 +1823,17 @@ int main(int argc, char *argv[]) { nBytes= 0; nBuffer= 0; StartTimer(); - while (n-- && Nwrite(fd, buf, opt.BufLen) == opt.BufLen) { + while (Nwrite(fd, buf, opt.BufLen) == opt.BufLen) { nBytes+= opt.BufLen; nBuffer++; + if (opt.RunTime == 0) { + if (--n == 0) + break; + } else { + /* XXX: tune how often to check if timer has expired? */ + if ((nBuffer % 100 == 0) && CheckTimer()) + break; + } } StopTimer(&cput, &realt); }