X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/799dfcfab944cd604ee0850f37e0dcb07f02d84d..1e00c92b81273392a7db4796dc163b0729891e44:/unix/uxmisc.c diff --git a/unix/uxmisc.c b/unix/uxmisc.c index d1afa44a..dd04e6f5 100644 --- a/unix/uxmisc.c +++ b/unix/uxmisc.c @@ -2,7 +2,10 @@ * PuTTY miscellaneous Unix stuff */ +#include #include +#include +#include #include #include #include @@ -10,19 +13,20 @@ #include "putty.h" +long tickcount_offset = 0; + unsigned long getticks(void) { struct timeval tv; gettimeofday(&tv, NULL); /* - * This will wrap around approximately every 4000 seconds, i.e. - * just over an hour, which is more than enough. + * 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 * 1000000 + tv.tv_usec; + return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset; } - - Filename filename_from_str(const char *str) { Filename ret; @@ -101,3 +105,48 @@ char *get_username(void) return dupstr(ret); } + +/* + * Display the fingerprints of the PGP Master Keys to the user. + * (This is here rather than in uxcons because it's appropriate even for + * Unix GUI apps.) + */ +void pgp_fingerprints(void) +{ + fputs("These are the fingerprints of the PuTTY PGP Master Keys. They can\n" + "be used to establish a trust path from this executable to another\n" + "one. See the manual for more information.\n" + "(Note: these fingerprints have nothing to do with SSH!)\n" + "\n" + "PuTTY Master Key (RSA), 1024-bit:\n" + " " PGP_RSA_MASTER_KEY_FP "\n" + "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); + } +}