modules/co/constants.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- set_string
- set_int
- set_boolean
- show_string
- show_int
- show_boolean
- CO_get_authenticate
- CO_get_whois_suspended
- CO_get_welcome
- CO_get_prompt
- CO_get_clear_screen
- CO_get_accounting
- CO_get_do_server
- CO_get_do_update
- init_constants
- CO_to_string
- CO_const_to_string
- CO_set_const
- CO_set
1 /***************************************
2 $Revision: 1.18 $
3
4 Constants module (co) - this _should_ eventually get merged in with the
5 config module.
6
7 Status: NOT REVUED, NOT TESTED
8
9 +html+ <DL COMPACT>
10 +html+ <DT>Online References:
11 +html+ <DD><UL>
12 +html+ </UL>
13 +html+ </DL>
14 +html+ <PRE>
15 Instructions for use:
16
17 To add a constant:
18 0. Add a default value for the constant. (string)
19 1. Add the constant declaration to the _Constants struct.
20 2. Add a CO_get_function()
21 3. Add initializing code to init_constants()
22
23 To access the constant:
24 use the CO_get<Constant>() function from your other code.
25 +html+ </PRE>
26
27 ******************/ /******************
28 Filename : constants.c
29 Author : ottrey@ripe.net
30 OSs Tested : Solaris
31 Related Modules : Used in conjunction with the properties module.
32 Problems :
33 To Do : Merge into a "config module"
34 Comments :
35 ******************/ /******************
36 Copyright (c) 1999 RIPE NCC
37
38 All Rights Reserved
39
40 Permission to use, copy, modify, and distribute this software and its
41 documentation for any purpose and without fee is hereby granted,
42 provided that the above copyright notice appear in all copies and that
43 both that copyright notice and this permission notice appear in
44 supporting documentation, and that the name of the author not be
45 used in advertising or publicity pertaining to distribution of the
46 software without specific, written prior permission.
47
48 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
49 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
50 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
51 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
52 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
53 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
54 ***************************************/
55 #include <stdio.h>
56 #include <stdlib.h>
57 #include <string.h>
58
59 #include "memwrap.h"
60 #include "properties.h"
61
62 #define STR_XL 4095
63
64 /*+ Maximum number of constants. +*/
65 #define MAX_CONSTS 100
66
67 /*+ Default values for constants. +*/
68
69 #define DEFLT_AUTHENTICATE "0"
70 #define DEFLT_WHOIS_SUSPENDED "0"
71 #define DEFLT_DO_SERVER "1"
72 #define DEFLT_WELCOME "Welcome to the whois R.I.P. server.\n"
73 #define DEFLT_PROMPT "whois R.I.P. config> "
74 #define DEFLT_CLEAR_SCREEN "0"
75 #define DEFLT_ACCOUNTING "0"
76 #define DEFLT_CONFIG_FILE "rip.config"
77
78 /*+ Each constant has a +*/
79 struct _constant {
80 const char *token; /*+ Token to be found in properties file. +*/
81 const char *deflt; /*+ Default value for the constant. +*/
82 int (*set_func)(void *, char *); /*+ Function to set the constant. +*/
83 void *constant_ptr; /*+ Pointer to the constant value +*/
84 char *(*show_func)(void *); /*+ Function to show the constant. +*/
85 };
86
87
88 /*+ The Constants array has a +*/
89 typedef struct _Constants {
90 int authenticate[1]; /*+ Authenticate users. +*/
91 int whois_suspended[1]; /*+ Suspend the whois server. +*/
92 char welcome[1024]; /*+ Welcome for config protocol. +*/
93 char prompt[1024]; /*+ Prompt for config protocol. +*/
94 int clear_screen[1]; /*+ Clear screen after config commands. +*/
95 int accounting[1]; /*+ Conduct accounting on whois queries. +*/
96
97 int do_server[1]; /*+ turns off execution of the all servers(threads) +*/
98 int do_update[1]; /*+ switches on and off the updates +*/
99
100 } *Constants;
101
102 /*
103 * Global Variables
104 */
105 /*+ The array of Global Constants. +*/
106 static Constants Global_constants=NULL;
107
108 /*
109 * Set Functions
110 */
111 static int set_string(void *constant, char *value) {
/* [<][>][^][v][top][bottom][index][help] */
112
113 strcpy((char *)constant, value);
114
115 return 0;
116 } /* set_string() */
117
118 static int set_int(void *constant, char *value) {
/* [<][>][^][v][top][bottom][index][help] */
119 int i;
120
121 i = atol(value);
122 ((int *)constant)[0] = i;
123
124 return 0;
125 } /* set_int() */
126
127 static int set_boolean(void *constant, char *value) {
/* [<][>][^][v][top][bottom][index][help] */
128 int result=1;
129 int i;
130
131 i = atol(value);
132
133 /* If a valid boolean */
134 if ( (i == 0) || (i == 1)) {
135 ((int *)constant)[0] = i;
136 result = 0;
137 }
138
139 return result;
140 } /* set_boolean() */
141
142
143 /*
144 * Show Functions
145 */
146 /* AR. changed for unification with oter show funcs */
147 static char *show_string(void *constant) {
/* [<][>][^][v][top][bottom][index][help] */
148 char *tmp;
149
150 /* tmp = calloc(1, strlen((char *)constant)+1); */
151 dieif( wr_malloc((void **)&tmp, strlen((char *)constant)+1) != UT_OK);
152
153 strcpy(tmp, (char *)constant);
154 /* return((char *)constant); */
155 return tmp;
156 } /* show_string() */
157
158 static char *show_int(void *constant) {
/* [<][>][^][v][top][bottom][index][help] */
159 char *tmp;
160
161 /* tmp = calloc(1, 64); */
162 dieif( wr_malloc((void **)&tmp, 64) != UT_OK);
163
164 sprintf(tmp, "%d", ((int *)constant)[0]);
165 return tmp;
166 } /* show_int() */
167
168 static char *show_boolean(void *constant) {
/* [<][>][^][v][top][bottom][index][help] */
169 char *tmp;
170
171 /* tmp = calloc(1, 64); */
172 dieif( wr_malloc((void **)&tmp, 64) != UT_OK);
173
174 sprintf(tmp, "%d", ((int *)constant)[0]);
175 return tmp;
176 } /* show_boolean() */
177
178
179 /*
180 * Get Functions
181 */
182
183 int CO_get_authenticate() {
/* [<][>][^][v][top][bottom][index][help] */
184 return Global_constants->authenticate[0];
185 }
186
187 int CO_get_whois_suspended() {
/* [<][>][^][v][top][bottom][index][help] */
188 return Global_constants->whois_suspended[0];
189 }
190
191 char *CO_get_welcome() {
/* [<][>][^][v][top][bottom][index][help] */
192 return Global_constants->welcome;
193 }
194
195 char *CO_get_prompt() {
/* [<][>][^][v][top][bottom][index][help] */
196 return Global_constants->prompt;
197 }
198
199 int CO_get_clear_screen() {
/* [<][>][^][v][top][bottom][index][help] */
200 return Global_constants->clear_screen[0];
201 }
202
203 int CO_get_accounting() {
/* [<][>][^][v][top][bottom][index][help] */
204 return Global_constants->accounting[0];
205 }
206
207 int CO_get_do_server() {
/* [<][>][^][v][top][bottom][index][help] */
208 return Global_constants->do_server[0];
209 }
210
211 int CO_get_do_update() {
/* [<][>][^][v][top][bottom][index][help] */
212 return Global_constants->do_update[0];
213 }
214
215 /*+
216 * Contains the constant definitions for the Token, set_function, show_function.
217 * (See: _constant)
218 +*/
219 static struct _constant constant[MAX_CONSTS];
220
221 /* init_constants() */
222 /*++++++++++++++++++++++++++++++++++++++
223 Initialize all the constants.
224
225 More:
226 +html+ <PRE>
227 Authors:
228 ottrey
229
230 +html+ </PRE><DL COMPACT>
231 +html+ <DT>Online References:
232 +html+ <DD><UL>
233 +html+ </UL></DL>
234
235 ++++++++++++++++++++++++++++++++++++++*/
236 static void init_constants(void) {
/* [<][>][^][v][top][bottom][index][help] */
237 int n=0;
238
239 constant[n].token="SV.authenticate";
240 constant[n].deflt=DEFLT_AUTHENTICATE;
241 constant[n].set_func=set_boolean;
242 constant[n].constant_ptr=Global_constants->authenticate;
243 constant[n].show_func=show_boolean;
244 n++;
245
246 constant[n].token="SV.whois_suspended";
247 constant[n].deflt=DEFLT_WHOIS_SUSPENDED;
248 constant[n].set_func=set_boolean;
249 constant[n].constant_ptr=Global_constants->whois_suspended;
250 constant[n].show_func=show_boolean;
251 n++;
252
253 constant[n].token="SV.do_server";
254 constant[n].deflt=DEFLT_DO_SERVER;
255 constant[n].set_func=set_boolean;
256 constant[n].constant_ptr=Global_constants->do_server;
257 constant[n].show_func=show_boolean;
258 n++;
259
260 constant[n].token="UD.do_update";
261 constant[n].deflt="1";
262 constant[n].set_func=set_int;
263 constant[n].constant_ptr=Global_constants->do_update;
264 constant[n].show_func=show_int;
265 n++;
266
267 constant[n].token="PC.prompt";
268 constant[n].deflt=DEFLT_PROMPT;
269 constant[n].set_func=set_string;
270 constant[n].constant_ptr=Global_constants->prompt;
271 constant[n].show_func=show_string;
272 n++;
273
274 constant[n].token="PC.clear_screen";
275 constant[n].deflt=DEFLT_CLEAR_SCREEN;
276 constant[n].set_func=set_boolean;
277 constant[n].constant_ptr=Global_constants->clear_screen;
278 constant[n].show_func=show_boolean;
279 n++;
280
281 constant[n].token=NULL;
282
283 } /* init_constants() */
284
285
286 /* CO_to_string() */
287 /*++++++++++++++++++++++++++++++++++++++
288 Returns the constants as a string.
289
290 More:
291 +html+ <PRE>
292 Authors:
293 ottrey
294
295 +html+ </PRE><DL COMPACT>
296 +html+ <DT>Online References:
297 +html+ <DD><UL>
298 +html+ </UL></DL>
299
300 ++++++++++++++++++++++++++++++++++++++*/
301 char *CO_to_string(void) {
/* [<][>][^][v][top][bottom][index][help] */
302 char *consts;
303 const char *token;
304 char *value;
305 char tmp_consts[2048];
306 char tmp_const[1024];
307 int i=0;
308
309 sprintf(tmp_consts, "Constants = { ");
310 while(constant[i].token != NULL) {
311 token = constant[i].token;
312 value = constant[i].show_func(constant[i].constant_ptr);
313 sprintf(tmp_const, "\n[%s]=\"%s\"", token, value);
314 wr_free(value); /* Otherwise we have memory leaks */
315 strcat(tmp_consts, tmp_const);
316 i++;
317 }
318 strcat(tmp_consts, "}");
319
320 /* consts = calloc(1, strlen(tmp_consts)+1); */
321 dieif( wr_malloc((void **)&consts, strlen(tmp_consts)+1) != UT_OK);
322
323 strcpy(consts, tmp_consts);
324
325 return consts;
326 } /* CO_to_string() */
327
328
329 char *CO_const_to_string(char *name) {
/* [<][>][^][v][top][bottom][index][help] */
330 char *result=NULL;
331 int i;
332
333 for (i=0; constant[i].token != NULL; i++) {
334 if (strcmp(constant[i].token, name) == 0) {
335 result = constant[i].show_func(constant[i].constant_ptr);
336 break;
337 }
338 }
339
340 return result;
341 } /* CO_const_to_string() */
342
343 /* CO_set_const() */
344 /*++++++++++++++++++++++++++++++++++++++
345 Sets the value of one constant. Returns 0 if no error.
346
347 More:
348 +html+ <PRE>
349 Authors:
350 ottrey
351
352 +html+ </PRE><DL COMPACT>
353 +html+ <DT>Online References:
354 +html+ <DD><UL>
355 +html+ </UL></DL>
356
357 ++++++++++++++++++++++++++++++++++++++*/
358 int CO_set_const(char *name, char *value) {
/* [<][>][^][v][top][bottom][index][help] */
359 int result=1;
360 int i;
361
362 for (i=0; constant[i].token != NULL; i++) {
363 if (strcmp(constant[i].token, name) == 0) {
364 result = constant[i].set_func((void *)constant[i].constant_ptr, value);
365 break;
366 }
367 }
368
369 return result;
370 } /* CO_set_const() */
371
372
373 /* CO_set() */
374 /*++++++++++++++++++++++++++++++++++++++
375 Sets the constants from the properties module.
376 Returns the number of constants set.
377
378 More:
379 +html+ <PRE>
380 Authors:
381 ottrey
382 +html+ </PRE><DL COMPACT>
383 +html+ <DT>Online References:
384 +html+ <DD><UL>
385 +html+ <LI><A HREF="../src/.properties">.properties</A>
386 +html+ </UL></DL>
387
388 ++++++++++++++++++++++++++++++++++++++*/
389 char *CO_set(void) {
/* [<][>][^][v][top][bottom][index][help] */
390 int i;
391 int set_count=0;
392 int set;
393 char result_buff[256];
394 char *result;
395 char *property;
396
397 /* Initialize if necessary */
398 if (Global_constants == NULL) {
399 /* Global_constants = (Constants)calloc(1, sizeof(struct _Constants)); */
400 dieif( wr_calloc((void **)&Global_constants, 1,
401 sizeof(struct _Constants)) != UT_OK);
402
403 init_constants();
404 }
405
406 for (i=0; constant[i].token != NULL; i++) {
407 property = PR_get_property(constant[i].token, constant[i].deflt);
408 set = constant[i].set_func((void *)constant[i].constant_ptr, property);
409 wr_free(property);
410 if (set == 0) {
411 set_count++;
412 }
413 }
414
415 sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i);
416
417 /* result = (char *)calloc(1, strlen(result_buff)+1); */
418 dieif( wr_malloc((void **)&result, strlen(result_buff)+1) != UT_OK);
419 strcpy(result, result_buff);
420
421 return result;
422 } /* CO_set() */
423