diff --git a/src/common/remoteio.c b/src/common/remoteio.c --- a/src/common/remoteio.c +++ b/src/common/remoteio.c @@ -20,11 +20,15 @@ #include "libremoteio.h" #include "execio.h" +#include "asprintf.h" #include #include #include +/* local */ +struct remoteio_server *remoteio_getserver(const struct remoteio_opts *opts, const char *servername); + int remoteio_config(cfg_t *cfg, struct remoteio_opts *opts) { size_t numservers; @@ -70,10 +74,35 @@ int remoteio_config(cfg_t *cfg, struct r return 0; } -int remoteio_open(struct remoteio **rem, struct remoteio_opts *opts, char *servername) + + +int remoteio_open(struct remoteio **rem, struct remoteio_opts *opts, const char *servername) { - char *sshargs[] = {opts->ssh_command, servername, "distrend", "-d", (char *)NULL}; + char *userhost; + char *sshargs[] = {opts->ssh_command, NULL /* userhost */, "distrend", "-d", (char *)NULL}; + int rtn; + + struct remoteio_server *theserver; + + theserver = remoteio_getserver(opts, servername); + if(!theserver) + { + fprintf(stderr, "%s:%d: Could not find server named ``%s''\n", __FILE__, __LINE__, servername); + return 1; + } + + if(theserver->method != REMOTEIO_METHOD_SSH) + { + fprintf(stderr, "%s:%d: Unsupported remoteio method %d\n", __FILE__, __LINE__, theserver->method); + return 1; + } + + if(theserver->username) + _distren_asprintf(&userhost, "%s@%s", aserver->username, aserver->hostname); + else + userhost = strdup(aserver->hostname); + sshargs[1] = userhost; *rem = malloc(sizeof(struct remoteio)); rtn = execio_open( &(*rem)->execio, "ssh", sshargs); @@ -81,8 +110,10 @@ int remoteio_open(struct remoteio **rem, { fprintf(stderr, "error opening remoteio channel to server ``%s''" , servername); free(*rem); + free(userhost); return 1; } + free(userhost); return 0; } @@ -107,3 +138,18 @@ int remoteio_close(struct remoteio *rem) return 0 + rtn; } + + + +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; + + return (struct remoteio_server *)NULL; +}