You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
80 lines
2.2 KiB
// *naka* - find a file within another file
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/mman.h>
|
|
|
|
#include <ints.h>
|
|
#include <macros.h>
|
|
#include <version.h>
|
|
|
|
#include <project.h>
|
|
|
|
#include <tests.h>
|
|
|
|
#include <map.h>
|
|
#include <comp.h>
|
|
|
|
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 <needle> <haystack(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] ?: "<null>");
|
|
|
|
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;
|
|
}
|
|
|