diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-09-08 07:16:34 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-09-08 07:16:34 +0000 |
commit | 0ef85f6dbad170d7757b60c782d2b0df87eafb9d (patch) | |
tree | 548aaf844bde663bbad40ff7cda1350454496a7d | |
parent | c66e4c48704b8be1425c2b6253542beed49ce0eb (diff) | |
download | tor-0ef85f6dbad170d7757b60c782d2b0df87eafb9d.tar.gz tor-0ef85f6dbad170d7757b60c782d2b0df87eafb9d.zip |
Some platforms have weird translations when you open files in "test" mode; make read/write_str_to_file aware.
svn:r2336
-rw-r--r-- | src/common/crypto.c | 4 | ||||
-rw-r--r-- | src/common/util.c | 28 | ||||
-rw-r--r-- | src/common/util.h | 4 | ||||
-rw-r--r-- | src/or/dirserv.c | 4 | ||||
-rw-r--r-- | src/or/main.c | 2 | ||||
-rw-r--r-- | src/or/rendservice.c | 2 | ||||
-rw-r--r-- | src/or/router.c | 6 | ||||
-rw-r--r-- | src/or/routerlist.c | 4 |
8 files changed, 27 insertions, 27 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index 063f076144..9977d94ed4 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -345,7 +345,7 @@ int crypto_pk_read_private_key_from_filename(crypto_pk_env_t *env, const char *k tor_assert(env && keyfile); /* open the keyfile */ - f_pr=fopen(keyfile,"rb"); + f_pr=fopen(keyfile,"r"); if (!f_pr) return -1; @@ -449,7 +449,7 @@ crypto_pk_write_private_key_to_filename(crypto_pk_env_t *env, s = tor_malloc(len+1); strncpy(s, cp, len); s[len] = '\0'; - r = write_str_to_file(fname, s); + r = write_str_to_file(fname, s, 0); BIO_free(bio); free(s); return r; diff --git a/src/common/util.c b/src/common/util.c index cc589bdfbe..c9b0fa1109 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -119,6 +119,10 @@ #include "strlcat.c" #endif +#ifndef O_BINARY +#define O_BINARY 0 +#endif + /** Allocate a chunk of <b>size</b> bytes of memory, and return a pointer to * result. On error, log and terminate the process. (Same as malloc(size), * but never returns NULL.) @@ -1459,33 +1463,29 @@ int check_private_dir(const char *dirname, int create) * This function replaces the old file atomically, if possible. */ int -write_str_to_file(const char *fname, const char *str) +write_str_to_file(const char *fname, const char *str, int bin) { char tempname[1024]; int fd; - FILE *file; + size_t len; if ((strlcpy(tempname,fname,1024) >= 1024) || (strlcat(tempname,".tmp",1024) >= 1024)) { log(LOG_WARN, "Filename %s.tmp too long (>1024 chars)", fname); return -1; } - if ((fd = open(tempname, O_WRONLY|O_CREAT|O_TRUNC, 0600)) < 0) { + if ((fd = open(tempname, O_WRONLY|O_CREAT|O_TRUNC|(bin?O_BINARY:0), 0600)) + < 0) { log(LOG_WARN, "Couldn't open %s for writing: %s", tempname, strerror(errno)); return -1; } - if (!(file = fdopen(fd, "w"))) { - log(LOG_WARN, "Couldn't fdopen %s for writing: %s", tempname, - strerror(errno)); - close(fd); - return -1; - } - if (fputs(str,file) == EOF) { + len = strlen(str); + if (write_all(fd, str, len, 0) != len) { log(LOG_WARN, "Error writing to %s: %s", tempname, strerror(errno)); - fclose(file); + close(fd); return -1; } - if (fclose(file) == EOF) { + if (close(fd)) { log(LOG_WARN,"Error flushing to %s: %s", tempname, strerror(errno)); return -1; } @@ -1521,7 +1521,7 @@ write_str_to_file(const char *fname, const char *str) /** Read the contents of <b>filename</b> into a newly allocated string; return the * string on success or NULL on failure. */ -char *read_file_to_str(const char *filename) { +char *read_file_to_str(const char *filename, int bin) { int fd; /* router file */ struct stat statbuf; char *string; @@ -1533,7 +1533,7 @@ char *read_file_to_str(const char *filename) { return NULL; } - fd = open(filename,O_RDONLY,0); + fd = open(filename,O_RDONLY|(bin?O_BINARY:0),0); if (fd<0) { log_fn(LOG_WARN,"Could not open %s.",filename); return NULL; diff --git a/src/common/util.h b/src/common/util.h index e96b16129d..9c68fba977 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -219,8 +219,8 @@ 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); -int write_str_to_file(const char *fname, const char *str); -char *read_file_to_str(const char *filename); +int write_str_to_file(const char *fname, const char *str, int bin); +char *read_file_to_str(const char *filename, int bin); int parse_line_from_file(char *line, int maxlen, FILE *f, char **key_out, char **value_out); char *expand_filename(const char *filename); int replace_file(const char *from, const char *to); diff --git a/src/or/dirserv.c b/src/or/dirserv.c index ba21c0f00d..dc7804b3bb 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -652,7 +652,7 @@ void dirserv_set_cached_directory(const char *directory, time_t when) cached_directory_published = when; if(get_data_directory(&options)) { sprintf(filename,"%s/cached-directory", get_data_directory(&options)); - if(write_str_to_file(filename,cached_directory) < 0) { + if(write_str_to_file(filename,cached_directory,0) < 0) { log_fn(LOG_WARN, "Couldn't write cached directory to disk. Ignoring."); } } @@ -725,7 +725,7 @@ static int dirserv_regenerate_directory(void) free(new_directory); if(get_data_directory(&options)) { sprintf(filename,"%s/cached-directory", get_data_directory(&options)); - if(write_str_to_file(filename,the_directory) < 0) { + if(write_str_to_file(filename,the_directory,0) < 0) { log_fn(LOG_WARN, "Couldn't write cached directory to disk. Ignoring."); } } diff --git a/src/or/main.c b/src/or/main.c index 9bdebbbb1d..b3ec831b74 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -764,7 +764,7 @@ static int do_hup(void) { router_rebuild_descriptor(); sprintf(keydir,"%s/router.desc", get_data_directory(&options)); log_fn(LOG_INFO,"Dumping descriptor to %s...",keydir); - if (write_str_to_file(keydir, router_get_my_descriptor())) { + if (write_str_to_file(keydir, router_get_my_descriptor(), 0)) { return -1; } } diff --git a/src/or/rendservice.c b/src/or/rendservice.c index a0e70be52f..cfc5841120 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -317,7 +317,7 @@ int rend_service_load_keys(void) return -1; } sprintf(buf, "%s.onion\n", s->service_id); - if (write_str_to_file(fname,buf)<0) + if (write_str_to_file(fname,buf,0)<0) return -1; } return 0; diff --git a/src/or/router.c b/src/or/router.c index 2b89bef8dc..8eb483643e 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -319,7 +319,7 @@ int init_keys(void) { sprintf(keydir,"%s/router.desc", datadir); log_fn(LOG_INFO,"Dumping descriptor to %s...",keydir); - if (write_str_to_file(keydir, mydesc)) { + if (write_str_to_file(keydir, mydesc,0)) { return -1; } /* 5. Dump fingerprint to 'fingerprint' */ @@ -334,7 +334,7 @@ int init_keys(void) { return -1; } strcat(fingerprint, "\n"); - if (write_str_to_file(keydir, fingerprint)) + if (write_str_to_file(keydir, fingerprint, 0)) return -1; if(!authdir_mode()) return 0; @@ -348,7 +348,7 @@ int init_keys(void) { /* 7. [authdirserver only] load old directory, if it's there */ sprintf(keydir,"%s/cached-directory", datadir); log_fn(LOG_INFO,"Loading cached directory from %s...",keydir); - cp = read_file_to_str(keydir); + cp = read_file_to_str(keydir,0); if(!cp) { log_fn(LOG_INFO,"Cached directory %s not present. Ok.",keydir); } else { diff --git a/src/or/routerlist.c b/src/or/routerlist.c index b7187984b9..dfd58283c2 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -60,7 +60,7 @@ int router_reload_router_list(void) if (get_data_directory(&options)) { char *s; sprintf(filename,"%s/cached-directory", get_data_directory(&options)); - s = read_file_to_str(filename); + s = read_file_to_str(filename,0); if (s) { log_fn(LOG_INFO, "Loading cached directory from %s", filename); if (router_load_routerlist_from_string(s, 0) < 0) { @@ -693,7 +693,7 @@ int router_load_routerlist_from_file(char *routerfile, int trusted) { char *string; - string = read_file_to_str(routerfile); + string = read_file_to_str(routerfile,0); if(!string) { log_fn(LOG_WARN,"Failed to load routerfile %s.",routerfile); return -1; |