1    | /***************************************
2    |   $Revision: 1.16 $
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   | #define DEFLT_MAX_THREADS     "10"
69   | #define DEFLT_WHOIS_PORT      "0"
70   | #define DEFLT_CONFIG_PORT     "0"
71   | #define DEFLT_MIRROR_PORT     "0"
72   | #define DEFLT_UPDATE_PORT     "0"
73   | #define DEFLT_HOST            "mysql.database.net"
74   | #define DEFLT_USER            "xxx"
75   | #define DEFLT_PASSWORD        "xxx"
76   | #define DEFLT_DATABASE_PORT   "3306"
77   | #define DEFLT_DATABASE        "RIPE"
78   | #define DEFLT_QUERY           "SHOW TABLES"
79   | #define DEFLT_IN_QUERY        "SELECT * FROM inetnum"
80   | #define DEFLT_RT_QUERY        "SELECT * FROM route"
81   | #define DEFLT_AUTHENTICATE    "0"
82   | #define DEFLT_WHOIS_SUSPENDED "0"
83   | #define DEFLT_DO_SERVER       "1"
84   | #define DEFLT_WELCOME         "Welcome to the whois R.I.P. server.\n"
85   | #define DEFLT_PROMPT          "whois R.I.P. config> "
86   | #define DEFLT_CLEAR_SCREEN    "0"
87   | #define DEFLT_SLEEP_TIME      "1"
88   | #define DEFLT_ACCOUNTING      "0"
89   | #define DEFLT_QUERY_LOGGING   "1"
90   | #define DEFLT_QUERY_LOGFILE   "stdout"
91   | #define DEFLT_INSTR_LOGGING   "1"
92   | #define DEFLT_INSTR_LOGFILE   "stdout"
93   | #define DEFLT_COMND_LOGGING   "1"
94   | #define DEFLT_COMND_LOGFILE   "stdout"
95   | #define DEFLT_TESTS_LOGGING   "1"
96   | #define DEFLT_TESTS_LOGFILE   "stdout"
97   | #define DEFLT_THREAD_LOGGING  "1"
98   | #define DEFLT_THREAD_LOGFILE  "stdout"
99   | #define DEFLT_SOCKET_LOGGING  "1"
100  | #define DEFLT_SOCKET_LOGFILE  "stdout"
101  | #define DEFLT_CONFIG_LOGGING  "1"
102  | #define DEFLT_CONFIG_LOGFILE  "stdout"
103  | #define DEFLT_CONFIG_FILE     "rip.config"
104  | #define DEFLT_NRTM_HOST       "nrtm.nowhere.xx"
105  | #define DEFLT_NRTM_VERSION    "1"
106  | #define DEFLT_NRTM_DELAY      "600"
107  | #define DEFLT_NRTM_CSERFILE   "RIPE.CURRENTSERIAL"
108  | #define DEFLT_NRTM_LOGFILE    "nrtm.log"
109  | #define DEFLT_UPDATE_MODE     "0"
110  | 
111  | /*+ Each constant has a +*/
112  | struct _constant {
113  |   const char *token;              /*+ Token to be found in properties file. +*/
114  |   const char *deflt;                    /*+ Default value for the constant. +*/
115  |   int (*set_func)(void *, char *);        /*+ Function to set the constant. +*/
116  |   void *constant_ptr;                     /*+ Pointer to the constant value +*/
117  |   char *(*show_func)(void *);            /*+ Function to show the constant. +*/
118  | };
119  | 
120  | 
121  | /*+ The Constants array has a +*/
122  | typedef struct _Constants {
123  |   int  max_threads[1];             /*+ Maximum number of server threads. +*/ 
124  |   char  whois_port[64];   /*+ Port for whois clients to rendezvous with. +*/
125  |   char  config_port[64]; /*+ Port for config clients to rendezvous with. +*/
126  |   char  mirror_port[64]; /*+ Port for mirror clients to rendezvous with. +*/
127  |   char  update_port[64]; /*+ Port for DBupdate clients to rendezvous with. +*/  
128  |   char  host[64];                             /*+ Host for the database. +*/
129  |   char  user[64];                             /*+ User for the database. +*/
130  |   char  password[64];                     /*+ Password for the database. +*/
131  |   int  database_port[1];                      /*+ Port for the database. +*/
132  |   char  database[64];                                 /*+ Database name. +*/
133  |   char  query[1024];                         /*+ Query for the database. +*/
134  |   char  in_query[1024];     /*+ Query for the radix tree initialization. +*/
135  |   char  rt_query[1024];     /*+ Query for the radix tree initialization. +*/
136  |   int   authenticate[1];                         /*+ Authenticate users. +*/
137  |   int   whois_suspended[1];                /*+ Suspend the whois server. +*/
138  |   char  welcome[1024];                  /*+ Welcome for config protocol. +*/
139  |   char  prompt[1024];                    /*+ Prompt for config protocol. +*/
140  |   int   clear_screen[1];         /*+ Clear screen after config commands. +*/
141  |   int   sleep_time[1];  /*+ Sleep time (in sec) between config commands. +*/
142  |   int   accounting[1];          /*+ Conduct accounting on whois queries. +*/
143  |   int   query_logging[1];                       /*+ Log the SQL queries. +*/
144  |   char  query_logfile[1024];         /*+ Query logfile for the database. +*/
145  |   int   instr_logging[1];                    /*+ Log the whois instrucs. +*/
146  |   char  instr_logfile[1024];   /*+ Query logfile for the whois instrucs. +*/
147  |   int   comnd_logging[1];                    /*+ Log the whois commands. +*/
148  |   char  comnd_logfile[1024];   /*+ Query logfile for the whois commands. +*/
149  |   int   tests_logging[1];                       /*+ Log the whois tests. +*/
150  |   char  tests_logfile[1024];      /*+ Query logfile for the whois tests. +*/
151  |   int   thread_logging[1];                    /*+ Log the whois threads. +*/
152  |   char  thread_logfile[1024];   /*+ Query logfile for the whois threads. +*/
153  |   int   socket_logging[1];                           /*+ Log the socket. +*/
154  |   char  socket_logfile[1024];                /*+ Logfile for the socket. +*/
155  |   int   config_logging[1];                           /*+ Log the config. +*/
156  |   char  config_logfile[1024];                /*+ Logfile for the config. +*/
157  |   char  config_file[1024];                   /*+ File for the config.    +*/
158  |   char  nrtm_host[64];/*+ NRTM server +*/
159  |   char	nrtm_port[64];/*+ Port of NRTM server when we are acting as a client +*/
160  |   int	nrtm_version[1];/*+ NRTM protocol version +*/
161  |   int	nrtm_delay[1];/*+ delay between syncs +*/
162  |   char	nrtm_cserialfile[1024];/*+ name of the file containing current serial +*/
163  |   char	nrtm_logfile[1024];/*+ NRTM logfile for failure reports +*/
164  |   int	do_nrtm[1]; 
165  |   int	update_mode[1];/*+ protected/unprotected (==dummy_allowed) +*/
166  |   int	do_update[1]; /*+ switches on and off the updates +*/
167  |   int   do_server[1]; /*+ turns off execution of the all servers(threads) +*/
168  | } *Constants;
169  | 
170  | /* in addition, we make a table of Sources here: */
171  | /*+ Source database mirrors +*/
172  | typedef struct {
173  |   char src[32];
174  |   char db[32];
175  | } source_info_t;
176  | 
177  | source_info_t const Sources[] = {
178  |   {"RIPE","RIPE6"}, /* the db part actually gets overwritten in 
179  | 		       init_constants */
180  |   
181  |   /*  "ARIN",
182  |       "APNIC",
183  |   */
184  |   
185  |   {"",""}
186  | }; /* Sources */
187  | 
188  | char * const Sources_vector[] = {
189  |   "RIPE",
190  |   NULL
191  | };
192  | 
193  | /*
194  |  * Global Variables
195  |  */
196  | /*+ The array of Global Constants. +*/
197  | static Constants  Global_constants=NULL;
198  | 
199  | /* 
200  |  * Set Functions
201  |  */
202  | static int set_string(void *constant, char *value) {
203  | 
204  |   strcpy((char *)constant, value);
205  | 
206  |   return 0;
207  | } /* set_string() */
208  | 
209  | static int set_int(void *constant, char *value) {
210  |   int i;
211  |   
212  |   i = atol(value);
213  |   ((int *)constant)[0] = i;
214  | 
215  |   return 0;
216  | } /* set_int() */
217  | 
218  | static int set_boolean(void *constant, char *value) {
219  |   int result=1;
220  |   int i;
221  |   
222  |   i = atol(value);
223  | 
224  |   /* If a valid boolean */
225  |   if ( (i == 0) || (i == 1)) {
226  |     ((int *)constant)[0] = i;
227  |     result = 0;
228  |   }
229  | 
230  |   return result;
231  | } /* set_boolean() */
232  | 
233  | 
234  | /* 
235  |  * Show Functions
236  |  */
237  | /* AR. changed for unification with oter show funcs */
238  | static char *show_string(void *constant) {
239  |   char *tmp;
240  |   
241  |   /*  tmp = calloc(1, strlen((char *)constant)+1); */
242  |   dieif( wr_malloc((void **)&tmp, strlen((char *)constant)+1) != UT_OK);  
243  |   
244  |   strcpy(tmp, (char *)constant);
245  | /*  return((char *)constant); */
246  |   return tmp;
247  | } /* show_string() */
248  | 
249  | static char *show_int(void *constant) {
250  |   char *tmp;
251  | 
252  |   /* tmp = calloc(1, 64); */
253  |   dieif( wr_malloc((void **)&tmp, 64) != UT_OK); 
254  | 
255  |   sprintf(tmp, "%d", ((int *)constant)[0]);
256  |   return tmp;
257  | } /* show_int() */
258  | 
259  | static char *show_boolean(void *constant) {
260  |   char *tmp;
261  | 
262  |   /*  tmp = calloc(1, 64); */
263  |   dieif( wr_malloc((void **)&tmp, 64) != UT_OK); 
264  | 
265  |   sprintf(tmp, "%d", ((int *)constant)[0]);
266  |   return tmp;
267  | } /* show_boolean() */
268  | 
269  | 
270  | /* 
271  |  * Get Functions
272  |  */
273  | int CO_get_max_threads() {
274  |   return Global_constants->max_threads[0];
275  | }
276  | 
277  | char *CO_get_whois_port() {
278  |   return Global_constants->whois_port;
279  | }
280  | 
281  | char *CO_get_config_port() {
282  |   return Global_constants->config_port;
283  | }
284  | 
285  | char *CO_get_mirror_port() {
286  |   return Global_constants->mirror_port;
287  | }
288  | 
289  | char *CO_get_update_port() {
290  |   return Global_constants->update_port;
291  | }
292  | 
293  | char *CO_get_host() {
294  |   return Global_constants->host;
295  | }
296  | 
297  | char *CO_get_user() {
298  |   return Global_constants->user;
299  | }
300  | 
301  | char *CO_get_password() {
302  |   return Global_constants->password;
303  | }
304  | 
305  | int CO_get_database_port() {
306  |   return Global_constants->database_port[0];
307  | }
308  | 
309  | char *CO_get_database() {
310  |   return Global_constants->database;
311  | }
312  | 
313  | char *CO_get_query() {
314  |   return Global_constants->query;
315  | }
316  | 
317  | char *CO_get_in_query() {
318  |   return Global_constants->in_query;
319  | }
320  | 
321  | char *CO_get_rt_query() {
322  |   return Global_constants->rt_query;
323  | }
324  | 
325  | int CO_get_authenticate() {
326  |   return Global_constants->authenticate[0];
327  | }
328  | 
329  | int CO_get_whois_suspended() {
330  |   return Global_constants->whois_suspended[0];
331  | }
332  | 
333  | char *CO_get_welcome() {
334  |   return Global_constants->welcome;
335  | }
336  | 
337  | char *CO_get_prompt() {
338  |   return Global_constants->prompt;
339  | }
340  | 
341  | int CO_get_clear_screen() {
342  |   return Global_constants->clear_screen[0];
343  | }
344  | 
345  | int CO_get_sleep_time() {
346  |   return Global_constants->sleep_time[0];
347  | }
348  | 
349  | int CO_get_accounting() {
350  |   return Global_constants->accounting[0];
351  | }
352  | 
353  | int CO_get_query_logging() {
354  |   return Global_constants->query_logging[0];
355  | }
356  | 
357  | char *CO_get_query_logfile() {
358  |   return Global_constants->query_logfile;
359  | }
360  | 
361  | int CO_get_instr_logging() {
362  |   return Global_constants->instr_logging[0];
363  | }
364  | 
365  | char *CO_get_instr_logfile() {
366  |   return Global_constants->instr_logfile;
367  | }
368  | 
369  | int CO_get_comnd_logging() {
370  |   return Global_constants->comnd_logging[0];
371  | }
372  | 
373  | char *CO_get_comnd_logfile() {
374  |   return Global_constants->comnd_logfile;
375  | }
376  | 
377  | int CO_get_tests_logging() {
378  |   return Global_constants->tests_logging[0];
379  | }
380  | 
381  | char *CO_get_tests_logfile() {
382  |   return Global_constants->tests_logfile;
383  | }
384  | 
385  | int CO_get_thread_logging() {
386  |   return Global_constants->thread_logging[0];
387  | }
388  | 
389  | char *CO_get_thread_logfile() {
390  |   return Global_constants->thread_logfile;
391  | }
392  | 
393  | int CO_get_socket_logging() {
394  |   return Global_constants->socket_logging[0];
395  | }
396  | 
397  | char *CO_get_socket_logfile() {
398  |   return Global_constants->socket_logfile;
399  | }
400  | 
401  | int CO_get_config_logging() {
402  |   return Global_constants->config_logging[0];
403  | }
404  | 
405  | char *CO_get_config_logfile() {
406  |   return Global_constants->config_logfile;
407  | }
408  | 
409  | char *CO_get_config_file() {
410  |   return Global_constants->config_file;
411  | }
412  | 
413  | 
414  | /*++++ NRTM stuff ++++*/
415  | 
416  | char *CO_get_nrtm_host() {
417  |   return Global_constants->nrtm_host;
418  | }
419  |   
420  | char *CO_get_nrtm_port() {
421  |   return Global_constants->nrtm_port;
422  | }
423  |   
424  | int CO_get_nrtm_version() {
425  |   return Global_constants->nrtm_version[0];
426  | }  
427  | 
428  | int CO_get_nrtm_delay() {
429  |   return Global_constants->nrtm_delay[0];
430  | }  
431  |     
432  | char *CO_get_nrtm_cserialfile() {
433  |   return Global_constants->nrtm_cserialfile;
434  | }  
435  | 
436  | char *CO_get_nrtm_logfile() {
437  |   return Global_constants->nrtm_logfile;
438  | }  
439  | 
440  | int CO_get_do_nrtm() {
441  |   return Global_constants->do_nrtm[0];
442  | }
443  | 
444  | int CO_get_update_mode() {
445  |   return Global_constants->update_mode[0];
446  | }
447  | 
448  | int CO_get_do_update() {
449  |   return Global_constants->do_update[0];
450  | }
451  | 
452  | int CO_get_do_server() {
453  |   return Global_constants->do_server[0];
454  | }
455  |   
456  | /* source_foreach() */
457  | /*++++++++++++++++++++++++++++++++++++++
458  |   Function to adds the source string to the created string from the Glist of sources.
459  |   It is called via g_list_foreach().
460  | 
461  |   void *element_data The source name.
462  | 
463  |   void *result_buf_ptr The string to be populated.
464  | 
465  |   More:
466  |   +html+ <PRE>
467  |   Authors:
468  |         ottrey
469  | 
470  |   +html+ </PRE><DL COMPACT>
471  |   +html+ <DT>Online References:
472  |   +html+ <DD><UL>
473  |   +html+ </UL></DL>
474  | 
475  |   ++++++++++++++++++++++++++++++++++++++*/
476  | static void source_foreach(void *element_data, void *result_buf_ptr) {
477  |   char *source = element_data;
478  |   char *result_buf = (char *)result_buf_ptr;
479  | 
480  |   strcat(result_buf, source);
481  |   strcat(result_buf, ",");
482  | 
483  | } /* source_foreach() */
484  | 
485  | /* CO_sources_to_string() */
486  | /*++++++++++++++++++++++++++++++++++++++
487  |   Creates a string from Sources.
488  | 
489  |   char * CO_sources_to_string Returns a string of the Sources.
490  | 
491  |   More:
492  |   +html+ <PRE>
493  |   Authors:
494  |         ottrey
495  | 
496  |   +html+ </PRE><DL COMPACT>
497  |   +html+ <DT>Online References:
498  |   +html+ <DD><UL>
499  |   +html+ </UL></DL>
500  | 
501  |   ++++++++++++++++++++++++++++++++++++++*/
502  | char * CO_sources_to_string(void) {
503  |   char *result=NULL;
504  |   char result_buf[STR_XL];
505  |   int result_len;
506  |   int i;
507  | 
508  |   strcpy(result_buf, "{");
509  |   for (i=0; Sources[i].src[0] != 0 ; i++) {
510  |     strcat(result_buf, Sources[i].src);
511  |     strcat(result_buf, ",");
512  |   }
513  |   result_len = strlen(result_buf);
514  |   result_buf[result_len-1] = '}';
515  |   result_buf[result_len] = '\0';
516  |   
517  |   /* result = (char *)calloc(1, result_len+1); */
518  |   dieif( wr_malloc((void **)&result, result_len+1) != UT_OK);  
519  |   strcpy(result, result_buf);
520  | 
521  |   return result;
522  | 
523  | } /* CO_sources_to_string() */
524  | 
525  | /* CO_sources_list_to_string() */
526  | /*++++++++++++++++++++++++++++++++++++++
527  |   Creates a string from the sources in the GList.
528  | 
529  |   GList *sources_list  The GList of sources.
530  | 
531  |   More:
532  |   +html+ <PRE>
533  |   Authors:
534  |         ottrey
535  | 
536  |   +html+ </PRE><DL COMPACT>
537  |   +html+ <DT>Online References:
538  |   +html+ <DD><UL>
539  |   +html+ </UL></DL>
540  | 
541  |   ++++++++++++++++++++++++++++++++++++++*/
542  | char *CO_sources_list_to_string(GList *sources_list) {
543  |   char *result=NULL;
544  |   char result_buf[STR_XL];
545  |   int result_len;
546  | 
547  |   strcpy(result_buf, "{");
548  |   g_list_foreach(sources_list, source_foreach, &result_buf);
549  |   result_len = strlen(result_buf);
550  |   if (result_len == 1) {
551  |     /* If an empty set */
552  |     result_buf[1] = '}';
553  |     result_buf[2] = '\0';
554  |   }
555  |   else {
556  |     result_buf[result_len-1] = '}';
557  |     result_buf[result_len] = '\0';
558  |   }
559  | 
560  |   /* result = (char *)calloc(1, result_len+1); */
561  |   dieif( wr_malloc((void **)&result, result_len+1) != UT_OK);  
562  |   strcpy(result, result_buf);
563  | 
564  |   return result;
565  | 
566  | } /* CO_sources_list_to_string() */
567  | 
568  | 
569  | char * const *CO_get_sources(void) {
570  |   return Sources_vector;
571  | } /* CO_get_sources() */
572  | 
573  | const char *CO_get_source(int index) {
574  | const char *s = Sources[index].src;
575  | 
576  |  return (*s == 0) 
577  |    ? NULL 
578  |    : s; 
579  |  
580  | } /* CO_get_source() */
581  | 
582  | const char *CO_get_source_database(int index) {
583  | const char *s = Sources[index].db;
584  | 
585  |  return (*s == 0) 
586  |    ? NULL 
587  |    : s; 
588  |  
589  | } /* CO_get_database() */
590  | 
591  | 
592  | 
593  | /*+
594  |  * Contains the constant definitions for the Token, set_function, show_function.
595  |  * (See: _constant)
596  | +*/
597  | static struct _constant constant[MAX_CONSTS];
598  | 
599  | /* init_constants() */
600  | /*++++++++++++++++++++++++++++++++++++++
601  |   Initialize all the constants.
602  | 
603  |   More:
604  |   +html+ <PRE>
605  |   Authors:
606  |         ottrey
607  | 
608  |   +html+ </PRE><DL COMPACT>
609  |   +html+ <DT>Online References:
610  |   +html+ <DD><UL>
611  |   +html+ </UL></DL>
612  | 
613  |   ++++++++++++++++++++++++++++++++++++++*/
614  | static void init_constants(void) {
615  |   int n=0;
616  | 
617  |   constant[n].token="SV.max_threads";
618  |   constant[n].deflt=DEFLT_MAX_THREADS;
619  |   constant[n].set_func=set_int;
620  |   constant[n].constant_ptr=Global_constants->max_threads;
621  |   constant[n].show_func=show_int;
622  |   n++;
623  | 
624  |   constant[n].token="SV.whois_port";
625  |   constant[n].deflt=DEFLT_WHOIS_PORT;
626  |   constant[n].set_func=set_string;
627  |   constant[n].constant_ptr=Global_constants->whois_port;
628  |   constant[n].show_func=show_string;
629  |   n++;
630  | 
631  |   constant[n].token="SV.config_port";
632  |   constant[n].deflt=DEFLT_CONFIG_PORT;
633  |   constant[n].set_func=set_string;
634  |   constant[n].constant_ptr=Global_constants->config_port;
635  |   constant[n].show_func=show_string;
636  |   n++;
637  | 
638  |   constant[n].token="SV.mirror_port";
639  |   constant[n].deflt=DEFLT_MIRROR_PORT;
640  |   constant[n].set_func=set_string;
641  |   constant[n].constant_ptr=Global_constants->mirror_port;
642  |   constant[n].show_func=show_string;
643  |   n++;
644  | 
645  |   constant[n].token="SV.update_port";
646  |   constant[n].deflt=DEFLT_UPDATE_PORT;
647  |   constant[n].set_func=set_string;
648  |   constant[n].constant_ptr=Global_constants->update_port;
649  |   constant[n].show_func=show_string;
650  |   n++;
651  | 
652  |   constant[n].token="DB.host";
653  |   constant[n].deflt=DEFLT_HOST;
654  |   constant[n].set_func=set_string;
655  |   constant[n].constant_ptr=Global_constants->host;
656  |   constant[n].show_func=show_string;
657  |   n++;
658  | 
659  |   constant[n].token="DB.user";
660  |   constant[n].deflt=DEFLT_USER;
661  |   constant[n].set_func=set_string;
662  |   constant[n].constant_ptr=Global_constants->user;
663  |   constant[n].show_func=show_string;
664  |   n++;
665  | 
666  |   constant[n].token="DB.password";
667  |   constant[n].deflt=DEFLT_PASSWORD;
668  |   constant[n].set_func=set_string;
669  |   constant[n].constant_ptr=Global_constants->password;
670  |   constant[n].show_func=show_string;
671  |   n++;
672  | 
673  |   constant[n].token="DB.database_port";
674  |   constant[n].deflt=DEFLT_DATABASE_PORT;
675  |   constant[n].set_func=set_int;
676  |   constant[n].constant_ptr=Global_constants->database_port;
677  |   constant[n].show_func=show_int;
678  |   n++;
679  | 
680  |   constant[n].token="DB.database";
681  |   constant[n].deflt=DEFLT_DATABASE;
682  |   constant[n].set_func=set_string;
683  |   constant[n].constant_ptr=Global_constants->database;
684  |   constant[n].show_func=show_string;
685  |   n++;
686  | 
687  |   constant[n].token="DB.query";
688  |   constant[n].deflt=DEFLT_QUERY;
689  |   constant[n].set_func=set_string;
690  |   constant[n].constant_ptr=Global_constants->query;
691  |   constant[n].show_func=show_string;
692  |   n++;
693  | 
694  |   constant[n].token="RX.in_query";
695  |   constant[n].deflt=DEFLT_IN_QUERY;
696  |   constant[n].set_func=set_string;
697  |   constant[n].constant_ptr=Global_constants->in_query;
698  |   constant[n].show_func=show_string;
699  |   n++;
700  | 
701  |   constant[n].token="RX.rt_query";
702  |   constant[n].deflt=DEFLT_RT_QUERY;
703  |   constant[n].set_func=set_string;
704  |   constant[n].constant_ptr=Global_constants->rt_query;
705  |   constant[n].show_func=show_string;
706  |   n++;
707  | 
708  |   constant[n].token="SV.authenticate";
709  |   constant[n].deflt=DEFLT_AUTHENTICATE;
710  |   constant[n].set_func=set_boolean;
711  |   constant[n].constant_ptr=Global_constants->authenticate;
712  |   constant[n].show_func=show_boolean;
713  |   n++;
714  | 
715  |   constant[n].token="SV.whois_suspended";
716  |   constant[n].deflt=DEFLT_WHOIS_SUSPENDED;
717  |   constant[n].set_func=set_boolean;
718  |   constant[n].constant_ptr=Global_constants->whois_suspended;
719  |   constant[n].show_func=show_boolean;
720  |   n++;
721  |   
722  |   constant[n].token="SV.do_server";
723  |   constant[n].deflt=DEFLT_DO_SERVER;
724  |   constant[n].set_func=set_boolean;
725  |   constant[n].constant_ptr=Global_constants->do_server;
726  |   constant[n].show_func=show_boolean;
727  |   n++;
728  | 
729  |   constant[n].token="PC.welcome";
730  |   constant[n].deflt=DEFLT_WELCOME;
731  |   constant[n].set_func=set_string;
732  |   constant[n].constant_ptr=Global_constants->welcome;
733  |   constant[n].show_func=show_string;
734  |   n++;
735  | 
736  |   constant[n].token="PC.prompt";
737  |   constant[n].deflt=DEFLT_PROMPT;
738  |   constant[n].set_func=set_string;
739  |   constant[n].constant_ptr=Global_constants->prompt;
740  |   constant[n].show_func=show_string;
741  |   n++;
742  | 
743  |   constant[n].token="PC.clear_screen";
744  |   constant[n].deflt=DEFLT_CLEAR_SCREEN;
745  |   constant[n].set_func=set_boolean;
746  |   constant[n].constant_ptr=Global_constants->clear_screen;
747  |   constant[n].show_func=show_boolean;
748  |   n++;
749  | 
750  |   constant[n].token="PC.sleep_time";
751  |   constant[n].deflt=DEFLT_SLEEP_TIME;
752  |   constant[n].set_func=set_int;
753  |   constant[n].constant_ptr=Global_constants->sleep_time;
754  |   constant[n].show_func=show_int;
755  |   n++;
756  | 
757  |   constant[n].token="WQ.accounting";
758  |   constant[n].deflt=DEFLT_ACCOUNTING;
759  |   constant[n].set_func=set_boolean;
760  |   constant[n].constant_ptr=Global_constants->accounting;
761  |   constant[n].show_func=show_boolean;
762  |   n++;
763  | 
764  |   constant[n].token="LO.query_logging";
765  |   constant[n].deflt=DEFLT_QUERY_LOGGING;
766  |   constant[n].set_func=set_boolean;
767  |   constant[n].constant_ptr=Global_constants->query_logging;
768  |   constant[n].show_func=show_boolean;
769  |   n++;
770  | 
771  |   constant[n].token="LO.query_logfile";
772  |   constant[n].deflt=DEFLT_QUERY_LOGFILE;
773  |   constant[n].set_func=set_string;
774  |   constant[n].constant_ptr=Global_constants->query_logfile;
775  |   constant[n].show_func=show_string;
776  |   n++;
777  | 
778  |   constant[n].token="LO.instr_logging";
779  |   constant[n].deflt=DEFLT_INSTR_LOGGING;
780  |   constant[n].set_func=set_boolean;
781  |   constant[n].constant_ptr=Global_constants->instr_logging;
782  |   constant[n].show_func=show_boolean;
783  |   n++;
784  | 
785  |   constant[n].token="LO.insrt_logfile";
786  |   constant[n].deflt=DEFLT_INSTR_LOGFILE;
787  |   constant[n].set_func=set_string;
788  |   constant[n].constant_ptr=Global_constants->instr_logfile;
789  |   constant[n].show_func=show_string;
790  |   n++;
791  | 
792  |   constant[n].token="LO.comnd_logging";
793  |   constant[n].deflt=DEFLT_COMND_LOGGING;
794  |   constant[n].set_func=set_boolean;
795  |   constant[n].constant_ptr=Global_constants->comnd_logging;
796  |   constant[n].show_func=show_boolean;
797  |   n++;
798  | 
799  |   constant[n].token="LO.comnd_logfile";
800  |   constant[n].deflt=DEFLT_COMND_LOGFILE;
801  |   constant[n].set_func=set_string;
802  |   constant[n].constant_ptr=Global_constants->comnd_logfile;
803  |   constant[n].show_func=show_string;
804  |   n++;
805  | 
806  |   constant[n].token="LO.tests_logging";
807  |   constant[n].deflt=DEFLT_TESTS_LOGGING;
808  |   constant[n].set_func=set_boolean;
809  |   constant[n].constant_ptr=Global_constants->tests_logging;
810  |   constant[n].show_func=show_boolean;
811  |   n++;
812  | 
813  |   constant[n].token="LO.tests_logfile";
814  |   constant[n].deflt=DEFLT_TESTS_LOGFILE;
815  |   constant[n].set_func=set_string;
816  |   constant[n].constant_ptr=Global_constants->tests_logfile;
817  |   constant[n].show_func=show_string;
818  |   n++;
819  | 
820  |   constant[n].token="LO.thread_logging";
821  |   constant[n].deflt=DEFLT_THREAD_LOGGING;
822  |   constant[n].set_func=set_boolean;
823  |   constant[n].constant_ptr=Global_constants->thread_logging;
824  |   constant[n].show_func=show_boolean;
825  |   n++;
826  | 
827  |   constant[n].token="LO.thread_logfile";
828  |   constant[n].deflt=DEFLT_THREAD_LOGFILE;
829  |   constant[n].set_func=set_string;
830  |   constant[n].constant_ptr=Global_constants->thread_logfile;
831  |   constant[n].show_func=show_string;
832  |   n++;
833  | 
834  |   constant[n].token="LO.socket_logging";
835  |   constant[n].deflt=DEFLT_SOCKET_LOGGING;
836  |   constant[n].set_func=set_boolean;
837  |   constant[n].constant_ptr=Global_constants->socket_logging;
838  |   constant[n].show_func=show_boolean;
839  |   n++;
840  | 
841  |   constant[n].token="LO.socket_logfile";
842  |   constant[n].deflt=DEFLT_SOCKET_LOGFILE;
843  |   constant[n].set_func=set_string;
844  |   constant[n].constant_ptr=Global_constants->socket_logfile;
845  |   constant[n].show_func=show_string;
846  |   n++;
847  | 
848  |   constant[n].token="LO.config_logging";
849  |   constant[n].deflt=DEFLT_CONFIG_LOGGING;
850  |   constant[n].set_func=set_boolean;
851  |   constant[n].constant_ptr=Global_constants->config_logging;
852  |   constant[n].show_func=show_boolean;
853  |   n++;
854  | 
855  |   constant[n].token="LO.config_logfile";
856  |   constant[n].deflt=DEFLT_CONFIG_LOGFILE;
857  |   constant[n].set_func=set_string;
858  |   constant[n].constant_ptr=Global_constants->config_logfile;
859  |   constant[n].show_func=show_string;
860  |   n++;
861  | 
862  |   constant[n].token="MI.nrtm_host";
863  |   constant[n].deflt=DEFLT_NRTM_HOST;
864  |   constant[n].set_func=set_string;
865  |   constant[n].constant_ptr=Global_constants->nrtm_host;
866  |   constant[n].show_func=show_string;
867  |   n++;
868  | 
869  |   constant[n].token="MI.nrtm_port";
870  |   constant[n].deflt=DEFLT_MIRROR_PORT;
871  |   constant[n].set_func=set_string;
872  |   constant[n].constant_ptr=Global_constants->nrtm_port;
873  |   constant[n].show_func=show_string;
874  |   n++;
875  | 
876  |   constant[n].token="MI.nrtm_version";
877  |   constant[n].deflt=DEFLT_NRTM_VERSION;
878  |   constant[n].set_func=set_int;
879  |   constant[n].constant_ptr=Global_constants->nrtm_version;
880  |   constant[n].show_func=show_int;
881  |   n++;
882  | 
883  |   constant[n].token="MI.nrtm_delay";
884  |   constant[n].deflt=DEFLT_NRTM_DELAY;
885  |   constant[n].set_func=set_int;
886  |   constant[n].constant_ptr=Global_constants->nrtm_delay;
887  |   constant[n].show_func=show_int;
888  |   n++;
889  | 
890  |   constant[n].token="MI.nrtm_cserialfile";
891  |   constant[n].deflt=DEFLT_NRTM_CSERFILE;
892  |   constant[n].set_func=set_string;
893  |   constant[n].constant_ptr=Global_constants->nrtm_cserialfile;
894  |   constant[n].show_func=show_string;
895  |   n++;
896  | 
897  |   constant[n].token="MI.nrtm_logfile";
898  |   constant[n].deflt=DEFLT_NRTM_LOGFILE;
899  |   constant[n].set_func=set_string;
900  |   constant[n].constant_ptr=Global_constants->nrtm_logfile;
901  |   constant[n].show_func=show_string;
902  |   n++;
903  | 
904  |   constant[n].token="MI.do_nrtm";
905  |   constant[n].deflt="1";
906  |   constant[n].set_func=set_int;
907  |   constant[n].constant_ptr=Global_constants->do_nrtm;
908  |   constant[n].show_func=show_int;
909  |   n++;
910  | 
911  |   constant[n].token="UD.update_mode";
912  |   constant[n].deflt=DEFLT_UPDATE_MODE;
913  |   constant[n].set_func=set_int;
914  |   constant[n].constant_ptr=Global_constants->update_mode;
915  |   constant[n].show_func=show_int;
916  |   n++;
917  | 
918  |   constant[n].token="UD.do_update";
919  |   constant[n].deflt="1";
920  |   constant[n].set_func=set_int;
921  |   constant[n].constant_ptr=Global_constants->do_update;
922  |   constant[n].show_func=show_int;
923  |   n++;
924  |   
925  |   constant[n].token="CO.config_file";
926  |   constant[n].deflt=DEFLT_CONFIG_FILE;
927  |   constant[n].set_func=set_string;
928  |   constant[n].constant_ptr=Global_constants->config_file;
929  |   constant[n].show_func=show_string;
930  |   n++;
931  | 
932  |   constant[n].token=NULL;
933  | 
934  | } /* init_constants() */
935  | 
936  | 
937  | /* CO_to_string() */
938  | /*++++++++++++++++++++++++++++++++++++++
939  |   Returns the constants as a string.
940  | 
941  |   More:
942  |   +html+ <PRE>
943  |   Authors:
944  |         ottrey
945  | 
946  |   +html+ </PRE><DL COMPACT>
947  |   +html+ <DT>Online References:
948  |   +html+ <DD><UL>
949  |   +html+ </UL></DL>
950  | 
951  |   ++++++++++++++++++++++++++++++++++++++*/
952  | char *CO_to_string(void) {
953  |   char *consts;
954  |   const char *token;
955  |   char *value;
956  |   char tmp_consts[2048];
957  |   char tmp_const[1024];
958  |   int i=0;
959  | 
960  |   sprintf(tmp_consts, "Constants = { ");
961  |   while(constant[i].token != NULL) {
962  |     token = constant[i].token;
963  |     value = constant[i].show_func(constant[i].constant_ptr);
964  |     sprintf(tmp_const, "\n[%s]=\"%s\"", token, value);
965  |     wr_free(value); /* Otherwise we have memory leaks */
966  |     strcat(tmp_consts, tmp_const);
967  |     i++;
968  |   }
969  |   strcat(tmp_consts, "}");
970  | 
971  |   /* consts = calloc(1, strlen(tmp_consts)+1); */
972  |   dieif(  wr_malloc((void **)&consts, strlen(tmp_consts)+1) != UT_OK);
973  | 
974  |   strcpy(consts, tmp_consts);
975  | 
976  |   return consts;
977  | } /* CO_to_string() */
978  | 
979  | 
980  | char *CO_const_to_string(char *name) {
981  |   char *result=NULL;
982  |   int i;
983  |   
984  |   for (i=0; constant[i].token != NULL; i++) {
985  |     if (strcmp(constant[i].token, name) == 0) {
986  |       result = constant[i].show_func(constant[i].constant_ptr);
987  |       break;
988  |     }
989  |   }
990  | 
991  |   return result;
992  | } /* CO_const_to_string() */
993  | 
994  |  /* CO_set_const() */
995  | /*++++++++++++++++++++++++++++++++++++++
996  |   Sets the value of one constant.  Returns 0 if no error.
997  | 
998  |   More:
999  |   +html+ <PRE>
1000 |   Authors:
1001 |         ottrey
1002 | 
1003 |   +html+ </PRE><DL COMPACT>
1004 |   +html+ <DT>Online References:
1005 |   +html+ <DD><UL>
1006 |   +html+ </UL></DL>
1007 | 
1008 |   ++++++++++++++++++++++++++++++++++++++*/
1009 | int CO_set_const(char *name, char *value) {
1010 |   int result=1;
1011 |   int i;
1012 |   
1013 |   for (i=0; constant[i].token != NULL; i++) {
1014 |     if (strcmp(constant[i].token, name) == 0) {
1015 |       result = constant[i].set_func((void *)constant[i].constant_ptr, value);
1016 |       break;
1017 |     }
1018 |   }
1019 | 
1020 |   return result;
1021 | } /* CO_set_const() */
1022 | 
1023 | 
1024 | /* CO_set() */
1025 | /*++++++++++++++++++++++++++++++++++++++
1026 |   Sets the constants from the properties module.
1027 |   Returns the number of constants set.
1028 | 
1029 |   More:
1030 |   +html+ <PRE>
1031 |   Authors:
1032 |         ottrey
1033 |   +html+ </PRE><DL COMPACT>
1034 |   +html+ <DT>Online References:
1035 |   +html+ <DD><UL>
1036 |   +html+   <LI><A HREF="../src/.properties">.properties</A>
1037 |   +html+ </UL></DL>
1038 | 
1039 |   ++++++++++++++++++++++++++++++++++++++*/
1040 | char *CO_set(void) {
1041 |   int i;
1042 |   int set_count=0;
1043 |   int set;
1044 |   char result_buff[256];
1045 |   char *result;
1046 |   char *property;
1047 | 
1048 |   /* Initialize if necessary */
1049 |   if (Global_constants == NULL) {
1050 |     /*  Global_constants = (Constants)calloc(1, sizeof(struct _Constants)); */
1051 |     dieif( wr_calloc((void **)&Global_constants, 1, 
1052 | 		     sizeof(struct _Constants)) != UT_OK);  
1053 |     
1054 |     init_constants();
1055 |   }
1056 | 
1057 |   for (i=0; constant[i].token != NULL; i++) {
1058 |     property = PR_get_property(constant[i].token, constant[i].deflt);
1059 |     set = constant[i].set_func((void *)constant[i].constant_ptr, property);
1060 |     wr_free(property);
1061 |     if (set == 0) {
1062 |       set_count++;
1063 |     }
1064 |   }
1065 | 
1066 |   sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i);
1067 | 
1068 |   /* result = (char *)calloc(1, strlen(result_buff)+1); */
1069 |   dieif( wr_malloc((void **)&result, strlen(result_buff)+1) != UT_OK);  
1070 |   strcpy(result, result_buff);
1071 | 
1072 |   return result;
1073 | } /* CO_set() */
1074 |