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 |