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) { 121 | 122 | strcpy((char *)constant, value); 123 | 124 | return 0; 125 | } /* set_string() */ 126 | 127 | static int set_int(void *constant, char *value) { 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) { 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) { 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) { 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) { 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() { 192 | return Global_constants->whois_port; 193 | } 194 | 195 | char *CO_get_config_port() { 196 | return Global_constants->config_port; 197 | } 198 | 199 | char *CO_get_mirror_port() { 200 | return Global_constants->mirror_port; 201 | } 202 | 203 | char *CO_get_update_port() { 204 | return Global_constants->update_port; 205 | } 206 | 207 | int CO_get_authenticate() { 208 | return Global_constants->authenticate[0]; 209 | } 210 | 211 | int CO_get_whois_suspended() { 212 | return Global_constants->whois_suspended[0]; 213 | } 214 | 215 | char *CO_get_welcome() { 216 | return Global_constants->welcome; 217 | } 218 | 219 | char *CO_get_prompt() { 220 | return Global_constants->prompt; 221 | } 222 | 223 | int CO_get_clear_screen() { 224 | return Global_constants->clear_screen[0]; 225 | } 226 | 227 | int CO_get_accounting() { 228 | return Global_constants->accounting[0]; 229 | } 230 | 231 | char *CO_get_config_file() { 232 | return Global_constants->config_file; 233 | } 234 | 235 | 236 | int CO_get_do_server() { 237 | return Global_constants->do_server[0]; 238 | } 239 | 240 | int CO_get_do_update() { 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) { 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) { 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) { 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) { 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) { 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 |