diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 47 |
1 files changed, 46 insertions, 1 deletions
@@ -1,11 +1,13 @@ -#define GNU_SOURCE +#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <sys/utsname.h> #include <getopt.h> +#include <sys/statvfs.h> #include "omc.h" +#include "copy.h" const char *VERSION = "1.0.0"; const char *AUTHOR = "Joseph Hunkeler"; @@ -104,6 +106,38 @@ static void usage(char *progname) { } } +char *get_tmpdir(int *usable) { + char *tmpdir_env = NULL; + char *x = NULL; + *usable = 0; + x = getenv("TMPDIR"); + + if (x) { + tmpdir_env = strdup(x); + } else { + tmpdir_env = strdup("/tmp"); + } + + if (access(tmpdir_env, F_OK) < 0) { + if (mkdirs(tmpdir_env, 0755) < 0) { + free(tmpdir_env); + tmpdir_env = NULL; + } + } + + struct statvfs st; + if (statvfs(tmpdir_env, &st) < 0) { + free(tmpdir_env); + return NULL; + } + + if (!(st.f_flag & ST_NOEXEC) || !(st.f_flag & ST_RDONLY)) { + *usable = 1; + } + + return tmpdir_env; +} + int main(int argc, char *argv[], char *arge[]) { struct INIFILE *cfg = NULL; struct INIFILE *ini = NULL; @@ -121,6 +155,17 @@ int main(int argc, char *argv[], char *arge[]) { char python_override_version[NAME_MAX]; unsigned char arg_continue_on_error = 0; unsigned char arg_always_update_base_environment = 0; + int tmpdir_usable = 0; + + globals.tmpdir = get_tmpdir(&tmpdir_usable); + if (!tmpdir_usable) { + fprintf(stderr, "%s cannot be used due to restrictive mount options.\n" + "Please set $TMPDIR to a path other than %s", + globals.tmpdir, globals.tmpdir); + if (globals.tmpdir) + free(globals.tmpdir); + exit(1); + } int c; while (1) { |