34 |
#include <ctype.h> |
#include <ctype.h> |
35 |
|
|
36 |
#include <radius.h> |
#include <radius.h> |
|
#include <slist.h> |
|
37 |
#include <debugmod.h> |
#include <debugmod.h> |
38 |
|
|
39 |
void |
void |
204 |
debug(1, |
debug(1, |
205 |
("sending %s", auth_code_str(code))); |
("sending %s", auth_code_str(code))); |
206 |
recv_buf = emalloc(config->buffer_size); |
recv_buf = emalloc(config->buffer_size); |
207 |
server = config->first_server; |
server = list_first(config->servers); |
208 |
do { |
do { |
209 |
fd_set readfds; |
fd_set readfds; |
210 |
struct timeval tm; |
struct timeval tm; |
301 |
ip_iptostr(server->addr, ipbuf), |
ip_iptostr(server->addr, ipbuf), |
302 |
server->port[port_type])); |
server->port[port_type])); |
303 |
|
|
304 |
} while (!req && (server = server->next) != NULL); |
} while (!req && (server = list_next(config->servers)) != NULL); |
305 |
|
|
306 |
efree(recv_buf); |
efree(recv_buf); |
307 |
close(sockfd); |
close(sockfd); |
376 |
file, lineno, argv[4]); |
file, lineno, argv[4]); |
377 |
break; |
break; |
378 |
} |
} |
379 |
|
|
380 |
client->first_server = |
rad_clt_append_server(client, rad_clt_alloc_server(&serv)); |
|
rad_clt_append_server(client->first_server, |
|
|
rad_clt_alloc_server(&serv)); |
|
381 |
break; |
break; |
382 |
|
|
383 |
case TOK_TIMEOUT: |
case TOK_TIMEOUT: |
413 |
client->timeout = 1; |
client->timeout = 1; |
414 |
client->retries = 3; |
client->retries = 3; |
415 |
client->buffer_size = bufsize ? bufsize : 4096; |
client->buffer_size = bufsize ? bufsize : 4096; |
416 |
client->first_server = NULL; |
client->servers = 0; |
417 |
|
|
418 |
if (read_cfg) { |
if (read_cfg) { |
419 |
filename = mkfilename(radius_dir, "client.conf"); |
filename = mkfilename(radius_dir, "client.conf"); |
427 |
rad_clt_destroy_queue(RADIUS_SERVER_QUEUE *queue) |
rad_clt_destroy_queue(RADIUS_SERVER_QUEUE *queue) |
428 |
{ |
{ |
429 |
if (queue) { |
if (queue) { |
430 |
rad_clt_clear_server_list(queue->first_server); |
rad_clt_clear_server_list(queue); |
431 |
efree(queue); |
efree(queue); |
432 |
} |
} |
433 |
} |
} |
437 |
{ |
{ |
438 |
RADIUS_SERVER *server; |
RADIUS_SERVER *server; |
439 |
|
|
440 |
server = mem_alloc(sizeof(*server)); |
server = emalloc(sizeof(*server)); |
441 |
server->name = string_create(src->name); |
server->name = string_create(src->name); |
442 |
server->addr = src->addr; |
server->addr = src->addr; |
443 |
server->port[0] = src->port[0]; |
server->port[0] = src->port[0]; |
444 |
server->port[1] = src->port[1]; |
server->port[1] = src->port[1]; |
445 |
server->secret = string_create(src->secret); |
server->secret = string_create(src->secret); |
446 |
|
server->id_offset = (off_t)-1; |
447 |
return server; |
return server; |
448 |
} |
} |
449 |
|
|
452 |
{ |
{ |
453 |
RADIUS_SERVER *dest; |
RADIUS_SERVER *dest; |
454 |
|
|
455 |
dest = mem_alloc(sizeof(*dest)); |
dest = emalloc(sizeof(*dest)); |
456 |
dest->addr = src->addr; |
dest->addr = src->addr; |
457 |
dest->name = string_dup(src->name); |
dest->name = string_dup(src->name); |
458 |
dest->port[0] = src->port[0]; |
dest->port[0] = src->port[0]; |
470 |
{ |
{ |
471 |
string_free(server->name); |
string_free(server->name); |
472 |
string_free(server->secret); |
string_free(server->secret); |
473 |
mem_free(server); |
efree(server); |
474 |
} |
} |
475 |
|
|
476 |
RADIUS_SERVER * |
RADIUS_SERVER * |
477 |
rad_clt_append_server(RADIUS_SERVER *list, RADIUS_SERVER *server) |
rad_clt_append_server(RADIUS_SERVER_QUEUE *qp, RADIUS_SERVER *server) |
478 |
{ |
{ |
479 |
return (RADIUS_SERVER*)append_slist((struct slist*)list, |
if (!qp->servers) |
480 |
(struct slist*)server); |
qp->servers = list_create(); |
481 |
|
list_append(qp->servers, server); |
482 |
} |
} |
483 |
|
|
484 |
static void |
static int |
485 |
rad_clt_internal_free_server(RADIUS_SERVER *server) |
rad_clt_internal_free_server(void *item, void *data) |
486 |
{ |
{ |
487 |
|
RADIUS_SERVER *server = item; |
488 |
string_free(server->name); |
string_free(server->name); |
489 |
string_free(server->secret); |
string_free(server->secret); |
490 |
|
efree(server); |
491 |
|
return 0; |
492 |
} |
} |
493 |
|
|
494 |
void |
void |
495 |
rad_clt_clear_server_list(RADIUS_SERVER *list) |
rad_clt_clear_server_list(RADIUS_SERVER_QUEUE *qp) |
496 |
{ |
{ |
497 |
free_slist((struct slist *)list, rad_clt_internal_free_server); |
list_destroy(&qp->servers, rad_clt_internal_free_server, NULL); |
498 |
} |
} |
499 |
|
|
500 |
static int |
static int |
501 |
server_cmp(RADIUS_SERVER *serv, char *id) |
server_cmp(void *item, void *data) |
502 |
{ |
{ |
503 |
return strcmp(serv->name, id); |
RADIUS_SERVER *serv = item; |
504 |
|
char *id = data; |
505 |
|
|
506 |
|
return strcmp(serv->name, id) == 0; |
507 |
} |
} |
508 |
|
|
509 |
RADIUS_SERVER * |
RADIUS_SERVER * |
510 |
rad_clt_find_server(RADIUS_SERVER *list, char *name) |
rad_clt_find_server(RADIUS_SERVER_QUEUE *qp, char *name) |
511 |
{ |
{ |
512 |
return (RADIUS_SERVER*)find_slist((struct slist *)list, |
list_iterate(qp->servers, server_cmp, name); |
513 |
server_cmp, |
return list_current(qp->servers); |
|
name); |
|
514 |
} |
} |
515 |
|
|