diff options
Diffstat (limited to 'src/plugins/ifw_listen/plugin.c')
-rw-r--r-- | src/plugins/ifw_listen/plugin.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/plugins/ifw_listen/plugin.c b/src/plugins/ifw_listen/plugin.c new file mode 100644 index 0000000..9dded4a --- /dev/null +++ b/src/plugins/ifw_listen/plugin.c @@ -0,0 +1,110 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/socket.h> + +#include "ifw_listen_dbus.h" + +static int init(plugin_t *plugin, DBusConnection *connection); +static void deinit(plugin_t *plugin, DBusConnection *connection); +static void process_listen_message(plugin_t *plugin, DBusConnection *connection, int seq, msg_listen_t *listen); +static DBusHandlerResult handle_message(DBusConnection *connection, DBusMessage *message, plugin_t *plugin); +#ifdef IFW_LISTEN_FAKE +static void generate_fake_listen(msg_listen_t *listen); +static void handle_fake(plugin_t *plugin, DBusConnection *connection); +#else +static void handle_incoming(plugin_t *plugin, DBusConnection *connection); +#endif + +static int init(plugin_t *plugin, DBusConnection *connection) { + ifw_listen_t *ifw_listen; + + ifw_listen = malloc(sizeof(ifw_listen_t)); + if (!ifw_listen) { + fprintf(stderr, "unable to malloc ifw\n"); + return -1; + } + +#ifdef IFW_LISTEN_FAKE + plugin->fd = 0; +#else + plugin->fd = nl_ifw_create_socket(); + if (plugin->fd < 0) { + fprintf(stderr, "unable to init netlink\n"); + return -1; + } +#endif + plugin->priv = (void *) ifw_listen; + + return 0; +} + +static void deinit(plugin_t *plugin, DBusConnection *connection) { + ifw_listen_t *ifw_listen = (ifw_listen_t *) plugin->priv; + close(plugin->fd); +} + +#ifdef IFW_LISTEN_FAKE +#include <time.h> + +static void generate_fake_listen(msg_listen_t *listen) { + static int port = 22; + strcpy(listen->program, "sshd"); + listen->port = port++; +} + +static void handle_fake(plugin_t *plugin, DBusConnection *connection) { + static int seq = 0; + msg_listen_t fake_listen; + + read(0, NULL, 1); + + generate_fake_listen(&fake_listen); + printf("seq : %d\n", seq); + + process_listen_message(plugin, connection, seq++, &fake_listen); +} + +#else + +static void handle_incoming(plugin_t *plugin, DBusConnection *connection) { + struct nl_msg msg; + static int seq = 0; + msg_listen_t listen; + + if (nl_ifw_read_msg(plugin->fd, NULL, &msg) <= 0) { + fprintf(stderr, "unable to read packet from netlink\n"); + return; + } + + process_listen_message(plugin, connection, seq++, &listen); +} + +#endif + +static void process_listen_message(plugin_t *plugin, DBusConnection *connection, int seq, msg_listen_t *listen) { + ifw_listen_t *ifw_listen = (ifw_listen_t *) plugin->priv; + ifw_listen_dbus_notify_listen(connection, listen); +} + +static DBusHandlerResult handle_message(DBusConnection *connection, DBusMessage *message, plugin_t *plugin) { + ifw_listen_t *ifw_listen = (ifw_listen_t *) plugin->priv; + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +plugin_t ifw_listen_plugin = { + .name = "Interactive Firewall", + .path = IFW_LISTEN_DBUS_PATH, + .init = init, +#ifdef IFW_LISTEN_FAKE + .handle_incoming = handle_fake, +#else + .handle_incoming = handle_incoming, +#endif + .handle_message = handle_message, + .deinit = deinit, +}; |