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 g_fprintf(stderr, _("usage: %s "), pgm);
34 g_fprintf(stderr, _(" [-d]"));
35 g_fprintf(stderr, _(" [-l length]"));
36 g_fprintf(stderr, _(" [if=input]"));
37 g_fprintf(stderr, _(" [of=output]"));
38 g_fprintf(stderr, _(" [bs=blocksize]"));
39 g_fprintf(stderr, _(" [count=count]"));
40 g_fprintf(stderr, _(" [skip=count]"));
41 g_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;
70 * Configure program for internationalization:
71 * 1) Only set the message locale for now.
72 * 2) Set textdomain for all amanda related programs to "amanda"
73 * We don't want to be forced to support dozens of message catalogs.
75 setlocale(LC_MESSAGES, "C");
78 fprintf(stderr, _("amdd is deprecated\n"));
80 if((pgm = strrchr(argv[0], '/')) != NULL) {
85 while(-1 != (ch = getopt(argc, argv, "hdl:"))) {
89 g_fprintf(stderr, _("debug mode!\n"));
95 length = OFF_T_ATOI(optarg);
96 len = (ssize_t)strlen(optarg);
98 switch(optarg[len-1] ) {
100 case 'b': length /= (off_t)2; break;
101 case 'M': length *= (off_t)1024; break;
102 default: length /= (off_t)1024; break;
105 length /= (off_t)1024;
120 for( ; optind < argc; optind++) {
121 if(0 == (eq = strchr(argv[optind], '='))) {
125 len = (ssize_t)(eq - argv[optind]);
126 if(0 == strncmp("if", argv[optind], (size_t)len)) {
127 if((infd = tape_open(eq + 1, O_RDONLY, 0)) < 0) {
129 g_fprintf(stderr, "%s: %s: ", pgm, eq + 1);
134 read_func = tapefd_read;
136 g_fprintf(stderr, _("input opened \"%s\", got fd %d\n"),
139 } else if(0 == strncmp("of", argv[optind], (size_t)len)) {
140 if((outfd = tape_open(eq + 1, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0) {
142 g_fprintf(stderr, "%s: %s: ", pgm, eq + 1);
147 write_func = tapefd_write;
149 g_fprintf(stderr, _("output opened \"%s\", got fd %d\n"),
154 g_fprintf(stderr, _("length set to %lld\n"),
157 tapefd_setinfo_length(outfd, length);
159 } else if(0 == strncmp("bs", argv[optind], (size_t)len)) {
160 blocksize = SIZE_T_ATOI(eq + 1);
161 len = (ssize_t)strlen(argv[optind]);
163 switch(argv[optind][len-1] ) {
164 case 'k': blocksize *= 1024; break;
165 case 'b': blocksize *= 512; break;
166 case 'M': blocksize *= 1024 * 1024; break;
170 g_fprintf(stderr, _("blocksize set to %zu\n"), blocksize);
172 } else if(0 == strncmp("count", argv[optind], (size_t)len)) {
173 count = OFF_T_ATOI(eq + 1);
176 g_fprintf(stderr, _("count set to %lld\n"), (long long)count);
178 } else if(0 == strncmp("skip", argv[optind], (size_t)len)) {
179 skip = OFF_T_ATOI(eq + 1);
181 g_fprintf(stderr, _("skip set to %lld\n"), (long long)skip);
184 g_fprintf(stderr, _("%s: bad argument: \"%s\"\n"), pgm, argv[optind]);
189 if(0 == (buf = malloc(blocksize))) {
191 g_fprintf(stderr, "%s: ", pgm);
193 perror(_("malloc error"));
197 eq = _("read error");
198 pread = fread = pwrite = fwrite = 0;
199 while(0 < (len = (*read_func)(infd, buf, blocksize))) {
200 if((skip -= (off_t)1) > (off_t)0) {
203 if((size_t)len == blocksize) {
208 len = (*write_func)(outfd, buf, (size_t)len);
210 eq = _("write error");
212 } else if((size_t)len == blocksize) {
218 if((count -= (off_t)1) <= (off_t)0) {
226 g_fprintf(stderr, "%s: ", pgm);
231 g_fprintf(stderr, _("%d+%d in\n%d+%d out\n"), fread, pread, fwrite, pwrite);
232 if(read_func == tapefd_read) {
233 if(0 != tapefd_close(infd)) {
235 g_fprintf(stderr, "%s: ", pgm);
237 perror(_("input close"));
241 if(write_func == tapefd_write) {
242 if(0 != tapefd_close(outfd)) {
244 g_fprintf(stderr, "%s: ", pgm);
246 perror(_("output close"));