Files @ f8b15ae5255a
Branch filter:

Location: DistRen/src/common/remoteio.c

binki
added partial server support to remoteio
/*
  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 <http://www.gnu.org/licenses/>.

*/

#include "libremoteio.h"
#include "execio.h"
#include "asprintf.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* 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", aserver->username, aserver->hostname);
  else
    userhost = strdup(aserver->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;
}