Encapsulate protocol_t
This commit is contained in:
parent
efabc7a40d
commit
3756620213
6 changed files with 91 additions and 26 deletions
|
@ -40,11 +40,12 @@ void main(int argc, char *argv[]) {
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<const protocol_t> proto = load_protocol(argv[1]);
|
context_t mmss;
|
||||||
|
|
||||||
|
std::shared_ptr<const protocol_t> proto = protocol_t::load(&mmss, argv[1]);
|
||||||
if (!proto)
|
if (!proto)
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
|
|
||||||
context_t mmss;
|
|
||||||
config_t conf = {};
|
config_t conf = {};
|
||||||
|
|
||||||
//read_config(&mmss, &conf, "babel_test.mmss");
|
//read_config(&mmss, &conf, "babel_test.mmss");
|
||||||
|
|
|
@ -61,8 +61,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<const protocol_t> load_protocol(const char *module);
|
|
||||||
|
|
||||||
bool read_config(context_t *mmss, config_t *conf, const char *filename);
|
bool read_config(context_t *mmss, config_t *conf, const char *filename);
|
||||||
|
|
||||||
void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<network_t> &net, const std::string &name, const gmrf_addr_t *address);
|
void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<network_t> &net, const std::string &name, const gmrf_addr_t *address);
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "types.hpp"
|
|
||||||
#include "iface.hpp"
|
#include "iface.hpp"
|
||||||
|
#include "protocol.hpp"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -24,43 +24,36 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "protocol.hpp"
|
||||||
#include "mmss.hpp"
|
#include "mmss.hpp"
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <cstdio>
|
|
||||||
|
|
||||||
|
|
||||||
namespace MMSS {
|
namespace MMSS {
|
||||||
|
|
||||||
class dlcloser {
|
protocol_t::~protocol_t() {
|
||||||
private:
|
|
||||||
void *handle;
|
|
||||||
|
|
||||||
public:
|
|
||||||
dlcloser(void *handle0) : handle(handle0) {}
|
|
||||||
void operator()(const protocol_t *ptr) const {
|
|
||||||
::dlclose(handle);
|
::dlclose(handle);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
std::shared_ptr<const protocol_t> load_protocol(const char *module) {
|
std::shared_ptr<const protocol_t> protocol_t::load(context_t *mmss, const std::string &module) {
|
||||||
void *handle = ::dlopen(module, RTLD_NOW);
|
void *handle = ::dlopen(module.c_str(), RTLD_NOW);
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
|
mmss->logf(LOG_ERR, "unable to load protocol from `%s': %s", module.c_str(), dlerror());
|
||||||
return std::shared_ptr<const protocol_t>();
|
return std::shared_ptr<const protocol_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
::dlerror();
|
::dlerror();
|
||||||
const protocol_t *proto = reinterpret_cast<const protocol_t*>(::dlsym(handle, "mmss_protocol_info"));
|
const mmss_protocol_t *proto = reinterpret_cast<const mmss_protocol_t*>(::dlsym(handle, "mmss_protocol_info"));
|
||||||
if (!proto) {
|
if (!proto) {
|
||||||
std::fprintf(stderr, "unable to load protocol from `%s': %s\n", module, dlerror());
|
mmss->logf(LOG_ERR, "unable to load protocol from `%s': %s", module.c_str(), dlerror());
|
||||||
::dlclose(handle);
|
::dlclose(handle);
|
||||||
return std::shared_ptr<const protocol_t>();
|
return std::shared_ptr<const protocol_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::fprintf(stderr, "loaded protocol `%s' version %s\n", proto->get_name(), proto->get_version());
|
mmss->logf(LOG_INFO, "loaded protocol `%s' version %s", proto->get_name(), proto->get_version());
|
||||||
|
|
||||||
return std::shared_ptr<const protocol_t>(proto, dlcloser(handle));
|
return std::shared_ptr<const protocol_t>(new protocol_t(handle, proto));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
75
mmss/protocol.hpp
Normal file
75
mmss/protocol.hpp
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.hpp"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
#include <mmss/protocol.h>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
|
namespace MMSS {
|
||||||
|
|
||||||
|
class protocol_t {
|
||||||
|
private:
|
||||||
|
void *handle;
|
||||||
|
const mmss_protocol_t *proto;
|
||||||
|
|
||||||
|
protocol_t(void *handle0, const mmss_protocol_t *proto0) : handle(handle0), proto(proto0) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
~protocol_t();
|
||||||
|
|
||||||
|
const char* get_name() const {
|
||||||
|
return proto->get_name();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* get_version() const {
|
||||||
|
return proto->get_version();
|
||||||
|
}
|
||||||
|
|
||||||
|
gmrf_context_t* init(gmrf_t *gmrf) const {
|
||||||
|
return proto->init(gmrf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_iface(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface) const {
|
||||||
|
return proto->add_iface(gmrf, ctx, iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len) const {
|
||||||
|
return proto->handle_packet(gmrf, ctx, iface, source, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<const protocol_t> load(context_t *mmss, const std::string &module);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -32,7 +32,6 @@
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
#include <mmss/protocol.h>
|
|
||||||
#include <gmrf/gmrf.h>
|
#include <gmrf/gmrf.h>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -50,8 +49,7 @@ class network_t;
|
||||||
class node_t;
|
class node_t;
|
||||||
class now_t;
|
class now_t;
|
||||||
class packet_t;
|
class packet_t;
|
||||||
|
class protocol_t;
|
||||||
class scheduled_t;
|
class scheduled_t;
|
||||||
|
|
||||||
typedef ::mmss_protocol_t protocol_t;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue