]>
Commit | Line | Data |
---|---|---|
f7a9f785 | 1 | /* Copyright (C) 1998-2016 Free Software Foundation, Inc. |
6591c335 UD |
2 | This file is part of the GNU C Library. |
3 | Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998. | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
6591c335 UD |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 13 | Lesser General Public License for more details. |
6591c335 | 14 | |
41bdb6e2 | 15 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
16 | License along with the GNU C Library; if not, see |
17 | <http://www.gnu.org/licenses/>. */ | |
6591c335 | 18 | |
6591c335 | 19 | #include <errno.h> |
9b3c7c3c UD |
20 | #include <fcntl.h> |
21 | #include <string.h> | |
22 | #include <unistd.h> | |
23 | ||
24 | ||
25 | /* Prefix for master pseudo terminal nodes. */ | |
26 | #define _PATH_PTY "/dev/pty" | |
6591c335 | 27 | |
6591c335 | 28 | |
9b3c7c3c UD |
29 | /* Letters indicating a series of pseudo terminals. */ |
30 | #ifndef PTYNAME1 | |
31 | #define PTYNAME1 "pqrsPQRS" | |
32 | #endif | |
ab26a24a | 33 | const char __libc_ptyname1[] attribute_hidden = PTYNAME1; |
6591c335 | 34 | |
9b3c7c3c UD |
35 | /* Letters indicating the position within a series. */ |
36 | #ifndef PTYNAME2 | |
37 | #define PTYNAME2 "0123456789abcdefghijklmnopqrstuv"; | |
38 | #endif | |
ab26a24a | 39 | const char __libc_ptyname2[] attribute_hidden = PTYNAME2; |
9b3c7c3c UD |
40 | |
41 | ||
42 | /* Open a master pseudo terminal and return its file descriptor. */ | |
6591c335 | 43 | int |
9b3c7c3c | 44 | __getpt (void) |
6591c335 | 45 | { |
9b3c7c3c UD |
46 | char buf[sizeof (_PATH_PTY) + 2]; |
47 | const char *p, *q; | |
48 | char *s; | |
6591c335 | 49 | |
e7c5513d UD |
50 | s = __mempcpy (buf, _PATH_PTY, sizeof (_PATH_PTY) - 1); |
51 | /* s[0] and s[1] will be filled in the loop. */ | |
52 | s[2] = '\0'; | |
53 | ||
54 | for (p = __libc_ptyname1; *p != '\0'; ++p) | |
6591c335 | 55 | { |
9b3c7c3c UD |
56 | s[0] = *p; |
57 | ||
e7c5513d | 58 | for (q = __libc_ptyname2; *q != '\0'; ++q) |
9b3c7c3c UD |
59 | { |
60 | int fd; | |
e7c5513d | 61 | |
9b3c7c3c | 62 | s[1] = *q; |
e7c5513d | 63 | |
9b3c7c3c | 64 | fd = __open (buf, O_RDWR); |
6591c335 | 65 | if (fd != -1) |
336dfb2d | 66 | return fd; |
e7c5513d | 67 | |
336dfb2d | 68 | if (errno == ENOENT) |
6591c335 | 69 | return -1; |
9b3c7c3c | 70 | } |
6591c335 | 71 | } |
9b3c7c3c | 72 | |
336dfb2d | 73 | __set_errno (ENOENT); |
6591c335 UD |
74 | return -1; |
75 | } | |
e993e9cc UD |
76 | |
77 | #undef __getpt | |
3331899a | 78 | weak_alias (__getpt, getpt) |
0101a56f UD |
79 | |
80 | #ifndef HAVE_POSIX_OPENPT | |
81 | /* We cannot define posix_openpt in general for BSD systems. */ | |
82 | int | |
8a0746ae | 83 | __posix_openpt (int oflag) |
0101a56f UD |
84 | { |
85 | __set_errno (ENOSYS); | |
86 | return -1; | |
87 | } | |
88 | weak_alias (__posix_openpt, posix_openpt) | |
89 | ||
90 | stub_warning (posix_openpt) | |
0101a56f | 91 | #endif |