158f0484fSRodney W. Grimes /* 258f0484fSRodney W. Grimes * Copyright (c) 1988, 1993 358f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved. 458f0484fSRodney W. Grimes * 558f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 658f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions 758f0484fSRodney W. Grimes * are met: 858f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 958f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 1058f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 1158f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 1258f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution. 13*fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 1458f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software 1558f0484fSRodney W. Grimes * without specific prior written permission. 1658f0484fSRodney W. Grimes * 1758f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1858f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1958f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2058f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2158f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2258f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2358f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2458f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2558f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2658f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2758f0484fSRodney W. Grimes * SUCH DAMAGE. 2858f0484fSRodney W. Grimes */ 2958f0484fSRodney W. Grimes 3058f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint) 3158f0484fSRodney W. Grimes static char sccsid[] = "@(#)ttyname.c 8.2 (Berkeley) 1/27/94"; 3258f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */ 33b231cb39SDavid E. O'Brien #include <sys/cdefs.h> 34b231cb39SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3558f0484fSRodney W. Grimes 36d201fe46SDaniel Eischen #include "namespace.h" 3758f0484fSRodney W. Grimes #include <sys/types.h> 389a9ef8b6SPoul-Henning Kamp #include <sys/ioctl.h> 399a9ef8b6SPoul-Henning Kamp #include <sys/filio.h> 4058f0484fSRodney W. Grimes #include <fcntl.h> 4158f0484fSRodney W. Grimes #include <dirent.h> 42f70177e7SJulian Elischer #include <stdlib.h> 43fcc3b699SPeter Wemm #include <termios.h> 44f70177e7SJulian Elischer #include <unistd.h> 4558f0484fSRodney W. Grimes #include <string.h> 4658f0484fSRodney W. Grimes #include <paths.h> 478dcb56dcSXin LI #include <errno.h> 488a4d3d84SHajimu UMEMOTO #include "reentrant.h" 49d201fe46SDaniel Eischen #include "un-namespace.h" 50d201fe46SDaniel Eischen 51d201fe46SDaniel Eischen #include "libc_private.h" 52d201fe46SDaniel Eischen 539a9ef8b6SPoul-Henning Kamp static char ttyname_buf[sizeof(_PATH_DEV) + MAXNAMLEN]; 54d201fe46SDaniel Eischen 558a4d3d84SHajimu UMEMOTO static once_t ttyname_init_once = ONCE_INITIALIZER; 568a4d3d84SHajimu UMEMOTO static thread_key_t ttyname_key; 578a4d3d84SHajimu UMEMOTO static int ttyname_keycreated = 0; 58f70177e7SJulian Elischer 598dcb56dcSXin LI int 60d201fe46SDaniel Eischen ttyname_r(int fd, char *buf, size_t len) 61f70177e7SJulian Elischer { 6277cf61aeSHajimu UMEMOTO size_t used; 63f70177e7SJulian Elischer 649a9ef8b6SPoul-Henning Kamp *buf = '\0'; 65f70177e7SJulian Elischer 66f70177e7SJulian Elischer /* Must be a terminal. */ 67f70177e7SJulian Elischer if (!isatty(fd)) 68424c16b2SJilles Tjoelker return (errno); 69f70177e7SJulian Elischer /* Must have enough room */ 70f70177e7SJulian Elischer if (len <= sizeof(_PATH_DEV)) 718dcb56dcSXin LI return (ERANGE); 72f70177e7SJulian Elischer 7397679e71SPoul-Henning Kamp strcpy(buf, _PATH_DEV); 7477cf61aeSHajimu UMEMOTO used = strlen(buf); 7526d4f5e9SEd Schouten if (fdevname_r(fd, buf + used, len - used) == NULL) 76424c16b2SJilles Tjoelker return (errno == EINVAL ? ERANGE : errno); 778dcb56dcSXin LI return (0); 78f70177e7SJulian Elischer } 79f70177e7SJulian Elischer 808a4d3d84SHajimu UMEMOTO static void 818a4d3d84SHajimu UMEMOTO ttyname_keycreate(void) 828a4d3d84SHajimu UMEMOTO { 838a4d3d84SHajimu UMEMOTO ttyname_keycreated = (thr_keycreate(&ttyname_key, free) == 0); 848a4d3d84SHajimu UMEMOTO } 858a4d3d84SHajimu UMEMOTO 869a9ef8b6SPoul-Henning Kamp char * 879a9ef8b6SPoul-Henning Kamp ttyname(int fd) 88f70177e7SJulian Elischer { 89f70177e7SJulian Elischer char *buf; 90f70177e7SJulian Elischer 918a4d3d84SHajimu UMEMOTO if (thr_main() != 0) 928a4d3d84SHajimu UMEMOTO buf = ttyname_buf; 938a4d3d84SHajimu UMEMOTO else { 948a4d3d84SHajimu UMEMOTO if (thr_once(&ttyname_init_once, ttyname_keycreate) != 0 || 958a4d3d84SHajimu UMEMOTO !ttyname_keycreated) 968dcb56dcSXin LI return (NULL); 978a4d3d84SHajimu UMEMOTO if ((buf = thr_getspecific(ttyname_key)) == NULL) { 988a4d3d84SHajimu UMEMOTO if ((buf = malloc(sizeof ttyname_buf)) == NULL) 99f70177e7SJulian Elischer return (NULL); 1008a4d3d84SHajimu UMEMOTO if (thr_setspecific(ttyname_key, buf) != 0) { 101f70177e7SJulian Elischer free(buf); 102f70177e7SJulian Elischer return (NULL); 103f70177e7SJulian Elischer } 104f70177e7SJulian Elischer } 105f70177e7SJulian Elischer } 1068a4d3d84SHajimu UMEMOTO 1078a4d3d84SHajimu UMEMOTO if (ttyname_r(fd, buf, sizeof ttyname_buf) != 0) 108532e65b8SHajimu UMEMOTO return (NULL); 1098dcb56dcSXin LI return (buf); 110f70177e7SJulian Elischer } 111