diff --git a/src/common/remoteio.c b/src/common/remoteio.c --- a/src/common/remoteio.c +++ b/src/common/remoteio.c @@ -22,6 +22,8 @@ #include "execio.h" #include "asprintf.h" +#include + #include #ifndef _WIN32 #include @@ -83,21 +85,19 @@ struct remoteio_server *remoteio_getserv int remoteio_config(cfg_t *cfg, struct remoteio_opts *opts) { size_t numservers; - size_t counter; + size_t counter, counter2; static int haslisted_methods = 0; - struct remoteio_server *aserver; + struct remoteio_server aserver; - opts->servers = malloc(sizeof(struct remoteio_server)); + opts->servers = list_init(); if(!opts->servers) { fprintf(stderr, "@todo cleanup!\n"); abort(); } - aserver = opts->servers; - - numservers = cfg_size(cfg, "server"); + numservers = cfg_size(cfg, "server"); for(counter = 0; counter < numservers; counter ++) { cfg_t *cfg_aserver; @@ -105,39 +105,30 @@ int remoteio_config(cfg_t *cfg, struct r cfg_aserver = cfg_getnsec(cfg, "server", counter); - if(!aserver) /*< if the malloc in the previous loop failed */ - abort(); - - aserver->name = strdup(cfg_title(cfg_aserver)); - aserver->hostname = strdup(cfg_getstr(cfg_aserver, "hostname")); - aserver->username = strdup(cfg_getstr(cfg_aserver, "username")); + aserver.name = strdup(cfg_title(cfg_aserver)); + aserver.hostname = strdup(cfg_getstr(cfg_aserver, "hostname")); + aserver.username = strdup(cfg_getstr(cfg_aserver, "username")); - aserver->method = REMOTEIO_METHOD_MAX; + aserver.method = REMOTEIO_METHOD_MAX; method = cfg_getstr(cfg_aserver, "method"); - for(counter = 0; funcmap[counter].name; counter ++) - if(strcmp(method, funcmap[counter].name) == 0) - aserver->method = REMOTEIO_METHOD_SSH; - if(aserver->method == REMOTEIO_METHOD_MAX) + for(counter2 = 0; funcmap[counter2].name; counter2 ++) + if(strcmp(method, funcmap[counter2].name) == 0) + aserver.method = REMOTEIO_METHOD_SSH; + if(aserver.method == REMOTEIO_METHOD_MAX) { fprintf(stderr, "No such method as %s\n", method); if(!haslisted_methods) { fprintf(stderr, "Available methods:\n"); - for(counter = 0; funcmap[counter].name; counter ++) - fprintf(stderr, "\t%s\n", funcmap[counter].name); + for(counter2 = 0; funcmap[counter2].name; counter2 ++) + fprintf(stderr, "\t%s\n", funcmap[counter2].name); haslisted_methods ++; } abort(); } - - if(counter < numservers - 1) - { - aserver->next = malloc(sizeof(struct remoteio_server)); - aserver = aserver->next; - } + list_insert_after(opts->servers, &aserver, sizeof(struct remoteio_server)); } - aserver->next = NULL; return 0; } @@ -213,16 +204,25 @@ int remoteio_close(struct remoteio *rem) return rtn; } +int _remoteio_getserver_traverse(char *servername, struct remoteio_server *aserver) +{ + if(!strcmp(aserver->name, servername)) + return FALSE; /* stop traversal */ + + return TRUE; +} struct remoteio_server *remoteio_getserver(const struct remoteio_opts *opts, const char *servername) { - struct remoteio_server *aserver; - - for(aserver = opts->servers; - aserver; - aserver = aserver->next) - if(!strcmp(servername, aserver->name)) - return aserver; + int traversal_result; + char *dispensible_servername; + + dispensible_servername = strdup(servername); /* for the sake of constness... */ + traversal_result = list_traverse(opts->servers, dispensible_servername, (list_traverse_func_t)&_remoteio_getserver_traverse, LIST_FRNT | LIST_ALTR); + free(dispensible_servername); + + if(traversal_result == LIST_OK) + return (struct remoteio_server *)list_curr(opts->servers); return (struct remoteio_server *)NULL; }