#include #include #include #include static const char* _prog_name = "fcmp"; #ifdef DEBUG #define __name(d) #d #define dprintf(fmt, ...) printf("[dbg @" __FILE__ "->%s:%d] " fmt "\n", __func__, __LINE__ __VA_OPT__(,) __VA_ARGS__) #else #define dprintf(fmt, ...) #endif __attribute__((noreturn)) static void usage() { fprintf(stderr, "fcmp: compare files for identity\n"); fprintf(stderr, "usage: %s \n", _prog_name); exit(-1); } __attribute__((always_inline)) static inline const void* die_if_null(const void* ptr) { if (!ptr) usage(); else return ptr; } static int unmap_all(mmap_t ptrs[], size_t len) { register int rval=1; dprintf("Unmapping %lu entries", len); for (register size_t i=0;ilen != map2.len) rval = 2; else if (memcmp(map1->ptr, map2.ptr, map1->len) != 0) rval = 1; if(!unmap_and_close(map2)) { fprintf(stderr, "Failed to unmap and close"); rval=-1; } return rval; } int main(int argc, char** argv) { _prog_name = argv[0]; const int nrest = argc-2; if (nrest==0) usage(); dprintf("There are %d extra files to chk", nrest); const char* f1 = die_if_null(argv[1]); const char* frest[nrest]; for (register int i=0;i