X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/962468d4b96c33869e9131eb42a0c784591f5884..f7aa4b367eaf2c1e928f97263bcf4da74680aff3:/unix/uxmisc.c diff --git a/unix/uxmisc.c b/unix/uxmisc.c index 7d577f96..300fc543 100644 --- a/unix/uxmisc.c +++ b/unix/uxmisc.c @@ -7,24 +7,36 @@ #include #include #include +#include #include #include #include #include "putty.h" -long tickcount_offset = 0; - unsigned long getticks(void) { - struct timeval tv; - gettimeofday(&tv, NULL); /* - * We want to use milliseconds rather than microseconds, - * because we need a decent number of them to fit into a 32-bit - * word so it can be used for keepalives. + * We want to use milliseconds rather than the microseconds or + * nanoseconds given by the underlying clock functions, because we + * need a decent number of them to fit into a 32-bit word so it + * can be used for keepalives. */ - return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset; +#if defined HAVE_CLOCK_GETTIME && defined HAVE_DECL_CLOCK_MONOTONIC + { + /* Use CLOCK_MONOTONIC if available, so as to be unconfused if + * the system clock changes. */ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) + return ts.tv_sec * TICKSPERSEC + + ts.tv_nsec / (1000000000 / TICKSPERSEC); + } +#endif + { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * TICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC); + } } Filename *filename_from_str(const char *str) @@ -174,7 +186,7 @@ FILE *f_open(const Filename *filename, char const *mode, int is_private) int fd; assert(mode[0] == 'w'); /* is_private is meaningless for read, and tricky for append */ - fd = open(filename->path, O_WRONLY | O_CREAT | O_TRUNC, 0700); + fd = open(filename->path, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fd < 0) return NULL; return fdopen(fd, mode);