1    | /***************************************
2    |   $Revision: 1.21 $
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,2000,2001,2002               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   | 
56   | #include "rip.h"
57   | 
58   | #include <stdio.h>
59   | #include <stdlib.h>
60   | #include <string.h>
61   | #include <glib.h>
62   | 
63   | /*+ Maximum number of constants. +*/
64   | #define MAX_CONSTS 100
65   | 
66   | /*+ Default values for constants. +*/
67   | 
68   | #define DEFLT_AUTHENTICATE    "0"
69   | #define DEFLT_WHOIS_SUSPENDED "0"
70   | #define DEFLT_DO_SERVER       "1"
71   | #define DEFLT_WELCOME         "Welcome to the whois R.I.P. server.\n"
72   | #define DEFLT_PROMPT          "whois R.I.P. config> "
73   | #define DEFLT_CLEAR_SCREEN    "0"
74   | #define DEFLT_ACCOUNTING      "0"
75   | #define DEFLT_CONFIG_FILE     "rip.config"
76   | 
77   | /*+ Each constant has a +*/
78   | struct _constant {
79   |   const char *token;              /*+ Token to be found in properties file. +*/
80   |   const char *deflt;                    /*+ Default value for the constant. +*/
81   |   int (*set_func)(void *, const char *);  /*+ Function to set the constant. +*/
82   |   void *constant_ptr;                     /*+ Pointer to the constant value +*/
83   |   char *(*show_func)(const void *);      /*+ Function to show the constant. +*/
84   | };
85   | 
86   | 
87   | /*+ The Constants array has a +*/
88   | typedef struct _Constants {
89   |   int   authenticate[1];                         /*+ Authenticate users. +*/
90   |   int   whois_suspended[1];                /*+ Suspend the whois server. +*/
91   |   char  welcome[1024];                  /*+ Welcome for config protocol. +*/
92   |   char  prompt[1024];                    /*+ Prompt for config protocol. +*/
93   |   int   clear_screen[1];         /*+ Clear screen after config commands. +*/
94   |   int   accounting[1];          /*+ Conduct accounting on whois queries. +*/
95   | 
96   |   int   do_server[1]; /*+ turns off execution of the all servers(threads) +*/
97   |   int   do_update[1]; /*+ switches on and off the updates +*/
98   | 
99   | } *Constants;
100  | 
101  | /*
102  |  * Global Variables
103  |  */
104  | /*+ The array of Global Constants. +*/
105  | static Constants  Global_constants=NULL;
106  | 
107  | /* 
108  |  * Set Functions
109  |  */
110  | static int set_string(void *constant, const char *value) {
111  | 
112  |   strcpy((char *)constant, value);
113  | 
114  |   return 0;
115  | } /* set_string() */
116  | 
117  | static int set_int(void *constant, const char *value) {
118  |   int i;
119  |   
120  |   i = atol(value);
121  |   ((int *)constant)[0] = i;
122  | 
123  |   return 0;
124  | } /* set_int() */
125  | 
126  | static int set_boolean(void *constant, const char *value) {
127  |   int result=1;
128  |   int i;
129  |   
130  |   i = atol(value);
131  | 
132  |   /* If a valid boolean */
133  |   if ( (i == 0) || (i == 1)) {
134  |     ((int *)constant)[0] = i;
135  |     result = 0;
136  |   }
137  | 
138  |   return result;
139  | } /* set_boolean() */
140  | 
141  | 
142  | /* 
143  |  * Show Functions
144  |  */
145  | /* AR. changed for unification with oter show funcs */
146  | static char *show_string(const void *constant) {
147  |   return UT_strdup((char *)constant);
148  | } /* show_string() */
149  | 
150  | static char *show_int(const void *constant) {
151  |   char *tmp;
152  | 
153  |   tmp = UT_malloc(32);
154  | 
155  |   sprintf(tmp, "%d", ((int *)constant)[0]);
156  |   return tmp;
157  | } /* show_int() */
158  | 
159  | static char *show_boolean(const void *constant) {
160  |   char *tmp;
161  | 
162  |   tmp =  UT_malloc(32);
163  | 
164  |   sprintf(tmp, "%d", ((int *)constant)[0]);
165  |   return tmp;
166  | } /* show_boolean() */
167  | 
168  | 
169  | /* 
170  |  * Get Functions
171  |  */
172  | 
173  | int CO_get_authenticate() {
174  |   return Global_constants->authenticate[0];
175  | }
176  | 
177  | int CO_get_whois_suspended() {
178  |   return Global_constants->whois_suspended[0];
179  | }
180  | 
181  | char *CO_get_welcome() {
182  |   return Global_constants->welcome;
183  | }
184  | 
185  | char *CO_get_prompt() {
186  |   return Global_constants->prompt;
187  | }
188  | 
189  | int CO_get_clear_screen() {
190  |   return Global_constants->clear_screen[0];
191  | }
192  | 
193  | int CO_get_accounting() {
194  |   return Global_constants->accounting[0];
195  | }
196  | 
197  | int CO_get_do_server() {
198  |   return Global_constants->do_server[0];
199  | }
200  |   
201  | int CO_get_do_update() {
202  |   return Global_constants->do_update[0];
203  | }
204  | 
205  | /*+
206  |  * Contains the constant definitions for the Token, set_function, show_function.
207  |  * (See: _constant)
208  | +*/
209  | static struct _constant constant[MAX_CONSTS];
210  | 
211  | /* init_constants() */
212  | /*++++++++++++++++++++++++++++++++++++++
213  |   Initialize all the constants.
214  | 
215  |   More:
216  |   +html+ <PRE>
217  |   Authors:
218  |         ottrey
219  | 
220  |   +html+ </PRE><DL COMPACT>
221  |   +html+ <DT>Online References:
222  |   +html+ <DD><UL>
223  |   +html+ </UL></DL>
224  | 
225  |   ++++++++++++++++++++++++++++++++++++++*/
226  | static void init_constants(void) {
227  |   int n=0;
228  | 
229  |   constant[n].token="SV.authenticate";
230  |   constant[n].deflt=DEFLT_AUTHENTICATE;
231  |   constant[n].set_func=set_boolean;
232  |   constant[n].constant_ptr=Global_constants->authenticate;
233  |   constant[n].show_func=show_boolean;
234  |   n++;
235  | 
236  |   constant[n].token="SV.whois_suspended";
237  |   constant[n].deflt=DEFLT_WHOIS_SUSPENDED;
238  |   constant[n].set_func=set_boolean;
239  |   constant[n].constant_ptr=Global_constants->whois_suspended;
240  |   constant[n].show_func=show_boolean;
241  |   n++;
242  |   
243  |   constant[n].token="SV.do_server";
244  |   constant[n].deflt=DEFLT_DO_SERVER;
245  |   constant[n].set_func=set_boolean;
246  |   constant[n].constant_ptr=Global_constants->do_server;
247  |   constant[n].show_func=show_boolean;
248  |   n++;
249  |   
250  |   constant[n].token="UD.do_update";
251  |   constant[n].deflt="1";
252  |   constant[n].set_func=set_int;
253  |   constant[n].constant_ptr=Global_constants->do_update;
254  |   constant[n].show_func=show_int;
255  |   n++;
256  | 
257  |   constant[n].token="PC.prompt";
258  |   constant[n].deflt=DEFLT_PROMPT;
259  |   constant[n].set_func=set_string;
260  |   constant[n].constant_ptr=Global_constants->prompt;
261  |   constant[n].show_func=show_string;
262  |   n++;
263  | 
264  |   constant[n].token="PC.clear_screen";
265  |   constant[n].deflt=DEFLT_CLEAR_SCREEN;
266  |   constant[n].set_func=set_boolean;
267  |   constant[n].constant_ptr=Global_constants->clear_screen;
268  |   constant[n].show_func=show_boolean;
269  |   n++;
270  | 
271  |   constant[n].token=NULL;
272  | 
273  | } /* init_constants() */
274  | 
275  | 
276  | /* CO_to_string() */
277  | /*++++++++++++++++++++++++++++++++++++++
278  |   Returns the constants as a string.
279  | 
280  |   More:
281  |   +html+ <PRE>
282  |   Authors:
283  |         ottrey
284  | 
285  |   +html+ </PRE><DL COMPACT>
286  |   +html+ <DT>Online References:
287  |   +html+ <DD><UL>
288  |   +html+ </UL></DL>
289  | 
290  |   ++++++++++++++++++++++++++++++++++++++*/
291  | char *CO_to_string(void) {
292  |   char *consts;
293  |   const char *token;
294  |   char *value;
295  |   GString *tmp;
296  |   int i=0;
297  | 
298  |   tmp = g_string_new("Constants = { ");
299  |   while(constant[i].token != NULL) {
300  |     token = constant[i].token;
301  |     value = constant[i].show_func(constant[i].constant_ptr);
302  |     g_string_sprintfa(tmp, "\n[%s]=\"%s\"", token, value);
303  |     UT_free(value); /* Otherwise we have memory leaks */
304  |     i++;
305  |   }
306  |   g_string_append_c(tmp, '}');
307  | 
308  |   consts = UT_strdup(tmp->str);
309  |   g_string_free(tmp, TRUE);
310  | 
311  |   return consts;
312  | } /* CO_to_string() */
313  | 
314  | 
315  | char *CO_const_to_string(const char *name) {
316  |   char *result=NULL;
317  |   int i;
318  |   
319  |   for (i=0; constant[i].token != NULL; i++) {
320  |     if (strcmp(constant[i].token, name) == 0) {
321  |       result = constant[i].show_func(constant[i].constant_ptr);
322  |       break;
323  |     }
324  |   }
325  | 
326  |   return result;
327  | } /* CO_const_to_string() */
328  | 
329  |  /* CO_set_const() */
330  | /*++++++++++++++++++++++++++++++++++++++
331  |   Sets the value of one constant.  Returns 0 if no error.
332  | 
333  |   More:
334  |   +html+ <PRE>
335  |   Authors:
336  |         ottrey
337  | 
338  |   +html+ </PRE><DL COMPACT>
339  |   +html+ <DT>Online References:
340  |   +html+ <DD><UL>
341  |   +html+ </UL></DL>
342  | 
343  |   ++++++++++++++++++++++++++++++++++++++*/
344  | int CO_set_const(const char *name, const char *value) {
345  |   int result=1;
346  |   int i;
347  |   
348  |   for (i=0; constant[i].token != NULL; i++) {
349  |     if (strcmp(constant[i].token, name) == 0) {
350  |       result = constant[i].set_func((void *)constant[i].constant_ptr, value);
351  |       break;
352  |     }
353  |   }
354  | 
355  |   return result;
356  | } /* CO_set_const() */
357  | 
358  | 
359  | /* CO_set() */
360  | /*++++++++++++++++++++++++++++++++++++++
361  |   Sets the constants from the properties module.
362  |   Returns the number of constants set.
363  | 
364  |   More:
365  |   +html+ <PRE>
366  |   Authors:
367  |         ottrey
368  |   +html+ </PRE><DL COMPACT>
369  |   +html+ <DT>Online References:
370  |   +html+ <DD><UL>
371  |   +html+   <LI><A HREF="../src/.properties">.properties</A>
372  |   +html+ </UL></DL>
373  | 
374  |   ++++++++++++++++++++++++++++++++++++++*/
375  | char *CO_set(void) {
376  |   int i;
377  |   int set_count=0;
378  |   int set;
379  |   char result_buff[256];
380  |   char *result;
381  |   char *property;
382  | 
383  |   /* Initialize if necessary */
384  |   if (Global_constants == NULL) {
385  |     Global_constants = (Constants)UT_calloc(1, sizeof(struct _Constants));
386  |     
387  |     init_constants();
388  |   }
389  | 
390  |   for (i=0; constant[i].token != NULL; i++) {
391  |     property = PR_get_property(constant[i].token, constant[i].deflt);
392  |     set = constant[i].set_func((void *)constant[i].constant_ptr, property);
393  |     UT_free(property);
394  |     if (set == 0) {
395  |       set_count++;
396  |     }
397  |   }
398  | 
399  |   sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i);
400  | 
401  |   result = (char *)UT_calloc(1, strlen(result_buff)+1);
402  |   strcpy(result, result_buff);
403  | 
404  |   return result;
405  | } /* CO_set() */
406  |