#include "../command.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; parse_help(argc, argv, help); for (int 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]); } } char* buffer = malloc(bs); size_t read; 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; }