#include "util.h"
#include "set.h"
#include "mount-setup.h"
+#include "exit-status.h"
/* Goes through /etc/fstab and remounts all API file systems, applying
* options that are in /etc/fstab that systemd might not have
* respected */
int main(int argc, char *argv[]) {
- int ret = 1;
+ int ret = EXIT_FAILURE;
FILE *f = NULL;
struct mntent* me;
Hashmap *pids = NULL;
if (argc > 1) {
log_error("This program takes no argument.");
- return 1;
+ return EXIT_FAILURE;
}
- log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
+ log_set_target(LOG_TARGET_AUTO);
log_parse_environment();
log_open();
- if (!(f = setmntent("/etc/fstab", "r"))) {
+ umask(0022);
+
+ f = setmntent("/etc/fstab", "r");
+ if (!f) {
log_error("Failed to open /etc/fstab: %m");
goto finish;
}
- if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
+ pids = hashmap_new(trivial_hash_func, trivial_compare_func);
+ if (!pids) {
log_error("Failed to allocate set");
goto finish;
}
- ret = 0;
+ ret = EXIT_SUCCESS;
while ((me = getmntent(f))) {
pid_t pid;
log_debug("Remounting %s", me->mnt_dir);
- if ((pid = fork()) < 0) {
+ pid = fork();
+ if (pid < 0) {
log_error("Failed to fork: %m");
- ret = 1;
+ ret = EXIT_FAILURE;
continue;
}
execv("/bin/mount", (char **) arguments);
log_error("Failed to execute /bin/mount: %m");
- _exit(1);
+ _exit(EXIT_FAILURE);
}
/* Parent */
s = strdup(me->mnt_dir);
+ if (!s) {
+ log_error("Out of memory.");
+ ret = EXIT_FAILURE;
+ continue;
+ }
+
- if ((k = hashmap_put(pids, UINT_TO_PTR(pid), s)) < 0) {
+ k = hashmap_put(pids, UINT_TO_PTR(pid), s);
+ if (k < 0) {
log_error("Failed to add PID to set: %s", strerror(-k));
- ret = 1;
+ ret = EXIT_FAILURE;
continue;
}
}
continue;
log_error("waitid() failed: %m");
- ret = 1;
+ ret = EXIT_FAILURE;
break;
}
- if ((s = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
+ s = hashmap_remove(pids, UINT_TO_PTR(si.si_pid));
+ if (s) {
if (!is_clean_exit(si.si_code, si.si_status)) {
if (si.si_code == CLD_EXITED)
log_error("/bin/mount for %s exited with exit status %i.", s, si.si_status);
else
log_error("/bin/mount for %s terminated by signal %s.", s, signal_to_string(si.si_status));
- ret = 1;
+ ret = EXIT_FAILURE;
}
free(s);