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