1/*
2 * Copyright (c) 2009-2010 Todd C. Miller <Todd.Miller@courtesan.com>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <config.h>
18
19#include <sys/types.h>
20#include <sys/time.h>
21#ifdef HAVE_SYS_SELECT_H
22#include <sys/select.h>
23#endif /* HAVE_SYS_SELECT_H */
24#if TIME_WITH_SYS_TIME
25# include <time.h>
26#endif
27#ifndef HAVE_STRUCT_TIMESPEC
28# include "emul/timespec.h"
29#endif
30#include <errno.h>
31
32#include "missing.h"
33
34int
35nanosleep(ts, rts)
36    const struct timespec *ts;
37    struct timespec *rts;
38{
39    struct timeval timeout, endtime, now;
40    int rval;
41
42    timeout.tv_sec = ts->tv_sec;
43    timeout.tv_usec = ts->tv_nsec / 1000;
44    if (rts != NULL) {
45	gettimeofday(&endtime, NULL);
46	timevaladd(&endtime, &timeout);
47    }
48    rval = select(0, NULL, NULL, NULL, &timeout);
49    if (rts != NULL && rval == -1 && errno == EINTR) {
50	gettimeofday(&now, NULL);
51	timevalsub(&endtime, &now);
52	rts->tv_sec = endtime.tv_sec;
53	rts->tv_nsec = endtime.tv_usec * 1000;
54    }
55    return rval;
56}
57