diff options
| -rw-r--r-- | lib/libtinytac/lmemory.c | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/lib/libtinytac/lmemory.c b/lib/libtinytac/lmemory.c index ae35759..f5dc85b 100644 --- a/lib/libtinytac/lmemory.c +++ b/lib/libtinytac/lmemory.c | |||
| @@ -186,6 +186,8 @@ tinytac_get_option( | |||
| 186 | int rc; | 186 | int rc; |
| 187 | const char * str; | 187 | const char * str; |
| 188 | unsigned * optsp; | 188 | unsigned * optsp; |
| 189 | void * ptr; | ||
| 190 | size_t pos; | ||
| 189 | 191 | ||
| 190 | TinyTacDebugTrace(); | 192 | TinyTacDebugTrace(); |
| 191 | 193 | ||
| @@ -260,6 +262,55 @@ tinytac_get_option( | |||
| 260 | return(TTAC_ENOMEM); | 262 | return(TTAC_ENOMEM); |
| 261 | return(TTAC_SUCCESS); | 263 | return(TTAC_SUCCESS); |
| 262 | 264 | ||
| 265 | case TTAC_OPT_IPV4: | ||
| 266 | optsp = ((tt)) ? &tt->opts : &tinytac_dflt.opts; | ||
| 267 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_IPV4, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 268 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %s", ((*optsp & TTAC_OPT_IPV4)) ? "TTAC_YES" : "TTAC_NO"); | ||
| 269 | *((int *)outvalue) = ((*optsp & TTAC_OPT_IPV4)) ? TTAC_YES : TTAC_NO; | ||
| 270 | return(TTAC_SUCCESS); | ||
| 271 | |||
| 272 | case TTAC_OPT_IPV6: | ||
| 273 | optsp = ((tt)) ? &tt->opts : &tinytac_dflt.opts; | ||
| 274 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_IPV6, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 275 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %s", ((*optsp & TTAC_OPT_IPV6)) ? "TTAC_YES" : "TTAC_NO"); | ||
| 276 | *((int *)outvalue) = ((*optsp & TTAC_OPT_IPV6)) ? TTAC_YES : TTAC_NO; | ||
| 277 | return(TTAC_SUCCESS); | ||
| 278 | |||
| 279 | case TTAC_OPT_KEY: | ||
| 280 | tt = ((tt)) ? tt : &tinytac_dflt; | ||
| 281 | *((char **)outvalue) = NULL; | ||
| 282 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_KEY, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 283 | if (!(tt->keys)) | ||
| 284 | return(TTAC_SUCCESS); | ||
| 285 | if (!(tt->keys[0])) | ||
| 286 | return(TTAC_SUCCESS); | ||
| 287 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %s", tt->keys[0]); | ||
| 288 | if ((*((char **)outvalue) = tinytacb_strdup(tt->keys[0])) == NULL) | ||
| 289 | return(TTAC_ENOMEM); | ||
| 290 | return(TTAC_SUCCESS); | ||
| 291 | |||
| 292 | case TTAC_OPT_KEYS: | ||
| 293 | tt = ((tt)) ? tt : &tinytac_dflt; | ||
| 294 | *((char **)outvalue) = NULL; | ||
| 295 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_KEY, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 296 | if (!(tt->keys)) | ||
| 297 | return(TTAC_SUCCESS); | ||
| 298 | for(pos = 0; ((tt->keys[pos])); pos++) | ||
| 299 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %s", tt->keys[pos]); | ||
| 300 | if ((tinytacb_strsdup((char ***)outvalue, tt->keys))) | ||
| 301 | return(TTAC_ENOMEM); | ||
| 302 | return(TTAC_SUCCESS); | ||
| 303 | |||
| 304 | case TTAC_OPT_NETWORK_TIMEOUT: | ||
| 305 | tt = ((tt)) ? tt : &tinytac_dflt; | ||
| 306 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_NETWORK_TIMEOUT, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 307 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %u sec %u usec", tt->net_timeout.tv_sec, tt->net_timeout.tv_usec); | ||
| 308 | if ((ptr = malloc(sizeof(struct timeval))) == NULL) | ||
| 309 | return(TTAC_ENOMEM); | ||
| 310 | memcpy(ptr, &tt->net_timeout, sizeof(struct timeval)); | ||
| 311 | *((struct timeval **)outvalue) = ptr; | ||
| 312 | return(TTAC_SUCCESS); | ||
| 313 | |||
| 263 | case TTAC_OPT_RANDOM: | 314 | case TTAC_OPT_RANDOM: |
| 264 | optsp = ((tt)) ? &tt->opts : &tinytac_dflt.opts; | 315 | optsp = ((tt)) ? &tt->opts : &tinytac_dflt.opts; |
| 265 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_RANDOM, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | 316 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_RANDOM, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); |
| @@ -273,6 +324,13 @@ tinytac_get_option( | |||
| 273 | *((int *)outvalue) = *optsp & TTAC_RND_METHODS; | 324 | *((int *)outvalue) = *optsp & TTAC_RND_METHODS; |
| 274 | return(TTAC_SUCCESS); | 325 | return(TTAC_SUCCESS); |
| 275 | 326 | ||
| 327 | case TTAC_OPT_TIMEOUT: | ||
| 328 | tt = ((tt)) ? tt : &tinytac_dflt; | ||
| 329 | TinyTacDebug(TTAC_DEBUG_ARGS, " == %s( %s, TTAC_OPT_TIMEOUT, outvalue )", __func__, (((tt)) ? "tt" : "NULL")); | ||
| 330 | TinyTacDebug(TTAC_DEBUG_ARGS, " <= outvalue: %i", tt->timeout); | ||
| 331 | *((int *)outvalue) = tt->timeout; | ||
| 332 | return(TTAC_SUCCESS); | ||
| 333 | |||
| 276 | default: | 334 | default: |
| 277 | break; | 335 | break; |
| 278 | }; | 336 | }; |
| @@ -308,16 +366,25 @@ tinytac_initialize( | |||
| 308 | return(rc); | 366 | return(rc); |
| 309 | }; | 367 | }; |
| 310 | 368 | ||
| 311 | // clear default options if overriden by user | 369 | // sets user flags and default flags |
| 312 | if ((opts & TTAC_IP_UNSPEC)) | 370 | if ((opts & TTAC_IP_UNSPEC)) |
| 313 | tt->opts &= ~TTAC_IP_UNSPEC; | 371 | tt->opts &= ~TTAC_IP_UNSPEC; |
| 314 | if ((opts & TTAC_AUTHEN_TYPES)) | 372 | if ((opts & TTAC_AUTHEN_TYPES)) |
| 315 | tt->opts &= ~TTAC_AUTHEN_TYPES; | 373 | tt->opts &= ~TTAC_AUTHEN_TYPES; |
| 316 | if ((opts & TTAC_RND_METHODS)) | 374 | if ((opts & TTAC_RND_METHODS)) |
| 317 | tt->opts &= ~TTAC_RND_METHODS; | 375 | tt->opts &= ~TTAC_RND_METHODS; |
| 376 | tt->opts |= opts; | ||
| 377 | if (!(tt->opts & TTAC_IP_UNSPEC)) | ||
| 378 | if (!(tt->opts |= TTAC_IP_UNSPEC & tinytac_dflt.opts)) | ||
| 379 | tt->opts |= TTAC_DFLT_IP & ~tinytac_dflt.opts_neg; | ||
| 380 | if (!(tt->opts & TTAC_AUTHEN_TYPES)) | ||
| 381 | if (!(tt->opts |= TTAC_AUTHEN_TYPES & tinytac_dflt.opts)) | ||
| 382 | tt->opts |= TTAC_DFLT_AUTHEN & ~tinytac_dflt.opts_neg; | ||
| 383 | if (!(tt->opts & TTAC_RND_METHODS)) | ||
| 384 | if (!(tt->opts |= TTAC_RND_METHODS & tinytac_dflt.opts)) | ||
| 385 | tt->opts |= TTAC_DFLT_RANDOM; | ||
| 318 | 386 | ||
| 319 | // apply user options | 387 | // apply user options |
| 320 | tt->opts |= opts; | ||
| 321 | if ((rc = tinytac_set_option(tt, TTAC_OPT_HOSTS, hosts)) != TTAC_SUCCESS) | 388 | if ((rc = tinytac_set_option(tt, TTAC_OPT_HOSTS, hosts)) != TTAC_SUCCESS) |
| 322 | { | 389 | { |
| 323 | tinytac_tinytac_free(tt); | 390 | tinytac_tinytac_free(tt); |
| @@ -438,7 +505,7 @@ tinytac_set_option( | |||
| 438 | { case TTAC_RAND: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_RAND"); break; | 505 | { case TTAC_RAND: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_RAND"); break; |
| 439 | case TTAC_RANDOM: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_RANDOM"); break; | 506 | case TTAC_RANDOM: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_RANDOM"); break; |
| 440 | case TTAC_URANDOM: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_URANDOM"); break; | 507 | case TTAC_URANDOM: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %s", "TTAC_URANDOM"); break; |
| 441 | default: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %i", *((const int *)invalue)); return(TTAC_EOPTVAL); | 508 | default: TinyTacDebug(TTAC_DEBUG_ARGS, " <= invalue: %i", ival); return(TTAC_EOPTVAL); |
| 442 | }; | 509 | }; |
| 443 | tt = ((tt)) ? tt : &tinytac_dflt; | 510 | tt = ((tt)) ? tt : &tinytac_dflt; |
| 444 | tt->opts &= ~(TTAC_RND_METHODS); | 511 | tt->opts &= ~(TTAC_RND_METHODS); |
