1 --- ttyname.c.orig 2008-10-09 21:30:31.000000000 -0700
2 +++ ttyname.c 2008-10-09 22:00:10.000000000 -0700
3 @@ -48,10 +48,12 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/tty
8 #include "un-namespace.h"
10 #include "libc_private.h"
12 +#ifndef BUILDING_VARIANT
13 static char buf[sizeof(_PATH_DEV) + MAXNAMLEN];
14 static char *ttyname_threaded(int fd);
15 static char *ttyname_unthreaded(int fd);
16 @@ -71,31 +73,63 @@ ttyname(int fd)
17 ret = ttyname_threaded(fd);
20 +#endif /* !BUILDING_VARIANT */
24 +#else /* !__DARWIN_UNIX03 */
26 -ttyname_r(int fd, char *buf, size_t len)
27 +#endif /* __DARWIN_UNIX03 */
28 +ttyname_r(int fd, char *thrbuf, size_t len)
36 + if (_fstat(fd, &sb) < 0)
38 /* Must be a terminal. */
42 /* Must be a character device. */
43 - if (_fstat(fd, &sb) || !S_ISCHR(sb.st_mode))
45 + if (!S_ISCHR(sb.st_mode))
47 /* Must have enough room */
48 if (len <= sizeof(_PATH_DEV))
51 +#else /* !__DARWIN_UNIX03 */
52 + /* Must be a terminal. */
55 + /* Must be a character device. */
56 + if (_fstat(fd, &sb))
58 + if (!S_ISCHR(sb.st_mode)) {
62 + /* Must have enough room */
63 + if (len <= sizeof(_PATH_DEV)) {
67 +#endif /* __DARWIN_UNIX03 */
69 - strcpy(buf, _PATH_DEV);
70 - devname_r(sb.st_rdev, S_IFCHR,
71 - buf + strlen(buf), sizeof(buf) - strlen(buf));
73 + strcpy(thrbuf, _PATH_DEV);
74 + if (devname_r(sb.st_rdev, S_IFCHR,
75 + thrbuf + strlen(thrbuf), len - strlen(thrbuf)) == NULL)
79 +#else /* !__DARWIN_UNIX03 */
85 +#endif /* __DARWIN_UNIX03 */
88 +#ifndef BUILDING_VARIANT
90 ttyname_threaded(int fd)
92 @@ -104,8 +138,12 @@ ttyname_threaded(int fd)
93 if (ttyname_init == 0) {
94 _pthread_mutex_lock(&ttyname_lock);
95 if (ttyname_init == 0) {
96 - if (_pthread_key_create(&ttyname_key, free)) {
97 + /* __PTK_LIBC_TTYNAME_KEY */
98 + ttyname_key = __LIBC_PTHREAD_KEY_TTYNAME;
99 + if (pthread_key_init_np(ttyname_key, free)) {
101 _pthread_mutex_unlock(&ttyname_lock);
106 @@ -117,14 +155,20 @@ ttyname_threaded(int fd)
107 if ((buf = _pthread_getspecific(ttyname_key)) == NULL) {
108 if ((buf = malloc(sizeof(_PATH_DEV) + MAXNAMLEN)) != NULL) {
109 if (_pthread_setspecific(ttyname_key, buf) != 0) {
120 + return (ttyname_r(fd, buf, sizeof(_PATH_DEV) + MAXNAMLEN) == 0 ? buf : NULL);
121 +#else /* !__DARWIN_UNIX03 */
122 return (ttyname_r(fd, buf, sizeof(_PATH_DEV) + MAXNAMLEN));
123 +#endif /* __DARWIN_UNIX03 */
127 @@ -137,11 +181,19 @@ ttyname_unthreaded(int fd)
128 if (tcgetattr(fd, &ttyb) < 0)
130 /* Must be a character device. */
131 - if (_fstat(fd, &sb) || !S_ISCHR(sb.st_mode))
132 + if (_fstat(fd, &sb))
134 + if (!S_ISCHR(sb.st_mode)) {
139 strcpy(buf, _PATH_DEV);
140 - devname_r(sb.st_rdev, S_IFCHR,
141 - buf + strlen(buf), sizeof(buf) - strlen(buf));
142 + if (devname_r(sb.st_rdev, S_IFCHR,
143 + buf + strlen(buf), sizeof(buf) - strlen(buf)) == NULL) {
149 +#endif /* !BUILDING_VARIANT */