From 4cc4b30426c5e5a0ecf912791e3f27312438d10e Mon Sep 17 00:00:00 2001
From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Date: Tue, 3 Jun 2008 08:11:56 +0000
Subject: - adds several config-options to allow for turning off certain
 features   like   o UCLIBC_HAS_GNU_ERROR   o UCLIBC_HAS_BSD_ERR   o
 UCLIBC_HAS_PTY   o UCLIBC_HAS_GETPT (1)   o UCLIBC_SYSCALL_STUBS   o
 UCLIBC_SYSCALL_STUB_WARNING   o UCLIBC_LINUX_SPECIFIC (2)   o
 UCLIBC_BSD_SPECIFIC (3)   o UCLIBC_NTP_LEGACY (4)   o UCLIBC_SV4_DEPRECATED
 (5)   o UCLIBC_HAVE_REALTIME (6)   o UCLIBC_HAVE_ADVANCED_REALTIME (7)   o
 UCLIBC_HAVE_EPOLL (8)   o UCLIBC_HAVE_XATTR (9)   o UCLIBC_HAVE_PROFILING
 (10)

(1) make non-standard getpt optional and implement standard posix_openpt
(2) fstatfs(), inotify_*(), ioperm(), iopl(), madvise(), modify_ldt(),
    personality()
    ppoll(), setresuid()
(3) mincore(), getdomainname(), setdomainname()
(4) ntp_adjtime(), ntp_gettime() aliases
(5) ustat() [use statfs(2) in your code instead]
(6) All marked as "(REALTIME)" in SUSv3
(7) All marked as "(ADVANCED REALTIME)" in SUSv3
(8) epoll_create(), epoll_ctl(), epoll_wait()
(9) all Extended Attributes
(10) helpers for gcc's -finstrument-functions

- Fixes _dl_exit()
- Implements sleep(3) for !UCLIBC_HAVE_REALTIME
- Implements usleep(3) for !UCLIBC_HAVE_REALTIME
- adds #warning about incorrect posix_fadvise{,64}()
- removes unused and unwanted uselib()

Net outcome is that an allnoconfig with HAVE_SHARED is now about 88k instead
of formerly 130k.
---
 libc/unistd/fpathconf.c | 20 +++++++++++++++---
 libc/unistd/pathconf.c  |  5 +++--
 libc/unistd/sleep.c     | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
 libc/unistd/usleep.c    | 14 +++++++++++++
 4 files changed, 89 insertions(+), 5 deletions(-)

(limited to 'libc/unistd')

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
-- 
cgit v1.2.3