aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-11-09 07:12:31 +0000
committerNick Mathewson <nickm@torproject.org>2004-11-09 07:12:31 +0000
commit180e0a9326a1383cf3a945e84700f99f5f9e4df1 (patch)
tree1839878e30f80d127ef798159b227add6200259c /src
parent6521c2ce51b3b808dd8ef5c47dc9995acce149e5 (diff)
downloadtor-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.c33
-rw-r--r--src/common/util.h3
-rw-r--r--src/or/config.c10
-rw-r--r--src/or/rendservice.c2
-rw-r--r--src/or/router.c4
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. */