1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 *
22 * Copyright 1996 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
28
29 /*
30 * Portions of this source code were derived from Berkeley
31 * under license from the Regents of the University of
32 * California.
33 */
34
35 #pragma ident "%Z%%M% %I% %E% SMI"
36
37 #include <stdio.h>
38 #include <string.h>
39 #include <sys/types.h>
40 #include <sys/statvfs.h>
41 #include "ypsym.h"
42 /* this is 14 less the space for temps pids and .pag more or less */
43
44 #ifdef DEBUG
45 #define YPDBDIR "/var/ypnew"
46 #define ALIASLIST "/var/ypnew/aliases"
47 #else
48 #define YPDBDIR "/var/yp"
49 #define ALIASLIST "/var/yp/aliases"
50 #endif
51 #define issep(c) (c == ' ' || c == '\t')
52
53 #ifdef SYSVCONFIG
54 #define isvar_sysv() (wasitsysv)
55
56 static int wasitsysv = TRUE;
57 static int first_time = TRUE;
58 static listofnames *list = NULL;
59 #endif
60
61 void sysv_exit();
62 extern listofnames *names();
63 extern void exit();
64 extern void free_listofnames();
65
66 /*
67 * Setup alias file, check /var/yp filesystem type
68 * Note: The *never* checks for aliases under Solaris, so there is no need
69 * for this function. As of 1.1 beta 4, I will ifdef it out (cause
70 * you never know...). Should go away completely soon.
71 */
72
73 #ifdef SYSVCONFIG
74 void
sysvconfig(void)75 sysvconfig(void)
76 {
77 struct statvfs statbuf;
78
79 sigset(SIGCHLD, SIG_IGN);
80 /*
81 * if neccesary free previous list, then read in aliaslist
82 */
83
84 if (!first_time)
85 free_listofnames(list);
86 else
87 first_time = FALSE;
88
89 list = names(ALIASLIST);
90
91 /*
92 * Check if YP database directory is in a system v filesystem
93 */
94
95 if (statvfs(YPDBDIR, &statbuf) != 0) {
96 fprintf(stderr, "Cannot stat %s\n", YPDBDIR);
97 exit(-1);
98 } else {
99 /* if (strcmp(statbuf.f_basetype,"s5")) (doesn't work in k13) */
100 if (statbuf.f_namemax == 14)
101 wasitsysv = TRUE;
102 else
103 wasitsysv = FALSE;
104 }
105 sigset(SIGCHLD, (void (*)())sysvconfig);
106 }
107 #endif
108
109 /*
110 * Match key to alias
111 */
112 int
yp_getalias(key,key_alias,maxlen)113 yp_getalias(key, key_alias, maxlen)
114 char *key;
115 char *key_alias;
116 int maxlen;
117 {
118 listofnames *entry;
119 char *longname;
120 char *alias;
121 char name[256];
122
123 #ifndef SYSVCONFIG
124 strcpy(key_alias, key);
125 return (0);
126 #else
127 /* sysvconfig must be run before this routine */
128 if (key == NULL || first_time)
129 return (-1);
130
131 if (!isvar_sysv()) {
132 strcpy(key_alias, key);
133 return (0);
134 }
135
136 for (entry = list, strcpy(name, entry->name); entry;
137 entry = entry->nextname, strcpy(name, entry->name)) {
138
139 longname = strtok(name, " \t");
140 alias = strtok(NULL, " \t\n");
141 if (longname == NULL || alias == NULL) {
142 continue;
143 }
144 if (strcmp(longname, key) == 0) {
145 if ((int)strlen(alias) > (maxlen)) {
146 strncpy(key_alias, alias, (maxlen));
147 key_alias[maxlen] = '\0';
148 } else {
149 strcpy(key_alias, alias);
150 }
151 return (0);
152 }
153 }
154 /* alias not found */
155 return (-1);
156 #endif
157 }
158
159 /*
160 * Match alias to key
161 */
162 int
yp_getkey(key_alias,key,maxlen)163 yp_getkey(key_alias, key, maxlen)
164 char *key_alias;
165 char *key;
166 int maxlen;
167 {
168 listofnames *entry;
169 char *longname;
170 char *alias;
171 char name[256];
172
173 #ifndef SYSVCONFIG
174 strcpy(key, key_alias);
175 return (0);
176 #else
177 if (key_alias == NULL || first_time) {
178 return (-1);
179 }
180
181 if (!isvar_sysv()) {
182 strcpy(key, key_alias);
183 return (0);
184 }
185
186 for (entry = list, strcpy(name, entry->name);
187 entry; entry = entry->nextname, strcpy(name, entry->name)) {
188
189 longname = strtok(name, " \t");
190 alias = strtok(NULL, " \t\n");
191 if (alias == NULL || longname == NULL) {
192 continue;
193 }
194 if ((strcmp(alias, key_alias) == 0) ||
195 (strncmp(alias, key_alias, maxlen) == 0)) {
196 strcpy(key, longname);
197 return (0);
198 }
199 }
200 /* key not found */
201 return (-1);
202 #endif
203 }
204