// *naka* - find a file within another file #include #include #include #include #include #include #include #include #include #include #include void prog_info(FILE* out) { fprintf(out, PROG_NAME " v%s - " PROG_DESCRIPTION #ifdef DEBUG " (debug build)" #endif "\n written by %s with <3 (compiled at %lu UTC (unix ts))\n license %s.\n", v_ctoss(v_rawtoc(PROG_VERSION)), PROG_AUTHOUR, PROG_COMPILED_TIMESTAMP, PROG_LICENSE); } void usage(FILE* out, int argc, char** argv) { IGNORE(argc); prog_info(out); fprintf(out, "\nUsage: %s \n", argv[0] ?: PROG_NAME); fprintf(out, "\nUsage: %s --help\n", argv[0] ?: PROG_NAME); } // err: 0 for normal exit and print to stdout. // err: nonzero for abnormal exit and print to stderr. noreturn void usage_then_exit(int err, int argc, char** argv) { usage( err ? stderr : stdout, argc, argv); exit(err); } int main(int argc, char** argv) { TRACE("main start with %d (pn: %s, a1: %s)", argc, argv[0], argv[1] ?: ""); if(!argv[1]) inv_args: usage_then_exit(PROG_RET_ARGS, argc, argv); else if(strcmp(argv[1], "--help")==0) usage_then_exit(0, argc, argv); else if(!argv[2]) goto inv_args; map_t needle; INFO("Mapping needle file `%s'", argv[1]); if(!map_handle_err(map_file(argv[1], false, 0, 0, &needle))) return PROG_RET_MAP_NEEDLE_FAILED; if(!map_handle_err(map_preload(&needle, false))) WARN("Failed to advise kernel about memory access: needle"); //TODO: Map argv[2...] //TODO: Setup thread-pool. //TODO: Dispatch haystack maps to threadpool. //TODO: Use either `cmp_find()` or `cmp_find_many()` to find the `needle` (mapped above) within those haystacks. //TODO: Within the threadpool: output information regarding each match/nonmatch. //TODO: Join the threadpool and consolidate results. //TODO: Should we return an error (`PROG_RET_MAP_HAYSTACK_N_FAILED(n)`) if one (or more) of the haystacks fail? Or consolidate multiple failures into `PROG_RET_MAP_HAYSTACK_FAILED | (failures)`? The latter would be the most complete. if(!map_handle_err(map_free(needle))) return PROG_RET_UNMAP_NEEDLE_FAILED; TRACE("main end"); return 0; }