From a3eb060b8d4419c1af85d3acf081f45cdc27708d Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@intec.ugent.be>
Date: Tue, 23 Feb 2016 17:04:49 +0100
Subject: lib: Initial messages for the IRM

This provides the initial messages to be passed between the irmd and
libouroboros-irm.
---
 include/ouroboros/sockets.h | 46 +++++++++++++++++++++
 src/irmd/main.c             | 57 +++++++++++++++++++++++++-
 src/lib/CMakeLists.txt      |  2 +
 src/lib/irm.c               | 97 +++++++++++++++++++++++++++++++++++++++++++++
 src/lib/sockets.c           | 94 +++++++++++++++++++++++++++++++++++++++++++
 src/tools/irm/main.c        | 13 +++++-
 6 files changed, 306 insertions(+), 3 deletions(-)
 create mode 100644 include/ouroboros/sockets.h
 create mode 100644 src/lib/irm.c
 create mode 100644 src/lib/sockets.c

diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h
new file mode 100644
index 00000000..fb2fa7db
--- /dev/null
+++ b/include/ouroboros/sockets.h
@@ -0,0 +1,46 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The sockets layer to communicate between daemons
+ *
+ *    Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define IRM_SOCK_PATH "/tmp/irm_sock"
+
+enum irm_msg_code {
+        IRM_CREATE_IPCP,
+        IRM_DESTROY_IPCP,
+        IRM_BOOTSTRAP_IPCP,
+        IRM_ENROLL_IPCP,
+        IRM_REG_IPCP,
+        IRM_UNREG_IPCP,
+        IRM_LIST_IPCPS
+};
+
+struct irm_msg_sock {
+        enum irm_msg_code code;
+        union {
+                struct {
+                        rina_name_t name;
+                        char * ipcp_type;
+                } create_ipcp;
+        } irm_msg;
+};
+
+int client_socket_open(char * file_name);
+int server_socket_open(char * file_name);
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 8ab071e0..b4e43534 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1,10 +1,63 @@
-#define OUROBOROS_PREFIX "irm"
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The IPC Resource Manager
+ *
+ *    Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "irmd"
 
 #include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/sockets.h>
+#include <ouroboros/irm.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#define BUF_SIZE 256
 
 int main()
 {
-        LOG_DBG("Test of the IRM");
+        int sockfd;
+
+        sockfd = server_socket_open(IRM_SOCK_PATH);
+        if (sockfd < 0)
+                return -1;
+
+        while (true) {
+                int     cli_sockfd;
+                struct irm_msg_sock msg;
+                ssize_t count;
+                char    buf[BUF_SIZE];
+
+                cli_sockfd = accept(sockfd, 0, 0);
+                if (cli_sockfd < 0) {
+                        LOG_ERR("Cannot accept new connection");
+                }
+
+                count = read(cli_sockfd, buf, BUF_SIZE);
+                if (count) {
+                        msg = (struct struct irm_msg_sock) buf;
+                        LOG_INFO("Got message code %d", buf.code);
+                }
+
+                close(cli_sockfd);
+        }
 
         return 0;
 }
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 9a6f1946..2e0d6b6b 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -9,6 +9,8 @@ set(SOURCE_FILES
         bitmap.c
         cdap.c
         du_buff.c
+        irm.c
+        sockets.c
 )
 
 add_library(ouroboros SHARED ${SOURCE_FILES})
diff --git a/src/lib/irm.c b/src/lib/irm.c
new file mode 100644
index 00000000..da229d3e
--- /dev/null
+++ b/src/lib/irm.c
@@ -0,0 +1,97 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The API to instruct the IRM
+ *
+ *    Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "libouroboros-irm"
+
+#include <ouroboros/irm.h>
+#include <ouroboros/common.h>
+#include <ouroboros/logs.h>
+#include <ouroboros/sockets.h>
+
+int irm_create_ipcp(rina_name_t name,
+                    char * ipcp_type)
+{
+        int sockfd;
+        struct irm_msg_sock msg;
+
+        if (!ipcp_type)
+                return -1;
+
+        sockfd = client_socket_open(IRM_SOCK_PATH);
+        if (sockfd < 0)
+                return -1;
+
+        msg.code = IRM_CREATE_IPCP;
+        msg.irm_msg.create_ipcp.name = name;
+        msg.irm_msg.create_ipcp.ipcp_type = ipcp_type;
+
+        write(sockfd, &msg, sizeof(msg));
+        close(sockfd);
+
+        return 0;
+}
+
+int irm_destroy_ipcp(int ipcp_id)
+{
+
+        return 0;
+}
+
+int irm_bootstrap_ipcp(int ipcp_id,
+                       struct dif_info info)
+{
+
+        return 0;
+}
+
+int irm_enroll_ipcp(int ipcp_id,
+                    char * dif_name)
+{
+
+        return 0;
+}
+
+int irm_reg_ipcp(int ipcp_id,
+                 char ** difs)
+{
+
+        return 0;
+}
+
+int irm_unreg_ipcp(int ipcp_id,
+                   char ** difs)
+{
+
+        return 0;
+}
+
+char ** irm_list_ipcps()
+{
+
+        return 0;
+}
+
+char ** irm_list_ipcp_types()
+{
+
+        return 0;
+}
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
new file mode 100644
index 00000000..8917f55a
--- /dev/null
+++ b/src/lib/sockets.c
@@ -0,0 +1,94 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The sockets layer to communicate between daemons
+ *
+ *    Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "libouroboros-sockets"
+
+#include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/sockets.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/stat.h>
+#include <string.h>
+
+int client_socket_open(char * file_name)
+{
+        int sockfd;
+        struct sockaddr_un serv_addr;
+
+        sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+        if (sockfd < 0) {
+                LOG_ERR("Failed to open socket");
+                return -1;
+        }
+
+        serv_addr.sun_family = AF_UNIX;
+        sprintf(serv_addr.sun_path, file_name);
+
+        if (connect(sockfd,
+                    (struct sockaddr *) &serv_addr,
+                    sizeof(serv_addr))) {
+                LOG_ERR("Failed to connect to server");
+                return -1;
+        }
+
+        return sockfd;
+}
+
+int server_socket_open(char * file_name)
+{
+        int sockfd;
+        struct sockaddr_un serv_addr;
+        struct stat sb;
+
+        if (!stat(file_name, &sb)) {
+                /* File exists */
+                if (unlink(file_name)) {
+                        LOG_ERR("Failed to unlink filename: %s",
+                                strerror(errno));
+                        return -1;
+                }
+        }
+
+        sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+        if (sockfd < 0) {
+                LOG_ERR("Failed to open socket");
+                return -1;
+        }
+
+        serv_addr.sun_family = AF_UNIX;
+        sprintf(serv_addr.sun_path, file_name);
+
+        if (bind(sockfd,
+                 (struct sockaddr *) &serv_addr,
+                 sizeof(serv_addr))) {
+                LOG_ERR("Failed to bind socket");
+                return -1;
+        }
+
+        if (listen(sockfd, 0)) {
+                LOG_ERR("Failed to listen to socket");
+                return -1;
+        }
+
+        return sockfd;
+}
diff --git a/src/tools/irm/main.c b/src/tools/irm/main.c
index bad1000e..6439243c 100644
--- a/src/tools/irm/main.c
+++ b/src/tools/irm/main.c
@@ -23,10 +23,21 @@
 #define OUROBOROS_PREFIX "irm"
 
 #include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/irm.h>
 
 int main () {
+        char * ap_name = "test";
+        char * ipcp_type = "normal-ipcp";
+        rina_name_t name;
+        name.ap_name = ap_name;
+        name.api_id = 1;
+
+        if (irm_create_ipcp(name, ipcp_type)) {
+                LOG_ERR("Failed to create IPCP");
+                return -1;
+        }
 
-        LOG_DBG("Test of the IRM tool");
 
         return 0;
 }
-- 
cgit v1.2.3


From 63633c57b1e2573890fa627dd63f7c79ee5777b8 Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@intec.ugent.be>
Date: Thu, 25 Feb 2016 19:14:26 +0100
Subject: lib, irmd, tools: Support to create IPCPs

Provides the initial support to create IPCPs via a command-line
tool. It extends the socket layer with a message that is sent over a
socket to the irmd when the irm_create_ipcp library function is called
from a program.
---
 CMakeLists.txt              |   1 +
 include/ouroboros/common.h  |   3 +-
 include/ouroboros/sockets.h |  13 +--
 src/irmd/main.c             |  48 +++++++++--
 src/lib/irm.c               |  14 +++-
 src/lib/sockets.c           | 193 ++++++++++++++++++++++++++++++++++++++++++++
 src/tools/irm/main.c        |   2 +
 7 files changed, 258 insertions(+), 16 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 84a42eb9..99750b00 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -54,6 +54,7 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
    MACRO_ADD_COMPILE_FLAGS(irmd -DCONFIG_OUROBOROS_DEBUG)
    MACRO_ADD_COMPILE_FLAGS(dad -DCONFIG_OUROBOROS_DEBUG)
    MACRO_ADD_COMPILE_FLAGS(irm -DCONFIG_OUROBOROS_DEBUG)
+   MACRO_ADD_COMPILE_FLAGS(ouroboros -DCONFIG_OUROBOROS_DEBUG)
 endif (CMAKE_BUILD_TYPE MATCHES Debug)
 
 #include(FeatureSummary)
diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h
index 09900a1f..02361f20 100644
--- a/include/ouroboros/common.h
+++ b/include/ouroboros/common.h
@@ -30,9 +30,8 @@
 
 typedef uint32_t port_id_t;
 
-/* FIXME: To be moved into a separate file */
 typedef struct {
-        char * data;
+        uint8_t * data;
         size_t size;
 } buffer_t;
 
diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h
index fb2fa7db..ad9bd408 100644
--- a/include/ouroboros/sockets.h
+++ b/include/ouroboros/sockets.h
@@ -32,15 +32,18 @@ enum irm_msg_code {
         IRM_LIST_IPCPS
 };
 
-struct irm_msg_sock {
+struct irm_msg {
         enum irm_msg_code code;
         union {
                 struct {
-                        rina_name_t name;
+                        rina_name_t * name;
                         char * ipcp_type;
                 } create_ipcp;
-        } irm_msg;
+        } msgs;
 };
 
-int client_socket_open(char * file_name);
-int server_socket_open(char * file_name);
+int              client_socket_open(char * file_name);
+int              server_socket_open(char * file_name);
+
+buffer_t *       serialize_irm_msg(struct irm_msg * msg);
+struct irm_msg * deserialize_irm_msg(buffer_t * data);
diff --git a/src/irmd/main.c b/src/irmd/main.c
index b4e43534..d2aa6cd9 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -28,22 +28,44 @@
 #include <ouroboros/irm.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <stdlib.h>
 
 #define BUF_SIZE 256
 
+
+static void create_ipcp(rina_name_t * name,
+                        char * ipcp_type)
+{
+        LOG_DBG("AP name is %s", name->ap_name);
+        LOG_DBG("AP instance id is %d", name->api_id);
+        LOG_DBG("AE name is %s", name->ae_name);
+        LOG_DBG("AE instance id is %d", name->aei_id);
+
+        LOG_DBG("IPCP type is %s", ipcp_type);
+
+        LOG_MISSING;
+}
+
 int main()
 {
         int sockfd;
+        uint8_t * buf;
 
         sockfd = server_socket_open(IRM_SOCK_PATH);
         if (sockfd < 0)
                 return -1;
 
+        buf = malloc(sizeof(buf) * BUF_SIZE);
+        if (!buf) {
+                LOG_ERR("Cannot allocate memory");
+                return -1;
+        }
+
         while (true) {
-                int     cli_sockfd;
-                struct irm_msg_sock msg;
+                int cli_sockfd;
+                struct irm_msg * msg;
                 ssize_t count;
-                char    buf[BUF_SIZE];
+                buffer_t buffer;
 
                 cli_sockfd = accept(sockfd, 0, 0);
                 if (cli_sockfd < 0) {
@@ -52,12 +74,28 @@ int main()
 
                 count = read(cli_sockfd, buf, BUF_SIZE);
                 if (count) {
-                        msg = (struct struct irm_msg_sock) buf;
-                        LOG_INFO("Got message code %d", buf.code);
+                        buffer.size = count;
+                        buffer.data = buf;
+                        msg = deserialize_irm_msg(&buffer);
+                        if (!msg)
+                                continue;
+
+                        LOG_DBG("Got message code %d", msg->code);
+                        switch (msg->code) {
+                        case IRM_CREATE_IPCP:
+                                create_ipcp(msg->msgs.create_ipcp.name,
+                                            msg->msgs.create_ipcp.ipcp_type);
+                                break;
+                        default:
+                                LOG_ERR("Don't know that message code");
+                                break;
+                        }
                 }
 
                 close(cli_sockfd);
         }
 
+        free(buf);
+
         return 0;
 }
diff --git a/src/lib/irm.c b/src/lib/irm.c
index da229d3e..1af8ed2c 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -31,7 +31,8 @@ int irm_create_ipcp(rina_name_t name,
                     char * ipcp_type)
 {
         int sockfd;
-        struct irm_msg_sock msg;
+        struct irm_msg msg;
+        buffer_t * buf;
 
         if (!ipcp_type)
                 return -1;
@@ -41,10 +42,15 @@ int irm_create_ipcp(rina_name_t name,
                 return -1;
 
         msg.code = IRM_CREATE_IPCP;
-        msg.irm_msg.create_ipcp.name = name;
-        msg.irm_msg.create_ipcp.ipcp_type = ipcp_type;
+        msg.msgs.create_ipcp.name = &name;
+        msg.msgs.create_ipcp.ipcp_type = ipcp_type;
+
+        buf = serialize_irm_msg(&msg);
+        if (!buf)
+                return -1;
+
+        write(sockfd, buf->data, buf->size);
 
-        write(sockfd, &msg, sizeof(msg));
         close(sockfd);
 
         return 0;
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
index 8917f55a..9985cd56 100644
--- a/src/lib/sockets.c
+++ b/src/lib/sockets.c
@@ -29,6 +29,9 @@
 #include <sys/un.h>
 #include <sys/stat.h>
 #include <string.h>
+#include <malloc.h>
+
+#define BUFFER_SIZE 256
 
 int client_socket_open(char * file_name)
 {
@@ -92,3 +95,193 @@ int server_socket_open(char * file_name)
 
         return sockfd;
 }
+
+static int serialized_string_len(uint8_t * data)
+{
+        uint8_t * seek = data;
+
+        while (*seek != '\0')
+                seek++;
+
+        return seek - data + 1;
+}
+
+static void ser_copy_value(size_t flen,
+                           void * dst,
+                           void * src,
+                           int * offset)
+{
+        memcpy(dst + *offset, src, flen);
+        *offset += flen;
+}
+
+static void deser_copy_value(size_t flen,
+                             void * dst,
+                             void * src,
+                             int * offset)
+{
+        memcpy(dst, src + *offset, flen);
+        *offset += flen;
+}
+
+static void deser_copy_string(uint8_t * data,
+                              char ** dst,
+                              int * offset)
+{
+        size_t flen;
+
+        flen = serialized_string_len(data + *offset);
+        *dst = malloc(flen + 1);
+        deser_copy_value(flen, *dst, data, offset);
+}
+
+static void deser_copy_int(uint8_t * data,
+                           int * dst,
+                           int * offset)
+{
+        *dst = 0;
+        deser_copy_value(sizeof(int), dst, data, offset);
+}
+
+static void deser_copy_enum(uint8_t * data,
+                            enum irm_msg_code * dst,
+                            int * offset)
+{
+        *dst = 0;
+        deser_copy_value(sizeof(enum irm_msg_code), dst, data, offset);
+}
+
+buffer_t * serialize_irm_msg(struct irm_msg * msg)
+{
+        buffer_t * buf;
+        uint8_t * data;
+        int offset = 0;
+        int i;
+        char buffer[BUFFER_SIZE];
+
+        buf = malloc(sizeof(buf));
+        buf->data = malloc(BUFFER_SIZE);
+        data = buf->data;
+
+        ser_copy_value(sizeof(enum irm_msg_code),
+                       data,
+                       &msg->code,
+                       &offset);
+
+        switch (msg->code) {
+        case IRM_CREATE_IPCP:
+                if (!msg->msgs.create_ipcp.name ||
+                    !msg->msgs.create_ipcp.name->ap_name ||
+                    !msg->msgs.create_ipcp.name->ae_name ||
+                    !msg->msgs.create_ipcp.ipcp_type) {
+                        LOG_ERR("Null pointer passed");
+                        free(buf->data);
+                        free(buf);
+                        return NULL;
+                }
+
+                ser_copy_value(strlen(msg->msgs.create_ipcp.name->ap_name) + 1,
+                               data,
+                               msg->msgs.create_ipcp.name->ap_name,
+                               &offset);
+
+                ser_copy_value(sizeof(int),
+                               data,
+                               &msg->msgs.create_ipcp.name->api_id,
+                               &offset);
+
+                ser_copy_value(strlen(msg->msgs.create_ipcp.name->ae_name) + 1,
+                               data,
+                               msg->msgs.create_ipcp.name->ae_name,
+                               &offset);
+
+                ser_copy_value(sizeof(int),
+                               data,
+                               &msg->msgs.create_ipcp.name->aei_id,
+                               &offset);
+
+                ser_copy_value(strlen(msg->msgs.create_ipcp.ipcp_type) + 1,
+                               data,
+                               msg->msgs.create_ipcp.ipcp_type,
+                               &offset);
+                break;
+        default:
+                LOG_ERR("Don't know that code");
+                free(buf->data);
+                free(buf);
+                return NULL;
+        }
+
+        buf->size = offset;
+
+        for (i = 0; i < buf->size; i++) {
+                if (i > 0) sprintf(buffer + strlen(buffer), ":");
+                sprintf(buffer + strlen(buffer), "%02X", data[i]);
+        }
+        LOG_DBGF("Serialized buffer to %s", buffer);
+
+        return buf;
+}
+
+struct irm_msg * deserialize_irm_msg(buffer_t * data)
+{
+        struct irm_msg * msg;
+        char buffer[BUFFER_SIZE];
+        int i;
+        int offset = 0;
+
+        if (!data || !data->data) {
+                LOG_ERR("Got a null pointer");
+                return NULL;
+        }
+
+        memset(buffer, 0, sizeof(buffer));
+        for (i = 0; i < data->size; i++) {
+                if (i > 0) sprintf(buffer + strlen(buffer), ":");
+                sprintf(buffer + strlen(buffer), "%02X", data->data[i]);
+        }
+        LOG_DBGF("Got buffer %s", buffer);
+
+        msg = malloc(sizeof(msg));
+        if (!msg) {
+                LOG_ERR("Failed to allocate memory");
+                return NULL;
+        }
+
+        deser_copy_enum(data->data,
+                        &msg->code,
+                        &offset);
+
+        switch (msg->code) {
+        case IRM_CREATE_IPCP:
+                msg->msgs.create_ipcp.name =
+                        malloc(sizeof(msg->msgs.create_ipcp.name));
+
+                deser_copy_string(data->data,
+                                  &msg->msgs.create_ipcp.name->ap_name,
+                                  &offset);
+
+                deser_copy_int(data->data,
+                               &msg->msgs.create_ipcp.name->api_id,
+                               &offset);
+
+                deser_copy_string(data->data,
+                                  &msg->msgs.create_ipcp.name->ae_name,
+                                  &offset);
+
+                deser_copy_int(data->data,
+                               &msg->msgs.create_ipcp.name->aei_id,
+                               &offset);
+
+                deser_copy_string(data->data,
+                                  &msg->msgs.create_ipcp.ipcp_type,
+                                  &offset);
+                break;
+        default:
+                LOG_ERR("Don't know that code");
+                free(msg);
+                return NULL;
+        }
+
+        return msg;
+}
diff --git a/src/tools/irm/main.c b/src/tools/irm/main.c
index 6439243c..470a8166 100644
--- a/src/tools/irm/main.c
+++ b/src/tools/irm/main.c
@@ -32,6 +32,8 @@ int main () {
         rina_name_t name;
         name.ap_name = ap_name;
         name.api_id = 1;
+        name.ae_name = "";
+        name.aei_id = 0;
 
         if (irm_create_ipcp(name, ipcp_type)) {
                 LOG_ERR("Failed to create IPCP");
-- 
cgit v1.2.3


From dff374d5f393a6b4bec4877aa1c35ceb70e82843 Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@intec.ugent.be>
Date: Fri, 26 Feb 2016 11:08:55 +0100
Subject: lib, irmd: Address Dimitri's comments

This addresses several comments Dimitri had on the sockets layer code.
---
 include/ouroboros/sockets.h |  5 ++++
 src/irmd/main.c             | 10 ++++---
 src/lib/irm.c               |  4 +--
 src/lib/sockets.c           | 70 +++++++++++++++++++++++++++++++++------------
 4 files changed, 64 insertions(+), 25 deletions(-)

diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h
index ad9bd408..fe7ddb28 100644
--- a/include/ouroboros/sockets.h
+++ b/include/ouroboros/sockets.h
@@ -20,6 +20,9 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#ifndef OUROBOROS_SOCKETS_H
+#define OUROBOROS_SOCKETS_H
+
 #define IRM_SOCK_PATH "/tmp/irm_sock"
 
 enum irm_msg_code {
@@ -47,3 +50,5 @@ int              server_socket_open(char * file_name);
 
 buffer_t *       serialize_irm_msg(struct irm_msg * msg);
 struct irm_msg * deserialize_irm_msg(buffer_t * data);
+
+#endif
diff --git a/src/irmd/main.c b/src/irmd/main.c
index d2aa6cd9..137b2b61 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -29,6 +29,7 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <stdlib.h>
+#include <errno.h>
 
 #define BUF_SIZE 256
 
@@ -55,10 +56,10 @@ int main()
         if (sockfd < 0)
                 return -1;
 
-        buf = malloc(sizeof(buf) * BUF_SIZE);
-        if (!buf) {
+        buf = malloc(sizeof(*buf) * BUF_SIZE);
+        if (buf == NULL) {
                 LOG_ERR("Cannot allocate memory");
-                return -1;
+                return -ENOMEM;
         }
 
         while (true) {
@@ -70,6 +71,7 @@ int main()
                 cli_sockfd = accept(sockfd, 0, 0);
                 if (cli_sockfd < 0) {
                         LOG_ERR("Cannot accept new connection");
+                        continue;
                 }
 
                 count = read(cli_sockfd, buf, BUF_SIZE);
@@ -77,7 +79,7 @@ int main()
                         buffer.size = count;
                         buffer.data = buf;
                         msg = deserialize_irm_msg(&buffer);
-                        if (!msg)
+                        if (msg == NULL)
                                 continue;
 
                         LOG_DBG("Got message code %d", msg->code);
diff --git a/src/lib/irm.c b/src/lib/irm.c
index 1af8ed2c..2c9b530c 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -34,7 +34,7 @@ int irm_create_ipcp(rina_name_t name,
         struct irm_msg msg;
         buffer_t * buf;
 
-        if (!ipcp_type)
+        if (ipcp_type == NULL)
                 return -1;
 
         sockfd = client_socket_open(IRM_SOCK_PATH);
@@ -46,7 +46,7 @@ int irm_create_ipcp(rina_name_t name,
         msg.msgs.create_ipcp.ipcp_type = ipcp_type;
 
         buf = serialize_irm_msg(&msg);
-        if (!buf)
+        if (buf == NULL)
                 return -1;
 
         write(sockfd, buf->data, buf->size);
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
index 9985cd56..095c9e5c 100644
--- a/src/lib/sockets.c
+++ b/src/lib/sockets.c
@@ -103,7 +103,7 @@ static int serialized_string_len(uint8_t * data)
         while (*seek != '\0')
                 seek++;
 
-        return seek - data + 1;
+        return (seek - data) + 1;
 }
 
 static void ser_copy_value(size_t flen,
@@ -124,15 +124,18 @@ static void deser_copy_value(size_t flen,
         *offset += flen;
 }
 
-static void deser_copy_string(uint8_t * data,
-                              char ** dst,
-                              int * offset)
+static int deser_copy_string(uint8_t * data,
+                             char ** dst,
+                             int * offset)
 {
         size_t flen;
 
         flen = serialized_string_len(data + *offset);
-        *dst = malloc(flen + 1);
+        *dst = malloc(sizeof(**dst) * (flen + 1));
+        if (*dst == NULL)
+                return -1;
         deser_copy_value(flen, *dst, data, offset);
+        return 0;
 }
 
 static void deser_copy_int(uint8_t * data,
@@ -159,8 +162,16 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
         int i;
         char buffer[BUFFER_SIZE];
 
-        buf = malloc(sizeof(buf));
+        buf = malloc(sizeof(*buf));
+        if (buf == NULL)
+                return NULL;
+
         buf->data = malloc(BUFFER_SIZE);
+        if (buf->data == NULL) {
+                free(buf);
+                return NULL;
+        }
+
         data = buf->data;
 
         ser_copy_value(sizeof(enum irm_msg_code),
@@ -230,7 +241,8 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
         int i;
         int offset = 0;
 
-        if (!data || !data->data) {
+        if (data == NULL ||
+            data->data == NULL) {
                 LOG_ERR("Got a null pointer");
                 return NULL;
         }
@@ -242,8 +254,8 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
         }
         LOG_DBGF("Got buffer %s", buffer);
 
-        msg = malloc(sizeof(msg));
-        if (!msg) {
+        msg = malloc(sizeof(*msg));
+        if (msg == NULL) {
                 LOG_ERR("Failed to allocate memory");
                 return NULL;
         }
@@ -255,27 +267,47 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)
         switch (msg->code) {
         case IRM_CREATE_IPCP:
                 msg->msgs.create_ipcp.name =
-                        malloc(sizeof(msg->msgs.create_ipcp.name));
+                        malloc(sizeof(*(msg->msgs.create_ipcp.name)));
+                if (!msg->msgs.create_ipcp.name) {
+                        LOG_ERR("Failed to alloc memory");
+                        free(msg);
+                        return NULL;
+                }
 
-                deser_copy_string(data->data,
-                                  &msg->msgs.create_ipcp.name->ap_name,
-                                  &offset);
+                if (deser_copy_string(data->data,
+                                      &msg->msgs.create_ipcp.name->ap_name,
+                                      &offset)) {
+                        free(msg->msgs.create_ipcp.name);
+                        free(msg);
+                        return NULL;
+                }
 
                 deser_copy_int(data->data,
                                &msg->msgs.create_ipcp.name->api_id,
                                &offset);
 
-                deser_copy_string(data->data,
-                                  &msg->msgs.create_ipcp.name->ae_name,
-                                  &offset);
+                if (deser_copy_string(data->data,
+                                      &msg->msgs.create_ipcp.name->ae_name,
+                                      &offset)) {
+                        free(msg->msgs.create_ipcp.name->ap_name);
+                        free(msg->msgs.create_ipcp.name);
+                        free(msg);
+                        return NULL;
+                }
 
                 deser_copy_int(data->data,
                                &msg->msgs.create_ipcp.name->aei_id,
                                &offset);
 
-                deser_copy_string(data->data,
-                                  &msg->msgs.create_ipcp.ipcp_type,
-                                  &offset);
+                if (deser_copy_string(data->data,
+                                      &msg->msgs.create_ipcp.ipcp_type,
+                                      &offset)) {
+                        free(msg->msgs.create_ipcp.name->ae_name);
+                        free(msg->msgs.create_ipcp.name->ap_name);
+                        free(msg->msgs.create_ipcp.name);
+                        free(msg);
+                        return NULL;
+                }
                 break;
         default:
                 LOG_ERR("Don't know that code");
-- 
cgit v1.2.3