1 /* $NetBSD: ttyslot.c,v 1.13 2009/01/11 02:46:27 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1988, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 #if defined(LIBC_SCCS) && !defined(lint) 34 #if 0 35 static char sccsid[] = "@(#)ttyslot.c 8.1 (Berkeley) 6/4/93"; 36 #else 37 __RCSID("$NetBSD: ttyslot.c,v 1.13 2009/01/11 02:46:27 christos Exp $"); 38 #endif 39 #endif /* LIBC_SCCS and not lint */ 40 41 #include "namespace.h" 42 #include <ttyent.h> 43 #include <stdio.h> 44 #include <stdlib.h> 45 #include <string.h> 46 #include <unistd.h> 47 #include <sys/ioctl.h> 48 #include <sys/stat.h> 49 50 #ifdef __weak_alias 51 __weak_alias(ttyslot,_ttyslot) 52 #endif 53 54 int 55 ttyslot(void) 56 { 57 struct ttyent *ttyp; 58 int slot = 0, ispty = 0; 59 char *p; 60 int cnt; 61 char *name; 62 #if !defined(__minix) 63 struct ptmget ptm; 64 #endif /* !defined(__minix) */ 65 66 setttyent(); 67 for (cnt = 0; cnt < 3; ++cnt) { 68 #if !defined(__minix) 69 if (ioctl(cnt, TIOCPTSNAME, &ptm) != -1) { 70 ispty = 1; 71 name = ptm.sn; 72 } else if ((name = ttyname(cnt)) != NULL) { 73 #else 74 if ((name = ttyname(cnt)) != NULL) { 75 #endif /* !defined(__minix) */ 76 ispty = 0; 77 } else 78 continue; 79 80 if ((p = strstr(name, "/pts/")) != NULL) 81 ++p; 82 else if ((p = strrchr(name, '/')) != NULL) 83 ++p; 84 else 85 p = name; 86 87 for (slot = 1; (ttyp = getttyent()) != NULL; ++slot) 88 if (!strcmp(ttyp->ty_name, p)) { 89 endttyent(); 90 return slot; 91 } 92 break; 93 } 94 endttyent(); 95 if (ispty) { 96 struct stat st; 97 if (fstat(cnt, &st) == -1) 98 return 0; 99 return slot + (int)minor(st.st_rdev) + 1; 100 } 101 return 0; 102 } 103