# HG changeset patch # User Nathan Phillip Brink # Date 2010-06-29 23:13:02 # Node ID 57766eb693c33663b6602eda9c65ed1d3ea57cfe # Parent cb26ccfc122dba20a45c62890be017efbc0bd8e6 - Convert some of remoteio to use liblist. - Fix bug where one function used counter in both an inner and outer loop (how embarassing ;-)) diff --git a/etc/distrencommon.conf b/etc/distrencommon.conf --- a/etc/distrencommon.conf +++ b/etc/distrencommon.conf @@ -23,3 +23,11 @@ server ohnopublishing types = {"distribution"} } + +server localhost +{ + hostname = "localhost" + username = "test" + method = "tcp" + types = {"submit", "distribution", "master"} +} diff --git a/src/common/libremoteio.h b/src/common/libremoteio.h --- a/src/common/libremoteio.h +++ b/src/common/libremoteio.h @@ -21,7 +21,9 @@ #define _DISTREN_LIBREMOTEIO_H #include "remoteio.h" + #include +#include /** private declarations for remoteio, to be included by options.c and remoteio.c @@ -40,7 +42,6 @@ enum remoteio_method struct remoteio_server { - struct remoteio_server *next; char *name; /*< The friendly named passed to remoteio_open() */ char *hostname; char *username; @@ -51,7 +52,7 @@ struct remoteio_server struct remoteio_opts { char *ssh_command; - struct remoteio_server *servers; + list_t servers; /* type: (struct remoteio_server *) */ }; struct remoteio { 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; }