diff options
author | Peter Palfrader <peter@palfrader.org> | 2009-09-21 13:14:39 +0200 |
---|---|---|
committer | Peter Palfrader <peter@palfrader.org> | 2009-09-21 13:14:39 +0200 |
commit | a9c45754e0e587dda4e16f888a1662eddf90b1f5 (patch) | |
tree | cc5b7aa467419ae63f394e9e3929c38eac316915 /src/common/util.c | |
parent | b440a4d9369c4a6c4501b289f2e6ff089ba9a519 (diff) | |
parent | 54ba86d9d0cff2ceef75d564ece3d7d2ea26af26 (diff) | |
download | tor-a9c45754e0e587dda4e16f888a1662eddf90b1f5.tar tor-a9c45754e0e587dda4e16f888a1662eddf90b1f5.tar.gz |
Merge commit 'tor-0.2.2.2-alpha' into debian-merge
* commit 'tor-0.2.2.2-alpha': (94 commits)
downgrade a log severity, since this event has been known
Update to the "September 4 2009" ip-to-country file.
bump to 0.2.2.2-alpha
Revert "Teach connection_ap_can_use_exit about Exclude*Nodes"
fix grammar / add changelog for the torify commit
Fix compile on Snow Leopard
Fix build warnings on OSX 10.5.8
Change the condition on the nonlive timeout counting.
Add a couple of time helper functions.
Fix typos and comments, plus two bugs
Implement and document new network liveness algorithm.
Fix some precision-related asserts in unit tests.
replace contrib/auto-naming with a readme saying where it went
clarify our rules for assigning the Named flag
disable the end of circuitbuildtimeout units tests
draw in a lot of 0.2.1.20 changelog items into 0.2.2.2-alpha
Fix compile on freebsd
Let our config abbreviations rewrite more than once
a mish-mash of stuff in my sandbox
give proposal 151 a changelog and other touchups
...
Diffstat (limited to 'src/common/util.c')
-rw-r--r-- | src/common/util.c | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/src/common/util.c b/src/common/util.c index 234180c4d..d05c308fe 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -735,7 +735,18 @@ tor_parse_ulong(const char *s, int base, unsigned long min, CHECK_STRTOX_RESULT(); } -/** As tor_parse_log, but return a unit64_t. Only base 10 is guaranteed to +/** As tor_parse_long(), but return a double. */ +double +tor_parse_double(const char *s, double min, double max, int *ok, char **next) +{ + char *endptr; + double r; + + r = strtod(s, &endptr); + CHECK_STRTOX_RESULT(); +} + +/** As tor_parse_long, but return a uint64_t. Only base 10 is guaranteed to * work for now. */ uint64_t tor_parse_uint64(const char *s, int base, uint64_t min, @@ -1023,6 +1034,42 @@ wrap_string(smartlist_t *out, const char *string, size_t width, * Time * ===== */ +/** + * Converts struct timeval to a double value. + * Preserves microsecond precision, but just barely. + * Error is approx +/- 0.1 usec when dealing with epoch values. + */ +double +tv_to_double(const struct timeval *tv) +{ + double conv = tv->tv_sec; + conv += tv->tv_usec/1000000.0; + return conv; +} + +/** + * Converts timeval to milliseconds. + */ +int64_t +tv_to_msec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000L; + /* Round ghetto-style */ + conv += ((int64_t)tv->tv_usec+500)/1000L; + return conv; +} + +/** + * Converts timeval to microseconds. + */ +int64_t +tv_to_usec(const struct timeval *tv) +{ + int64_t conv = ((int64_t)tv->tv_sec)*1000000L; + conv += tv->tv_usec; + return conv; +} + /** Return the number of microseconds elapsed between *start and *end. */ long @@ -1055,7 +1102,9 @@ tv_mdiff(const struct timeval *start, const struct timeval *end) return LONG_MAX; } - mdiff = secdiff*1000L + (end->tv_usec - start->tv_usec) / 1000L; + /* Subtract and round */ + mdiff = secdiff*1000L + + ((long)end->tv_usec - (long)start->tv_usec + 500L) / 1000L; return mdiff; } @@ -1865,7 +1914,8 @@ write_chunks_to_file_impl(const char *fname, const smartlist_t *chunks, int open_flags) { open_file_t *file = NULL; - int fd, result; + int fd; + ssize_t result; fd = start_writing_to_file(fname, open_flags, 0600, &file); if (fd<0) return -1; @@ -1950,7 +2000,7 @@ read_file_to_str(const char *filename, int flags, struct stat *stat_out) int fd; /* router file */ struct stat statbuf; char *string; - int r; + ssize_t r; int bin = flags & RFTS_BIN; tor_assert(filename); @@ -2009,7 +2059,7 @@ read_file_to_str(const char *filename, int flags, struct stat *stat_out) * match for size. */ int save_errno = errno; log_warn(LD_FS,"Could read only %d of %ld bytes of file \"%s\".", - r, (long)statbuf.st_size,filename); + (int)r, (long)statbuf.st_size,filename); tor_free(string); close(fd); errno = save_errno; |