diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat.c | 17 | ||||
-rw-r--r-- | src/common/compat.h | 1 | ||||
-rw-r--r-- | src/common/log.c | 8 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 1760684cf7..dcdf78d49f 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1004,6 +1004,23 @@ tor_fd_setpos(int fd, off_t pos) #endif } +/** Replacement for ftruncate(fd, 0): move to the front of the file and remove + * all the rest of the file. Return -1 on error, 0 on success. */ +int +tor_ftruncate(int fd) +{ + /* Rumor has it that some versions of ftruncate do not move the file pointer. + */ + if (tor_fd_setpos(fd, 0) < 0) + return -1; + +#ifdef _WIN32 + return _chsize(fd, 0); +#else + return ftruncate(fd, 0); +#endif +} + #undef DEBUG_SOCKET_COUNTING #ifdef DEBUG_SOCKET_COUNTING /** A bitarray of all fds that should be passed to tor_socket_close(). Only diff --git a/src/common/compat.h b/src/common/compat.h index 296042fa50..852a432187 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -408,6 +408,7 @@ void tor_lockfile_unlock(tor_lockfile_t *lockfile); off_t tor_fd_getpos(int fd); int tor_fd_setpos(int fd, off_t pos); int tor_fd_seekend(int fd); +int tor_ftruncate(int fd); #ifdef _WIN32 #define PATH_SEPARATOR "\\" diff --git a/src/common/log.c b/src/common/log.c index 7c8a48746a..4ddd54fab0 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -1305,6 +1305,10 @@ switch_logs_debug(void) void truncate_logs(void) { - for (logfile_t *lf = logfiles; lf; lf = lf->next) - ftruncate(lf->fd, 0); + for (logfile_t *lf = logfiles; lf; lf = lf->next) { + if (lf->fd >= 0) { + tor_ftruncate(lf->fd); + } + } } + |