mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 22:03:31 +01:00
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:
parent
8a9a55251f
commit
5cb99857bc
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
close(fd);
|
||||||
if (size_out)
|
return NULL;
|
||||||
*size_out = (size_t) r;
|
}
|
||||||
|
close(fd);
|
||||||
|
if (stat_out) {
|
||||||
|
memcpy(stat_out, &statbuf, sizeof(struct stat));
|
||||||
|
}
|
||||||
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user