int main(int argc, char *argv[]) { assert(sizeof(localbuf) >= getpagesize()); close(STDIN_FILENO); setlocale(LC_ALL, "C"); if (!configure(argc, argv)) return EXIT_FAILURE; if (unlikely(!read_proc_swaps()) || unlikely(!activate_old_swaps()) || unlikely(!check_memory_status())) return EXIT_FAILURE; if (erase) return retire_all() ? EXIT_SUCCESS : EXIT_FAILURE; install_sigs(); if (unlikely(!startpidfile())) return EXIT_FAILURE; /* Do a first iteration here so we can report any startup errors, and if we're * going to run as a daemon, we can do so in a steady state. */ handle_requirements(); /* If we're going to fork(), this is the last chance to read /proc/swaps in a * nonempty state before we do so. Make one last attempt to check its format. */ if (!proc_swaps_parsed()) { if (!read_proc_swaps()) return EXIT_FAILURE; #ifndef NO_CONFIG if (!quiet && !proc_swaps_parsed()) fputs("[/proc/swaps is empty, so cannot check its format]\n", stderr); #endif } if (godaemon) { #ifndef NO_CONFIG if (verbose) logm(LOG_DEBUG, "daemonizing..."); #endif const pid_t pid = daemonize(); if (unlikely(pid < 0)) { rmpidfile(); return EXIT_FAILURE; } if (pid > 0) { /* New process, so new pid. Parent process rewrites pidfile. We do this * from the parent, not the child process so that we're sure that the * pidfile is in a stable state when the parent exits. */ lseek(pidfd, 0, SEEK_SET); #ifndef NO_CONFIG if (verbose) logm(LOG_DEBUG, "got process id %d", pid); #endif return writepid(pid) ? EXIT_SUCCESS : EXIT_FAILURE; } } finishpidfile(); if (godaemon) { close(STDERR_FILENO); close(STDOUT_FILENO); // From here on std output is pointless in daemon mode. Use syslog instead. log_start(argv[0]); } // Central loop for (++runclock; !stop; ++runclock) { if (unlikely(print_status)) print_status = false, dump_stats(); else if (unlikely(adjust_swap)) adjust_swap = false, request_diet(); else handle_requirements(); sleep(1); } int result = EXIT_SUCCESS; #ifndef NO_CONFIG /* If we're worried about attackers getting unguarded access to the disk, we * need to retire and erase all swap files to keep them secret. */ if (paranoid && !retire_all()) result = EXIT_FAILURE; #endif rmpidfile(); log_close(); return result; }
static void mtnfs_destroy(void *buff) { MTNFS *mtnfs = MTNFS_CONTEXT; rmpidfile(mtnfs->pid); mtnlogger(mtnfs->mtn, 0, "%s finished\n", MODULE_NAME); }