Add utility functions
authorNeutron Soutmun <neo.neutron@gmail.com>
Sat, 30 Aug 2008 19:14:57 +0000 (02:14 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Sun, 2 Nov 2008 19:43:11 +0000 (02:43 +0700)
2008-08-31  Neutron Soutmun <neo.neutron@gmail.com>

* +src/rh-utils.{h,c}: Add new utility functions.
* src/rahunasd.{h,c}:
  - Move rh_malloc() and rh_free() to rh-utils.
  - include file rh-utils.h which now provide rh_{malloc,free}().
* src/rh-ipset.c: include file rh-utils.h.
* src/rh-xmlrpc-server.c:
  - Implement new function rh_string_get_sep() which more clean looking code.
* src/Makefile.am: Update accordingly to new change.

ChangeLog
src/Makefile.am
src/rahunasd.c
src/rahunasd.h
src/rh-ipset.c
src/rh-utils.c [new file with mode: 0644]
src/rh-utils.h [new file with mode: 0644]
src/rh-xmlrpc-server.c

index 7e99a6b..c1aede5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-08-31  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * +src/rh-utils.{h,c}: Add new utility functions.
+       * src/rahunasd.{h,c}: 
+         - Move rh_malloc() and rh_free() to rh-utils.
+         - include file rh-utils.h which now provide rh_{malloc,free}().
+       * src/rh-ipset.c: include file rh-utils.h.
+       * src/rh-xmlrpc-server.c:
+         - Implement new function rh_string_get_sep() which more clean looking code.
+       * src/Makefile.am: Update accordingly to new change.
+
 2008-08-25  Neutron Soutmun <neo.neutron@gmail.com>
 
        * src/rh-ipset.c:
index 8f1ccd1..147144b 100644 (file)
@@ -7,7 +7,8 @@ AM_CFLAGS = $(LIBGNET_CFLAGS) -I$(top_builddir)/src/include/ \
 
 rahunasd_SOURCES = rahunasd.c \
        rh-xmlrpc-server.c \
-  rh-ipset.c   
+  rh-ipset.c \
+       rh-utils.c
 
 rahunasd_LDADD =  \
        $(top_builddir)/xmlrpc/libgnetxmlrpc.a \
index 4d27c4b..211e1ba 100644 (file)
@@ -21,6 +21,7 @@
 #include "rahunasd.h"
 #include "rh-xmlrpc-server.h"
 #include "rh-ipset.h"
+#include "rh-utils.h"
 
 /* Abstract functions */
 int logmsg(int priority, const char *msg, ...); 
@@ -82,30 +83,6 @@ char *idtoip(struct rahunas_map *map, uint32_t id) {
   return inet_ntoa(sess_addr);
 }
 
-void *rh_malloc(size_t size)
-{
-  void *p;
-  
-  if (size == 0)
-    return NULL;
-
-  if ((p = malloc(size)) == NULL) {
-    syslog(LOG_ERR, "RahuNASd: not enough memory");
-    exit(EXIT_FAILURE);
-  } 
-
-  return p;
-}
-
-void rh_free(void **data)
-{
-  if (*data == NULL)
-    return;
-
-  free(*data);
-  *data = NULL;
-}
-
 void rh_free_member (struct rahunas_member *member)
 {
   if (member->username && member->username != termstring)
index 4f9cd0a..e5c9b9d 100644 (file)
@@ -64,9 +64,6 @@ struct rahunas_member {
 uint32_t iptoid(struct rahunas_map *map, const char *ip);
 char *idtoip(struct rahunas_map *map, uint32_t id);
 
-void *rh_malloc(size_t size);
-void rh_free(void **data);
-
 void rh_free_member (struct rahunas_member *member);
 
 static char *timemsg()
index 580e514..60044b0 100644 (file)
@@ -10,6 +10,7 @@
 #include <unistd.h>
 #include <syslog.h>
 #include "rh-ipset.h"
+#include "rh-utils.h"
 
 extern struct set **set_list;
 extern ip_set_id_t max_sets;
diff --git a/src/rh-utils.c b/src/rh-utils.c
new file mode 100644 (file)
index 0000000..e90d32a
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * utility functions header
+ * Author: Neutron Soutmun <neo.neutron@gmail.com>
+ * Date:   2008-08-31
+ */
+
+#include <syslog.h>
+#include <glib.h>
+
+#include "rh-utils.h"
+
+void *rh_malloc(size_t size)
+{
+  void *p;
+  
+  if (size == 0)
+    return NULL;
+
+  if ((p = malloc(size)) == NULL) {
+    syslog(LOG_ERR, "RahuNASd: not enough memory");
+    exit(EXIT_FAILURE);
+  } 
+
+  return p;
+}
+
+void rh_free(void **data)
+{
+  if (*data == NULL)
+    return;
+
+  free(*data);
+  *data = NULL;
+}
+
+const char *rh_string_get_sep(const char *haystack, const char *sep, 
+                              unsigned short idx)
+{
+  char* result = NULL;
+  gchar *pStart = NULL;
+  gchar *pEnd   = NULL;
+  gchar *pLast  = NULL;
+  unsigned short current_idx = 0;
+  unsigned short isFound = 0;
+
+  if (!haystack) {
+    return NULL;
+  }
+
+  pEnd = haystack;
+  pLast = haystack + strlen(haystack);
+  while (!isFound) {
+    pStart = pEnd;
+    if (pStart == pLast) {
+      // Finding the separator fail
+      return NULL;
+    }
+
+    pEnd = g_strstr_len(pStart, strlen(pStart), sep);  
+    pEnd = pEnd == NULL ? pLast : pEnd;
+
+    current_idx++;
+
+    if (current_idx == idx) {
+      result = g_strndup(pStart, pEnd - pStart);
+      return result;
+    } else {
+      pEnd++;
+    }
+  }
+}
diff --git a/src/rh-utils.h b/src/rh-utils.h
new file mode 100644 (file)
index 0000000..835b2f0
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * utility functions header
+ * Author: Neutron Soutmun <neo.neutron@gmail.com>
+ * Date:   2008-08-31
+ */
+#include <stdlib.h>
+
+void *rh_malloc(size_t size);
+void rh_free(void **data);
+
+const char *rh_string_get_sep(const char *haystack, const char *sep, 
+                              unsigned short idx);
index b812b13..5af88c5 100644 (file)
@@ -9,6 +9,7 @@
 #include "rahunasd.h"
 #include "rh-xmlrpc-server.h"
 #include "rh-ipset.h"
+#include "rh-utils.h"
 
 extern struct set *rahunas_set;
 extern const char* termstring;
@@ -26,8 +27,6 @@ int do_startsession(GNetXmlRpcServer *server,
        gchar *username = NULL;
        gchar *session_id = NULL;
   gchar *mac_address = NULL;
-       gchar *pStart = NULL;
-       gchar *pEnd = NULL;
        uint32_t id;
   int res = 0;
 
@@ -42,33 +41,15 @@ int do_startsession(GNetXmlRpcServer *server,
 
        members = map->members;
 
-  pStart = param;
-       pEnd = g_strstr_len(pStart, strlen(pStart), "|");
-       if (pEnd == NULL) {
-         goto out;
-       }
+       ip          = rh_string_get_sep(param, "|", 1);
+       username    = rh_string_get_sep(param, "|", 2);
+       session_id  = rh_string_get_sep(param, "|", 3);
+  mac_address = rh_string_get_sep(param, "|", 4);
 
-       ip = g_strndup(pStart, pEnd - pStart);
-  if (ip == NULL)
+  if (ip == NULL || username == NULL 
+        || session_id == NULL || mac_address == NULL)
     goto out;
 
-       pStart = pEnd + 1;
-       pEnd = g_strstr_len(pStart, strlen(pStart), "|");
-       if (pEnd == NULL) {
-    goto out;
-       }
-       username = g_strndup(pStart, pEnd - pStart);
-
-  pStart = pEnd + 1;
-       pEnd = g_strstr_len(pStart, strlen(pStart), "|");
-       if (pEnd == NULL) {
-    goto out;
-       }
-       session_id = g_strndup(pStart, pEnd - pStart);
-
-       pStart = pEnd + 1;
-  mac_address = g_strndup(pStart, strlen(pStart));
-
        id = iptoid(map, ip);
 
        if (id < 0) {
@@ -131,8 +112,6 @@ int do_stopsession(GNetXmlRpcServer *server,
        struct rahunas_member *members;
        gchar *ip = NULL;
        gchar *mac_address = NULL;
-       gchar *pStart = NULL;
-       gchar *pEnd = NULL;
        uint32_t   id;
   int res = 0;
   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
@@ -150,19 +129,10 @@ int do_stopsession(GNetXmlRpcServer *server,
 
   DP("RPC Receive: %s", param);
 
-  pStart = param;
-       pEnd = g_strstr_len(pStart, strlen(pStart), "|");
-       if (pEnd == NULL) {
-         goto out;
-       }
-
-       ip = g_strndup(pStart, pEnd - pStart);
-  if (ip == NULL)
-    goto out;
+  ip          = rh_string_get_sep(param, "|", 1);
+  mac_address = rh_string_get_sep(param, "|", 2);
 
-       pStart = pEnd + 1;
-  mac_address = g_strndup(pStart, strlen(pStart));
-  if (mac_address == NULL)
+  if (ip == NULL || mac_address == NULL)
     goto out;
 
        id = iptoid(map, ip);