diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-11-09 07:12:31 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-11-09 07:12:31 +0000 |
commit | 180e0a9326a1383cf3a945e84700f99f5f9e4df1 (patch) | |
tree | 1839878e30f80d127ef798159b227add6200259c /src | |
parent | 6521c2ce51b3b808dd8ef5c47dc9995acce149e5 (diff) | |
download | tor-180e0a9326a1383cf3a945e84700f99f5f9e4df1.tar.gz tor-180e0a9326a1383cf3a945e84700f99f5f9e4df1.zip |
Make check_private_dir trimodal (check/create/ignore), not bimodal (create/ignore).
svn:r2733
Diffstat (limited to 'src')
-rw-r--r-- | src/common/util.c | 33 | ||||
-rw-r--r-- | src/common/util.h | 3 | ||||
-rw-r--r-- | src/or/config.c | 10 | ||||
-rw-r--r-- | src/or/rendservice.c | 2 | ||||
-rw-r--r-- | src/or/router.c | 4 |
5 files changed, 32 insertions, 20 deletions
diff --git a/src/common/util.c b/src/common/util.c index 292b7cfd5b..8311f95be5 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -701,9 +701,11 @@ file_status_t file_status(const char *fname) } /** Check whether dirname exists and is private. If yes return 0. If - * it does not exist, and create is set, try to create it and return 0 - * on success. Else return -1. */ -int check_private_dir(const char *dirname, int create) + * it does not exist, and check==CPD_CREATE is set, try to create it + * and return 0 on success. If it does not exist, and + * check==CPD_CHECK, and we think we can create it, return 0. Else + * return -1. */ +int check_private_dir(const char *dirname, cpd_check_t check) { int r; struct stat st; @@ -714,23 +716,26 @@ int check_private_dir(const char *dirname, int create) strerror(errno)); return -1; } - if (!create) { + if (check == CPD_NONE) { log(LOG_WARN, "Directory %s does not exist.", dirname); return -1; - } - log(LOG_INFO, "Creating directory %s", dirname); + } else if (check == CPD_CREATE) { + log(LOG_INFO, "Creating directory %s", dirname); #ifdef MS_WINDOWS - r = mkdir(dirname); + r = mkdir(dirname); #else - r = mkdir(dirname, 0700); + r = mkdir(dirname, 0700); #endif - if (r) { - log(LOG_WARN, "Error creating directory %s: %s", dirname, - strerror(errno)); - return -1; - } else { - return 0; + if (r) { + log(LOG_WARN, "Error creating directory %s: %s", dirname, + strerror(errno)); + return -1; + } } + + /* XXXX In the case where check==CPD_CHECK, we should look at the + * parent directory a little harder. */ + return 0; } if (!(st.st_mode & S_IFDIR)) { log(LOG_WARN, "%s is not a directory", dirname); diff --git a/src/common/util.h b/src/common/util.h index c925834daf..9f116b5796 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -88,7 +88,8 @@ int read_all(int fd, char *buf, size_t count, int isSocket); typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR} file_status_t; file_status_t file_status(const char *filename); -int check_private_dir(const char *dirname, int create); +typedef enum { CPD_NONE, CPD_CREATE, CPD_CHECK } cpd_check_t; +int check_private_dir(const char *dirname, cpd_check_t check); int write_str_to_file(const char *fname, const char *str, int bin); int write_bytes_to_file(const char *fname, const char *str, size_t len, int bin); diff --git a/src/or/config.c b/src/or/config.c index cfa6970939..cebff82d39 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -241,9 +241,8 @@ options_act(void) { } } -/*XXX in options_validate, we should check if this is going to fail */ /* Ensure data directory is private; create if possible. */ - if (check_private_dir(options->DataDirectory, 1) != 0) { + if (check_private_dir(options->DataDirectory, CPD_CREATE) != 0) { log_fn(LOG_ERR, "Couldn't access/create private data directory %s", options->DataDirectory); return -1; @@ -1014,6 +1013,13 @@ options_validate(or_options_t *options) if (normalize_log_options(options)) return -1; + + if (options->DataDirectory && + check_private_dir(options->DataDirectory, CPD_CHECK != 0)) { + log_fn(LOG_WARN, "Can't create directory %s", options->DataDirectory); + result = -1; + } + /* Special case if no options are given. */ if (!options->Logs) { options->Logs = config_line_prepend(NULL, "Log", "notice-err stdout"); diff --git a/src/or/rendservice.c b/src/or/rendservice.c index ebbc618d1b..3bc1238d34 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -295,7 +295,7 @@ int rend_service_load_keys(void) log_fn(LOG_INFO, "Loading hidden-service keys from '%s'", s->directory); /* Check/create directory */ - if (check_private_dir(s->directory, 1) < 0) + if (check_private_dir(s->directory, CPD_CREATE) < 0) return -1; /* Load key */ diff --git a/src/or/router.c b/src/or/router.c index c47080e562..75f2fe6a41 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -259,12 +259,12 @@ int init_keys(void) { } /* Make sure DataDirectory exists, and is private. */ datadir = options->DataDirectory; - if (check_private_dir(datadir, 1)) { + if (check_private_dir(datadir, CPD_CREATE)) { return -1; } /* Check the key directory. */ tor_snprintf(keydir,sizeof(keydir),"%s/keys", datadir); - if (check_private_dir(keydir, 1)) { + if (check_private_dir(keydir, CPD_CREATE)) { return -1; } cp = keydir + strlen(keydir); /* End of string. */ |