Subject: Re: pkg/33897: benchmarks/ttcp is not 64-bit clean (alpha/ultrasparc)
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: Erik E. Fair <fair@netbsd.org>
List: pkgsrc-bugs
Date: 07/03/2006 08:55:02
The following reply was made to PR pkg/33897; it has been noted by GNATS.

From: "Erik E. Fair" <fair@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/33897: benchmarks/ttcp is not 64-bit clean (alpha/ultrasparc) 
Date: Mon, 03 Jul 2006 01:53:55 -0700

 *** ttcp.c.orig	Thu Feb 27 13:30:23 1997
 --- ttcp.c	Sun Jul  2 20:12:26 2006
 ***************
 *** 31,36 ****
 --- 31,38 ----
    * Modified Oct. 1991 at Silicon Graphics, Inc.
    *	use getopt(3) for option processing, add -f and -T options.
    *	SGI IRIX 3.3 and 4.0 releases don't need #define SYSV.
 +  * Modified July 2006 by the NetBSD Project
 +  *      for modern APIs and LP64
    *
    * Distribution Status -
    *      Public Domain.  Distribution Unlimited.
 ***************
 *** 44,49 ****
 --- 46,55 ----
   /* #define BSD41a */
   /* #define SYSV */	/* required on SGI IRIX releases before 3.3 */
   
 + #include <unistd.h>
 + #include <stdlib.h>
 + #include <string.h>
 + #include <strings.h>
   #include <stdio.h>
   #include <signal.h>
   #include <ctype.h>
 ***************
 *** 67,90 ****
   #include <sys/resource.h>
   #endif
   
 ! struct sockaddr_in sinme;
 ! struct sockaddr_in sinhim;
 ! struct sockaddr_in frominet;
   
 ! int domain, fromlen;
   int fd;				/* fd of network socket */
   
 ! int buflen = 8 * 1024;		/* length of buffer */
   char *buf;			/* ptr to dynamic buffer */
 ! int nbuf = 2 * 1024;		/* number of buffers to send in sinkmode */
   
   int bufoffset = 0;		/* align buffer to this */
 ! int bufalign = 16*1024;		/* modulo this */
   
   int udp = 0;			/* 0 = tcp, !0 = udp */
   int options = 0;		/* socket options */
   int one = 1;                    /* for 4.3 BSD style setsockopt() */
 ! short port = 5001;		/* TCP port number */
   char *host;			/* ptr to name of host */
   int trans;			/* 0=receive, !0=transmit mode */
   int sinkmode = 0;		/* 0=normal I/O, !0=sink/source mode */
 --- 73,136 ----
   #include <sys/resource.h>
   #endif
   
 ! /* time to ANSIfy */
   
 ! void	delay( long us );
 ! 
 ! ssize_t	mread( int fd, void *bufp, size_t n );
 ! 
 ! ssize_t	Nwrite( int fd, void *buf, size_t count );
 ! 
 ! ssize_t	Nread( int fd, void *buf, size_t count );
 ! 
 ! void	mes( const char *s );
 ! 
 ! static void	err( const char *s );
 ! 
 ! void	pattern( char *cp, ssize_t cnt );
 ! 
 ! void	prep_timer();
 ! 
 ! double	read_timer( char *str, size_t len );
 ! 
 ! char *	outfmt( double b );
 ! 
 ! static void	prusage( struct rusage *r0, struct rusage *r1,
 ! 	struct timeval *e, struct timeval *b, char *outp );
 ! 
 ! static void	tvadd( struct timeval *tsum, struct timeval *t0, struct timeval *t1 );
 ! 
 ! static void	tvsub( struct timeval *tdiff, struct timeval *t1, struct timeval *t0 );
 ! 
 ! static void	psecs( long l, char *cp );
 ! 
 ! #define	DEFPORT		5001
 ! #define	DEFALIGN	(16 * 1024)
 ! #define	DEFBUFSZ	(8 * 1024)
 ! #define	DEFNBUFS2SEND	(2 * 1024)
 ! 
 ! #define	KILO		1000
 ! #define	MEGA		(KILO * KILO)
 ! #define	GIGA		(MEGA * KILO)
 ! 
 ! struct sockaddr_in sinme = { sizeof(struct sockaddr_in), AF_INET, DEFPORT };
 ! struct sockaddr_in sinhim = { sizeof(struct sockaddr_in), AF_INET, DEFPORT };
 ! struct sockaddr_in frominet = { sizeof(struct sockaddr_in), AF_INET, DEFPORT };
 ! 
 ! socklen_t fromlen;
   int fd;				/* fd of network socket */
   
 ! ssize_t buflen = DEFBUFSZ;	/* length of buffer */
   char *buf;			/* ptr to dynamic buffer */
 ! int nbuf = DEFNBUFS2SEND;	/* number of buffers to send in sinkmode */
   
   int bufoffset = 0;		/* align buffer to this */
 ! int bufalign = DEFALIGN;	/* modulo this */
   
   int udp = 0;			/* 0 = tcp, !0 = udp */
   int options = 0;		/* socket options */
   int one = 1;                    /* for 4.3 BSD style setsockopt() */
 ! in_port_t port = DEFPORT;	/* TCP port number */
   char *host;			/* ptr to name of host */
   int trans;			/* 0=receive, !0=transmit mode */
   int sinkmode = 0;		/* 0=normal I/O, !0=sink/source mode */
 ***************
 *** 107,125 ****
   Usage: ttcp -t [-options] host [ < in ]\n\
          ttcp -r [-options > out]\n\
   Common options:\n\
 ! 	-l ##	length of bufs read from or written to network (default 8192)\n\
   	-u	use UDP instead of TCP\n\
 ! 	-p ##	port number to send to or listen at (default 5001)\n\
   	-s	-t: source a pattern to network\n\
   		-r: sink (discard) all data from network\n\
 ! 	-A	align the start of buffers to this modulus (default 16384)\n\
   	-O	start buffers at this offset from the modulus (default 0)\n\
   	-v	verbose: print more statistics\n\
   	-d	set SO_DEBUG socket option\n\
   	-b ##	set socket buffer size (if supported)\n\
   	-f X	format for rate: k,K = kilo{bit,byte}; m,M = mega; g,G = giga\n\
   Options specific to -t:\n\
 ! 	-n##	number of source bufs written to network (default 2048)\n\
   	-D	don't buffer TCP writes (sets TCP_NODELAY socket option)\n\
   Options specific to -r:\n\
   	-B	for -s, only output full blocks as specified by -l (for TAR)\n\
 --- 153,171 ----
   Usage: ttcp -t [-options] host [ < in ]\n\
          ttcp -r [-options > out]\n\
   Common options:\n\
 ! 	-l ##	length of bufs read from or written to network (default %lu)\n\
   	-u	use UDP instead of TCP\n\
 ! 	-p ##	port number to send to or listen at (default %u)\n\
   	-s	-t: source a pattern to network\n\
   		-r: sink (discard) all data from network\n\
 ! 	-A	align the start of buffers to this modulus (default %u)\n\
   	-O	start buffers at this offset from the modulus (default 0)\n\
   	-v	verbose: print more statistics\n\
   	-d	set SO_DEBUG socket option\n\
   	-b ##	set socket buffer size (if supported)\n\
   	-f X	format for rate: k,K = kilo{bit,byte}; m,M = mega; g,G = giga\n\
   Options specific to -t:\n\
 ! 	-n##	number of source bufs written to network (default %u)\n\
   	-D	don't buffer TCP writes (sets TCP_NODELAY socket option)\n\
   Options specific to -r:\n\
   	-B	for -s, only output full blocks as specified by -l (for TAR)\n\
 ***************
 *** 131,155 ****
   unsigned long numCalls;		/* # of I/O system calls */
   double cput, realt;		/* user, real time (seconds) */
   
 - void err();
 - void mes();
 - int pattern();
 - void prep_timer();
 - double read_timer();
 - int Nread();
 - int Nwrite();
 - void delay();
 - int mread();
 - char *outfmt();
 - 
   void
   sigpipe()
   {
   }
   
 ! main(argc,argv)
 ! int argc;
 ! char **argv;
   {
   	unsigned long addr_tmp;
   	int c;
 --- 177,189 ----
   unsigned long numCalls;		/* # of I/O system calls */
   double cput, realt;		/* user, real time (seconds) */
   
   void
   sigpipe()
   {
   }
   
 ! int
 ! main( int argc, char **argv )
   {
   	unsigned long addr_tmp;
   	int c;
 ***************
 *** 263,280 ****
   	if ( (buf = (char *)malloc(buflen+bufalign)) == (char *)NULL)
   		err("malloc");
   	if (bufalign != 0)
 ! 		buf +=(bufalign - ((int)buf % bufalign) + bufoffset) % bufalign;
   
   	if (trans) {
   	    fprintf(stdout,
 ! 	    "ttcp-t: buflen=%d, nbuf=%d, align=%d/%d, port=%d",
   		buflen, nbuf, bufalign, bufoffset, port);
    	    if (sockbufsize)
    		fprintf(stdout, ", sockbufsize=%d", sockbufsize);
    	    fprintf(stdout, "  %s  -> %s\n", udp?"udp":"tcp", host);
   	} else {
   	    fprintf(stdout,
 !  	    "ttcp-r: buflen=%d, nbuf=%d, align=%d/%d, port=%d",
    		buflen, nbuf, bufalign, bufoffset, port);
    	    if (sockbufsize)
    		fprintf(stdout, ", sockbufsize=%d", sockbufsize);
 --- 297,314 ----
   	if ( (buf = (char *)malloc(buflen+bufalign)) == (char *)NULL)
   		err("malloc");
   	if (bufalign != 0)
 ! 		buf +=(bufalign - ((unsigned int)buf % bufalign) + bufoffset) % bufalign;
   
   	if (trans) {
   	    fprintf(stdout,
 ! 	    "ttcp-t: buflen=%lu, nbuf=%d, align=%d/%d, port=%d",
   		buflen, nbuf, bufalign, bufoffset, port);
    	    if (sockbufsize)
    		fprintf(stdout, ", sockbufsize=%d", sockbufsize);
    	    fprintf(stdout, "  %s  -> %s\n", udp?"udp":"tcp", host);
   	} else {
   	    fprintf(stdout,
 !  	    "ttcp-r: buflen=%lu, nbuf=%d, align=%d/%d, port=%d",
    		buflen, nbuf, bufalign, bufoffset, port);
    	    if (sockbufsize)
    		fprintf(stdout, ", sockbufsize=%d", sockbufsize);
 ***************
 *** 285,291 ****
   		err("socket");
   	mes("socket");
   
 ! 	if (bind(fd, &sinme, sizeof(sinme)) < 0)
   		err("bind");
   
   #if defined(SO_SNDBUF) || defined(SO_RCVBUF)
 --- 319,325 ----
   		err("socket");
   	mes("socket");
   
 ! 	if (bind(fd, (struct sockaddr *)&sinme, sizeof(sinme)) < 0)
   		err("bind");
   
   #if defined(SO_SNDBUF) || defined(SO_RCVBUF)
 ***************
 *** 326,332 ****
   			mes("nodelay");
   		}
   #endif
 ! 		if(connect(fd, &sinhim, sizeof(sinhim) ) < 0)
   			err("connect");
   		mes("connect");
   	    } else {
 --- 360,366 ----
   			mes("nodelay");
   		}
   #endif
 ! 		if(connect(fd, (struct sockaddr *)&sinhim, sizeof(sinhim) ) < 0)
   			err("connect");
   		mes("connect");
   	    } else {
 ***************
 *** 347,370 ****
   				err("setsockopt");
   		}
   		fromlen = sizeof(frominet);
 ! 		domain = AF_INET;
 ! 		if((fd=accept(fd, &frominet, &fromlen) ) < 0)
   			err("accept");
 ! 		{ struct sockaddr_in peer;
 ! 		  int peerlen = sizeof(peer);
 ! 		  if (getpeername(fd, (struct sockaddr_in *) &peer, 
   				&peerlen) < 0) {
   			err("getpeername");
   		  }
   		  fprintf(stderr,"ttcp-r: accept from %s\n", 
 ! 			inet_ntoa(peer.sin_addr));
   		}
   	    }
   	}
   	prep_timer();
   	errno = 0;
   	if (sinkmode) {      
 ! 		register int cnt;
   		if (trans)  {
   			pattern( buf, buflen );
   			if(udp)  (void)Nwrite( fd, buf, 4 ); /* rcvr start */
 --- 381,403 ----
   				err("setsockopt");
   		}
   		fromlen = sizeof(frominet);
 ! 		if((fd=accept(fd, (struct sockaddr *)&frominet, &fromlen) ) < 0)
   			err("accept");
 ! 		{ struct sockaddr_storage peer;
 ! 		  socklen_t peerlen = sizeof(peer);
 ! 		  if (getpeername(fd,  (struct sockaddr *)&peer, 
   				&peerlen) < 0) {
   			err("getpeername");
   		  }
   		  fprintf(stderr,"ttcp-r: accept from %s\n", 
 ! 			inet_ntoa(((struct sockaddr_in *)&peer)->sin_addr));
   		}
   	    }
   	}
   	prep_timer();
   	errno = 0;
   	if (sinkmode) {      
 ! 		ssize_t cnt;
   		if (trans)  {
   			pattern( buf, buflen );
   			if(udp)  (void)Nwrite( fd, buf, 4 ); /* rcvr start */
 ***************
 *** 391,397 ****
   			}
   		}
   	} else {
 ! 		register int cnt;
   		if (trans)  {
   			while((cnt=read(0,buf,buflen)) > 0 &&
   			    Nwrite(fd,buf,cnt) == cnt)
 --- 424,430 ----
   			}
   		}
   	} else {
 ! 		ssize_t cnt;
   		if (trans)  {
   			while((cnt=read(0,buf,buflen)) > 0 &&
   			    Nwrite(fd,buf,cnt) == cnt)
 ***************
 *** 423,429 ****
   		nbytes, cput, outfmt(nbytes/cput));
   	}
   	fprintf(stdout,
 ! 		"ttcp%s: %d I/O calls, msec/call = %.2f, calls/sec = %.2f\n",
   		trans?"-t":"-r",
   		numCalls,
   		1024.0 * realt/((double)numCalls),
 --- 456,462 ----
   		nbytes, cput, outfmt(nbytes/cput));
   	}
   	fprintf(stdout,
 ! 		"ttcp%s: %lu I/O calls, msec/call = %.2f, calls/sec = %.2f\n",
   		trans?"-t":"-r",
   		numCalls,
   		1024.0 * realt/((double)numCalls),
 ***************
 *** 438,450 ****
   	exit(0);
   
   usage:
 ! 	fprintf(stderr,Usage);
   	exit(1);
   }
   
 ! void
 ! err(s)
 ! char *s;
   {
   	fprintf(stderr,"ttcp%s: ", trans?"-t":"-r");
   	perror(s);
 --- 471,482 ----
   	exit(0);
   
   usage:
 ! 	fprintf(stderr, Usage, DEFBUFSZ, DEFPORT, DEFALIGN, DEFNBUFS2SEND);
   	exit(1);
   }
   
 ! static void
 ! err( const char *s )
   {
   	fprintf(stderr,"ttcp%s: ", trans?"-t":"-r");
   	perror(s);
 ***************
 *** 453,470 ****
   }
   
   void
 ! mes(s)
 ! char *s;
   {
   	fprintf(stderr,"ttcp%s: %s\n", trans?"-t":"-r", s);
   }
   
 ! pattern( cp, cnt )
 ! register char *cp;
 ! register int cnt;
   {
 ! 	register char c;
 ! 	c = 0;
   	while( cnt-- > 0 )  {
   		while( !isprint((c&0x7F)) )  c++;
   		*cp++ = (c++&0x7F);
 --- 485,500 ----
   }
   
   void
 ! mes( const char *s )
   {
   	fprintf(stderr,"ttcp%s: %s\n", trans?"-t":"-r", s);
   }
   
 ! void
 ! pattern( char *cp, ssize_t cnt )
   {
 ! 	char c = 0;
 ! 
   	while( cnt-- > 0 )  {
   		while( !isprint((c&0x7F)) )  c++;
   		*cp++ = (c++&0x7F);
 ***************
 *** 472,500 ****
   }
   
   char *
 ! outfmt(b)
 ! double b;
   {
       static char obuf[50];
       switch (fmt) {
   	case 'G':
 ! 	    sprintf(obuf, "%.2f GB", b / 1024.0 / 1024.0 / 1024.0);
   	    break;
   	default:
   	case 'K':
 ! 	    sprintf(obuf, "%.2f KB", b / 1024.0);
   	    break;
   	case 'M':
 ! 	    sprintf(obuf, "%.2f MB", b / 1024.0 / 1024.0);
   	    break;
   	case 'g':
 ! 	    sprintf(obuf, "%.2f Gbit", b * 8.0 / 1024.0 / 1024.0 / 1024.0);
   	    break;
   	case 'k':
 ! 	    sprintf(obuf, "%.2f Kbit", b * 8.0 / 1024.0);
   	    break;
   	case 'm':
 ! 	    sprintf(obuf, "%.2f Mbit", b * 8.0 / 1024.0 / 1024.0);
   	    break;
       }
       return obuf;
 --- 502,529 ----
   }
   
   char *
 ! outfmt( double b )
   {
       static char obuf[50];
       switch (fmt) {
   	case 'G':
 ! 	    sprintf(obuf, "%.2f GB", b / (double)GIGA);
   	    break;
   	default:
   	case 'K':
 ! 	    sprintf(obuf, "%.2f KB", b / (double)KILO);
   	    break;
   	case 'M':
 ! 	    sprintf(obuf, "%.2f MB", b / (double)MEGA);
   	    break;
   	case 'g':
 ! 	    sprintf(obuf, "%.2f Gbit", b * 8.0 / (double)GIGA);
   	    break;
   	case 'k':
 ! 	    sprintf(obuf, "%.2f Kbit", b * 8.0 / (double)KILO);
   	    break;
   	case 'm':
 ! 	    sprintf(obuf, "%.2f Mbit", b * 8.0 / (double)MEGA);
   	    break;
       }
       return obuf;
 ***************
 *** 503,513 ****
   static struct	timeval time0;	/* Time at which timing started */
   static struct	rusage ru0;	/* Resource utilization at the start */
   
 - static void prusage();
 - static void tvadd();
 - static void tvsub();
 - static void psecs();
 - 
   #if defined(SYSV)
   /*ARGSUSED*/
   static
 --- 532,537 ----
 ***************
 *** 552,559 ****
    * 
    */
   double
 ! read_timer(str,len)
 ! char *str;
   {
   	struct timeval timedol;
   	struct rusage ru1;
 --- 576,582 ----
    * 
    */
   double
 ! read_timer( char *str, size_t len )
   {
   	struct timeval timedol;
   	struct rusage ru1;
 ***************
 *** 580,595 ****
   }
   
   static void
 ! prusage(r0, r1, e, b, outp)
 ! 	register struct rusage *r0, *r1;
 ! 	struct timeval *e, *b;
 ! 	char *outp;
   {
   	struct timeval tdiff;
   	register time_t t;
   	register char *cp;
 ! 	register int i;
 ! 	int ms;
   
   	t = (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+
   	    (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+
 --- 603,614 ----
   }
   
   static void
 ! prusage( struct rusage *r0, struct rusage *r1, struct timeval *e, struct timeval *b, char *outp )
   {
   	struct timeval tdiff;
   	register time_t t;
   	register char *cp;
 ! 	long ms, i;
   
   	t = (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+
   	    (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+
 ***************
 *** 614,690 ****
   
   		case 'U':
   			tvsub(&tdiff, &r1->ru_utime, &r0->ru_utime);
 ! 			sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000);
   			END(outp);
   			break;
   
   		case 'S':
   			tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime);
 ! 			sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000);
   			END(outp);
   			break;
   
   		case 'E':
 ! 			psecs(ms / 100, outp);
   			END(outp);
   			break;
   
   		case 'P':
 ! 			sprintf(outp,"%d%%", (int) (t*100 / ((ms ? ms : 1))));
   			END(outp);
   			break;
   
   #if !defined(SYSV)
   		case 'W':
   			i = r1->ru_nswap - r0->ru_nswap;
 ! 			sprintf(outp,"%d", i);
   			END(outp);
   			break;
   
   		case 'X':
 ! 			sprintf(outp,"%d", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t);
   			END(outp);
   			break;
   
   		case 'D':
 ! 			sprintf(outp,"%d", t == 0 ? 0 :
   			    (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t);
   			END(outp);
   			break;
   
   		case 'K':
 ! 			sprintf(outp,"%d", t == 0 ? 0 :
   			    ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) -
   			    (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t);
   			END(outp);
   			break;
   
   		case 'M':
 ! 			sprintf(outp,"%d", r1->ru_maxrss/2);
   			END(outp);
   			break;
   
   		case 'F':
 ! 			sprintf(outp,"%d", r1->ru_majflt-r0->ru_majflt);
   			END(outp);
   			break;
   
   		case 'R':
 ! 			sprintf(outp,"%d", r1->ru_minflt-r0->ru_minflt);
   			END(outp);
   			break;
   
   		case 'I':
 ! 			sprintf(outp,"%d", r1->ru_inblock-r0->ru_inblock);
   			END(outp);
   			break;
   
   		case 'O':
 ! 			sprintf(outp,"%d", r1->ru_oublock-r0->ru_oublock);
   			END(outp);
   			break;
   		case 'C':
 ! 			sprintf(outp,"%d+%d", r1->ru_nvcsw-r0->ru_nvcsw,
   				r1->ru_nivcsw-r0->ru_nivcsw );
   			END(outp);
   			break;
 --- 633,709 ----
   
   		case 'U':
   			tvsub(&tdiff, &r1->ru_utime, &r0->ru_utime);
 ! 			sprintf(outp,"%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000);
   			END(outp);
   			break;
   
   		case 'S':
   			tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime);
 ! 			sprintf(outp,"%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000);
   			END(outp);
   			break;
   
   		case 'E':
 ! 			psecs(ms / 100L, outp);
   			END(outp);
   			break;
   
   		case 'P':
 ! 			sprintf(outp,"%ld%%",  (t*100 / ((ms ? ms : 1))));
   			END(outp);
   			break;
   
   #if !defined(SYSV)
   		case 'W':
   			i = r1->ru_nswap - r0->ru_nswap;
 ! 			sprintf(outp,"%ld", i);
   			END(outp);
   			break;
   
   		case 'X':
 ! 			sprintf(outp,"%ld", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t);
   			END(outp);
   			break;
   
   		case 'D':
 ! 			sprintf(outp,"%ld", t == 0 ? 0 :
   			    (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t);
   			END(outp);
   			break;
   
   		case 'K':
 ! 			sprintf(outp,"%ld", t == 0 ? 0 :
   			    ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) -
   			    (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t);
   			END(outp);
   			break;
   
   		case 'M':
 ! 			sprintf(outp,"%ld", r1->ru_maxrss/2);
   			END(outp);
   			break;
   
   		case 'F':
 ! 			sprintf(outp,"%ld", r1->ru_majflt-r0->ru_majflt);
   			END(outp);
   			break;
   
   		case 'R':
 ! 			sprintf(outp,"%ld", r1->ru_minflt-r0->ru_minflt);
   			END(outp);
   			break;
   
   		case 'I':
 ! 			sprintf(outp,"%ld", r1->ru_inblock-r0->ru_inblock);
   			END(outp);
   			break;
   
   		case 'O':
 ! 			sprintf(outp,"%ld", r1->ru_oublock-r0->ru_oublock);
   			END(outp);
   			break;
   		case 'C':
 ! 			sprintf(outp,"%ld+%ld", r1->ru_nvcsw-r0->ru_nvcsw,
   				r1->ru_nivcsw-r0->ru_nivcsw );
   			END(outp);
   			break;
 ***************
 *** 695,702 ****
   }
   
   static void
 ! tvadd(tsum, t0, t1)
 ! 	struct timeval *tsum, *t0, *t1;
   {
   
   	tsum->tv_sec = t0->tv_sec + t1->tv_sec;
 --- 714,720 ----
   }
   
   static void
 ! tvadd( struct timeval *tsum, struct timeval *t0, struct timeval *t1 )
   {
   
   	tsum->tv_sec = t0->tv_sec + t1->tv_sec;
 ***************
 *** 706,713 ****
   }
   
   static void
 ! tvsub(tdiff, t1, t0)
 ! 	struct timeval *tdiff, *t1, *t0;
   {
   
   	tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
 --- 724,730 ----
   }
   
   static void
 ! tvsub( struct timeval *tdiff, struct timeval *t1, struct timeval *t0 )
   {
   
   	tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
 ***************
 *** 717,758 ****
   }
   
   static void
 ! psecs(l,cp)
 ! long l;
 ! register char *cp;
   {
 ! 	register int i;
   
 ! 	i = l / 3600;
   	if (i) {
 ! 		sprintf(cp,"%d:", i);
   		END(cp);
 ! 		i = l % 3600;
 ! 		sprintf(cp,"%d%d", (i/60) / 10, (i/60) % 10);
   		END(cp);
   	} else {
   		i = l;
 ! 		sprintf(cp,"%d", i / 60);
   		END(cp);
   	}
 ! 	i %= 60;
   	*cp++ = ':';
 ! 	sprintf(cp,"%d%d", i / 10, i % 10);
   }
   
   /*
    *			N R E A D
    */
 ! Nread( fd, buf, count )
 ! int fd;
 ! void *buf;
 ! int count;
   {
   	struct sockaddr_in from;
 ! 	int len = sizeof(from);
 ! 	register int cnt;
   	if( udp )  {
 ! 		cnt = recvfrom( fd, buf, count, 0, &from, &len );
   		numCalls++;
   	} else {
   		if( b_flag )
 --- 734,772 ----
   }
   
   static void
 ! psecs( long l, char *cp )
   {
 ! 	long i;
   
 ! 	i = l / 3600L;
   	if (i) {
 ! 		sprintf(cp,"%ld:", i);
   		END(cp);
 ! 		i = l % 3600L;
 ! 		sprintf(cp,"%ld%ld", (i/60L) / 10L, (i/60L) % 10L);
   		END(cp);
   	} else {
   		i = l;
 ! 		sprintf(cp,"%ld", i / 60L);
   		END(cp);
   	}
 ! 	i %= 60L;
   	*cp++ = ':';
 ! 	sprintf(cp,"%ld%ld", i / 10L, i % 10L);
   }
   
   /*
    *			N R E A D
    */
 ! ssize_t
 ! Nread( int fd, void *buf, size_t count )
   {
   	struct sockaddr_in from;
 ! 	socklen_t len = sizeof(from);
 ! 	ssize_t  cnt;
 ! 
   	if( udp )  {
 ! 		cnt = recvfrom( fd, buf, count, 0, (struct sockaddr *)&from, &len );
   		numCalls++;
   	} else {
   		if( b_flag )
 ***************
 *** 762,769 ****
   			numCalls++;
   		}
   		if (touchdata && cnt > 0) {
 ! 			register int c = cnt, sum;
 ! 			register char *b = buf;
   			while (c--)
   				sum += *b++;
   		}
 --- 776,783 ----
   			numCalls++;
   		}
   		if (touchdata && cnt > 0) {
 ! 			int c = cnt, sum = 0;
 ! 			char *b = buf;
   			while (c--)
   				sum += *b++;
   		}
 ***************
 *** 774,791 ****
   /*
    *			N W R I T E
    */
 ! Nwrite( fd, buf, count )
 ! int fd;
 ! void *buf;
 ! int count;
   {
 ! 	register int cnt;
   	if( udp )  {
   again:
 ! 		cnt = sendto( fd, buf, count, 0, &sinhim, sizeof(sinhim) );
   		numCalls++;
   		if( cnt<0 && errno == ENOBUFS )  {
 ! 			delay(18000);
   			errno = 0;
   			goto again;
   		}
 --- 788,803 ----
   /*
    *			N W R I T E
    */
 ! ssize_t
 ! Nwrite( int fd, void *buf, size_t count )
   {
 ! 	ssize_t cnt;
   	if( udp )  {
   again:
 ! 		cnt = sendto( fd, buf, count, 0, (struct sockaddr *)&sinhim, sizeof(sinhim) );
   		numCalls++;
   		if( cnt<0 && errno == ENOBUFS )  {
 ! 			delay(18000L);
   			errno = 0;
   			goto again;
   		}
 ***************
 *** 797,809 ****
   }
   
   void
 ! delay(us)
   {
   	struct timeval tv;
   
   	tv.tv_sec = 0;
   	tv.tv_usec = us;
 ! 	(void)select( 1, (char *)0, (char *)0, (char *)0, &tv );
   }
   
   /*
 --- 809,821 ----
   }
   
   void
 ! delay(long us)
   {
   	struct timeval tv;
   
   	tv.tv_sec = 0;
   	tv.tv_usec = us;
 ! 	(void)select( 1, NULL, NULL, NULL, &tv );
   }
   
   /*
 ***************
 *** 815,828 ****
    * network connections don't deliver data with the same
    * grouping as it is written with.  Written by Robert S. Miles, BRL.
    */
 ! int
 ! mread(fd, bufp, n)
 ! int fd;
 ! register char	*bufp;
 ! unsigned	n;
   {
 ! 	register unsigned	count = 0;
 ! 	register int		nread;
   
   	do {
   		nread = read(fd, bufp, n-count);
 --- 827,837 ----
    * network connections don't deliver data with the same
    * grouping as it is written with.  Written by Robert S. Miles, BRL.
    */
 ! ssize_t
 ! mread(int fd, void *bufp, size_t n)
   {
 ! 	size_t		count = 0;
 ! 	ssize_t		nread;
   
   	do {
   		nread = read(fd, bufp, n-count);
 ***************
 *** 832,841 ****
   			return(-1);
   		}
   		if(nread == 0)
 ! 			return((int)count);
 ! 		count += (unsigned)nread;
   		bufp += nread;
   	 } while(count < n);
   
 ! 	return((int)count);
   }
 --- 841,850 ----
   			return(-1);
   		}
   		if(nread == 0)
 ! 			return((ssize_t)count);
 ! 		count += nread;
   		bufp += nread;
   	 } while(count < n);
   
 ! 	return((ssize_t)count);
   }