Source File co/constants.c

    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  |