lazysphere/command/dd.c
2023-05-14 21:43:02 -04:00

63 lines
1.7 KiB
C

#include "command.h"
#include "lslib.h"
#include <stdlib.h>
static void help(void) {
printf("Usage: dd [if=FILE] [of=FILE] [bs=N] [count=N]\n\n");
printf("Copy a file with converting and formatting\n\n");
printf("\tif=FILE\t\tRead from FILE instead of stdin\n");
printf("\tof=FILE\t\tWrite to FILE instead of stdout\n");
printf("\tbs=N\t\tRead and write N bytes at a time\n");
printf("\tcount=N\t\tCopy only N input blocks\n");
}
COMMAND(dd) {
FILE* in_file = stdin;
FILE* out_file = stdout;
int bs = 1024;
int count = -1;
int i;
char* buffer;
size_t read;
parse_help(argc, argv, help);
for (i = 0; i < argc; i++) {
if (prefix("if=", argv[i])) {
char* path = argv[i] + 3;
in_file = get_file(path, "rb");
} else if (prefix("of=", argv[i])) {
char* path = argv[i] + 3;
out_file = get_file(path, "wb");
} else if (prefix("bs=", argv[i])) {
char* str = argv[i] + 3;
bs = get_number(str);
if (bs < 1) {
error("block size must be greater than 0");
}
} else if (prefix("count=", argv[i])) {
char* str = argv[i] + 6;
count = get_number(str);
if (count < 1) {
error("count must be greather than 0");
}
} else {
error("unkown option %s", argv[i]);
}
}
buffer = xalloc(bs);
while ((read = fread(buffer, 1, bs, in_file)) != 0) {
fwrite(buffer, 1, read, out_file);
if (--count, count == 0) break;
}
free(buffer);
fclose(in_file);
fclose(out_file);
return EXIT_SUCCESS;
}