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