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