diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 185 |
1 files changed, 0 insertions, 185 deletions
@@ -1,185 +0,0 @@ -#include <sys/select.h> -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <assert.h> -#include <fcntl.h> - -#include "util.h" - -/* Calculate the difference between the two specfified timeval - * timestamsps. */ -usec_t timeval_diff(const struct timeval *a, const struct timeval *b) { - usec_t r; - assert(a && b); - - /* Check which whan is the earlier time and swap the two arguments if reuqired. */ - if (timeval_cmp(a, b) < 0) { - const struct timeval *c; - c = a; - a = b; - b = c; - } - - /* Calculate the second difference*/ - r = ((usec_t) a->tv_sec - b->tv_sec)* 1000000; - - /* Calculate the microsecond difference */ - if (a->tv_usec > b->tv_usec) - r += ((usec_t) a->tv_usec - b->tv_usec); - else if (a->tv_usec < b->tv_usec) - r -= ((usec_t) b->tv_usec - a->tv_usec); - - return r; -} - -/* Compare the two timeval structs and return 0 when equal, negative when a < b, positive otherwse */ -int timeval_cmp(const struct timeval *a, const struct timeval *b) { - assert(a && b); - - if (a->tv_sec < b->tv_sec) - return -1; - - if (a->tv_sec > b->tv_sec) - return 1; - - if (a->tv_usec < b->tv_usec) - return -1; - - if (a->tv_usec > b->tv_usec) - return 1; - - return 0; -} - -/* Return the time difference between now and the specified timestamp */ -usec_t timeval_age(const struct timeval *tv) { - struct timeval now; - assert(tv); - gettimeofday(&now, NULL); - return timeval_diff(&now, tv); -} - -/* Add the specified time inmicroseconds to the specified timeval structure */ -void timeval_add(struct timeval *tv, usec_t v) { - unsigned long secs; - assert(tv); - - secs = (v/1000000); - tv->tv_sec += (unsigned long) secs; - v -= secs*1000000; - - tv->tv_usec += v; - - /* Normalize */ - while (tv->tv_usec >= 1000000) { - tv->tv_sec++; - tv->tv_usec -= 1000000; - } -} - -int set_cloexec(int fd) { - int n; - assert(fd >= 0); - - if ((n = fcntl(fd, F_GETFD)) < 0) - return -1; - - if (n & FD_CLOEXEC) - return 0; - - return fcntl(fd, F_SETFD, n|FD_CLOEXEC); -} - -int set_nonblock(int fd) { - int n; - assert(fd >= 0); - - if ((n = fcntl(fd, F_GETFL)) < 0) - return -1; - - if (n & O_NONBLOCK) - return 0; - - return fcntl(fd, F_SETFL, n|O_NONBLOCK); -} - -int wait_for_write(int fd, struct timeval *end) { - struct timeval now; - - if (end) - gettimeofday(&now, NULL); - - for (;;) { - struct timeval tv; - fd_set fds; - int r; - - FD_ZERO(&fds); - FD_SET(fd, &fds); - - if (end) { - if (timeval_cmp(&now, end) >= 0) - return 1; - - tv.tv_sec = tv.tv_usec = 0; - timeval_add(&tv, timeval_diff(end, &now)); - } - - if ((r = select(fd+1, NULL, &fds, NULL, end ? &tv : NULL)) < 0) { - if (errno != EINTR) { - fprintf(stderr, "select() failed: %s\n", strerror(errno)); - return -1; - } - } else if (r == 0) - return 1; - else { - if (FD_ISSET(fd, &fds)) - return 0; - } - - if (end) - gettimeofday(&now, NULL); - } -} - -int wait_for_read(int fd, struct timeval *end) { - struct timeval now; - - if (end) - gettimeofday(&now, NULL); - - for (;;) { - struct timeval tv; - fd_set fds; - int r; - - FD_ZERO(&fds); - FD_SET(fd, &fds); - - if (end) { - if (timeval_cmp(&now, end) >= 0) - return 1; - - tv.tv_sec = tv.tv_usec = 0; - timeval_add(&tv, timeval_diff(end, &now)); - } - - if ((r = select(fd+1, &fds, NULL, NULL, end ? &tv : NULL)) < 0) { - if (errno != EINTR) { - fprintf(stderr, "select() failed: %s\n", strerror(errno)); - return -1; - } - } else if (r == 0) - return 1; - else { - - if (FD_ISSET(fd, &fds)) - return 0; - } - - if (end) - gettimeofday(&now, NULL); - } -} - |