#include #include #include #include #include #include #include #include #define S0(x) (x ? x : "") #include int main (int argc, char ** argv) { int r = 0; if (argc != 1+1) error_at_line(1, 0, __FILE__, __LINE__, "%s configfile.ben", S0(argv[0])); int cf = open(argv[1], O_RDWR | O_CLOEXEC | O_CREAT, 00664); if (cf == -1) error_at_line(2, errno, __FILE__, __LINE__, "open(%s)", argv[1]); struct stat statbuf; if (fstat(cf, &statbuf) == -1) { error_at_line(0, errno, __FILE__, __LINE__, "fstat(cf, &statbuf)"); r = 3; goto r; } char * cfr = NULL; if (statbuf.st_size && !(cfr = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, cf, 0))) { error_at_line(0, errno, __FILE__, __LINE__, "mmap(NULL, %ld, PROT_READ, MAP_SHARED, cf, 0)", statbuf.st_size); r = 4; goto r; } struct bencoding * config = bdecode(cfr, statbuf.st_size, replace); struct dht * dht = dht_init(config); free_bencoding(config); config = persistent(dht); dht_free(dht); if (cfr && munmap(cfr, statbuf.st_size) == -1) { error_at_line(0, errno, __FILE__, __LINE__, "munmap(cf, %ld)", statbuf.st_size); r = 105; goto r; } cfr = NULL; if (ftruncate(cf, (statbuf.st_size = bencode_length(config))) == -1) { error_at_line(0, errno, __FILE__, __LINE__, "ftruncate(cf, %ld)", statbuf.st_size); r = 106; goto r; } if (!(cfr = mmap(NULL, statbuf.st_size, PROT_WRITE, MAP_SHARED, cf, 0))) { error_at_line(0, errno, __FILE__, __LINE__, "mmap(NULL, %ld, PROT_READ, MAP_SHARED, cf, 0)", statbuf.st_size); r = 107; goto r; } bencode(cfr, config); free_bencoding(config); r: if (cfr && munmap(cfr, statbuf.st_size) == -1) error_at_line(0, errno, __FILE__, __LINE__, "munmap(cf, %ld)", statbuf.st_size); if (close(cf) == -1) error_at_line(0, errno, __FILE__, __LINE__, "close(cf)"); return r; }