/*
Copyright 2010 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 .
*/
#ifndef _DISTREN_LIBREMOTEIO_H
#define _DISTREN_LIBREMOTEIO_H
#include "common/multiio.h"
#include "common/remoteio.h"
#include
#include
#include
/**
private declarations for remoteio, to be included by options.c and remoteio.c
*/
enum remoteio_method
{
REMOTEIO_METHOD_SSH = 0,
#ifndef WINDOWS
REMOTEIO_METHOD_UNIX = 1,
#endif
REMOTEIO_METHOD_TCP = 2,
/* REMOETIO_METHOD_XMLRPC */ /*< maybe someday */
/** method for the remoteio_open_socket() function, where we don't call open() ourselves: */
REMOTEIO_METHOD_SOCKET = 3,
REMOTEIO_METHOD_MAX = 4 /*< This is a number used to check the consitency of remoteio_server structs */
};
struct remoteio_server
{
char *name; /*< The friendly named passed to remoteio_open() */
char *hostname;
char *username;
enum remoteio_method method;
unsigned int types; /*< See ``Server types'' in protocol.h */
};
struct remoteio_opts
{
char *ssh_command;
list_t servers; /* type: (struct remoteio_server *) */
/* store the multiio context for general use */
multiio_context_t multiio;
/* store remoteio's socket_type */
multiio_socket_type_t socket_type;
/* an argument for the remoteio_read_handle_func_t */
void *generic_handler_data;
};
/**
* Used to describe the nature of the data stored in the
* outbound and message queues that power remoteio_write()
* and remoteio_read() (?).
*/
struct remoteio_packet
{
size_t len;
char *data;
};
struct remoteio
{
enum remoteio_method method;
struct remoteio_opts *opts;
struct execio *execio;
#ifndef WINDOWS
int sock;
#endif
remoteio_read_handle_func_t read_handler;
/* for the read_handler */
void *read_handler_data;
/**
* Store a buffer of data waiting to be processed.
*/
struct remoteio_packet inbuf;
/**
* Provide the asynchronosity abstraction by queuing outgoing messages.
*/
queue_t outmsgs;
/**
* This is disappointingly hacky. If this variable is 0, then
* remoteio_close() will act normal. If set to 1, then
* remoteio_close() will not actually free this struct but instead
* increment this variable to 2. This is so that read_handler can
* call remoteio_close() without segfaulting us.
*/
short careful_free;
};
/* lookup table */
typedef int remoteio_open_func_t(struct remoteio *rem, struct remoteio_server *server);
typedef int remoteio_read_func_t(struct remoteio *rem, void *buf, size_t len, size_t *bytesread);
typedef int remoteio_write_func_t(struct remoteio *rem, void *buf, size_t len, size_t *bytesread);
typedef int remoteio_close_func_t(struct remoteio *rem);
struct remoteio_method_funcmap
{
enum remoteio_method method;
remoteio_open_func_t *open_func;
remoteio_read_func_t *read_func;
remoteio_write_func_t *write_func;
remoteio_close_func_t *close_func;
char *name; /*< used for error messages */
};
int remoteio_config(cfg_t *cfg, struct remoteio_opts *opts);
#endif