|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <libc.h> ! 3: #include <ipc.h> ! 4: ! 5: timeout() ! 6: { ! 7: fprintf(stderr, "timeout\n"); ! 8: exit(1); ! 9: } ! 10: ! 11: main(ac,av) ! 12: int ac; ! 13: char *av[]; ! 14: { ! 15: char buf[8*1024]; ! 16: char buf2[8*1024]; ! 17: int fd, n; ! 18: unsigned int i, j, count, size, bytes; ! 19: char *ipcpath(); ! 20: long start, end; ! 21: ! 22: bytes=1024*1024; ! 23: size=1024; ! 24: switch(ac) { ! 25: default: ! 26: fprintf(stderr, "usage: loopback host [size] [bytes]\n"); ! 27: exit(1); ! 28: case 4: ! 29: bytes=atoi(av[3]); ! 30: case 3: ! 31: size=atoi(av[2]); ! 32: if(size>sizeof(buf)) ! 33: size=sizeof(buf); ! 34: case 2: ! 35: break; ! 36: } ! 37: count=bytes/size; ! 38: ! 39: /* ! 40: * set up pattern ! 41: */ ! 42: for(i=0; i<sizeof(buf); i++) ! 43: buf[i] = i&0xff; ! 44: ! 45: fd = ipcopen(ipcpath(av[1], "dk", "loopback"), "heavy"); ! 46: if (fd<0){ ! 47: fprintf(stderr, "error connecting to %s: %s\n", av[1], errstr); ! 48: exit(1); ! 49: } ! 50: printf("connected to %s\n", av[1]); ! 51: fflush(stdout); ! 52: ! 53: /* ! 54: * separate reader and writer ! 55: */ ! 56: switch(fork()) { ! 57: case -1: ! 58: perror("forking:"); ! 59: exit(1); ! 60: case 0: ! 61: for(i=0; i<count; i++){ ! 62: alarm(60); ! 63: if(write(fd, buf, size)!=size) { ! 64: perror("write:"); ! 65: exit(1); ! 66: } ! 67: } ! 68: exit(0); ! 69: default: ! 70: start=time((long *)0); ! 71: for(i=0; i<count; i++){ ! 72: alarm(60); ! 73: for(j=0; j<size; j+=n){ ! 74: n=read(fd, buf2+j, size-j); ! 75: if(n<=0){ ! 76: perror("read"); ! 77: exit(1); ! 78: } ! 79: } ! 80: if(memcmp(buf, buf2, size)){ ! 81: fprintf(stderr,"bad data\n"); ! 82: exit(1); ! 83: } ! 84: } ! 85: break; ! 86: } ! 87: end=time((long *)0); ! 88: printf("%d*%d bytes xferred in %d secs = %d bytes/sec\n", count, size, ! 89: end-start, (size*count)/(end-start)); ! 90: exit(0); ! 91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.