added OS-specific function to make a file descriptor/socket non-blocking
authorBernd Petrovitsch <bernd@firmix.at>
Sun, 16 Nov 2008 18:11:56 +0000 (19:11 +0100)
committerBernd Petrovitsch <bernd@firmix.at>
Sun, 16 Nov 2008 18:11:56 +0000 (19:11 +0100)
We have this in various places and Win32 is +completely different anyways.
So add a separate function and use it.

lib/arprefresh/src/olsrd_arprefresh.c
lib/txtinfo/src/olsrd_txtinfo.c
src/bsd/net.c
src/linux/net.c
src/main.c
src/misc.h
src/unix/misc.c
src/win32/misc.c

index d170bd6..f31bf73 100644 (file)
@@ -54,6 +54,7 @@
 #include "olsrd_arprefresh.h"
 #include "kernel_routes.h"
 #include "scheduler.h"
+#include "misc.h"
 
 #undef ARPREFRESH_DEBUG
 #define PLUGIN_INTERFACE_VERSION 5
@@ -162,7 +163,6 @@ int olsrd_plugin_init(void)
        arp_event_timer_cookie  = olsr_alloc_cookie("Arprefresh: event", OLSR_COOKIE_TYPE_TIMER);
        if (AF_INET == olsr_cnf->ip_version)
        {
-               int flags;
                struct sock_fprog filter;
                struct sock_filter BPF_code[]=
                {
@@ -187,8 +187,7 @@ int olsrd_plugin_init(void)
                filter.len = sizeof(BPF_code) / sizeof(BPF_code[0]);
                filter.filter = BPF_code;
                if (0 <= (arprefresh_sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) &&
-                   0 <= (flags = fcntl(arprefresh_sockfd, F_GETFL)) &&
-                   0 <= fcntl(arprefresh_sockfd, F_SETFL, flags | O_NONBLOCK) &&
+                   0 <= set_nonblocking(arprefresh_sockfd) &&
                    0 <= setsockopt(arprefresh_sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)))
                {
                        /* Register the ARP refresh event */
index 9c9bfd9..0401a23 100644 (file)
 #include "mid_set.h"
 #include "routing_table.h"
 #include "log.h"
+#include "misc.h"
 
 #include "common/autobuf.h"
 
-#include <errno.h>
 #include <unistd.h>
-#include <fcntl.h>
+#include <errno.h>
 
 #ifdef WIN32
 #undef EWOULDBLOCK
@@ -92,8 +92,6 @@ static int ipc_socket = -1;
 
 static void conn_destroy(struct ipc_conn *);
 
-static int set_nonblocking(int);
-
 static void ipc_action(int, void *, unsigned int);
 
 static void ipc_http(int, void *, unsigned int);
@@ -238,31 +236,6 @@ static void kill_connection(int fd, struct ipc_conn *conn)
     conn_destroy(conn);
 }
 
-static int set_nonblocking(int fd)
-{
-    /* make the fd non-blocking */
-#ifdef WIN32
-    unsigned long flags = 1;
-    if (ioctlsocket(fd, FIONBIO, &flags) != 0) {
-        const long int save_errno = errno;
-        olsr_printf(0, "(TXTINFO) ioctlsocket()=%ld/%s\n", save_errno, strerror(save_errno));
-        olsr_syslog(OLSR_LOG_ERR, "(TXTINFO) Cannot set the socket flags: %s", strerror(save_errno));
-        return -1;
-    }
-#else
-    int socket_flags = fcntl(fd, F_GETFL);
-    if (socket_flags < 0) {
-        olsr_syslog(OLSR_LOG_ERR, "(TXTINFO) Cannot get the socket flags: %s", strerror(errno));
-        return -1;
-    }
-    if (fcntl(fd, F_SETFL, socket_flags|O_NONBLOCK) < 0) {
-        olsr_syslog(OLSR_LOG_ERR, "(TXTINFO) Cannot set the socket flags: %s", strerror(errno));
-        return -1;
-    }
-#endif
-    return 0;
-}
-
 static void ipc_action(int fd, void *data __attribute__((unused)), unsigned int flags __attribute__((unused)))
 {
     struct ipc_conn *conn;
index 1857ea8..2be1b84 100644 (file)
@@ -45,6 +45,7 @@
 #include "../parser.h"         /* dnc: needed for call to packet_parser() */
 #include "../olsr_protocol.h"
 #include "../common/string.h"
+#include "../misc.h"
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -403,14 +404,7 @@ getsocket(int bufspace, char *int_name __attribute__ ((unused)))
     return -1;
   }
 
-  on = fcntl(sock, F_GETFL);
-  if (on == -1) {
-    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
-  } else {
-    if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) {
-      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-    }
-  }
+  set_nonblocking(sock);
   return (sock);
 }
 
@@ -473,14 +467,7 @@ getsocket6(int bufspace, char *int_name __attribute__ ((unused)))
     return -1;
   }
 
-  on = fcntl(sock, F_GETFL);
-  if (on == -1) {
-    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
-  } else {
-    if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) {
-      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-    }
-  }
+  set_nonblocking(sock);
   return sock;
 }
 
index 9fd243d..2e22ace 100644 (file)
@@ -47,6 +47,7 @@
 #include "../ipcalc.h"
 #include "../common/string.h"
 #include "../olsr_protocol.h"
+#include "../misc.h"
 
 #include <net/if.h>
 
@@ -463,14 +464,7 @@ getsocket(int bufspace, char *int_name)
     return -1;
   }
 
-  on = fcntl(sock, F_GETFL);
-  if (on == -1) {
-    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
-  } else {
-    if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
-      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-    }
-  }
+  set_nonblocking(sock);
   return sock;
 }
 
@@ -567,14 +561,7 @@ getsocket6(int bufspace, char *int_name)
     return (-1);
   }
 
-  on = fcntl(sock, F_GETFL);
-  if (on == -1) {
-    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
-  } else {
-    if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
-      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-    }
-  }
+  set_nonblocking(sock);
   return sock;
 }
 
index e105aba..642ce9e 100644 (file)
@@ -57,6 +57,7 @@
 #include "build_msg.h"
 #include "net_olsr.h"
 #include "ipc_frontend.h"
+#include "misc.h"
 #include "common/string.h"
 
 #if LINUX_POLICY_ROUTING
@@ -260,7 +261,7 @@ main(int argc, char *argv[])
     olsr_syslog(OLSR_LOG_ERR, "rtnetlink socket: %m");
     olsr_exit(__func__, 0);
   }
-  fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK);
+  set_nonblocking(olsr_cnf->rtnl_s);
 #endif
 
 /*
index 0e56e6b..c35e671 100644 (file)
 
 void clear_console(void);
 
+int set_nonblocking(int fd);
+
 #endif
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */
index 94b3ee7..b87e9ae 100644 (file)
  *
  */
 
+#include "misc.h"
+#include "log.h"
 
 #include <stdio.h>
+#include <string.h>
 #include <unistd.h>
-#include "misc.h"
-#include "olsr_types.h"
+#include <fcntl.h>
+#include <errno.h>
 
 void clear_console(void)
 {
@@ -50,23 +53,42 @@ void clear_console(void)
   static char clear_buff[100];
   int i;
 
-  if (len < 0)
-    {
-      FILE *pip = popen("clear", "r");
-      for (len = 0; len < (int)sizeof(clear_buff); len++)
-        {
-          int c = fgetc(pip);
-          if (c == EOF)
+  if (len < 0) {
+    FILE *pip = popen("clear", "r");
+    for (len = 0; len < (int)sizeof(clear_buff); len++) {
+      int c = fgetc(pip);
+      if (c == EOF) {
             break;
-
-          clear_buff[len] = c;
-        }
-
-      pclose(pip);
+      }
+      clear_buff[len] = c;
     }
 
-  for (i = 0; i < len; i++)
-    fputc(clear_buff[i], stdout);
+    pclose(pip);
+  }
 
+  for (i = 0; i < len; i++) {
+    fputc(clear_buff[i], stdout);
+  }
   fflush(stdout);
 }
+
+int set_nonblocking(int fd)
+{
+    /* make the fd non-blocking */
+    int socket_flags = fcntl(fd, F_GETFL);
+    if (socket_flags < 0) {
+        olsr_syslog(OLSR_LOG_ERR, "Cannot get the socket flags: %s", strerror(errno));
+        return -1;
+    }
+    if (fcntl(fd, F_SETFL, socket_flags|O_NONBLOCK) < 0) {
+        olsr_syslog(OLSR_LOG_ERR, "Cannot set the socket flags: %s", strerror(errno));
+        return -1;
+    }
+    return 0;
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */
index d9600de..0eebe4d 100644 (file)
  *
  */
 
-#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef interface
 
-#include <misc.h>
+#include "misc.h"
+#include "log.h"
 
 void clear_console(void)
 {
@@ -73,3 +73,20 @@ void clear_console(void)
   SetConsoleCursorPosition(Hand, Home);
 #endif
 }
+
+int set_nonblocking(int fd)
+{
+    /* make the fd non-blocking */
+    unsigned long flags = 1;
+    if (ioctlsocket(fd, FIONBIO, &flags) != 0) {
+        olsr_syslog(OLSR_LOG_ERR, "Cannot set the socket flags: %s", StrError(WSAGetLastError()));
+        return -1;
+    }
+    return 0;
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */