10 #include "output-rait.h"
12 #define tape_open rait_open
13 #define tapefd_read rait_read
14 #define tapefd_write rait_write
15 #define tapefd_setinfo_length(outfd, length)
16 #define tapefd_close rait_close
25 static int debug_amdd = 0;
26 static char *pgm = NULL;
28 static void usage(void);
33 fprintf(stderr, "usage: %s ", pgm);
34 fprintf(stderr, " [-d]");
35 fprintf(stderr, " [-l length]");
36 fprintf(stderr, " [if=input]");
37 fprintf(stderr, " [of=output]");
38 fprintf(stderr, " [bs=blocksize]");
39 fprintf(stderr, " [count=count]");
40 fprintf(stderr, " [skip=count]");
41 fprintf(stderr, "\n");
45 static ssize_t (*read_func)(int, void *, size_t);
46 static ssize_t (*write_func)(int, const void *, size_t);
53 int infd = 0; /* stdin */
54 int outfd = 1; /* stdout */
55 size_t blocksize = 512;
56 off_t skip = (off_t)0;
58 int pread, fread, pwrite, fwrite;
61 off_t count = (off_t)0;
66 off_t length = (off_t)0;
69 if((pgm = strrchr(argv[0], '/')) != NULL) {
74 while(-1 != (ch = getopt(argc, argv, "hdl:"))) {
78 fprintf(stderr, "debug mode!\n");
84 length = OFF_T_ATOI(optarg);
85 len = (ssize_t)strlen(optarg);
87 switch(optarg[len-1] ) {
89 case 'b': length /= (off_t)2; break;
90 case 'M': length *= (off_t)1024; break;
91 default: length /= (off_t)1024; break;
94 length /= (off_t)1024;
109 for( ; optind < argc; optind++) {
110 if(0 == (eq = strchr(argv[optind], '='))) {
114 len = (ssize_t)(eq - argv[optind]);
115 if(0 == strncmp("if", argv[optind], (size_t)len)) {
116 if((infd = tape_open(eq + 1, O_RDONLY, 0)) < 0) {
118 fprintf(stderr, "%s: %s: ", pgm, eq + 1);
123 read_func = tapefd_read;
125 fprintf(stderr, "input opened \"%s\", got fd %d\n",
128 } else if(0 == strncmp("of", argv[optind], (size_t)len)) {
129 if((outfd = tape_open(eq + 1, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0) {
131 fprintf(stderr, "%s: %s: ", pgm, eq + 1);
136 write_func = tapefd_write;
138 fprintf(stderr, "output opened \"%s\", got fd %d\n",
143 fprintf(stderr, "length set to " OFF_T_FMT "\n",
144 (OFF_T_FMT_TYPE)length);
146 tapefd_setinfo_length(outfd, length);
148 } else if(0 == strncmp("bs", argv[optind], (size_t)len)) {
149 blocksize = SIZE_T_ATOI(eq + 1);
150 len = (ssize_t)strlen(argv[optind]);
152 switch(argv[optind][len-1] ) {
153 case 'k': blocksize *= 1024; break;
154 case 'b': blocksize *= 512; break;
155 case 'M': blocksize *= 1024 * 1024; break;
159 fprintf(stderr, "blocksize set to " SIZE_T_FMT "\n",
160 (SIZE_T_FMT_TYPE)blocksize);
162 } else if(0 == strncmp("count", argv[optind], (size_t)len)) {
163 count = OFF_T_ATOI(eq + 1);
166 fprintf(stderr, "count set to " OFF_T_FMT "\n",
167 (OFF_T_FMT_TYPE)count);
169 } else if(0 == strncmp("skip", argv[optind], (size_t)len)) {
170 skip = OFF_T_ATOI(eq + 1);
172 fprintf(stderr, "skip set to " OFF_T_FMT "\n",
173 (OFF_T_FMT_TYPE)skip);
176 fprintf(stderr, "%s: bad argument: \"%s\"\n", pgm, argv[optind]);
181 if(0 == (buf = malloc(blocksize))) {
183 fprintf(stderr, "%s: ", pgm);
185 perror("malloc error");
190 pread = fread = pwrite = fwrite = 0;
191 while(0 < (len = (*read_func)(infd, buf, blocksize))) {
192 if((skip -= (off_t)1) > (off_t)0) {
195 if((size_t)len == blocksize) {
200 len = (*write_func)(outfd, buf, (size_t)len);
204 } else if((size_t)len == blocksize) {
210 if((count -= (off_t)1) <= (off_t)0) {
218 fprintf(stderr, "%s: ", pgm);
223 fprintf(stderr, "%d+%d in\n%d+%d out\n", fread, pread, fwrite, pwrite);
224 if(read_func == tapefd_read) {
225 if(0 != tapefd_close(infd)) {
227 fprintf(stderr, "%s: ", pgm);
229 perror("input close");
233 if(write_func == tapefd_write) {
234 if(0 != tapefd_close(outfd)) {
236 fprintf(stderr, "%s: ", pgm);
238 perror("output close");