1    | /***************************************
2    |   $Revision: 1.8 $
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 "properties.h"
60   | 
61   | /*+ Maximum number of constants. +*/
62   | #define MAX_CONSTS 100
63   | 
64   | /*+ Default values for constants. +*/
65   | #define DEFLT_MAX_THREADS     "10"
66   | #define DEFLT_WHOIS_PORT      "0"
67   | #define DEFLT_CONFIG_PORT     "0"
68   | #define DEFLT_MIRROR_PORT     "0"
69   | #define DEFLT_HOST            "mysql.database.net"
70   | #define DEFLT_USER            "xxx"
71   | #define DEFLT_PASSWORD        "xxx"
72   | #define DEFLT_DATABASE_PORT   "3306"
73   | #define DEFLT_DATABASE        "RIPE"
74   | #define DEFLT_QUERY           "SHOW TABLES"
75   | #define DEFLT_IN_QUERY        "SELECT * FROM inetnum"
76   | #define DEFLT_RT_QUERY        "SELECT * FROM route"
77   | #define DEFLT_AUTHENTICATE    "0"
78   | #define DEFLT_WHOIS_SUSPENDED "0"
79   | #define DEFLT_WELCOME         "Welcome to the whois R.I.P. server.\n"
80   | #define DEFLT_PROMPT          "whois R.I.P. config> "
81   | #define DEFLT_CLEAR_SCREEN    "0"
82   | #define DEFLT_SLEEP_TIME      "1"
83   | #define DEFLT_ACCOUNTING      "0"
84   | #define DEFLT_QUERY_LOGGING   "1"
85   | #define DEFLT_QUERY_LOGFILE   "stdout"
86   | #define DEFLT_INSTR_LOGGING   "1"
87   | #define DEFLT_INSTR_LOGFILE   "stdout"
88   | #define DEFLT_COMND_LOGGING   "1"
89   | #define DEFLT_COMND_LOGFILE   "stdout"
90   | #define DEFLT_TESTS_LOGGING   "1"
91   | #define DEFLT_TESTS_LOGFILE   "stdout"
92   | #define DEFLT_THREAD_LOGGING  "1"
93   | #define DEFLT_THREAD_LOGFILE  "stdout"
94   | #define DEFLT_SOCKET_LOGGING  "1"
95   | #define DEFLT_SOCKET_LOGFILE  "stdout"
96   | #define DEFLT_CONFIG_LOGGING  "1"
97   | #define DEFLT_CONFIG_LOGFILE  "stdout"
98   | 
99   | 
100  | /*+ Each constant has a +*/
101  | struct _constant {
102  |   const char *token;              /*+ Token to be found in properties file. +*/
103  |   const char *deflt;                    /*+ Default value for the constant. +*/
104  |   int (*set_func)(void *, char *);        /*+ Function to set the constant. +*/
105  |   void *constant_ptr;                     /*+ Pointer to the constant value +*/
106  |   char *(*show_func)(void *);            /*+ Function to show the constant. +*/
107  | };
108  | 
109  | 
110  | /*+ The Constants array has a +*/
111  | typedef struct _Constants {
112  |   int  max_threads[1];             /*+ Maximum number of server threads. +*/ 
113  |   char  whois_port[64];   /*+ Port for whois clients to rendezvous with. +*/
114  |   char  config_port[64]; /*+ Port for config clients to rendezvous with. +*/
115  |   char  mirror_port[64]; /*+ Port for mirror clients to rendezvous with. +*/
116  |   char  host[64];                             /*+ Host for the database. +*/
117  |   char  user[64];                             /*+ User for the database. +*/
118  |   char  password[64];                     /*+ Password for the database. +*/
119  |   int  database_port[1];                      /*+ Port for the database. +*/
120  |   char  database[64];                                 /*+ Database name. +*/
121  |   char  query[1024];                         /*+ Query for the database. +*/
122  |   char  in_query[1024];     /*+ Query for the radix tree initialization. +*/
123  |   char  rt_query[1024];     /*+ Query for the radix tree initialization. +*/
124  |   int   authenticate[1];                         /*+ Authenticate users. +*/
125  |   int   whois_suspended[1];                /*+ Suspend the whois server. +*/
126  |   char  welcome[1024];                  /*+ Welcome for config protocol. +*/
127  |   char  prompt[1024];                    /*+ Prompt for config protocol. +*/
128  |   int   clear_screen[1];         /*+ Clear screen after config commands. +*/
129  |   int   sleep_time[1];  /*+ Sleep time (in sec) between config commands. +*/
130  |   int   accounting[1];          /*+ Conduct accounting on whois queries. +*/
131  |   int   query_logging[1];                       /*+ Log the SQL queries. +*/
132  |   char  query_logfile[1024];         /*+ Query logfile for the database. +*/
133  |   int   instr_logging[1];                    /*+ Log the whois instrucs. +*/
134  |   char  instr_logfile[1024];   /*+ Query logfile for the whois instrucs. +*/
135  |   int   comnd_logging[1];                    /*+ Log the whois commands. +*/
136  |   char  comnd_logfile[1024];   /*+ Query logfile for the whois commands. +*/
137  |   int   tests_logging[1];                       /*+ Log the whois tests. +*/
138  |   char  tests_logfile[1024];      /*+ Query logfile for the whois tests. +*/
139  |   int   thread_logging[1];                    /*+ Log the whois threads. +*/
140  |   char  thread_logfile[1024];   /*+ Query logfile for the whois threads. +*/
141  |   int   socket_logging[1];                           /*+ Log the socket. +*/
142  |   char  socket_logfile[1024];                /*+ Logfile for the socket. +*/
143  |   int   config_logging[1];                           /*+ Log the config. +*/
144  |   char  config_logfile[1024];                /*+ Logfile for the config. +*/
145  | } *Constants;
146  | 
147  | 
148  | /*
149  |  * Global Variables
150  |  */
151  | /*+ The array of Global Constants. +*/
152  | static Constants  Global_constants=NULL;
153  | 
154  | /* 
155  |  * Set Functions
156  |  */
157  | static int set_string(void *constant, char *value) {
158  | 
159  |   strcpy((char *)constant, value);
160  | 
161  |   return 0;
162  | } /* set_string() */
163  | 
164  | static int set_int(void *constant, char *value) {
165  |   int i;
166  |   
167  |   i = atol(value);
168  |   ((int *)constant)[0] = i;
169  | 
170  |   return 0;
171  | } /* set_int() */
172  | 
173  | static int set_boolean(void *constant, char *value) {
174  |   int result=1;
175  |   int i;
176  |   
177  |   i = atol(value);
178  | 
179  |   /* If a valid boolean */
180  |   if ( (i == 0) || (i == 1)) {
181  |     ((int *)constant)[0] = i;
182  |     result = 0;
183  |   }
184  | 
185  |   return result;
186  | } /* set_boolean() */
187  | 
188  | 
189  | /* 
190  |  * Show Functions
191  |  */
192  | static char *show_string(void *constant) {
193  |   return((char *)constant);
194  | } /* show_string() */
195  | 
196  | static char *show_int(void *constant) {
197  |   char *tmp;
198  | 
199  |   tmp = calloc(1, 64);
200  |   sprintf(tmp, "%d", ((int *)constant)[0]);
201  |   return tmp;
202  | } /* show_int() */
203  | 
204  | static char *show_boolean(void *constant) {
205  |   char *tmp;
206  | 
207  |   tmp = calloc(1, 64);
208  |   sprintf(tmp, "%d", ((int *)constant)[0]);
209  |   return tmp;
210  | } /* show_boolean() */
211  | 
212  | 
213  | /* 
214  |  * Get Functions
215  |  */
216  | int CO_get_max_threads() {
217  |   return Global_constants->max_threads[0];
218  | }
219  | 
220  | const char *CO_get_whois_port() {
221  |   return Global_constants->whois_port;
222  | }
223  | 
224  | const char *CO_get_config_port() {
225  |   return Global_constants->config_port;
226  | }
227  | 
228  | const char *CO_get_mirror_port() {
229  |   return Global_constants->mirror_port;
230  | }
231  | 
232  | const char *CO_get_host() {
233  |   return Global_constants->host;
234  | }
235  | 
236  | const char *CO_get_user() {
237  |   return Global_constants->user;
238  | }
239  | 
240  | const char *CO_get_password() {
241  |   return Global_constants->password;
242  | }
243  | 
244  | int CO_get_database_port() {
245  |   return Global_constants->database_port[0];
246  | }
247  | 
248  | const char *CO_get_database() {
249  |   return Global_constants->database;
250  | }
251  | 
252  | const char *CO_get_query() {
253  |   return Global_constants->query;
254  | }
255  | 
256  | const char *CO_get_in_query() {
257  |   return Global_constants->in_query;
258  | }
259  | 
260  | const char *CO_get_rt_query() {
261  |   return Global_constants->rt_query;
262  | }
263  | 
264  | int CO_get_authenticate() {
265  |   return Global_constants->authenticate[0];
266  | }
267  | 
268  | int CO_get_whois_suspended() {
269  |   return Global_constants->whois_suspended[0];
270  | }
271  | 
272  | const char *CO_get_welcome() {
273  |   return Global_constants->welcome;
274  | }
275  | 
276  | const char *CO_get_prompt() {
277  |   return Global_constants->prompt;
278  | }
279  | 
280  | int CO_get_clear_screen() {
281  |   return Global_constants->clear_screen[0];
282  | }
283  | 
284  | int CO_get_sleep_time() {
285  |   return Global_constants->sleep_time[0];
286  | }
287  | 
288  | int CO_get_accounting() {
289  |   return Global_constants->accounting[0];
290  | }
291  | 
292  | int CO_get_query_logging() {
293  |   return Global_constants->query_logging[0];
294  | }
295  | 
296  | const char *CO_get_query_logfile() {
297  |   return Global_constants->query_logfile;
298  | }
299  | 
300  | int CO_get_instr_logging() {
301  |   return Global_constants->instr_logging[0];
302  | }
303  | 
304  | const char *CO_get_instr_logfile() {
305  |   return Global_constants->instr_logfile;
306  | }
307  | 
308  | int CO_get_comnd_logging() {
309  |   return Global_constants->comnd_logging[0];
310  | }
311  | 
312  | const char *CO_get_comnd_logfile() {
313  |   return Global_constants->comnd_logfile;
314  | }
315  | 
316  | int CO_get_tests_logging() {
317  |   return Global_constants->tests_logging[0];
318  | }
319  | 
320  | const char *CO_get_tests_logfile() {
321  |   return Global_constants->tests_logfile;
322  | }
323  | 
324  | int CO_get_thread_logging() {
325  |   return Global_constants->thread_logging[0];
326  | }
327  | 
328  | const char *CO_get_thread_logfile() {
329  |   return Global_constants->thread_logfile;
330  | }
331  | 
332  | int CO_get_socket_logging() {
333  |   return Global_constants->socket_logging[0];
334  | }
335  | 
336  | const char *CO_get_socket_logfile() {
337  |   return Global_constants->socket_logfile;
338  | }
339  | 
340  | int CO_get_config_logging() {
341  |   return Global_constants->config_logging[0];
342  | }
343  | 
344  | const char *CO_get_config_logfile() {
345  |   return Global_constants->config_logfile;
346  | }
347  | 
348  | 
349  | /*+
350  |  * Contains the constant definitions for the Token, set_function, show_function.
351  |  * (See: _constant)
352  | +*/
353  | static struct _constant constant[MAX_CONSTS];
354  | 
355  | /* init_constants() */
356  | /*++++++++++++++++++++++++++++++++++++++
357  |   Initialize all the constants.
358  | 
359  |   More:
360  |   +html+ <PRE>
361  |   Authors:
362  |         ottrey
363  | 
364  |   +html+ </PRE><DL COMPACT>
365  |   +html+ <DT>Online References:
366  |   +html+ <DD><UL>
367  |   +html+ </UL></DL>
368  | 
369  |   ++++++++++++++++++++++++++++++++++++++*/
370  | static void init_constants(void) {
371  |   int n=0;
372  | 
373  |   constant[n].token="SV.max_threads";
374  |   constant[n].deflt=DEFLT_MAX_THREADS;
375  |   constant[n].set_func=set_int;
376  |   constant[n].constant_ptr=Global_constants->max_threads;
377  |   constant[n].show_func=show_int;
378  |   n++;
379  | 
380  |   constant[n].token="SV.whois_port";
381  |   constant[n].deflt=DEFLT_WHOIS_PORT;
382  |   constant[n].set_func=set_string;
383  |   constant[n].constant_ptr=Global_constants->whois_port;
384  |   constant[n].show_func=show_string;
385  |   n++;
386  | 
387  |   constant[n].token="SV.config_port";
388  |   constant[n].deflt=DEFLT_CONFIG_PORT;
389  |   constant[n].set_func=set_string;
390  |   constant[n].constant_ptr=Global_constants->config_port;
391  |   constant[n].show_func=show_string;
392  |   n++;
393  | 
394  |   constant[n].token="SV.mirror_port";
395  |   constant[n].deflt=DEFLT_MIRROR_PORT;
396  |   constant[n].set_func=set_string;
397  |   constant[n].constant_ptr=Global_constants->mirror_port;
398  |   constant[n].show_func=show_string;
399  |   n++;
400  | 
401  |   constant[n].token="DB.host";
402  |   constant[n].deflt=DEFLT_HOST;
403  |   constant[n].set_func=set_string;
404  |   constant[n].constant_ptr=Global_constants->host;
405  |   constant[n].show_func=show_string;
406  |   n++;
407  | 
408  |   constant[n].token="DB.user";
409  |   constant[n].deflt=DEFLT_USER;
410  |   constant[n].set_func=set_string;
411  |   constant[n].constant_ptr=Global_constants->user;
412  |   constant[n].show_func=show_string;
413  |   n++;
414  | 
415  |   constant[n].token="DB.password";
416  |   constant[n].deflt=DEFLT_PASSWORD;
417  |   constant[n].set_func=set_string;
418  |   constant[n].constant_ptr=Global_constants->password;
419  |   constant[n].show_func=show_string;
420  |   n++;
421  | 
422  |   constant[n].token="DB.database_port";
423  |   constant[n].deflt=DEFLT_DATABASE_PORT;
424  |   constant[n].set_func=set_int;
425  |   constant[n].constant_ptr=Global_constants->database_port;
426  |   constant[n].show_func=show_int;
427  |   n++;
428  | 
429  |   constant[n].token="DB.database";
430  |   constant[n].deflt=DEFLT_DATABASE;
431  |   constant[n].set_func=set_string;
432  |   constant[n].constant_ptr=Global_constants->database;
433  |   constant[n].show_func=show_string;
434  |   n++;
435  | 
436  |   constant[n].token="DB.query";
437  |   constant[n].deflt=DEFLT_QUERY;
438  |   constant[n].set_func=set_string;
439  |   constant[n].constant_ptr=Global_constants->query;
440  |   constant[n].show_func=show_string;
441  |   n++;
442  | 
443  |   constant[n].token="RX.in_query";
444  |   constant[n].deflt=DEFLT_IN_QUERY;
445  |   constant[n].set_func=set_string;
446  |   constant[n].constant_ptr=Global_constants->in_query;
447  |   constant[n].show_func=show_string;
448  |   n++;
449  | 
450  |   constant[n].token="RX.rt_query";
451  |   constant[n].deflt=DEFLT_RT_QUERY;
452  |   constant[n].set_func=set_string;
453  |   constant[n].constant_ptr=Global_constants->rt_query;
454  |   constant[n].show_func=show_string;
455  |   n++;
456  | 
457  |   constant[n].token="SV.authenticate";
458  |   constant[n].deflt=DEFLT_AUTHENTICATE;
459  |   constant[n].set_func=set_boolean;
460  |   constant[n].constant_ptr=Global_constants->authenticate;
461  |   constant[n].show_func=show_boolean;
462  |   n++;
463  | 
464  |   constant[n].token="SV.whois_suspended";
465  |   constant[n].deflt=DEFLT_WHOIS_SUSPENDED;
466  |   constant[n].set_func=set_boolean;
467  |   constant[n].constant_ptr=Global_constants->whois_suspended;
468  |   constant[n].show_func=show_boolean;
469  |   n++;
470  | 
471  |   constant[n].token="PC.welcome";
472  |   constant[n].deflt=DEFLT_WELCOME;
473  |   constant[n].set_func=set_string;
474  |   constant[n].constant_ptr=Global_constants->welcome;
475  |   constant[n].show_func=show_string;
476  |   n++;
477  | 
478  |   constant[n].token="PC.prompt";
479  |   constant[n].deflt=DEFLT_PROMPT;
480  |   constant[n].set_func=set_string;
481  |   constant[n].constant_ptr=Global_constants->prompt;
482  |   constant[n].show_func=show_string;
483  |   n++;
484  | 
485  |   constant[n].token="PC.clear_screen";
486  |   constant[n].deflt=DEFLT_CLEAR_SCREEN;
487  |   constant[n].set_func=set_boolean;
488  |   constant[n].constant_ptr=Global_constants->clear_screen;
489  |   constant[n].show_func=show_boolean;
490  |   n++;
491  | 
492  |   constant[n].token="PC.sleep_time";
493  |   constant[n].deflt=DEFLT_SLEEP_TIME;
494  |   constant[n].set_func=set_int;
495  |   constant[n].constant_ptr=Global_constants->sleep_time;
496  |   constant[n].show_func=show_int;
497  |   n++;
498  | 
499  |   constant[n].token="WQ.accounting";
500  |   constant[n].deflt=DEFLT_ACCOUNTING;
501  |   constant[n].set_func=set_boolean;
502  |   constant[n].constant_ptr=Global_constants->accounting;
503  |   constant[n].show_func=show_boolean;
504  |   n++;
505  | 
506  |   constant[n].token="LO.query_logging";
507  |   constant[n].deflt=DEFLT_QUERY_LOGGING;
508  |   constant[n].set_func=set_boolean;
509  |   constant[n].constant_ptr=Global_constants->query_logging;
510  |   constant[n].show_func=show_boolean;
511  |   n++;
512  | 
513  |   constant[n].token="LO.query_logfile";
514  |   constant[n].deflt=DEFLT_QUERY_LOGFILE;
515  |   constant[n].set_func=set_string;
516  |   constant[n].constant_ptr=Global_constants->query_logfile;
517  |   constant[n].show_func=show_string;
518  |   n++;
519  | 
520  |   constant[n].token="LO.instr_logging";
521  |   constant[n].deflt=DEFLT_INSTR_LOGGING;
522  |   constant[n].set_func=set_boolean;
523  |   constant[n].constant_ptr=Global_constants->instr_logging;
524  |   constant[n].show_func=show_boolean;
525  |   n++;
526  | 
527  |   constant[n].token="LO.insrt_logfile";
528  |   constant[n].deflt=DEFLT_INSTR_LOGFILE;
529  |   constant[n].set_func=set_string;
530  |   constant[n].constant_ptr=Global_constants->instr_logfile;
531  |   constant[n].show_func=show_string;
532  |   n++;
533  | 
534  |   constant[n].token="LO.comnd_logging";
535  |   constant[n].deflt=DEFLT_COMND_LOGGING;
536  |   constant[n].set_func=set_boolean;
537  |   constant[n].constant_ptr=Global_constants->comnd_logging;
538  |   constant[n].show_func=show_boolean;
539  |   n++;
540  | 
541  |   constant[n].token="LO.comnd_logfile";
542  |   constant[n].deflt=DEFLT_COMND_LOGFILE;
543  |   constant[n].set_func=set_string;
544  |   constant[n].constant_ptr=Global_constants->comnd_logfile;
545  |   constant[n].show_func=show_string;
546  |   n++;
547  | 
548  |   constant[n].token="LO.tests_logging";
549  |   constant[n].deflt=DEFLT_TESTS_LOGGING;
550  |   constant[n].set_func=set_boolean;
551  |   constant[n].constant_ptr=Global_constants->tests_logging;
552  |   constant[n].show_func=show_boolean;
553  |   n++;
554  | 
555  |   constant[n].token="LO.tests_logfile";
556  |   constant[n].deflt=DEFLT_TESTS_LOGFILE;
557  |   constant[n].set_func=set_string;
558  |   constant[n].constant_ptr=Global_constants->tests_logfile;
559  |   constant[n].show_func=show_string;
560  |   n++;
561  | 
562  |   constant[n].token="LO.thread_logging";
563  |   constant[n].deflt=DEFLT_THREAD_LOGGING;
564  |   constant[n].set_func=set_boolean;
565  |   constant[n].constant_ptr=Global_constants->thread_logging;
566  |   constant[n].show_func=show_boolean;
567  |   n++;
568  | 
569  |   constant[n].token="LO.thread_logfile";
570  |   constant[n].deflt=DEFLT_THREAD_LOGFILE;
571  |   constant[n].set_func=set_string;
572  |   constant[n].constant_ptr=Global_constants->thread_logfile;
573  |   constant[n].show_func=show_string;
574  |   n++;
575  | 
576  |   constant[n].token="LO.socket_logging";
577  |   constant[n].deflt=DEFLT_SOCKET_LOGGING;
578  |   constant[n].set_func=set_boolean;
579  |   constant[n].constant_ptr=Global_constants->socket_logging;
580  |   constant[n].show_func=show_boolean;
581  |   n++;
582  | 
583  |   constant[n].token="LO.socket_logfile";
584  |   constant[n].deflt=DEFLT_SOCKET_LOGFILE;
585  |   constant[n].set_func=set_string;
586  |   constant[n].constant_ptr=Global_constants->socket_logfile;
587  |   constant[n].show_func=show_string;
588  |   n++;
589  | 
590  |   constant[n].token="LO.config_logging";
591  |   constant[n].deflt=DEFLT_CONFIG_LOGGING;
592  |   constant[n].set_func=set_boolean;
593  |   constant[n].constant_ptr=Global_constants->config_logging;
594  |   constant[n].show_func=show_boolean;
595  |   n++;
596  | 
597  |   constant[n].token="LO.config_logfile";
598  |   constant[n].deflt=DEFLT_CONFIG_LOGFILE;
599  |   constant[n].set_func=set_string;
600  |   constant[n].constant_ptr=Global_constants->config_logfile;
601  |   constant[n].show_func=show_string;
602  |   n++;
603  | 
604  |   constant[n].token=NULL;
605  | 
606  | } /* init_constants() */
607  | 
608  | 
609  | /* CO_to_string() */
610  | /*++++++++++++++++++++++++++++++++++++++
611  |   Returns the constants as a string.
612  | 
613  |   More:
614  |   +html+ <PRE>
615  |   Authors:
616  |         ottrey
617  | 
618  |   +html+ </PRE><DL COMPACT>
619  |   +html+ <DT>Online References:
620  |   +html+ <DD><UL>
621  |   +html+ </UL></DL>
622  | 
623  |   ++++++++++++++++++++++++++++++++++++++*/
624  | char *CO_to_string(void) {
625  |   char *consts;
626  |   const char *token;
627  |   char *value;
628  |   char tmp_consts[1024];
629  |   char tmp_const[128];
630  |   int i=0;
631  | 
632  |   sprintf(tmp_consts, "Constants = { ");
633  |   while(constant[i].token != NULL) {
634  |     token = constant[i].token;
635  |     value = constant[i].show_func(constant[i].constant_ptr);
636  |     sprintf(tmp_const, "\n[%s]=\"%s\"", token, value);
637  |     strcat(tmp_consts, tmp_const);
638  |     i++;
639  |   }
640  |   strcat(tmp_consts, "}");
641  | 
642  |   consts = calloc(1, strlen(tmp_consts)+1);
643  |   strcpy(consts, tmp_consts);
644  | 
645  |   return consts;
646  | } /* CO_to_string() */
647  | 
648  | 
649  | char *CO_const_to_string(char *name) {
650  |   char *result=NULL;
651  |   int i;
652  |   
653  |   for (i=0; constant[i].token != NULL; i++) {
654  |     if (strcmp(constant[i].token, name) == 0) {
655  |       result = constant[i].show_func(constant[i].constant_ptr);
656  |       break;
657  |     }
658  |   }
659  | 
660  |   return result;
661  | } /* CO_const_to_string() */
662  | 
663  |  /* CO_set_const() */
664  | /*++++++++++++++++++++++++++++++++++++++
665  |   Sets the value of one constant.  Returns 0 if no error.
666  | 
667  |   More:
668  |   +html+ <PRE>
669  |   Authors:
670  |         ottrey
671  | 
672  |   +html+ </PRE><DL COMPACT>
673  |   +html+ <DT>Online References:
674  |   +html+ <DD><UL>
675  |   +html+ </UL></DL>
676  | 
677  |   ++++++++++++++++++++++++++++++++++++++*/
678  | int CO_set_const(char *name, char *value) {
679  |   int result=1;
680  |   int i;
681  |   
682  |   for (i=0; constant[i].token != NULL; i++) {
683  |     if (strcmp(constant[i].token, name) == 0) {
684  |       result = constant[i].set_func((void *)constant[i].constant_ptr, value);
685  |       break;
686  |     }
687  |   }
688  | 
689  |   return result;
690  | } /* CO_set_const() */
691  | 
692  | 
693  | /* CO_set() */
694  | /*++++++++++++++++++++++++++++++++++++++
695  |   Sets the constants from the properties module.
696  |   Returns the number of constants set.
697  | 
698  |   More:
699  |   +html+ <PRE>
700  |   Authors:
701  |         ottrey
702  |   +html+ </PRE><DL COMPACT>
703  |   +html+ <DT>Online References:
704  |   +html+ <DD><UL>
705  |   +html+   <LI><A HREF="../src/.properties">.properties</A>
706  |   +html+ </UL></DL>
707  | 
708  |   ++++++++++++++++++++++++++++++++++++++*/
709  | char *CO_set(void) {
710  |   int i;
711  |   int set_count=0;
712  |   int set;
713  |   char result_buff[256];
714  |   char *result;
715  |   char *property;
716  | 
717  |   /* Initialize if necessary */
718  |   if (Global_constants == NULL) {
719  |     Global_constants = (Constants)calloc(1, sizeof(struct _Constants));
720  |     init_constants();
721  |   }
722  | 
723  |   for (i=0; constant[i].token != NULL; i++) {
724  |     property = PR_get_property(constant[i].token, constant[i].deflt);
725  |     set = constant[i].set_func((void *)constant[i].constant_ptr, property);
726  |     if (set == 0) {
727  |       set_count++;
728  |     }
729  |   }
730  | 
731  |   sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i);
732  | 
733  |   result = (char *)calloc(1, strlen(result_buff)+1);
734  |   strcpy(result, result_buff);
735  | 
736  |   return result;
737  | } /* CO_set() */
738  |