|
|
1.1 root 1: #include <fio.h>
2: #include <libc.h>
3:
4: #define TMP "/tmp/tstwr"
5:
6: main(argc, argv)
7: char **argv;
8: {
9: register n, c, k;
10: int len, fd, cd;
11: char *b1, *b2, *p;
12:
13: if(argc < 2){
14: Fprint(2, "Usage: tstwr file\n");
15: exit(1);
16: }
17: len = flen(argv[1]);
18: if((fd = open(argv[1], 0)) < 0){
19: perror(argv[1]);
20: exit(1);
21: }
22: if((b1 = malloc(len)) == 0){
23: Fprint(2, "malloc(%d) failed\n", len);
24: exit(1);
25: }
26: if(read(fd, b1, len) != len){
27: perror("read");
28: exit(1);
29: }
30: close(fd);
31: if((fd = creat(TMP, 0666)) < 0){
32: perror(TMP);
33: exit(1);
34: }
35: close(fd);
36: if((fd = open(TMP, 2)) < 0){
37: perror(TMP);
38: exit(1);
39: }
40: /* unlink(TMP); /**/
41: if((b2 = malloc(len)) == 0){
42: Fprint(2, "malloc(%d) failed\n", len);
43: exit(1);
44: }
45: for(p = b1, cd = 0; cd < len;){
46: n = 1000*nrand(6) + nrand(199);
47: if(n > len-cd) n = len-cd;
48: Fprint(1, "%d putc's\n", n);
49: cd += n;
50: while(n--)
51: Fputc(fd, *p++);
52: if(len == cd)
53: continue;
54: n = 1000*nrand(12) + nrand(199);
55: if(n > len-cd) n = len-cd;
56: cd += n;
57: Fprint(1, "%d write\n", n);
58: if(Fwrite(fd, p, (long)n) != (long)n) break;
59: p += n;
60: }
61: done:
62: Fflush(fd);
63: lseek(fd, 0L, 0);
64: if((n = read(fd, b2, len)) != len){
65: fprint(2, "read %d, len=%d: ", n, len);
66: perror("read2");
67: exit(1);
68: }
69: if(memcmp(b1, b2, len)){
70: Fprint(2, "memcmp failed!\n");
71: exit(1);
72: }
73: Fprint(2, "tstwr: %d bytes, succeeded\n", len);
74: exit(0);
75: }
76:
77: #include <sys/types.h>
78: #include <sys/stat.h>
79:
80: flen(s)
81: char *s;
82: {
83: struct stat sb;
84: int n;
85:
86: if(stat(s, &sb) < 0){
87: perror(s);
88: exit(1);
89: }
90: n = sb.st_size;
91: if(sizeof(int) == 2)
92: n &= 0x7FFF;
93: return(n);
94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.