#include #include #include #include #include #include #include #include /* TODO Usage: kpack [--nologo / -n] [--kernel / -k] [--unpack / -u] [] */ static const char* str_usage = "Usage: %s [--nologo / -n] [--kernel / -k] [--unpack / -u] []\n"; int main(int argc, char *argv[]) { bool nologo = false; bool kernel = false; bool unpack = false; char *infile = NULL; char *outfile = NULL; int opt; static struct option long_options[] = { {"nologo", no_argument, NULL, 'n'}, {"kernel", no_argument, NULL, 'k'}, {"unpack", no_argument, NULL, 'u'}, {0, 0, 0, 0} // must be zeros here }; while ((opt = getopt_long(argc, argv, "nku", long_options, NULL)) != -1) { switch (opt) { case 'n': nologo = true; break; case 'k': kernel = true; break; case 'u': unpack = true; break; default: // '?' fprintf(stderr, str_usage, argv[0]); return 1; } } // Check for required infile if (optind >= argc) { printf("Error: Input file is required.\n"); printf(str_usage, argv[0]); return 1; } infile = argv[optind]; // Optional outfile if (optind + 1 < argc) { outfile = argv[optind + 1]; optind++; } // printf("argc = %d, optind = %d\n", argc - 1, optind); if (argc - 1 > optind) { printf("Error: too many arguments\n"); printf(str_usage, argv[0]); return 1; } // for debug: print parsed options and args printf("nologo: %s\n", nologo ? "true" : "false"); printf("kernel: %s\n", kernel ? "true" : "false"); printf("unpack: %s\n", unpack ? "true" : "false"); printf("infile: %s\n", infile); printf("outfile: %s\n", outfile ? outfile : "Not specified"); printf("\n"); if (!nologo) { printf("KPackC - Kolibri Packer in C\nUses LZMA v4.32 compression library\n\n"); } struct stat64 statbuf; int res_stat = stat64(infile, &statbuf); if (res_stat == -1) { printf("Error: cannot load input file\n"); return 1; } // printf("statbuf.st_size = %lld\n", statbuf.st_size); if (statbuf.st_size == 0 || statbuf.st_size >= 4294967296LL) { printf("Error: input file must be non zero and less than 4G\n"); return 1; } unsigned infile_size = (unsigned int)statbuf.st_size; printf("infile_size = %u\n", infile_size); FILE *infile_handle = fopen(infile, "rb"); if (!infile_handle) { printf("Error: cannot load input file\n"); return 1; } return 0; }