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_authenticate
  8. CO_get_whois_suspended
  9. CO_get_welcome
  10. CO_get_prompt
  11. CO_get_clear_screen
  12. CO_get_accounting
  13. CO_get_do_server
  14. CO_get_do_update
  15. init_constants
  16. CO_to_string
  17. CO_const_to_string
  18. CO_set_const
  19. CO_set

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

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