1 /* 2 * Copyright (c) 1989 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #if defined(LIBC_SCCS) && !defined(lint) 35 /*static char *sccsid = "from: @(#)getttyent.c 5.10 (Berkeley) 3/23/91";*/ 36 static char *rcsid = "$Id: getttyent.c,v 1.7 1994/03/30 08:22:07 cgd Exp $"; 37 #endif /* LIBC_SCCS and not lint */ 38 39 #include <ttyent.h> 40 #include <stdio.h> 41 #include <ctype.h> 42 #include <string.h> 43 44 static char zapchar; 45 static FILE *tf; 46 47 struct ttyent * 48 getttynam(tty) 49 const char *tty; 50 { 51 register struct ttyent *t; 52 53 setttyent(); 54 while (t = getttyent()) 55 if (!strcmp(tty, t->ty_name)) 56 break; 57 endttyent(); 58 return (t); 59 } 60 61 struct ttyent * 62 getttyent() 63 { 64 static struct ttyent tty; 65 register int c; 66 register char *p; 67 #define MAXLINELENGTH 200 68 static char line[MAXLINELENGTH]; 69 static char *skip(), *value(); 70 71 if (!tf && !setttyent()) 72 return (NULL); 73 for (;;) { 74 if (!fgets(p = line, sizeof(line), tf)) 75 return (NULL); 76 /* skip lines that are too big */ 77 if (!strchr(p, '\n')) { 78 while ((c = getc(tf)) != '\n' && c != EOF) 79 ; 80 continue; 81 } 82 while (isspace(*p)) 83 ++p; 84 if (*p && *p != '#') 85 break; 86 } 87 88 zapchar = 0; 89 tty.ty_name = p; 90 p = skip(p); 91 if (!*(tty.ty_getty = p)) 92 tty.ty_getty = tty.ty_type = NULL; 93 else { 94 p = skip(p); 95 if (!*(tty.ty_type = p)) 96 tty.ty_type = NULL; 97 else 98 p = skip(p); 99 } 100 tty.ty_status = 0; 101 tty.ty_window = NULL; 102 103 #define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1]) 104 #define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '=' 105 for (; *p; p = skip(p)) { 106 if (scmp(_TTYS_OFF)) 107 tty.ty_status &= ~TTY_ON; 108 else if (scmp(_TTYS_ON)) 109 tty.ty_status |= TTY_ON; 110 else if (scmp(_TTYS_SECURE)) 111 tty.ty_status |= TTY_SECURE; 112 else if (scmp(_TTYS_LOCAL)) 113 tty.ty_status |= TTY_LOCAL; 114 else if (scmp(_TTYS_RTSCTS)) 115 tty.ty_status |= TTY_RTSCTS; 116 else if (scmp(_TTYS_SOFTCAR)) 117 tty.ty_status |= TTY_SOFTCAR; 118 else if (scmp(_TTYS_MDMBUF)) 119 tty.ty_status |= TTY_MDMBUF; 120 else if (vcmp(_TTYS_WINDOW)) 121 tty.ty_window = value(p); 122 else 123 break; 124 } 125 126 if (zapchar == '#' || *p == '#') 127 while ((c = *++p) == ' ' || c == '\t') 128 ; 129 tty.ty_comment = p; 130 if (*p == 0) 131 tty.ty_comment = 0; 132 if (p = strchr(p, '\n')) 133 *p = '\0'; 134 return (&tty); 135 } 136 137 #define QUOTED 1 138 139 /* 140 * Skip over the current field, removing quotes, and return a pointer to 141 * the next field. 142 */ 143 static char * 144 skip(p) 145 register char *p; 146 { 147 register char *t; 148 register int c, q; 149 150 for (q = 0, t = p; (c = *p) != '\0'; p++) { 151 if (c == '"') { 152 q ^= QUOTED; /* obscure, but nice */ 153 continue; 154 } 155 if (q == QUOTED && *p == '\\' && *(p+1) == '"') 156 p++; 157 *t++ = *p; 158 if (q == QUOTED) 159 continue; 160 if (c == '#') { 161 zapchar = c; 162 *p = 0; 163 break; 164 } 165 if (c == '\t' || c == ' ' || c == '\n') { 166 zapchar = c; 167 *p++ = 0; 168 while ((c = *p) == '\t' || c == ' ' || c == '\n') 169 p++; 170 break; 171 } 172 } 173 *--t = '\0'; 174 return (p); 175 } 176 177 static char * 178 value(p) 179 register char *p; 180 { 181 182 return ((p = strchr(p, '=')) ? ++p : NULL); 183 } 184 185 int 186 setttyent() 187 { 188 189 if (tf) { 190 (void)rewind(tf); 191 return (1); 192 } else if (tf = fopen(_PATH_TTYS, "r")) 193 return (1); 194 return (0); 195 } 196 197 int 198 endttyent() 199 { 200 int rval; 201 202 if (tf) { 203 rval = !(fclose(tf) == EOF); 204 tf = NULL; 205 return (rval); 206 } 207 return (1); 208 } 209