diff options
Diffstat (limited to 'libc/unistd')
-rw-r--r-- | libc/unistd/fpathconf.c | 20 | ||||
-rw-r--r-- | libc/unistd/pathconf.c | 5 | ||||
-rw-r--r-- | libc/unistd/sleep.c | 55 | ||||
-rw-r--r-- | libc/unistd/usleep.c | 14 |
4 files changed, 89 insertions, 5 deletions
diff --git a/libc/unistd/fpathconf.c b/libc/unistd/fpathconf.c index 23b628f48..f3e2ffe83 100644 --- a/libc/unistd/fpathconf.c +++ b/libc/unistd/fpathconf.c @@ -32,7 +32,21 @@ //#include "linux_fsinfo.h" libc_hidden_proto(fstat) -libc_hidden_proto(fstatfs) +#if !defined __UCLIBC_LINUX_SPECIFIC__ +#ifndef __USE_FILE_OFFSET64 +extern int fstatfs (int __fildes, struct statfs *__buf) + __THROW __nonnull ((2)); +#else +# ifdef __REDIRECT_NTH + extern int __REDIRECT_NTH (fstatfs, (int __fildes, struct statfs *__buf), + fstatfs64) __nonnull ((2)); +# else +# define fstatfs fstatfs64 +# endif +#endif +#endif +extern __typeof(fstatfs) __libc_fstatfs; +libc_hidden_proto(__libc_fstatfs) /* The Linux kernel headers mention this as a kind of generic value. */ #define LINUX_LINK_MAX 127 @@ -54,7 +68,7 @@ long int fpathconf(int fd, int name) struct statfs fsbuf; /* Determine the filesystem type. */ - if (fstatfs (fd, &fsbuf) < 0) + if (__libc_fstatfs (fd, &fsbuf) < 0) { if (errno == ENOSYS) /* not possible, return the default value. */ @@ -128,7 +142,7 @@ long int fpathconf(int fd, int name) struct statfs buf; int save_errno = errno; - if (fstatfs (fd, &buf) < 0) + if (__libc_fstatfs (fd, &buf) < 0) { if (errno == ENOSYS) { diff --git a/libc/unistd/pathconf.c b/libc/unistd/pathconf.c index 8e3c0a352..7f7efbb7f 100644 --- a/libc/unistd/pathconf.c +++ b/libc/unistd/pathconf.c @@ -31,7 +31,8 @@ #include <sys/statfs.h> //#include <sys/statvfs.h> -libc_hidden_proto(statfs) +extern __typeof(statfs) __libc_statfs; +libc_hidden_proto(__libc_statfs) libc_hidden_proto(stat) @@ -83,7 +84,7 @@ pathconf (const char *path, int name) struct statfs buf; int save_errno = errno; - if (statfs (path, &buf) < 0) + if (__libc_statfs (path, &buf) < 0) { if (errno == ENOSYS) { diff --git a/libc/unistd/sleep.c b/libc/unistd/sleep.c index 4381c45c7..c5c9cdd21 100644 --- a/libc/unistd/sleep.c +++ b/libc/unistd/sleep.c @@ -27,6 +27,9 @@ libc_hidden_proto(sleep) libc_hidden_proto(sigaction) libc_hidden_proto(sigprocmask) + +/* version perusing nanosleep */ +#if defined __UCLIBC_HAS_REALTIME__ //libc_hidden_proto(__sigaddset) //libc_hidden_proto(__sigemptyset) //libc_hidden_proto(__sigismember) @@ -114,4 +117,56 @@ unsigned int sleep (unsigned int seconds) return result; } #endif +#else /* __UCLIBC_HAS_REALTIME__ */ +libc_hidden_proto(sigaction) +/* no nanosleep, use signals and alarm() */ +static void sleep_alarm_handler(int attribute_unused sig) +{ +} +unsigned int sleep (unsigned int seconds) +{ + struct sigaction act, oact; + sigset_t set, oset; + unsigned int result, remaining; + time_t before, after; + int old_errno = errno; + + /* This is not necessary but some buggy programs depend on this. */ + if (seconds == 0) + return 0; + + /* block SIGALRM */ + if (__sigemptyset (&set) < 0 + || __sigaddset (&set, SIGALRM) < 0 + || sigprocmask (SIG_BLOCK, &set, &oset)) + return seconds; + + act.sa_handler = sleep_alarm_handler; + act.sa_flags = 0; + act.sa_mask = oset; + if (sigaction(SIGALRM, &act, &oact) < 0) + return seconds; + + before = time(NULL); + remaining = alarm(seconds); + if (remaining && remaining > seconds) { + /* restore user's alarm */ + (void) sigaction(SIGALRM, &oact, (struct sigaction *) NULL); + alarm(remaining); /* restore old alarm */ + sigsuspend(&oset); + after = time(NULL); + } else { + sigsuspend (&oset); + after = time(NULL); + (void) sigaction (SIGALRM, &oact, NULL); + } + result = after - before; + alarm(remaining > result ? remaining - result : 0); + sigprocmask (SIG_SETMASK, &oset, NULL); + + __set_errno(old_errno); + + return result > seconds ? 0 : seconds - result; +} +#endif /* __UCLIBC_HAS_REALTIME__ */ libc_hidden_def(sleep) diff --git a/libc/unistd/usleep.c b/libc/unistd/usleep.c index 91b88278d..8a27f900a 100644 --- a/libc/unistd/usleep.c +++ b/libc/unistd/usleep.c @@ -9,6 +9,8 @@ #include <sys/types.h> #include <unistd.h> +#if defined __USE_BSD || defined __USE_POSIX98 +#if defined __UCLIBC_HAS_REALTIME__ /*libc_hidden_proto(nanosleep) need the reloc for cancellation*/ int usleep (__useconds_t usec) @@ -19,3 +21,15 @@ int usleep (__useconds_t usec) }; return(nanosleep(&ts, NULL)); } +#else /* __UCLIBC_HAS_REALTIME__ */ +libc_hidden_proto(select) +int usleep (__useconds_t usec) +{ + struct timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = usec; + return select(0, NULL, NULL, NULL, &tv); +} +#endif /* __UCLIBC_HAS_REALTIME__ */ +#endif |