X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/23193e2c5a4646c1dedf4c09a805d6fae7523a8e..ae62eaeb01088430162fa96e8cca35f721ff376d:/unix/uxmisc.c diff --git a/unix/uxmisc.c b/unix/uxmisc.c index 0b04d211..222d5590 100644 --- a/unix/uxmisc.c +++ b/unix/uxmisc.c @@ -2,30 +2,29 @@ * PuTTY miscellaneous Unix stuff */ +#include #include +#include +#include #include -#include #include #include #include #include "putty.h" -/* - * We want to use milliseconds rather than microseconds or nanoseconds, - * because we need a decent number of them to fit into a 32-bit - * word so it can be used for keepalives. - */ +long tickcount_offset = 0; + unsigned long getticks(void) { struct timeval tv; -#ifdef CLOCK_MONOTONIC - struct timespec ts; - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) - return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; -#endif gettimeofday(&tv, NULL); - return tv.tv_sec * 1000 + tv.tv_usec / 1000; + /* + * 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. + */ + return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset; } Filename filename_from_str(const char *str) @@ -124,3 +123,62 @@ void pgp_fingerprints(void) "PuTTY Master Key (DSA), 1024-bit:\n" " " PGP_DSA_MASTER_KEY_FP "\n", stdout); } + +/* + * Set FD_CLOEXEC on a file descriptor + */ +int cloexec(int fd) { + int fdflags; + + fdflags = fcntl(fd, F_GETFD); + if (fdflags == -1) return -1; + return fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); +} + +FILE *f_open(struct Filename filename, char const *mode, int is_private) +{ + if (!is_private) { + return fopen(filename.path, mode); + } else { + 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); + if (fd < 0) + return NULL; + return fdopen(fd, mode); + } +} + +FontSpec *fontspec_new(const char *name) +{ + FontSpec *f = snew(FontSpec); + f->name = dupstr(name); + return f; +} +FontSpec *fontspec_copy(const FontSpec *f) +{ + return fontspec_new(f->name); +} +void fontspec_free(FontSpec *f) +{ + sfree(f->name); + sfree(f); +} +int fontspec_serialise(FontSpec *f, void *data) +{ + int len = strlen(f->name); + if (data) + strcpy(data, f->name); + return len + 1; /* include trailing NUL */ +} +FontSpec *fontspec_deserialise(void *vdata, int maxsize, int *used) +{ + char *data = (char *)vdata; + char *end = memchr(data, '\0', maxsize); + if (!end) + return NULL; + *used = end - data + 1; + return fontspec_new(data); +}