1 | /*************************************** 2 | $Revision: 1.8 $ 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 "properties.h" 60 | 61 | /*+ Maximum number of constants. +*/ 62 | #define MAX_CONSTS 100 63 | 64 | /*+ Default values for constants. +*/ 65 | #define DEFLT_MAX_THREADS "10" 66 | #define DEFLT_WHOIS_PORT "0" 67 | #define DEFLT_CONFIG_PORT "0" 68 | #define DEFLT_MIRROR_PORT "0" 69 | #define DEFLT_HOST "mysql.database.net" 70 | #define DEFLT_USER "xxx" 71 | #define DEFLT_PASSWORD "xxx" 72 | #define DEFLT_DATABASE_PORT "3306" 73 | #define DEFLT_DATABASE "RIPE" 74 | #define DEFLT_QUERY "SHOW TABLES" 75 | #define DEFLT_IN_QUERY "SELECT * FROM inetnum" 76 | #define DEFLT_RT_QUERY "SELECT * FROM route" 77 | #define DEFLT_AUTHENTICATE "0" 78 | #define DEFLT_WHOIS_SUSPENDED "0" 79 | #define DEFLT_WELCOME "Welcome to the whois R.I.P. server.\n" 80 | #define DEFLT_PROMPT "whois R.I.P. config> " 81 | #define DEFLT_CLEAR_SCREEN "0" 82 | #define DEFLT_SLEEP_TIME "1" 83 | #define DEFLT_ACCOUNTING "0" 84 | #define DEFLT_QUERY_LOGGING "1" 85 | #define DEFLT_QUERY_LOGFILE "stdout" 86 | #define DEFLT_INSTR_LOGGING "1" 87 | #define DEFLT_INSTR_LOGFILE "stdout" 88 | #define DEFLT_COMND_LOGGING "1" 89 | #define DEFLT_COMND_LOGFILE "stdout" 90 | #define DEFLT_TESTS_LOGGING "1" 91 | #define DEFLT_TESTS_LOGFILE "stdout" 92 | #define DEFLT_THREAD_LOGGING "1" 93 | #define DEFLT_THREAD_LOGFILE "stdout" 94 | #define DEFLT_SOCKET_LOGGING "1" 95 | #define DEFLT_SOCKET_LOGFILE "stdout" 96 | #define DEFLT_CONFIG_LOGGING "1" 97 | #define DEFLT_CONFIG_LOGFILE "stdout" 98 | 99 | 100 | /*+ Each constant has a +*/ 101 | struct _constant { 102 | const char *token; /*+ Token to be found in properties file. +*/ 103 | const char *deflt; /*+ Default value for the constant. +*/ 104 | int (*set_func)(void *, char *); /*+ Function to set the constant. +*/ 105 | void *constant_ptr; /*+ Pointer to the constant value +*/ 106 | char *(*show_func)(void *); /*+ Function to show the constant. +*/ 107 | }; 108 | 109 | 110 | /*+ The Constants array has a +*/ 111 | typedef struct _Constants { 112 | int max_threads[1]; /*+ Maximum number of server threads. +*/ 113 | char whois_port[64]; /*+ Port for whois clients to rendezvous with. +*/ 114 | char config_port[64]; /*+ Port for config clients to rendezvous with. +*/ 115 | char mirror_port[64]; /*+ Port for mirror clients to rendezvous with. +*/ 116 | char host[64]; /*+ Host for the database. +*/ 117 | char user[64]; /*+ User for the database. +*/ 118 | char password[64]; /*+ Password for the database. +*/ 119 | int database_port[1]; /*+ Port for the database. +*/ 120 | char database[64]; /*+ Database name. +*/ 121 | char query[1024]; /*+ Query for the database. +*/ 122 | char in_query[1024]; /*+ Query for the radix tree initialization. +*/ 123 | char rt_query[1024]; /*+ Query for the radix tree initialization. +*/ 124 | int authenticate[1]; /*+ Authenticate users. +*/ 125 | int whois_suspended[1]; /*+ Suspend the whois server. +*/ 126 | char welcome[1024]; /*+ Welcome for config protocol. +*/ 127 | char prompt[1024]; /*+ Prompt for config protocol. +*/ 128 | int clear_screen[1]; /*+ Clear screen after config commands. +*/ 129 | int sleep_time[1]; /*+ Sleep time (in sec) between config commands. +*/ 130 | int accounting[1]; /*+ Conduct accounting on whois queries. +*/ 131 | int query_logging[1]; /*+ Log the SQL queries. +*/ 132 | char query_logfile[1024]; /*+ Query logfile for the database. +*/ 133 | int instr_logging[1]; /*+ Log the whois instrucs. +*/ 134 | char instr_logfile[1024]; /*+ Query logfile for the whois instrucs. +*/ 135 | int comnd_logging[1]; /*+ Log the whois commands. +*/ 136 | char comnd_logfile[1024]; /*+ Query logfile for the whois commands. +*/ 137 | int tests_logging[1]; /*+ Log the whois tests. +*/ 138 | char tests_logfile[1024]; /*+ Query logfile for the whois tests. +*/ 139 | int thread_logging[1]; /*+ Log the whois threads. +*/ 140 | char thread_logfile[1024]; /*+ Query logfile for the whois threads. +*/ 141 | int socket_logging[1]; /*+ Log the socket. +*/ 142 | char socket_logfile[1024]; /*+ Logfile for the socket. +*/ 143 | int config_logging[1]; /*+ Log the config. +*/ 144 | char config_logfile[1024]; /*+ Logfile for the config. +*/ 145 | } *Constants; 146 | 147 | 148 | /* 149 | * Global Variables 150 | */ 151 | /*+ The array of Global Constants. +*/ 152 | static Constants Global_constants=NULL; 153 | 154 | /* 155 | * Set Functions 156 | */ 157 | static int set_string(void *constant, char *value) { 158 | 159 | strcpy((char *)constant, value); 160 | 161 | return 0; 162 | } /* set_string() */ 163 | 164 | static int set_int(void *constant, char *value) { 165 | int i; 166 | 167 | i = atol(value); 168 | ((int *)constant)[0] = i; 169 | 170 | return 0; 171 | } /* set_int() */ 172 | 173 | static int set_boolean(void *constant, char *value) { 174 | int result=1; 175 | int i; 176 | 177 | i = atol(value); 178 | 179 | /* If a valid boolean */ 180 | if ( (i == 0) || (i == 1)) { 181 | ((int *)constant)[0] = i; 182 | result = 0; 183 | } 184 | 185 | return result; 186 | } /* set_boolean() */ 187 | 188 | 189 | /* 190 | * Show Functions 191 | */ 192 | static char *show_string(void *constant) { 193 | return((char *)constant); 194 | } /* show_string() */ 195 | 196 | static char *show_int(void *constant) { 197 | char *tmp; 198 | 199 | tmp = calloc(1, 64); 200 | sprintf(tmp, "%d", ((int *)constant)[0]); 201 | return tmp; 202 | } /* show_int() */ 203 | 204 | static char *show_boolean(void *constant) { 205 | char *tmp; 206 | 207 | tmp = calloc(1, 64); 208 | sprintf(tmp, "%d", ((int *)constant)[0]); 209 | return tmp; 210 | } /* show_boolean() */ 211 | 212 | 213 | /* 214 | * Get Functions 215 | */ 216 | int CO_get_max_threads() { 217 | return Global_constants->max_threads[0]; 218 | } 219 | 220 | const char *CO_get_whois_port() { 221 | return Global_constants->whois_port; 222 | } 223 | 224 | const char *CO_get_config_port() { 225 | return Global_constants->config_port; 226 | } 227 | 228 | const char *CO_get_mirror_port() { 229 | return Global_constants->mirror_port; 230 | } 231 | 232 | const char *CO_get_host() { 233 | return Global_constants->host; 234 | } 235 | 236 | const char *CO_get_user() { 237 | return Global_constants->user; 238 | } 239 | 240 | const char *CO_get_password() { 241 | return Global_constants->password; 242 | } 243 | 244 | int CO_get_database_port() { 245 | return Global_constants->database_port[0]; 246 | } 247 | 248 | const char *CO_get_database() { 249 | return Global_constants->database; 250 | } 251 | 252 | const char *CO_get_query() { 253 | return Global_constants->query; 254 | } 255 | 256 | const char *CO_get_in_query() { 257 | return Global_constants->in_query; 258 | } 259 | 260 | const char *CO_get_rt_query() { 261 | return Global_constants->rt_query; 262 | } 263 | 264 | int CO_get_authenticate() { 265 | return Global_constants->authenticate[0]; 266 | } 267 | 268 | int CO_get_whois_suspended() { 269 | return Global_constants->whois_suspended[0]; 270 | } 271 | 272 | const char *CO_get_welcome() { 273 | return Global_constants->welcome; 274 | } 275 | 276 | const char *CO_get_prompt() { 277 | return Global_constants->prompt; 278 | } 279 | 280 | int CO_get_clear_screen() { 281 | return Global_constants->clear_screen[0]; 282 | } 283 | 284 | int CO_get_sleep_time() { 285 | return Global_constants->sleep_time[0]; 286 | } 287 | 288 | int CO_get_accounting() { 289 | return Global_constants->accounting[0]; 290 | } 291 | 292 | int CO_get_query_logging() { 293 | return Global_constants->query_logging[0]; 294 | } 295 | 296 | const char *CO_get_query_logfile() { 297 | return Global_constants->query_logfile; 298 | } 299 | 300 | int CO_get_instr_logging() { 301 | return Global_constants->instr_logging[0]; 302 | } 303 | 304 | const char *CO_get_instr_logfile() { 305 | return Global_constants->instr_logfile; 306 | } 307 | 308 | int CO_get_comnd_logging() { 309 | return Global_constants->comnd_logging[0]; 310 | } 311 | 312 | const char *CO_get_comnd_logfile() { 313 | return Global_constants->comnd_logfile; 314 | } 315 | 316 | int CO_get_tests_logging() { 317 | return Global_constants->tests_logging[0]; 318 | } 319 | 320 | const char *CO_get_tests_logfile() { 321 | return Global_constants->tests_logfile; 322 | } 323 | 324 | int CO_get_thread_logging() { 325 | return Global_constants->thread_logging[0]; 326 | } 327 | 328 | const char *CO_get_thread_logfile() { 329 | return Global_constants->thread_logfile; 330 | } 331 | 332 | int CO_get_socket_logging() { 333 | return Global_constants->socket_logging[0]; 334 | } 335 | 336 | const char *CO_get_socket_logfile() { 337 | return Global_constants->socket_logfile; 338 | } 339 | 340 | int CO_get_config_logging() { 341 | return Global_constants->config_logging[0]; 342 | } 343 | 344 | const char *CO_get_config_logfile() { 345 | return Global_constants->config_logfile; 346 | } 347 | 348 | 349 | /*+ 350 | * Contains the constant definitions for the Token, set_function, show_function. 351 | * (See: _constant) 352 | +*/ 353 | static struct _constant constant[MAX_CONSTS]; 354 | 355 | /* init_constants() */ 356 | /*++++++++++++++++++++++++++++++++++++++ 357 | Initialize all the constants. 358 | 359 | More: 360 | +html+ <PRE> 361 | Authors: 362 | ottrey 363 | 364 | +html+ </PRE><DL COMPACT> 365 | +html+ <DT>Online References: 366 | +html+ <DD><UL> 367 | +html+ </UL></DL> 368 | 369 | ++++++++++++++++++++++++++++++++++++++*/ 370 | static void init_constants(void) { 371 | int n=0; 372 | 373 | constant[n].token="SV.max_threads"; 374 | constant[n].deflt=DEFLT_MAX_THREADS; 375 | constant[n].set_func=set_int; 376 | constant[n].constant_ptr=Global_constants->max_threads; 377 | constant[n].show_func=show_int; 378 | n++; 379 | 380 | constant[n].token="SV.whois_port"; 381 | constant[n].deflt=DEFLT_WHOIS_PORT; 382 | constant[n].set_func=set_string; 383 | constant[n].constant_ptr=Global_constants->whois_port; 384 | constant[n].show_func=show_string; 385 | n++; 386 | 387 | constant[n].token="SV.config_port"; 388 | constant[n].deflt=DEFLT_CONFIG_PORT; 389 | constant[n].set_func=set_string; 390 | constant[n].constant_ptr=Global_constants->config_port; 391 | constant[n].show_func=show_string; 392 | n++; 393 | 394 | constant[n].token="SV.mirror_port"; 395 | constant[n].deflt=DEFLT_MIRROR_PORT; 396 | constant[n].set_func=set_string; 397 | constant[n].constant_ptr=Global_constants->mirror_port; 398 | constant[n].show_func=show_string; 399 | n++; 400 | 401 | constant[n].token="DB.host"; 402 | constant[n].deflt=DEFLT_HOST; 403 | constant[n].set_func=set_string; 404 | constant[n].constant_ptr=Global_constants->host; 405 | constant[n].show_func=show_string; 406 | n++; 407 | 408 | constant[n].token="DB.user"; 409 | constant[n].deflt=DEFLT_USER; 410 | constant[n].set_func=set_string; 411 | constant[n].constant_ptr=Global_constants->user; 412 | constant[n].show_func=show_string; 413 | n++; 414 | 415 | constant[n].token="DB.password"; 416 | constant[n].deflt=DEFLT_PASSWORD; 417 | constant[n].set_func=set_string; 418 | constant[n].constant_ptr=Global_constants->password; 419 | constant[n].show_func=show_string; 420 | n++; 421 | 422 | constant[n].token="DB.database_port"; 423 | constant[n].deflt=DEFLT_DATABASE_PORT; 424 | constant[n].set_func=set_int; 425 | constant[n].constant_ptr=Global_constants->database_port; 426 | constant[n].show_func=show_int; 427 | n++; 428 | 429 | constant[n].token="DB.database"; 430 | constant[n].deflt=DEFLT_DATABASE; 431 | constant[n].set_func=set_string; 432 | constant[n].constant_ptr=Global_constants->database; 433 | constant[n].show_func=show_string; 434 | n++; 435 | 436 | constant[n].token="DB.query"; 437 | constant[n].deflt=DEFLT_QUERY; 438 | constant[n].set_func=set_string; 439 | constant[n].constant_ptr=Global_constants->query; 440 | constant[n].show_func=show_string; 441 | n++; 442 | 443 | constant[n].token="RX.in_query"; 444 | constant[n].deflt=DEFLT_IN_QUERY; 445 | constant[n].set_func=set_string; 446 | constant[n].constant_ptr=Global_constants->in_query; 447 | constant[n].show_func=show_string; 448 | n++; 449 | 450 | constant[n].token="RX.rt_query"; 451 | constant[n].deflt=DEFLT_RT_QUERY; 452 | constant[n].set_func=set_string; 453 | constant[n].constant_ptr=Global_constants->rt_query; 454 | constant[n].show_func=show_string; 455 | n++; 456 | 457 | constant[n].token="SV.authenticate"; 458 | constant[n].deflt=DEFLT_AUTHENTICATE; 459 | constant[n].set_func=set_boolean; 460 | constant[n].constant_ptr=Global_constants->authenticate; 461 | constant[n].show_func=show_boolean; 462 | n++; 463 | 464 | constant[n].token="SV.whois_suspended"; 465 | constant[n].deflt=DEFLT_WHOIS_SUSPENDED; 466 | constant[n].set_func=set_boolean; 467 | constant[n].constant_ptr=Global_constants->whois_suspended; 468 | constant[n].show_func=show_boolean; 469 | n++; 470 | 471 | constant[n].token="PC.welcome"; 472 | constant[n].deflt=DEFLT_WELCOME; 473 | constant[n].set_func=set_string; 474 | constant[n].constant_ptr=Global_constants->welcome; 475 | constant[n].show_func=show_string; 476 | n++; 477 | 478 | constant[n].token="PC.prompt"; 479 | constant[n].deflt=DEFLT_PROMPT; 480 | constant[n].set_func=set_string; 481 | constant[n].constant_ptr=Global_constants->prompt; 482 | constant[n].show_func=show_string; 483 | n++; 484 | 485 | constant[n].token="PC.clear_screen"; 486 | constant[n].deflt=DEFLT_CLEAR_SCREEN; 487 | constant[n].set_func=set_boolean; 488 | constant[n].constant_ptr=Global_constants->clear_screen; 489 | constant[n].show_func=show_boolean; 490 | n++; 491 | 492 | constant[n].token="PC.sleep_time"; 493 | constant[n].deflt=DEFLT_SLEEP_TIME; 494 | constant[n].set_func=set_int; 495 | constant[n].constant_ptr=Global_constants->sleep_time; 496 | constant[n].show_func=show_int; 497 | n++; 498 | 499 | constant[n].token="WQ.accounting"; 500 | constant[n].deflt=DEFLT_ACCOUNTING; 501 | constant[n].set_func=set_boolean; 502 | constant[n].constant_ptr=Global_constants->accounting; 503 | constant[n].show_func=show_boolean; 504 | n++; 505 | 506 | constant[n].token="LO.query_logging"; 507 | constant[n].deflt=DEFLT_QUERY_LOGGING; 508 | constant[n].set_func=set_boolean; 509 | constant[n].constant_ptr=Global_constants->query_logging; 510 | constant[n].show_func=show_boolean; 511 | n++; 512 | 513 | constant[n].token="LO.query_logfile"; 514 | constant[n].deflt=DEFLT_QUERY_LOGFILE; 515 | constant[n].set_func=set_string; 516 | constant[n].constant_ptr=Global_constants->query_logfile; 517 | constant[n].show_func=show_string; 518 | n++; 519 | 520 | constant[n].token="LO.instr_logging"; 521 | constant[n].deflt=DEFLT_INSTR_LOGGING; 522 | constant[n].set_func=set_boolean; 523 | constant[n].constant_ptr=Global_constants->instr_logging; 524 | constant[n].show_func=show_boolean; 525 | n++; 526 | 527 | constant[n].token="LO.insrt_logfile"; 528 | constant[n].deflt=DEFLT_INSTR_LOGFILE; 529 | constant[n].set_func=set_string; 530 | constant[n].constant_ptr=Global_constants->instr_logfile; 531 | constant[n].show_func=show_string; 532 | n++; 533 | 534 | constant[n].token="LO.comnd_logging"; 535 | constant[n].deflt=DEFLT_COMND_LOGGING; 536 | constant[n].set_func=set_boolean; 537 | constant[n].constant_ptr=Global_constants->comnd_logging; 538 | constant[n].show_func=show_boolean; 539 | n++; 540 | 541 | constant[n].token="LO.comnd_logfile"; 542 | constant[n].deflt=DEFLT_COMND_LOGFILE; 543 | constant[n].set_func=set_string; 544 | constant[n].constant_ptr=Global_constants->comnd_logfile; 545 | constant[n].show_func=show_string; 546 | n++; 547 | 548 | constant[n].token="LO.tests_logging"; 549 | constant[n].deflt=DEFLT_TESTS_LOGGING; 550 | constant[n].set_func=set_boolean; 551 | constant[n].constant_ptr=Global_constants->tests_logging; 552 | constant[n].show_func=show_boolean; 553 | n++; 554 | 555 | constant[n].token="LO.tests_logfile"; 556 | constant[n].deflt=DEFLT_TESTS_LOGFILE; 557 | constant[n].set_func=set_string; 558 | constant[n].constant_ptr=Global_constants->tests_logfile; 559 | constant[n].show_func=show_string; 560 | n++; 561 | 562 | constant[n].token="LO.thread_logging"; 563 | constant[n].deflt=DEFLT_THREAD_LOGGING; 564 | constant[n].set_func=set_boolean; 565 | constant[n].constant_ptr=Global_constants->thread_logging; 566 | constant[n].show_func=show_boolean; 567 | n++; 568 | 569 | constant[n].token="LO.thread_logfile"; 570 | constant[n].deflt=DEFLT_THREAD_LOGFILE; 571 | constant[n].set_func=set_string; 572 | constant[n].constant_ptr=Global_constants->thread_logfile; 573 | constant[n].show_func=show_string; 574 | n++; 575 | 576 | constant[n].token="LO.socket_logging"; 577 | constant[n].deflt=DEFLT_SOCKET_LOGGING; 578 | constant[n].set_func=set_boolean; 579 | constant[n].constant_ptr=Global_constants->socket_logging; 580 | constant[n].show_func=show_boolean; 581 | n++; 582 | 583 | constant[n].token="LO.socket_logfile"; 584 | constant[n].deflt=DEFLT_SOCKET_LOGFILE; 585 | constant[n].set_func=set_string; 586 | constant[n].constant_ptr=Global_constants->socket_logfile; 587 | constant[n].show_func=show_string; 588 | n++; 589 | 590 | constant[n].token="LO.config_logging"; 591 | constant[n].deflt=DEFLT_CONFIG_LOGGING; 592 | constant[n].set_func=set_boolean; 593 | constant[n].constant_ptr=Global_constants->config_logging; 594 | constant[n].show_func=show_boolean; 595 | n++; 596 | 597 | constant[n].token="LO.config_logfile"; 598 | constant[n].deflt=DEFLT_CONFIG_LOGFILE; 599 | constant[n].set_func=set_string; 600 | constant[n].constant_ptr=Global_constants->config_logfile; 601 | constant[n].show_func=show_string; 602 | n++; 603 | 604 | constant[n].token=NULL; 605 | 606 | } /* init_constants() */ 607 | 608 | 609 | /* CO_to_string() */ 610 | /*++++++++++++++++++++++++++++++++++++++ 611 | Returns the constants as a string. 612 | 613 | More: 614 | +html+ <PRE> 615 | Authors: 616 | ottrey 617 | 618 | +html+ </PRE><DL COMPACT> 619 | +html+ <DT>Online References: 620 | +html+ <DD><UL> 621 | +html+ </UL></DL> 622 | 623 | ++++++++++++++++++++++++++++++++++++++*/ 624 | char *CO_to_string(void) { 625 | char *consts; 626 | const char *token; 627 | char *value; 628 | char tmp_consts[1024]; 629 | char tmp_const[128]; 630 | int i=0; 631 | 632 | sprintf(tmp_consts, "Constants = { "); 633 | while(constant[i].token != NULL) { 634 | token = constant[i].token; 635 | value = constant[i].show_func(constant[i].constant_ptr); 636 | sprintf(tmp_const, "\n[%s]=\"%s\"", token, value); 637 | strcat(tmp_consts, tmp_const); 638 | i++; 639 | } 640 | strcat(tmp_consts, "}"); 641 | 642 | consts = calloc(1, strlen(tmp_consts)+1); 643 | strcpy(consts, tmp_consts); 644 | 645 | return consts; 646 | } /* CO_to_string() */ 647 | 648 | 649 | char *CO_const_to_string(char *name) { 650 | char *result=NULL; 651 | int i; 652 | 653 | for (i=0; constant[i].token != NULL; i++) { 654 | if (strcmp(constant[i].token, name) == 0) { 655 | result = constant[i].show_func(constant[i].constant_ptr); 656 | break; 657 | } 658 | } 659 | 660 | return result; 661 | } /* CO_const_to_string() */ 662 | 663 | /* CO_set_const() */ 664 | /*++++++++++++++++++++++++++++++++++++++ 665 | Sets the value of one constant. Returns 0 if no error. 666 | 667 | More: 668 | +html+ <PRE> 669 | Authors: 670 | ottrey 671 | 672 | +html+ </PRE><DL COMPACT> 673 | +html+ <DT>Online References: 674 | +html+ <DD><UL> 675 | +html+ </UL></DL> 676 | 677 | ++++++++++++++++++++++++++++++++++++++*/ 678 | int CO_set_const(char *name, char *value) { 679 | int result=1; 680 | int i; 681 | 682 | for (i=0; constant[i].token != NULL; i++) { 683 | if (strcmp(constant[i].token, name) == 0) { 684 | result = constant[i].set_func((void *)constant[i].constant_ptr, value); 685 | break; 686 | } 687 | } 688 | 689 | return result; 690 | } /* CO_set_const() */ 691 | 692 | 693 | /* CO_set() */ 694 | /*++++++++++++++++++++++++++++++++++++++ 695 | Sets the constants from the properties module. 696 | Returns the number of constants set. 697 | 698 | More: 699 | +html+ <PRE> 700 | Authors: 701 | ottrey 702 | +html+ </PRE><DL COMPACT> 703 | +html+ <DT>Online References: 704 | +html+ <DD><UL> 705 | +html+ <LI><A HREF="../src/.properties">.properties</A> 706 | +html+ </UL></DL> 707 | 708 | ++++++++++++++++++++++++++++++++++++++*/ 709 | char *CO_set(void) { 710 | int i; 711 | int set_count=0; 712 | int set; 713 | char result_buff[256]; 714 | char *result; 715 | char *property; 716 | 717 | /* Initialize if necessary */ 718 | if (Global_constants == NULL) { 719 | Global_constants = (Constants)calloc(1, sizeof(struct _Constants)); 720 | init_constants(); 721 | } 722 | 723 | for (i=0; constant[i].token != NULL; i++) { 724 | property = PR_get_property(constant[i].token, constant[i].deflt); 725 | set = constant[i].set_func((void *)constant[i].constant_ptr, property); 726 | if (set == 0) { 727 | set_count++; 728 | } 729 | } 730 | 731 | sprintf(result_buff, "%d out of %d constant(s) set.", set_count, i); 732 | 733 | result = (char *)calloc(1, strlen(result_buff)+1); 734 | strcpy(result, result_buff); 735 | 736 | return result; 737 | } /* CO_set() */ 738 |