/* Copyright 2009 Nathan Phillip Brink This file is a part of DistRen. DistRen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. DistRen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with DistRen. If not, see . */ #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; size_t counter; struct remoteio_server *aserver; opts->servers = malloc(sizeof(struct remoteio_server)); if(!opts->servers) { fprintf(stderr, "@todo cleanup!\n"); abort(); } aserver = opts->servers; numservers = cfg_size(cfg, "server"); for(counter = 0; counter < numservers; counter ++) { cfg_t *cfg_aserver; 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")); if(strcmp(cfg_getstr(cfg_aserver, "method"), "ssh") == 0) aserver->method = REMOTEIO_METHOD_SSH; else abort(); if(counter < numservers - 1) { aserver->next = malloc(sizeof(struct remoteio_server)); aserver = aserver->next; } } aserver->next = NULL; return 0; } int remoteio_open(struct remoteio **rem, struct remoteio_opts *opts, const char *servername) { 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", theserver->username, theserver->hostname); else userhost = strdup(theserver->hostname); sshargs[1] = userhost; *rem = malloc(sizeof(struct remoteio)); rtn = execio_open( &(*rem)->execio, "ssh", sshargs); if(rtn) { fprintf(stderr, "error opening remoteio channel to server ``%s''" , servername); free(*rem); free(userhost); return 1; } free(userhost); return 0; } int remoteio_read(struct remoteio *rem, void *buf, size_t len, size_t *bytesread) { return execio_read(rem->execio, buf, len, bytesread); } int remoteio_write(struct remoteio *rem, void *buf, size_t len, size_t *byteswritten) { return execio_write(rem->execio, buf, len, byteswritten); } int remoteio_close(struct remoteio *rem) { int rtn; rtn = execio_close(rem->execio); free(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; }