xref: /titanic_44/usr/src/cmd/bnu/limits.c (revision b1dd958f54f8bfa984d306bb8ca8264855761d7b)
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 (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 #ident	"%Z%%M%	%I%	%E% SMI"	/* from SVR4 bnu:limits.c 1.4 */
27 
28 #include "uucp.h"
29 
30 /* add sitedep() and sysmatch() to list when ifdefs are removed below */
31 static int get_tokens(), siteindep();
32 
33 /*  field array indexes for LIMIT parameters */
34 
35 #define U_SERVICE	0
36 #define U_MAX		1
37 #define U_SYSTEM	2
38 #define U_MODE		3
39 
40 static char * _Lwords[] = {"service", "max", "system", "mode"};
41 
42 #define NUMFLDS		4
43 
44 struct name_value
45 {
46 	char *name;
47 	char *value;
48 };
49 
50 /*
51  * manage limits file.
52  */
53 
54 /*
55  * scan the Limits file and get the limit for the given service.
56  * return SUCCESS if the limit was found, else return FAIL.
57  */
58 int
59 scanlimit(service, limitval)
60 char *service;
61 struct limits *limitval;
62 {
63 	char buf[BUFSIZ];
64 	char *tokens[NUMFLDS];	/* fields found in LIMITS */
65 	char msgbuf[BUFSIZ];	/* place to build messages */
66 	FILE *Fp = NULL;	/* file pointer for LIMITS */
67 	int SIflag, SDflag;
68 
69 	if ((Fp = fopen(LIMITS, "r")) == NULL) {
70 	    DEBUG(5, "cannot open %s\n", LIMITS);
71 	    sprintf(msgbuf, "fopen of %s failed with errno=%%d\n", LIMITS);
72 	    DEBUG(5, msgbuf, errno);
73 	    return(FAIL);
74 	}
75 
76 	SIflag = FALSE;
77 	SDflag = TRUE;
78 
79 /* The following #if (0 == 1) and #endif lines should be deleted when
80  * we expand the functionality of the Limits file to include the
81  * limit per site, and the mode for uucico.
82  */
83 #if (0 == 1)
84 	if (strcmp(service, "uucico") == SAME)
85 	    SDflag = FALSE;
86 #endif
87 
88 	while ((getuline(Fp, buf) > 0) && ((SIflag && SDflag) == FALSE)) {
89 	    if (get_tokens(buf, tokens) == FAIL)
90 		continue;
91 
92 	    if (SIflag == FALSE) {
93 		if (siteindep(tokens, service, limitval) == SUCCESS)
94 		    SIflag = TRUE;
95 	    }
96 
97 /* The following #if (0 == 1) and #endif lines should be deleted when
98  * we expand the functionality of the Limits file to include the
99  * limit per site, and the mode for uucico.
100  */
101 #if (0 == 1)
102 	    if (SDflag == FALSE) {
103 		if (sitedep(tokens, limitval) == SUCCESS)
104 		    SDflag = TRUE;
105 	    }
106 #endif
107 	}
108 
109 	fclose(Fp);
110 	if ((SIflag && SDflag) == TRUE)
111 	    return(SUCCESS);
112 	else return(FAIL);
113 }
114 
115 /*
116  * parse a line in LIMITS and return a vector
117  * of fields (flds)
118  *
119  * return:
120  *	SUCCESS - token pairs name match with the key words
121  */
122 static int
123 get_tokens (line,flds)
124 char *line;
125 char *flds[];
126 {
127 	register i;
128 	register char *p;
129 	struct name_value pair;
130 
131 	/* initialize defaults  in case parameter is not specified */
132 	for (i=0;i<NUMFLDS;i++)
133 		flds[i] = CNULL;
134 
135 	for (p=line;p && *p;) {
136 		p = next_token (p, &pair);
137 
138 		for (i=0; i<NUMFLDS; i++) {
139 			if (EQUALS(pair.name, _Lwords[i])) {
140 				flds[i] = pair.value;
141 				break;
142 			}
143 			if (i == NUMFLDS-1) /* pair.name is not key */
144 				return FAIL;
145 		}
146 	}
147 	return(SUCCESS);
148 }
149 /*
150  * this function can only handle the following format
151  *
152  *	service=uucico max=5
153  *
154  * return:
155  *	SUCCESS - OK
156  *	FAIL - service's value does not match or wrong format
157  */
158 static int
159 siteindep(flds, service, limitval)
160 char *flds[];
161 char *service;
162 struct limits *limitval;
163 {
164 
165 	if (!EQUALS(flds[U_SERVICE], service) || (flds[U_MAX] == CNULL))
166 		return(FAIL);
167 	if (sscanf(flds[U_MAX],"%d",&limitval->totalmax)==0)
168 		limitval->totalmax = -1; /* type conflict*/
169 	return(SUCCESS);
170 }
171 
172 /* The following #if (0 == 1) and #endif lines should be deleted when
173  * we expand the functionality of the Limits file to include the
174  * limit per site, and the mode for uucico.
175  */
176 #if (0 == 1)
177 /*
178  * this function can only handle the following format
179  *
180  *	service=uucico system=ihnp1:ihnp3 [max=5] [mode=master]
181  *
182  * return:
183  *	SUCCESS - OK
184  *	FAIL - not uucico, no system name in Limits,
185  *		system's name does not match
186  */
187 static int
188 sitedep(flds, limitval)
189 char *flds[];
190 struct limits *limitval;
191 {
192 
193 	if (!EQUALS(flds[U_SERVICE],"uucico"))
194 		return FAIL;
195 	if ((flds[U_SYSTEM] == CNULL) || (sysmatch(flds[U_SYSTEM]) != 0))
196 		return FAIL;
197 	if (flds[U_MAX] == CNULL)
198 		limitval->sitemax = 1; /* default value */
199 	else if (sscanf(flds[U_MAX],"%d",&limitval->sitemax)==0)
200 			limitval->sitemax = -1; /* type conflict*/
201 
202 	if (flds[U_MODE] == CNULL)
203 		strcpy(limitval->mode,"master:slave");
204 	else
205 		strncpy(limitval->mode,flds[U_MODE],strlen(flds[U_MODE]));
206 	return(SUCCESS);
207 }
208 
209 /*
210  * this function checks if system in system's list
211  * system=ihnp1:ihnp3:...
212  *
213  * return:
214  *	SUCCESS - OK
215  */
216 static int
217 sysmatch(p)
218 char *p;
219 {
220 	char *arg;
221 
222 	while (p && *p) {
223 		p = nextarg(p, &arg);
224 	    	if (EQUALS(arg, Rmtname))
225 			return(SUCCESS);
226 	}
227 	return FAIL;
228 }
229 
230 #endif
231