summaryrefslogtreecommitdiff
path: root/libc/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'libc/stdlib')
-rw-r--r--libc/stdlib/Makefile.in10
-rw-r--r--libc/stdlib/_atexit.c1
-rw-r--r--libc/stdlib/bsd_getpt.c2
-rw-r--r--libc/stdlib/getpt.c40
4 files changed, 39 insertions, 14 deletions
diff --git a/libc/stdlib/Makefile.in b/libc/stdlib/Makefile.in
index ad2a95935..dfef6d18e 100644
--- a/libc/stdlib/Makefile.in
+++ b/libc/stdlib/Makefile.in
@@ -12,10 +12,16 @@ include $(top_srcdir)libc/stdlib/malloc-standard/Makefile.in
CSRC := \
abort.c getenv.c mkdtemp.c mktemp.c realpath.c mkstemp.c \
rand.c random.c random_r.c setenv.c system.c div.c ldiv.c lldiv.c \
- getpt.c ptsname.c grantpt.c unlockpt.c drand48-iter.c jrand48.c \
+ getpt.c drand48-iter.c jrand48.c \
jrand48_r.c lrand48.c lrand48_r.c mrand48.c mrand48_r.c nrand48.c \
nrand48_r.c rand_r.c srand48.c srand48_r.c seed48.c seed48_r.c \
- valloc.c posix_memalign.c a64l.c l64a.c __uc_malloc.c
+ valloc.c a64l.c l64a.c __uc_malloc.c
+ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),y)
+CSRC += posix_memalign.c
+endif
+ifeq ($(UCLIBC_HAS_PTY),y)
+CSRC += grantpt.c unlockpt.c ptsname.c
+endif
ifeq ($(UCLIBC_HAS_ARC4RANDOM),y)
CSRC += arc4random.c
endif
diff --git a/libc/stdlib/_atexit.c b/libc/stdlib/_atexit.c
index 21aa30c81..e5840f471 100644
--- a/libc/stdlib/_atexit.c
+++ b/libc/stdlib/_atexit.c
@@ -107,6 +107,7 @@ extern void *__dso_handle __attribute__ ((__weak__));
#ifdef L_atexit
int attribute_hidden atexit(aefuncp func)
#else
+int old_atexit(aefuncp func);
int old_atexit(aefuncp func)
#endif
{
diff --git a/libc/stdlib/bsd_getpt.c b/libc/stdlib/bsd_getpt.c
index 9b93448bc..5f0f63f7a 100644
--- a/libc/stdlib/bsd_getpt.c
+++ b/libc/stdlib/bsd_getpt.c
@@ -22,6 +22,7 @@
#include <string.h>
#include <unistd.h>
+#if defined __USE_BSD
libc_hidden_proto(open)
/* Experimentally off - libc_hidden_proto(mempcpy) */
@@ -76,3 +77,4 @@ __getpt (void)
__set_errno (ENOENT);
return -1;
}
+#endif
diff --git a/libc/stdlib/getpt.c b/libc/stdlib/getpt.c
index 3dbaf9ed7..950664509 100644
--- a/libc/stdlib/getpt.c
+++ b/libc/stdlib/getpt.c
@@ -20,8 +20,13 @@
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <unistd.h>
#include <paths.h>
+#include <sys/statfs.h>
+
+extern __typeof(statfs) __libc_statfs;
+libc_hidden_proto(__libc_statfs)
libc_hidden_proto(open)
libc_hidden_proto(close)
@@ -47,36 +52,37 @@ extern int __bsd_getpt (void) attribute_hidden;
/* Open a master pseudo terminal and return its file descriptor. */
int
-getpt (void)
+posix_openpt (int flags)
{
+#define have_no_dev_ptmx (1<<0)
+#define devpts_mounted (1<<1)
#if !defined __UNIX98PTY_ONLY__
- static smallint have_no_dev_ptmx;
+ static smallint _state;
#endif
int fd;
#if !defined __UNIX98PTY_ONLY__
- if (!have_no_dev_ptmx)
+ if (!(_state & have_no_dev_ptmx))
#endif
{
- fd = open (_PATH_DEVPTMX, O_RDWR);
+ fd = open (_PATH_DEVPTMX, flags);
if (fd != -1)
{
#if defined __ASSUME_DEVPTS__
return fd;
#else
struct statfs fsbuf;
- static smallint devpts_mounted;
/* Check that the /dev/pts filesystem is mounted
or if /dev is a devfs filesystem (this implies /dev/pts). */
- if (devpts_mounted
- || (statfs (_PATH_DEVPTS, &fsbuf) == 0
+ if ((_state & devpts_mounted)
+ || (__libc_statfs (_PATH_DEVPTS, &fsbuf) == 0
&& fsbuf.f_type == DEVPTS_SUPER_MAGIC)
- || (statfs (_PATH_DEV, &fsbuf) == 0
+ || (__libc_statfs (_PATH_DEV, &fsbuf) == 0
&& fsbuf.f_type == DEVFS_SUPER_MAGIC))
{
/* Everything is ok. */
- devpts_mounted = 1;
+ _state |= devpts_mounted;
return fd;
}
@@ -84,7 +90,7 @@ getpt (void)
are not usable. */
close (fd);
#if !defined __UNIX98PTY_ONLY__
- have_no_dev_ptmx = 1;
+ _state |= have_no_dev_ptmx;
#endif
#endif
}
@@ -92,16 +98,25 @@ getpt (void)
{
#if !defined __UNIX98PTY_ONLY__
if (errno == ENOENT || errno == ENODEV)
- have_no_dev_ptmx = 1;
+ _state |= have_no_dev_ptmx;
else
#endif
return -1;
}
}
+ return -1;
+}
+#if defined __USE_GNU && defined __UCLIBC_HAS_GETPT__
+int
+getpt (void)
+{
+ int fd = posix_openpt(O_RDWR);
#if !defined __UNIX98PTY_ONLY__
- return __bsd_getpt ();
+ if (fd == -1)
+ fd = __bsd_getpt();
#endif
+ return fd;
}
#if !defined __UNIX98PTY_ONLY__
@@ -111,3 +126,4 @@ getpt (void)
# define __getpt __bsd_getpt
# include "bsd_getpt.c"
#endif
+#endif /* GNU && __UCLIBC_HAS_GETPT__ */