summaryrefslogtreecommitdiffstats
path: root/src/plugins/ifw_listen/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/ifw_listen/plugin.c')
-rw-r--r--src/plugins/ifw_listen/plugin.c110
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,
+};