Fix try to open the socket until over limit
authorNeutron Soutmun <neo.neutron@gmail.com>
Fri, 22 Aug 2008 19:55:53 +0000 (02:55 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Sun, 2 Nov 2008 19:43:11 +0000 (02:43 +0700)
2008-08-23  Neutron Soutmun <neo.neutron@gmail.com>

* src/rahunasd.h:
  - Fix typo the project name, it is shame.
  - Change POLLING interval from 30 seconds to 60 seconds,
    try to prevent the socket access overload.
* src/rh-ipset.{h,c}:
  - Try to open the socket until over the limit GETSOCK_TRIES before exit with    EXIT_FAILURE status.

ChangeLog
src/rahunasd.h
src/rh-ipset.c
src/rh-ipset.h

index 8ab5e7a..ae8152a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-08-23  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * src/rahunasd.h:
+         - Fix typo the project name, it is shame.
+         - Change POLLING interval from 30 seconds to 60 seconds, 
+           try to prevent the socket access overload.
+       * src/rh-ipset.{h,c}:
+         - Try to open the socket until over the limit GETSOCK_TRIES before exit with            EXIT_FAILURE status.
+
 2008-08-22  Neutron Soutmun <neo.neutron@gmail.com>
 
        * src/rahunasd.c, src/rh-xmlrpc-server.c:
index 708d32b..4f9cd0a 100644 (file)
@@ -13,7 +13,7 @@
 #include <time.h>
 #include <linux/if_ether.h>
 
-#define PROGRAM "RuhuNASd"
+#define PROGRAM "RahuNASd"
 #define VERSION "0.1.1"
 #define MAX_MEMBERS 0x00FFFF
 
@@ -21,7 +21,7 @@
 #define DEFAULT_LOG "/var/log/rahunas/rahunas.log"
 #define DEFAULT_PID "/var/run/rahunasd.pid"
 #define IDLE_THRESHOLD 600
-#define POLLING 30 
+#define POLLING 60 
 #define SET_NAME "rahunas_set"
 #define XMLSERVICE_HOST        "localhost"
 #define XMLSERVICE_PORT        8888
index 9832b81..f94eaf0 100644 (file)
@@ -17,14 +17,20 @@ extern ip_set_id_t max_sets;
 int kernel_getsocket(void)
 {
   int sockfd = -1;
-
-  sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
-  if (sockfd <0) {
-    syslog(LOG_ERR, "You need to be root to run this daemon.");
-    exit(EXIT_FAILURE);
+  int tries = GETSOCK_TRIES;
+
+  while (tries > 0) {
+    sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
+    if (sockfd < 0) {
+      syslog(LOG_ERR, "Failed kernel_getsocket(), Retry....");
+      sleep(2);
+    } else {
+      return sockfd;
+    }
+    tries--;
   }
   
-  return sockfd;
+  exit(EXIT_FAILURE);
 }
 
 int wrapped_getsockopt(void *data, socklen_t *size)
@@ -32,6 +38,9 @@ int wrapped_getsockopt(void *data, socklen_t *size)
   int res;
   int sockfd = kernel_getsocket();
 
+  if (sockfd < 0)
+    return -1;
+
   /* Send! */
   res = getsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
   if (res != 0)
@@ -45,6 +54,9 @@ int wrapped_setsockopt(void *data, socklen_t size)
   int res;
   int sockfd = kernel_getsocket();
 
+  if (sockfd < 0)
+    return -1;
+
   /* Send! */
   res = setsockopt(sockfd, SOL_IP, SO_IP_SET, data, size);
   if (res != 0)
index 327e4f9..c6f7388 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/netfilter_ipv4/ip_set.h>
 #include <linux/netfilter_ipv4/ip_set_rahunas.h>
 
+#define GETSOCK_TRIES 5
 #define LIST_TRIES 5
 
 /* The view of an ipset in userspace */