## modules/co/constants.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. set_string
2. set_int
3. set_boolean
4. show_string
5. show_int
6. show_boolean
7. CO_get_whois_port
8. CO_get_config_port
9. CO_get_mirror_port
10. CO_get_update_port
11. CO_get_authenticate
12. CO_get_whois_suspended
13. CO_get_welcome
14. CO_get_prompt
15. CO_get_clear_screen
16. CO_get_accounting
17. CO_get_config_file
18. CO_get_do_server
19. CO_get_do_update
20. init_constants
21. CO_to_string
22. CO_const_to_string
23. CO_set_const
24. CO_set

       1 /***************************************
       2   $Revision: 1.17 $
       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_WHOIS_PORT      "0"
      70 #define DEFLT_CONFIG_PORT     "0"
      71 #define DEFLT_MIRROR_PORT     "0"
      72 #define DEFLT_UPDATE_PORT     "0"
      73 #define DEFLT_AUTHENTICATE    "0"
      74 #define DEFLT_WHOIS_SUSPENDED "0"
      75 #define DEFLT_DO_SERVER       "1"
      76 #define DEFLT_WELCOME         "Welcome to the whois R.I.P. server.\n"
      77 #define DEFLT_PROMPT          "whois R.I.P. config> "
      78 #define DEFLT_CLEAR_SCREEN    "0"
      79 #define DEFLT_ACCOUNTING      "0"
      80 #define DEFLT_CONFIG_FILE     "rip.config"
      81
      82 /*+ Each constant has a +*/
      83 struct _constant {
      84   const char *token;              /*+ Token to be found in properties file. +*/
      85   const char *deflt;                    /*+ Default value for the constant. +*/
      86   int (*set_func)(void *, char *);        /*+ Function to set the constant. +*/
      87   void *constant_ptr;                     /*+ Pointer to the constant value +*/
      88   char *(*show_func)(void *);            /*+ Function to show the constant. +*/
      89 };
      90
      91
      92 /*+ The Constants array has a +*/
      93 typedef struct _Constants {
      94   char  whois_port[64];   /*+ Port for whois clients to rendezvous with. +*/
      95   char  config_port[64]; /*+ Port for config clients to rendezvous with. +*/
      96   char  mirror_port[64]; /*+ Port for mirror clients to rendezvous with. +*/
      97   char  update_port[64]; /*+ Port for DBupdate clients to rendezvous with. +*/
      98   int   authenticate[1];                         /*+ Authenticate users. +*/
      99   int   whois_suspended[1];                /*+ Suspend the whois server. +*/
     100   char  welcome[1024];                  /*+ Welcome for config protocol. +*/
     101   char  prompt[1024];                    /*+ Prompt for config protocol. +*/
     102   int   clear_screen[1];         /*+ Clear screen after config commands. +*/
     103   int   accounting[1];          /*+ Conduct accounting on whois queries. +*/
     104   char  config_file[1024];                   /*+ File for the config.    +*/
     105
     106   int   do_server[1]; /*+ turns off execution of the all servers(threads) +*/
     107   int   do_update[1]; /*+ switches on and off the updates +*/
     108
     109 } *Constants;
     110
     111 /*
     112  * Global Variables
     113  */
     114 /*+ The array of Global Constants. +*/
     115 static Constants  Global_constants=NULL;
     116
     117 /*
     118  * Set Functions
     119  */
     120 static int set_string(void *constant, char *value) {
         /* [<][>][^][v][top][bottom][index][help] */
     121
     122   strcpy((char *)constant, value);
     123
     124   return 0;
     125 } /* set_string() */
     126
     127 static int set_int(void *constant, char *value) {
         /* [<][>][^][v][top][bottom][index][help] */
     128   int i;
     129
     130   i = atol(value);
     131   ((int *)constant)[0] = i;
     132
     133   return 0;
     134 } /* set_int() */
     135
     136 static int set_boolean(void *constant, char *value) {
         /* [<][>][^][v][top][bottom][index][help] */
     137   int result=1;
     138   int i;
     139
     140   i = atol(value);
     141
     142   /* If a valid boolean */
     143   if ( (i == 0) || (i == 1)) {
     144     ((int *)constant)[0] = i;
     145     result = 0;
     146   }
     147
     148   return result;
     149 } /* set_boolean() */
     150
     151
     152 /*
     153  * Show Functions
     154  */
     155 /* AR. changed for unification with oter show funcs */
     156 static char *show_string(void *constant) {
         /* [<][>][^][v][top][bottom][index][help] */
     157   char *tmp;
     158
     159   /*  tmp = calloc(1, strlen((char *)constant)+1); */
     160   dieif( wr_malloc((void **)&tmp, strlen((char *)constant)+1) != UT_OK);
     161
     162   strcpy(tmp, (char *)constant);
     163 /*  return((char *)constant); */
     164   return tmp;
     165 } /* show_string() */
     166
     167 static char *show_int(void *constant) {
         /* [<][>][^][v][top][bottom][index][help] */
     168   char *tmp;
     169
     170   /* tmp = calloc(1, 64); */
     171   dieif( wr_malloc((void **)&tmp, 64) != UT_OK);
     172
     173   sprintf(tmp, "%d", ((int *)constant)[0]);
     174   return tmp;
     175 } /* show_int() */
     176
     177 static char *show_boolean(void *constant) {
         /* [<][>][^][v][top][bottom][index][help] */
     178   char *tmp;
     179
     180   /*  tmp = calloc(1, 64); */
     181   dieif( wr_malloc((void **)&tmp, 64) != UT_OK);
     182
     183   sprintf(tmp, "%d", ((int *)constant)[0]);
     184   return tmp;
     185 } /* show_boolean() */
     186
     187
     188 /*
     189  * Get Functions
     190  */
     191 char *CO_get_whois_port() {
         /* [<][>][^][v][top][bottom][index][help] */
     192   return Global_constants->whois_port;
     193 }
     194
     195 char *CO_get_config_port() {
         /* [<][>][^][v][top][bottom][index][help] */
     196   return Global_constants->config_port;
     197 }
     198
     199 char *CO_get_mirror_port() {
         /* [<][>][^][v][top][bottom][index][help] */
     200   return Global_constants->mirror_port;
     201 }
     202
     203 char *CO_get_update_port() {
         /* [<][>][^][v][top][bottom][index][help] */
     204   return Global_constants->update_port;
     205 }
     206
     207 int CO_get_authenticate() {
         /* [<][>][^][v][top][bottom][index][help] */
     208   return Global_constants->authenticate[0];
     209 }
     210
     211 int CO_get_whois_suspended() {
         /* [<][>][^][v][top][bottom][index][help] */
     212   return Global_constants->whois_suspended[0];
     213 }
     214
     215 char *CO_get_welcome() {
         /* [<][>][^][v][top][bottom][index][help] */
     216   return Global_constants->welcome;
     217 }
     218
     219 char *CO_get_prompt() {
         /* [<][>][^][v][top][bottom][index][help] */
     220   return Global_constants->prompt;
     221 }
     222
     223 int CO_get_clear_screen() {
         /* [<][>][^][v][top][bottom][index][help] */
     224   return Global_constants->clear_screen[0];
     225 }
     226
     227 int CO_get_accounting() {
         /* [<][>][^][v][top][bottom][index][help] */
     228   return Global_constants->accounting[0];
     229 }
     230
     231 char *CO_get_config_file() {
         /* [<][>][^][v][top][bottom][index][help] */
     232   return Global_constants->config_file;
     233 }
     234
     235
     236 int CO_get_do_server() {
         /* [<][>][^][v][top][bottom][index][help] */
     237   return Global_constants->do_server[0];
     238 }
     239
     240 int CO_get_do_update() {
         /* [<][>][^][v][top][bottom][index][help] */
     241   return Global_constants->do_update[0];
     242 }
     243
     244 /*+
     245  * Contains the constant definitions for the Token, set_function, show_function.
     246  * (See: _constant)
     247 +*/
     248 static struct _constant constant[MAX_CONSTS];
     249
     250 /* init_constants() */
     251 /*++++++++++++++++++++++++++++++++++++++
     252   Initialize all the constants.
     253
     254   More:
     255   +html+ <PRE>
     256   Authors:
     257         ottrey
     258
     259   +html+ </PRE><DL COMPACT>
     260   +html+ <DT>Online References:
     261   +html+ <DD><UL>
     262   +html+ </UL></DL>
     263
     264   ++++++++++++++++++++++++++++++++++++++*/
     265 static void init_constants(void) {
         /* [<][>][^][v][top][bottom][index][help] */
     266   int n=0;
     267
     268   constant[n].token="SV.whois_port";
     269   constant[n].deflt=DEFLT_WHOIS_PORT;
     270   constant[n].set_func=set_string;
     271   constant[n].constant_ptr=Global_constants->whois_port;
     272   constant[n].show_func=show_string;
     273   n++;
     274
     275   constant[n].token="SV.config_port";
     276   constant[n].deflt=DEFLT_CONFIG_PORT;
     277   constant[n].set_func=set_string;
     278   constant[n].constant_ptr=Global_constants->config_port;
     279   constant[n].show_func=show_string;
     280   n++;
     281
     282   constant[n].token="SV.mirror_port";
     283   constant[n].deflt=DEFLT_MIRROR_PORT;
     284   constant[n].set_func=set_string;
     285   constant[n].constant_ptr=Global_constants->mirror_port;
     286   constant[n].show_func=show_string;
     287   n++;
     288
     289   constant[n].token="SV.update_port";
     290   constant[n].deflt=DEFLT_UPDATE_PORT;
     291   constant[n].set_func=set_string;
     292   constant[n].constant_ptr=Global_constants->update_port;
     293   constant[n].show_func=show_string;
     294   n++;
     295   constant[n].token="SV.authenticate";
     296   constant[n].deflt=DEFLT_AUTHENTICATE;
     297   constant[n].set_func=set_boolean;
     298   constant[n].constant_ptr=Global_constants->authenticate;
     299   constant[n].show_func=show_boolean;
     300   n++;
     301
     302   constant[n].token="SV.whois_suspended";
     303   constant[n].deflt=DEFLT_WHOIS_SUSPENDED;
     304   constant[n].set_func=set_boolean;
     305   constant[n].constant_ptr=Global_constants->whois_suspended;
     306   constant[n].show_func=show_boolean;
     307   n++;
     308
     309   constant[n].token="SV.do_server";
     310   constant[n].deflt=DEFLT_DO_SERVER;
     311   constant[n].set_func=set_boolean;
     312   constant[n].constant_ptr=Global_constants->do_server;
     313   constant[n].show_func=show_boolean;
     314   n++;
     315
     316   constant[n].token="UD.do_update";
     317   constant[n].deflt="1";
     318   constant[n].set_func=set_int;
     319   constant[n].constant_ptr=Global_constants->do_update;
     320   constant[n].show_func=show_int;
     321   n++;
     322
     323   constant[n].token="PC.welcome";
     324   constant[n].deflt=DEFLT_WELCOME;
     325   constant[n].set_func=set_string;
     326   constant[n].constant_ptr=Global_constants->welcome;
     327   constant[n].show_func=show_string;
     328   n++;
     329
     330   constant[n].token="PC.prompt";
     331   constant[n].deflt=DEFLT_PROMPT;
     332   constant[n].set_func=set_string;
     333   constant[n].constant_ptr=Global_constants->prompt;
     334   constant[n].show_func=show_string;
     335   n++;
     336
     337   constant[n].token="PC.clear_screen";
     338   constant[n].deflt=DEFLT_CLEAR_SCREEN;
     339   constant[n].set_func=set_boolean;
     340   constant[n].constant_ptr=Global_constants->clear_screen;
     341   constant[n].show_func=show_boolean;
     342   n++;
     343
     344   constant[n].token="WQ.accounting";
     345   constant[n].deflt=DEFLT_ACCOUNTING;
     346   constant[n].set_func=set_boolean;
     347   constant[n].constant_ptr=Global_constants->accounting;
     348   constant[n].show_func=show_boolean;
     349   n++;
     350
     351
     352
     353   constant[n].token="CO.config_file";
     354   constant[n].deflt=DEFLT_CONFIG_FILE;
     355   constant[n].set_func=set_string;
     356   constant[n].constant_ptr=Global_constants->config_file;
     357   constant[n].show_func=show_string;
     358   n++;
     359
     360   constant[n].token=NULL;
     361
     362 } /* init_constants() */
     363
     364
     365 /* CO_to_string() */
     366 /*++++++++++++++++++++++++++++++++++++++
     367   Returns the constants as a string.
     368
     369   More:
     370   +html+ <PRE>
     371   Authors:
     372         ottrey
     373
     374   +html+ </PRE><DL COMPACT>
     375   +html+ <DT>Online References:
     376   +html+ <DD><UL>
     377   +html+ </UL></DL>
     378
     379   ++++++++++++++++++++++++++++++++++++++*/
     380 char *CO_to_string(void) {
         /* [<][>][^][v][top][bottom][index][help] */
     381   char *consts;
     382   const char *token;
     383   char *value;
     384   char tmp_consts[2048];
     385   char tmp_const[1024];
     386   int i=0;
     387
     388   sprintf(tmp_consts, "Constants = { ");
     389   while(constant[i].token != NULL) {
     390     token = constant[i].token;
     391     value = constant[i].show_func(constant[i].constant_ptr);
     392     sprintf(tmp_const, "\n[%s]=\"%s\"", token, value);
     393     wr_free(value); /* Otherwise we have memory leaks */
     394     strcat(tmp_consts, tmp_const);
     395     i++;
     396   }
     397   strcat(tmp_consts, "}");
     398
     399   /* consts = calloc(1, strlen(tmp_consts)+1); */
     400   dieif(  wr_malloc((void **)&consts, strlen(tmp_consts)+1) != UT_OK);
     401
     402   strcpy(consts, tmp_consts);
     403
     404   return consts;
     405 } /* CO_to_string() */
     406
     407
     408 char *CO_const_to_string(char *name) {
         /* [<][>][^][v][top][bottom][index][help] */
     409   char *result=NULL;
     410   int i;
     411
     412   for (i=0; constant[i].token != NULL; i++) {
     413     if (strcmp(constant[i].token, name) == 0) {
     414       result = constant[i].show_func(constant[i].constant_ptr);
     415       break;
     416     }
     417   }
     418
     419   return result;
     420 } /* CO_const_to_string() */
     421
     422  /* CO_set_const() */
     423 /*++++++++++++++++++++++++++++++++++++++
     424   Sets the value of one constant.  Returns 0 if no error.
     425
     426   More:
     427   +html+ <PRE>
     428   Authors:
     429         ottrey
     430
     431   +html+ </PRE><DL COMPACT>
     432   +html+ <DT>Online References:
     433   +html+ <DD><UL>
     434   +html+ </UL></DL>
     435
     436   ++++++++++++++++++++++++++++++++++++++*/
     437 int CO_set_const(char *name, char *value) {
         /* [<][>][^][v][top][bottom][index][help] */
     438   int result=1;
     439   int i;
     440
     441   for (i=0; constant[i].token != NULL; i++) {
     442     if (strcmp(constant[i].token, name) == 0) {
     443       result = constant[i].set_func((void *)constant[i].constant_ptr, value);
     444       break;
     445     }
     446   }
     447
     448   return result;
     449 } /* CO_set_const() */
     450
     451
     452 /* CO_set() */
     453 /*++++++++++++++++++++++++++++++++++++++
     454   Sets the constants from the properties module.
     455   Returns the number of constants set.
     456
     457   More:
     458   +html+ <PRE>
     459   Authors:
     460         ottrey
     461   +html+ </PRE><DL COMPACT>
     462   +html+ <DT>Online References:
     463   +html+ <DD><UL>
     464   +html+   <LI><A HREF="../src/.properties">.properties</A>
     465   +html+ </UL></DL>
     466
     467   ++++++++++++++++++++++++++++++++++++++*/
     468 char *CO_set(void) {
         /* [<][>][^][v][top][bottom][index][help] */
     469   int i;
     470   int set_count=0;
     471   int set;
     472   char result_buff[256];
     473   char *result;
     474   char *property;
     475
     476   /* Initialize if necessary */
     477   if (Global_constants == NULL) {
     478     /*  Global_constants = (Constants)calloc(1, sizeof(struct _Constants)); */
     479     dieif( wr_calloc((void **)&Global_constants, 1,
     480                      sizeof(struct _Constants)) != UT_OK);
     481
     482     init_constants();
     483   }
     484
     485   for (i=0; constant[i].token != NULL; i++) {
     486     property = PR_get_property(constant[i].token, constant[i].deflt);
     487     set = constant[i].set_func((void *)constant[i].constant_ptr, property);
     488     wr_free(property);
     489     if (set == 0) {
     490       set_count++;
     491     }
     492   }
     493
     494   sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i);
     495
     496   /* result = (char *)calloc(1, strlen(result_buff)+1); */
     497   dieif( wr_malloc((void **)&result, strlen(result_buff)+1) != UT_OK);
     498   strcpy(result, result_buff);
     499
     500   return result;
     501 } /* CO_set() */
     502

/* [<][>][^][v][top][bottom][index][help] */