Commit 0ef85f6d authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Some platforms have weird translations when you open files in "test" mode;...

Some platforms have weird translations when you open files in "test" mode; make read/write_str_to_file aware.


svn:r2336
parent c66e4c48
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;
+14 −14
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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.");
    }
  }
+1 −1
Original line number Diff line number Diff line
@@ -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;
    }
  }
Loading