]>
Commit | Line | Data |
---|---|---|
ee188d55 | 1 | /* Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc. |
60478656 RM |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Library General Public License as | |
6 | published by the Free Software Foundation; either version 2 of the | |
7 | License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Library General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Library General Public | |
15 | License along with the GNU C Library; see the file COPYING.LIB. If | |
16 | not, write to the Free Software Foundation, Inc., 675 Mass Ave, | |
17 | Cambridge, MA 02139, USA. */ | |
18 | ||
19 | #include <errno.h> | |
20 | #include <limits.h> | |
21 | #include <stddef.h> | |
22 | #include <dirent.h> | |
23 | #include <sys/types.h> | |
24 | #include <sys/stat.h> | |
25 | #include <unistd.h> | |
26 | #include <string.h> | |
27 | #include <stdlib.h> | |
28 | ||
29 | #ifndef MIN | |
30 | # define MIN(a, b) ((a) < (b) ? (a) : (b)) | |
31 | #endif | |
32 | ||
33 | /* Store at most BUFLEN character of the pathname of the terminal FD is | |
34 | open on in BUF. Return 0 on success, -1 otherwise. */ | |
35 | int | |
23396375 | 36 | __ttyname_r (fd, buf, buflen) |
60478656 RM |
37 | int fd; |
38 | char *buf; | |
39 | int buflen; | |
40 | { | |
41 | static const char dev[] = "/dev"; | |
42 | struct stat st; | |
43 | dev_t mydev; | |
44 | ino_t myino; | |
45 | DIR *dirstream; | |
46 | struct dirent *d; | |
47 | int save = errno; | |
48 | ||
49 | /* Test for the absolute minimal size. This makes life easier inside | |
50 | the loop. */ | |
2064087b | 51 | if (buflen < (int) (sizeof (dev) + 1)) |
60478656 RM |
52 | { |
53 | errno = EINVAL; | |
54 | return -1; | |
55 | } | |
56 | ||
a3e59be8 UD |
57 | if (!__isatty (fd)) |
58 | return -1; | |
59 | ||
60478656 RM |
60 | if (fstat (fd, &st) < 0) |
61 | return -1; | |
62 | mydev = st.st_dev; | |
63 | myino = st.st_ino; | |
64 | ||
65 | dirstream = opendir (dev); | |
66 | if (dirstream == NULL) | |
67 | return -1; | |
68 | ||
69 | /* Prepare the result buffer. */ | |
2064087b RM |
70 | memcpy (buf, dev, sizeof (dev) - 1); |
71 | buf[sizeof (dev) - 1] = '/'; | |
72 | buflen -= sizeof (dev); | |
60478656 RM |
73 | |
74 | while ((d = readdir (dirstream)) != NULL) | |
75 | if (d->d_fileno == myino) | |
76 | { | |
77 | char *cp; | |
78 | ||
2064087b | 79 | cp = __stpncpy (&buf[sizeof (dev)], d->d_name, |
ee188d55 | 80 | MIN ((int) (_D_EXACT_NAMLEN (d) + 1), buflen)); |
60478656 RM |
81 | cp[0] = '\0'; |
82 | ||
83 | if (stat (buf, &st) == 0 && st.st_dev == mydev) | |
84 | { | |
85 | (void) closedir (dirstream); | |
86 | errno = save; | |
87 | return 0; | |
88 | } | |
89 | } | |
90 | ||
91 | (void) closedir (dirstream); | |
92 | errno = save; | |
93 | return -1; | |
94 | } | |
23396375 | 95 | weak_alias (__ttyname_r, ttyname_r) |