diff options
Diffstat (limited to 'src/common/util.c')
-rw-r--r-- | src/common/util.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/common/util.c b/src/common/util.c index a969f0dbd1..e290ab0471 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -101,7 +101,7 @@ void tv_addms(struct timeval *a, long ms) { */ /* a wrapper for write(2) that makes sure to write all count bytes. - * Only use if fd is a blocking socket. */ + * Only use if fd is a blocking fd. */ int write_all(int fd, const void *buf, size_t count) { int written = 0; int result; @@ -116,7 +116,7 @@ int write_all(int fd, const void *buf, size_t count) { } /* a wrapper for read(2) that makes sure to read all count bytes. - * Only use if fd is a blocking socket. */ + * Only use if fd is a blocking fd. */ int read_all(int fd, void *buf, size_t count) { int numread = 0; int result; @@ -391,3 +391,42 @@ write_str_to_file(const char *fname, const char *str) } return 0; } + +char *read_file_to_str(const char *filename) { + int fd; /* router file */ + struct stat statbuf; + char *string; + + assert(filename); + + if(strcspn(filename,CONFIG_LEGAL_FILENAME_CHARACTERS) != 0) { + log_fn(LOG_WARNING,"Filename %s contains illegal characters.",filename); + return NULL; + } + + if(stat(filename, &statbuf) < 0) { + log_fn(LOG_WARNING,"Could not stat %s.",filename); + return NULL; + } + + fd = open(filename,O_RDONLY,0); + if (fd<0) { + log_fn(LOG_WARNING,"Could not open %s.",filename); + return NULL; + } + + string = tor_malloc(statbuf.st_size+1); + + if(read_all(fd,string,statbuf.st_size) != statbuf.st_size) { + log_fn(LOG_WARNING,"Couldn't read all %ld bytes of file '%s'.", + (long)statbuf.st_size,filename); + free(string); + close(fd); + return NULL; + } + close(fd); + + string[statbuf.st_size] = 0; /* null terminate it */ + return string; +} + |