r11620@catbus: nickm | 2007-02-01 13:06:27 -0500

Call stat() slightly less often; use fstat() when possible.


svn:r9472
This commit is contained in:
Nick Mathewson 2007-02-01 18:09:27 +00:00
parent 8a9a55251f
commit 5cb99857bc
6 changed files with 34 additions and 33 deletions

View File

@ -62,6 +62,7 @@ Changes in version 0.1.2.7-alpha - 2007-??-??
unstable ones. unstable ones.
- Handle TTL values correctly on reverse DNS lookups. - Handle TTL values correctly on reverse DNS lookups.
- Stop using the reserved ac_cv namespace in our configure script. - Stop using the reserved ac_cv namespace in our configure script.
- Call stat() slightly less often; use fstat() when possible.
o Major features: o Major features:
- Weight directory requests by advertised bandwidth. Now we can - Weight directory requests by advertised bandwidth. Now we can

View File

@ -241,14 +241,14 @@ tor_munmap_file(tor_mmap_t *handle)
tor_mmap_t * tor_mmap_t *
tor_mmap_file(const char *filename) tor_mmap_file(const char *filename)
{ {
size_t size; struct stat st;
char *res = read_file_to_str(filename, 1, &size); char *res = read_file_to_str(filename, 1, &st);
tor_mmap_t *handle; tor_mmap_t *handle;
if (! res) if (! res)
return NULL; return NULL;
handle = tor_malloc_zero(sizeof(tor_mmap_t)); handle = tor_malloc_zero(sizeof(tor_mmap_t));
handle->data = res; handle->data = res;
handle->size = size; handle->size = st.st_size;
return handle; return handle;
} }
void void

View File

@ -1375,30 +1375,27 @@ append_bytes_to_file(const char *fname, const char *str, size_t len,
* be truncated. * be truncated.
*/ */
char * char *
read_file_to_str(const char *filename, int bin, size_t *size_out) read_file_to_str(const char *filename, int bin, struct stat *stat_out)
{ {
int fd; /* router file */ int fd; /* router file */
struct stat statbuf; struct stat statbuf;
char *string, *f; char *string;
int r; int r;
tor_assert(filename); tor_assert(filename);
f = tor_strdup(filename);
clean_name_for_stat(f);
r = stat(f, &statbuf);
tor_free(f);
if (r < 0) {
log_info(LD_FS,"Could not stat \"%s\".",filename);
return NULL;
}
fd = open(filename,O_RDONLY|(bin?O_BINARY:O_TEXT),0); fd = open(filename,O_RDONLY|(bin?O_BINARY:O_TEXT),0);
if (fd<0) { if (fd<0) {
log_warn(LD_FS,"Could not open \"%s\".",filename); log_warn(LD_FS,"Could not open \"%s\".",filename);
return NULL; return NULL;
} }
if (fstat(fd, &statbuf)<0) {
close(fd);
log_info(LD_FS,"Could not fstat \"%s\".",filename);
return NULL;
}
if ((uint64_t)(statbuf.st_size)+1 > SIZE_T_MAX) if ((uint64_t)(statbuf.st_size)+1 > SIZE_T_MAX)
return NULL; return NULL;
@ -1414,26 +1411,31 @@ read_file_to_str(const char *filename, int bin, size_t *size_out)
} }
string[r] = '\0'; /* NUL-terminate the result. */ string[r] = '\0'; /* NUL-terminate the result. */
if (bin && r != statbuf.st_size) {
/* If we're in binary mode, then we'd better have an exact match for
* size. Otherwise, win32 encoding may throw us off, and that's okay. */
log_warn(LD_FS,"Could read only %d of %ld bytes of file \"%s\".",
r, (long)statbuf.st_size,filename);
tor_free(string);
close(fd);
return NULL;
}
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
if (!bin && strchr(string, '\r')) { if (!bin && strchr(string, '\r')) {
log_debug(LD_FS, "We didn't convert CRLF to LF as well as we hoped " log_debug(LD_FS, "We didn't convert CRLF to LF as well as we hoped "
"when reading %s. Coping.", "when reading %s. Coping.",
filename); filename);
tor_strstrip(string, "\r"); tor_strstrip(string, "\r");
r = strlen(string);
} }
if (!bin) {
statbuf.st_size = (size_t) r;
} else
#endif #endif
if (r != statbuf.st_size) {
/* Unless we're using text mode on win32, we'd better have an exact
* match for size. */
log_warn(LD_FS,"Could read only %d of %ld bytes of file \"%s\".",
r, (long)statbuf.st_size,filename);
tor_free(string);
close(fd);
return NULL;
}
close(fd); close(fd);
if (size_out) if (stat_out) {
*size_out = (size_t) r; memcpy(stat_out, &statbuf, sizeof(struct stat));
}
return string; return string;
} }

View File

@ -182,7 +182,8 @@ int write_chunks_to_file(const char *fname, const struct smartlist_t *chunks,
int append_bytes_to_file(const char *fname, const char *str, size_t len, int append_bytes_to_file(const char *fname, const char *str, size_t len,
int bin); int bin);
char *read_file_to_str(const char *filename, int bin, size_t *size_out) struct stat;
char *read_file_to_str(const char *filename, int bin, struct stat *stat_out)
ATTR_MALLOC; ATTR_MALLOC;
char *parse_line_from_str(char *line, char **key_out, char **value_out); char *parse_line_from_str(char *line, char **key_out, char **value_out);
char *expand_filename(const char *filename); char *expand_filename(const char *filename);

View File

@ -1529,8 +1529,8 @@ configure_nameservers(int force)
evdns_set_log_fn(evdns_log_cb); evdns_set_log_fn(evdns_log_cb);
if (conf_fname) { if (conf_fname) {
if (stat(conf_fname, &st)) { if (stat(conf_fname, &st)) {
log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s'", log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s",
conf_fname); conf_fname, strerror(errno));
return -1; return -1;
} }
if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname) if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname)

View File

@ -118,8 +118,8 @@ int
router_reload_networkstatus(void) router_reload_networkstatus(void)
{ {
char filename[512]; char filename[512];
struct stat st;
smartlist_t *entries; smartlist_t *entries;
struct stat st;
char *s; char *s;
tor_assert(get_options()->DataDirectory); tor_assert(get_options()->DataDirectory);
if (!networkstatus_list) if (!networkstatus_list)
@ -138,9 +138,8 @@ router_reload_networkstatus(void)
} }
tor_snprintf(filename,sizeof(filename),"%s/cached-status/%s", tor_snprintf(filename,sizeof(filename),"%s/cached-status/%s",
get_options()->DataDirectory, fn); get_options()->DataDirectory, fn);
s = read_file_to_str(filename, 0, NULL); s = read_file_to_str(filename, 0, &st);
if (s) { if (s) {
stat(filename, &st);
if (router_set_networkstatus(s, st.st_mtime, NS_FROM_CACHE, NULL)<0) { if (router_set_networkstatus(s, st.st_mtime, NS_FROM_CACHE, NULL)<0) {
log_warn(LD_FS, "Couldn't load networkstatus from \"%s\"",filename); log_warn(LD_FS, "Couldn't load networkstatus from \"%s\"",filename);
} }
@ -353,7 +352,6 @@ router_reload_router_list(void)
or_options_t *options = get_options(); or_options_t *options = get_options();
size_t fname_len = strlen(options->DataDirectory)+32; size_t fname_len = strlen(options->DataDirectory)+32;
char *fname = tor_malloc(fname_len), *contents; char *fname = tor_malloc(fname_len), *contents;
struct stat st;
if (!routerlist) if (!routerlist)
router_get_routerlist(); /* mallocs and inits it in place */ router_get_routerlist(); /* mallocs and inits it in place */
@ -376,7 +374,6 @@ router_reload_router_list(void)
options->DataDirectory); options->DataDirectory);
contents = read_file_to_str(fname, 1, NULL); contents = read_file_to_str(fname, 1, NULL);
if (contents) { if (contents) {
stat(fname, &st);
router_load_routers_from_string(contents, router_load_routers_from_string(contents,
SAVED_IN_JOURNAL, NULL); SAVED_IN_JOURNAL, NULL);
tor_free(contents); tor_free(contents);