diff options
Diffstat (limited to 'libc/stdlib/getpt.c')
-rw-r--r-- | libc/stdlib/getpt.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/libc/stdlib/getpt.c b/libc/stdlib/getpt.c index 0ee2d90d6..9e1f255bb 100644 --- a/libc/stdlib/getpt.c +++ b/libc/stdlib/getpt.c @@ -22,33 +22,45 @@ #include <stdlib.h> #include <unistd.h> #include <paths.h> -#include <sys/statfs.h> + +#if !defined ASSUME_DEVPTS +# include <sys/statfs.h> /* Constant that identifies the `devpts' filesystem. */ -#define DEVPTS_SUPER_MAGIC 0x1cd1 +# define DEVPTS_SUPER_MAGIC 0x1cd1 /* Constant that identifies the `devfs' filesystem. */ -#define DEVFS_SUPER_MAGIC 0x1373 +# define DEVFS_SUPER_MAGIC 0x1373 +#endif /* Path to the master pseudo terminal cloning device. */ #define _PATH_DEVPTMX _PATH_DEV "ptmx" /* Directory containing the UNIX98 pseudo terminals. */ #define _PATH_DEVPTS _PATH_DEV "pts" +#if !defined UNIX98PTY_ONLY /* Prototype for function that opens BSD-style master pseudo-terminals. */ int __bsd_getpt (void); +#endif /* Open a master pseudo terminal and return its file descriptor. */ int getpt (void) { +#if !defined UNIX98PTY_ONLY static int have_no_dev_ptmx; +#endif int fd; +#if !defined UNIX98PTY_ONLY if (!have_no_dev_ptmx) +#endif { fd = open (_PATH_DEVPTMX, O_RDWR); if (fd != -1) { +#if defined ASSUME_DEVPTS + return fd; +#else struct statfs fsbuf; static int devpts_mounted; @@ -69,21 +81,28 @@ getpt (void) are not usable. */ close (fd); have_no_dev_ptmx = 1; +#endif } else { +#if !defined UNIX98PTY_ONLY if (errno == ENOENT || errno == ENODEV) have_no_dev_ptmx = 1; else +#endif return -1; } } +#if !defined UNIX98PTY_ONLY return __bsd_getpt (); +#endif } -#define PTYNAME1 "pqrstuvwxyzabcde"; -#define PTYNAME2 "0123456789abcdef"; +#if !defined UNIX98PTY_ONLY +# define PTYNAME1 "pqrstuvwxyzabcde"; +# define PTYNAME2 "0123456789abcdef"; -#define __getpt __bsd_getpt -#include "bsd_getpt.c" +# define __getpt __bsd_getpt +# include "bsd_getpt.c" +#endif |