Commit | Line | Data |
---|---|---|
d2bfe217 SL |
1 | /* fastcopy.c 1.1 86/01/12 */ |
2 | /* fastcopy.c */ | |
3 | ||
4 | #define BSIZE 1024 | |
5 | #define FACTOR 32 /* 32k bytes in one i/o */ | |
6 | ||
7 | char buffer[BSIZE * FACTOR]; | |
8 | ||
9 | main() | |
10 | { | |
11 | char in_dev[50]; | |
12 | char out_dev[50]; | |
13 | char blocks[50]; | |
14 | register int input; | |
15 | register int output; | |
16 | register int count; | |
17 | register int firstread = 1; | |
18 | register int blk_siz = BSIZE * FACTOR; | |
19 | register int blk_num = 0; | |
20 | register int read_count = 0; | |
21 | register int write_count = 0; | |
22 | register int transfers = 0; | |
23 | ||
24 | in_dev[0] = 0; | |
25 | out_dev[0] = 0; | |
26 | blocks[0] = 0; | |
27 | for(;;) { | |
28 | /* get input and output devices */ | |
29 | printf("Source device : "); | |
30 | gets(in_dev); | |
31 | if((input = open(in_dev, 0)) > 0) | |
32 | break; | |
33 | printf("Cannot open input file '%s'\n", in_dev); | |
34 | } | |
35 | ||
36 | for(;;) { | |
37 | printf("Copy to device : "); | |
38 | gets(out_dev); | |
39 | if((output = open(out_dev, 1)) > 0) | |
40 | break; | |
41 | printf("Cannot open output file '%s'\n", out_dev); | |
42 | } | |
43 | ||
44 | for(;;) { | |
45 | printf("Number of blocks : "); | |
46 | gets(blocks); | |
47 | count = number(blocks); | |
48 | if(count > 0) | |
49 | break; | |
50 | } | |
51 | printf("\nCopy %d blocks from %s to %s\n", count, in_dev, out_dev); | |
52 | do { | |
53 | if ((transfers > 0) && !(transfers % 25)) | |
54 | printf("%d blocks\n", blk_num); | |
55 | transfers++; | |
56 | read_count = read(input, buffer, | |
57 | ((count*BSIZE) > blk_siz) ? blk_siz : count*BSIZE); | |
58 | if (firstread) { | |
59 | if (read_count != blk_siz) { | |
60 | blk_siz = read_count; | |
61 | } | |
62 | firstread = 0; | |
63 | printf("Block size from input = %d bytes\n", blk_siz); | |
64 | } | |
65 | if (read_count > 0) { | |
66 | if (read_count != blk_siz) | |
67 | printf("Short read! Block %d: %d read, %d bytes requested\n", blk_num, read_count, blk_siz); | |
68 | write_count = write(output, buffer, read_count); | |
69 | if (write_count != read_count) | |
70 | printf("Short write! Block %d: %d bytes written of %d bytes possible\n", blk_num, write_count, read_count); | |
71 | count -= read_count / BSIZE; | |
72 | blk_num += read_count / BSIZE; | |
73 | } | |
74 | } while((read_count > 0) && (write_count > 0) && (count > 0)); | |
75 | printf ("Total of %d blocks copied\n", blk_num); | |
76 | close(input); | |
77 | close(output); | |
78 | } | |
79 | ||
80 | int number (response) | |
81 | char *response; | |
82 | { | |
83 | int total; | |
84 | ||
85 | total = 0; | |
86 | while (*response == ' ' || *response == '\t') response++; | |
87 | while (*response >= '0' && *response <= '9') { | |
88 | total = total * 10 + (*response - '0'); | |
89 | response++; | |
90 | } | |
91 | return (total); | |
92 | } |