[isf-wifidog] patches for portability, compiler warnings

David Young dyoung at pobox.com
Ven 19 Oct 20:26:05 EDT 2007


I am porting the WiFiDog gateway to NetBSD for a client.

I have already produced some patches that I would like to feed back to
you: I have found some issues by compiling with gcc -g -O2 -Wall, so I
fixed those.  I also have produced NetBSD implementations of OS-specific
routines such as get_iface_mac().  My patches, below, should apply to
the WiFiDog sources on the trunk, today.

I will be feeding more patches of this sort to WiFiDog as my project
proceeds.  I hope they are suitable for inclusion in your repository.
Let me know your feedback on the patches.

Beware: I am not compiling or testing these patches on Linux, so there
may be some rough spots.  I am compiling them on NetBSD, however.

My development is mirrored for the public in the Subversion repository
at http://svn.cuwireless.net/svn/cuw/trunk/extern-src/wifidog/.
It may be useful to look at differences from my vendor branch at
http://svn.cuwireless.net/svn/cuw/vendor/wifidog/current/, to see what
I have changed.

Dave

----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:34:36 -0500 (CDT)
Subject: [CUWiN-Commits] r4890 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:34:36 -0500 (Fri, 19 Oct 2007)
New Revision: 4890

Modified:
   cuw/trunk/extern-src/wifidog/src/auth.c
Log:
If the client lookup fails, use r->clientAddr for the name of the
client instead of ip, because ip is never assigned a value.

Delete unused local variable ip.



Modified: cuw/trunk/extern-src/wifidog/src/auth.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/auth.c	2007-10-19 20:22:46 UTC (rev 4889)
+++ cuw/trunk/extern-src/wifidog/src/auth.c	2007-10-19 22:34:36 UTC (rev 4890)
@@ -95,8 +95,7 @@
 {
 	t_client	*client;
 	t_authresponse	auth_response;
-	char	*ip,
-		*mac,
+	char	*mac,
 		*token;
 	char *urlFragment = NULL;
 	s_config	*config = NULL;
@@ -107,7 +106,7 @@
 	client = client_list_find_by_ip(r->clientAddr);
 
 	if (client == NULL) {
-		debug(LOG_ERR, "Could not find client for %s", ip);
+		debug(LOG_ERR, "Could not find client for %s", r->clientAddr);
 		UNLOCK_CLIENT_LIST();
 		return;
 	}

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:35:29 -0500 (CDT)
Subject: [CUWiN-Commits] r4891 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:35:29 -0500 (Fri, 19 Oct 2007)
New Revision: 4891

Modified:
   cuw/trunk/extern-src/wifidog/src/auth.h
Log:
#include "httpd.h" for the definition of type 'request'.



Modified: cuw/trunk/extern-src/wifidog/src/auth.h
===================================================================
--- cuw/trunk/extern-src/wifidog/src/auth.h	2007-10-19 22:34:36 UTC (rev 4890)
+++ cuw/trunk/extern-src/wifidog/src/auth.h	2007-10-19 22:35:29 UTC (rev 4891)
@@ -27,6 +27,8 @@
 #ifndef _AUTH_H_
 #define _AUTH_H_
 
+#include "httpd.h"
+
 /**
  * @brief Authentication codes returned by auth server.
  *

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:35:52 -0500 (CDT)
Subject: [CUWiN-Commits] r4892 - cuw/trunk/extern-src/wifidog/libhttpd

Author: dyoung
Date: 2007-10-19 17:35:52 -0500 (Fri, 19 Oct 2007)
New Revision: 4892

Modified:
   cuw/trunk/extern-src/wifidog/libhttpd/httpd.h
Log:
#include <sys/time.h> for the definition of struct timeval.



Modified: cuw/trunk/extern-src/wifidog/libhttpd/httpd.h
===================================================================
--- cuw/trunk/extern-src/wifidog/libhttpd/httpd.h	2007-10-19 22:35:29 UTC (rev 4891)
+++ cuw/trunk/extern-src/wifidog/libhttpd/httpd.h	2007-10-19 22:35:52 UTC (rev 4892)
@@ -32,6 +32,8 @@
 
 #define LIB_HTTPD_H 1
 
+#include <sys/time.h>
+
 #if !defined(__ANSI_PROTO)
 #if defined(_WIN32) || defined(__STDC__) || defined(__cplusplus)
 #  define __ANSI_PROTO(x)       x

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:39:39 -0500 (CDT)
Subject: [CUWiN-Commits] r4893 - cuw/trunk/extern-src/wifidog/libhttpd

Author: dyoung
Date: 2007-10-19 17:39:39 -0500 (Fri, 19 Oct 2007)
New Revision: 4893

Modified:
   cuw/trunk/extern-src/wifidog/libhttpd/protocol.c
Log:
Use a local variable, time_t t, instead of casting a pointer to
int to pointer to time_t.  time_t could be a 'wider' type than int
on some platforms, so casting an int* to time_t* could have unexpected
results.



Modified: cuw/trunk/extern-src/wifidog/libhttpd/protocol.c
===================================================================
--- cuw/trunk/extern-src/wifidog/libhttpd/protocol.c	2007-10-19 22:35:52 UTC (rev 4892)
+++ cuw/trunk/extern-src/wifidog/libhttpd/protocol.c	2007-10-19 22:39:39 UTC (rev 4893)
@@ -407,10 +407,10 @@
 void _httpd_formatTimeString(char *ptr, int clock)
 {
 	struct 	tm *timePtr;
+	time_t t;
 
-	if (clock == 0)
-		clock = time(NULL);
-	timePtr = gmtime((time_t*)&clock);
+	t = (clock == 0) ? time(NULL) : clock;
+	timePtr = gmtime(&t);
 	strftime(ptr, HTTP_TIME_STRING_LEN,"%a, %d %b %Y %T GMT",timePtr);
 }
 

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:47:25 -0500 (CDT)
Subject: [CUWiN-Commits] r4894 - cuw/trunk/extern-src/wifidog/libhttpd

Author: dyoung
Date: 2007-10-19 17:47:24 -0500 (Fri, 19 Oct 2007)
New Revision: 4894

Modified:
   cuw/trunk/extern-src/wifidog/libhttpd/api.c
Log:
On some platforms, char is signed.  isalpha(3) and isalnum(3) are
undefined for arguments less than 0, so cast a char to unsigned
char before passing to those functions.



Modified: cuw/trunk/extern-src/wifidog/libhttpd/api.c
===================================================================
--- cuw/trunk/extern-src/wifidog/libhttpd/api.c	2007-10-19 22:39:39 UTC (rev 4893)
+++ cuw/trunk/extern-src/wifidog/libhttpd/api.c	2007-10-19 22:47:24 UTC (rev 4894)
@@ -412,7 +412,7 @@
 			** First line.  Scan the request info
 			*/
 			cp = cp2 = buf;
-			while(isalpha(*cp2))
+			while(isalpha((unsigned char)*cp2))
 				cp2++;
 			*cp2 = 0;
 			if (strcasecmp(cp,"GET") == 0)
@@ -870,7 +870,8 @@
 			tmp = src + 1;
 			cp = varName;
 			count2 = 0;
-			while(*tmp&&(isalnum(*tmp)||*tmp == '_')&&count2 < 80)
+			while (*tmp && (isalnum((unsigned char)*tmp) || *tmp == '_') &&
+			       count2 < 80)
 			{
 				*cp++ = *tmp++;
 				count2++;

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:52:32 -0500 (CDT)
Subject: [CUWiN-Commits] r4895 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:52:32 -0500 (Fri, 19 Oct 2007)
New Revision: 4895

Modified:
   cuw/trunk/extern-src/wifidog/src/conf.c
   cuw/trunk/extern-src/wifidog/src/conf.h
Log:
On some platforms, char is signed.  tolower(3) and isdigit(3) are
undefined for arguments less than 0, so cast a char to unsigned
char before passing to those functions.

Move static subroutine declarations from the .h file to the .c
file.



Modified: cuw/trunk/extern-src/wifidog/src/conf.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/conf.c	2007-10-19 22:47:24 UTC (rev 4894)
+++ cuw/trunk/extern-src/wifidog/src/conf.c	2007-10-19 22:52:32 UTC (rev 4895)
@@ -130,6 +130,12 @@
 	{ NULL,                 oBadOption },
 };
 
+static void config_notnull(void *parm, char *parmname);
+static int parse_boolean_value(char *);
+static void parse_auth_server(FILE *, char *, int *);
+static int _parse_firewall_rule(char *ruleset, char *leftover);
+static void parse_firewall_ruleset(char *, FILE *, char *, int *);
+
 static OpCodes config_parse_token(const char *cp, const char *filename, int linenum);
 
 /** Accessor for the current gateway configuration
@@ -479,7 +485,7 @@
 
 	/* lower case */
 	for (i = 0; *(leftover + i) != '\0'
-			&& (*(leftover + i) = tolower(*(leftover + i))); i++);
+			&& (*(leftover + i) = tolower((unsigned char)*(leftover + i))); i++);
 	
 	token = leftover;
 	TO_NEXT_WORD(leftover, finished);
@@ -511,7 +517,7 @@
 		port = leftover;
 		TO_NEXT_WORD(leftover, finished);
 		for (i = 0; *(port + i) != '\0'; i++)
-			if (!isdigit(*(port + i)))
+			if (!isdigit((unsigned char)*(port + i)))
 				all_nums = 0; /*< No longer only digits */
 		if (!all_nums) {
 			debug(LOG_ERR, "Invalid port %s", port);
@@ -535,7 +541,7 @@
 		TO_NEXT_WORD(leftover, finished);
 		all_nums = 1;
 		for (i = 0; *(mask + i) != '\0'; i++)
-			if (!isdigit(*(mask + i)) && (*(mask + i) != '.')
+			if (!isdigit((unsigned char)*(mask + i)) && (*(mask + i) != '.')
 					&& (*(mask + i) != '/'))
 				all_nums = 0; /*< No longer only digits */
 		if (!all_nums) {

Modified: cuw/trunk/extern-src/wifidog/src/conf.h
===================================================================
--- cuw/trunk/extern-src/wifidog/src/conf.h	2007-10-19 22:47:24 UTC (rev 4894)
+++ cuw/trunk/extern-src/wifidog/src/conf.h	2007-10-19 22:52:32 UTC (rev 4895)
@@ -173,11 +173,6 @@
 /** @brief Fetch a firewall rule set. */
 t_firewall_rule *get_ruleset(char *);
 
-static void config_notnull(void *parm, char *parmname);
-static int parse_boolean_value(char *);
-static void parse_auth_server(FILE *, char *, int *);
-static int _parse_firewall_rule(char *ruleset, char *leftover);
-static void parse_firewall_ruleset(char *, FILE *, char *, int *);
 void parse_trusted_mac_list(char *);
 
 #define LOCK_CONFIG() do { \

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:53:41 -0500 (CDT)
Subject: [CUWiN-Commits] r4896 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:53:40 -0500 (Fri, 19 Oct 2007)
New Revision: 4896

Modified:
   cuw/trunk/extern-src/wifidog/src/debug.c
Log:
#include <unistd.h> for getpid(2) declaration.



Modified: cuw/trunk/extern-src/wifidog/src/debug.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/debug.c	2007-10-19 22:52:32 UTC (rev 4895)
+++ cuw/trunk/extern-src/wifidog/src/debug.c	2007-10-19 22:53:40 UTC (rev 4896)
@@ -29,6 +29,7 @@
 #include <syslog.h>
 #include <stdarg.h>
 #include <time.h>
+#include <unistd.h>
 
 #include "conf.h"
 

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:54:48 -0500 (CDT)
Subject: [CUWiN-Commits] r4897 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:54:47 -0500 (Fri, 19 Oct 2007)
New Revision: 4897

Modified:
   cuw/trunk/extern-src/wifidog/src/fw_iptables.c
Log:
get_ext_iface() may return NULL on error.  Detect the condition
and exit.



Modified: cuw/trunk/extern-src/wifidog/src/fw_iptables.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/fw_iptables.c	2007-10-19 22:53:40 UTC (rev 4896)
+++ cuw/trunk/extern-src/wifidog/src/fw_iptables.c	2007-10-19 22:54:47 UTC (rev 4897)
@@ -206,6 +206,11 @@
      }
 	 UNLOCK_CONFIG();
     
+	if (ext_interface == NULL) {
+		debug(LOG_ERR, "FATAL: no external interface");
+		/* XXX leaks safe_strdup()'d strings */
+		return 0;
+	}
 	 /*
 	  *
 	  * Everything in the MANGLE table

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:56:25 -0500 (CDT)
Subject: [CUWiN-Commits] r4898 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:56:24 -0500 (Fri, 19 Oct 2007)
New Revision: 4898

Modified:
   cuw/trunk/extern-src/wifidog/src/gateway.c
Log:
Remove unused variables 'fh' and 'config' in termination_handler()
and main_loop(), respectively.

Check return code of fw_init(), and exit on error.



Modified: cuw/trunk/extern-src/wifidog/src/gateway.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/gateway.c	2007-10-19 22:54:47 UTC (rev 4897)
+++ cuw/trunk/extern-src/wifidog/src/gateway.c	2007-10-19 22:56:24 UTC (rev 4898)
@@ -269,7 +269,6 @@
 termination_handler(int s)
 {
 	static	pthread_mutex_t	sigterm_mutex = PTHREAD_MUTEX_INITIALIZER;
-	s_config *config = config_get_config();
 
 	debug(LOG_INFO, "Handler for termination caught signal %d", s);
 
@@ -367,7 +366,6 @@
 	s_config *config = config_get_config();
 	request *r;
 	void **params;
-    FILE *fh;
 
     /* Set the time when wifidog started */
 	if (!started_time) {
@@ -419,7 +417,10 @@
 	/* Reset the firewall (if WiFiDog crashed) */
 	fw_destroy();
 	/* Then initialize it */
-	fw_init();
+	if (!fw_init()) {
+		debug(LOG_ERR, "FATAL: Failed to initialize firewall");
+		exit(1);
+	}
 
 	/* Start clean up thread */
 	result = pthread_create(&tid_fw_counter, NULL, (void *)thread_client_timeout_check, NULL);

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:56:58 -0500 (CDT)
Subject: [CUWiN-Commits] r4899 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:56:58 -0500 (Fri, 19 Oct 2007)
New Revision: 4899

Modified:
   cuw/trunk/extern-src/wifidog/src/centralserver.h
Log:
#include "auth.h" for t_authcode definition.



Modified: cuw/trunk/extern-src/wifidog/src/centralserver.h
===================================================================
--- cuw/trunk/extern-src/wifidog/src/centralserver.h	2007-10-19 22:56:24 UTC (rev 4898)
+++ cuw/trunk/extern-src/wifidog/src/centralserver.h	2007-10-19 22:56:58 UTC (rev 4899)
@@ -27,6 +27,8 @@
 #ifndef _CENTRALSERVER_H_
 #define _CENTRALSERVER_H_
 
+#include "auth.h"
+
 /** @brief Ask the central server to login a client */
 #define REQUEST_TYPE_LOGIN     "login"
 /** @brief Notify the the central server of a client logout */

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:58:35 -0500 (CDT)
Subject: [CUWiN-Commits] r4900 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:58:35 -0500 (Fri, 19 Oct 2007)
New Revision: 4900

Modified:
   cuw/trunk/extern-src/wifidog/src/centralserver.c
Log:
#include <pthread.h> for pthread(3) prototypes and definitions,
and "firewall.h" for fw_clear_authservers() and fw_set_authservers()
prototypes.



Modified: cuw/trunk/extern-src/wifidog/src/centralserver.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/centralserver.c	2007-10-19 22:56:58 UTC (rev 4899)
+++ cuw/trunk/extern-src/wifidog/src/centralserver.c	2007-10-19 22:58:35 UTC (rev 4900)
@@ -24,6 +24,7 @@
   @author Copyright (C) 2004 Philippe April <papril777 at yahoo.com>
  */
 
+#include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -45,6 +46,7 @@
 #include "conf.h"
 #include "debug.h"
 #include "centralserver.h"
+#include "firewall.h"
 #include "../config.h"
 
 extern pthread_mutex_t	config_mutex;

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:59:20 -0500 (CDT)
Subject: [CUWiN-Commits] r4901 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:59:20 -0500 (Fri, 19 Oct 2007)
New Revision: 4901

Modified:
   cuw/trunk/extern-src/wifidog/src/wdctl_thread.c
Log:
#include "gateway.h" and "safe.h" for prototypes and definitions.

Delete unused local variable 'result' from wdctl_restart().



Modified: cuw/trunk/extern-src/wifidog/src/wdctl_thread.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/wdctl_thread.c	2007-10-19 22:58:35 UTC (rev 4900)
+++ cuw/trunk/extern-src/wifidog/src/wdctl_thread.c	2007-10-19 22:59:20 UTC (rev 4901)
@@ -50,6 +50,8 @@
 #include "firewall.h"
 #include "client_list.h"
 #include "wdctl_thread.h"
+#include "gateway.h"
+#include "safe.h"
 
 /* Defined in clientlist.c */
 extern	pthread_mutex_t	client_list_mutex;
@@ -234,7 +236,6 @@
 		fd;
 	char	*sock_name;
 	struct 	sockaddr_un	sa_un;
-	int result;
 	s_config * conf = NULL;
 	t_client * client = NULL;
 	char * tempstring = NULL;

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 17:59:42 -0500 (CDT)
Subject: [CUWiN-Commits] r4902 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 17:59:42 -0500 (Fri, 19 Oct 2007)
New Revision: 4902

Modified:
   cuw/trunk/extern-src/wifidog/src/ping_thread.c
Log:
#include "centralserver.h" for prototypes and definitions.



Modified: cuw/trunk/extern-src/wifidog/src/ping_thread.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/ping_thread.c	2007-10-19 22:59:20 UTC (rev 4901)
+++ cuw/trunk/extern-src/wifidog/src/ping_thread.c	2007-10-19 22:59:42 UTC (rev 4902)
@@ -50,6 +50,7 @@
 #include "debug.h"
 #include "ping_thread.h"
 #include "util.h"
+#include "centralserver.h"
 
 static void ping(void);
 

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from dyoung at cuw.ojctech.com -----

To: cu-wireless-commits at cuwireless.net
From: dyoung at cuw.ojctech.com
Date: Fri, 19 Oct 2007 18:30:08 -0500 (CDT)
Subject: [CUWiN-Commits] r4903 - cuw/trunk/extern-src/wifidog/src

Author: dyoung
Date: 2007-10-19 18:30:08 -0500 (Fri, 19 Oct 2007)
New Revision: 4903

Modified:
   cuw/trunk/extern-src/wifidog/src/firewall.c
   cuw/trunk/extern-src/wifidog/src/util.c
Log:
Add implementations for NetBSD, bracketed by #if defined(__NetBSD__).

Linux & NetBSD may be able to share much of this code, especially
if getifaddrs(3) in Linux works anything like it does in NetBSD.



Modified: cuw/trunk/extern-src/wifidog/src/firewall.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/firewall.c	2007-10-19 22:59:42 UTC (rev 4902)
+++ cuw/trunk/extern-src/wifidog/src/firewall.c	2007-10-19 23:30:08 UTC (rev 4903)
@@ -57,6 +57,12 @@
 #include <netpacket/packet.h>
 #endif
 
+#if defined(__NetBSD__)
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+#endif
+
 #include "httpd.h"
 #include "safe.h"
 #include "debug.h"
@@ -105,6 +111,7 @@
     return iptables_fw_access(FW_ACCESS_DENY, ip, mac, fw_connection_state);
 }
 
+/* XXX DCY */
 /**
  * Get an IP's MAC address from the ARP cache.
  * Go through all the entries in /proc/net/arp until we find the requested
@@ -156,7 +163,7 @@
              setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &oneopt, sizeof(oneopt)) ||
              setsockopt(icmp_fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1) {
         debug(LOG_ERR, "Cannot create ICMP raw socket.");
-        return;
+        return 0;
     }
 
     debug(LOG_INFO, "Initializing Firewall");
@@ -341,60 +348,60 @@
     UNLOCK_CLIENT_LIST();
 }
 
-void icmp_ping(char *host) {
-  struct sockaddr_in saddr;
-#ifdef __linux__
-  struct { 
-    struct ip ip;
-    struct icmp icmp;
-  } packet;
+void
+icmp_ping(char *host)
+{
+	struct sockaddr_in saddr;
+#if defined(__linux__) || defined(__NetBSD__)
+	struct { 
+		struct ip ip;
+		struct icmp icmp;
+	} packet;
 #endif
-  unsigned int i, j;
-  int opt = 2000;
-  unsigned short id = rand16();
+	unsigned int i, j;
+	int opt = 2000;
+	unsigned short id = rand16();
 
-  saddr.sin_family = AF_INET;
-  saddr.sin_port = 0;
-  inet_aton(host, &saddr.sin_addr);
-#ifdef HAVE_SOCKADDR_SA_LEN
-  saddr.sin_len = sizeof(struct sockaddr_in);
+	memset(&saddr, 0, sizeof(saddr));
+	saddr.sin_family = AF_INET;
+	inet_aton(host, &saddr.sin_addr);
+#if defined(HAVE_SOCKADDR_SA_LEN) || defined(__NetBSD__)
+	saddr.sin_len = sizeof(struct sockaddr_in);
 #endif
 
-  memset(&(saddr.sin_zero), '\0', sizeof(saddr.sin_zero));
+#if defined(__linux__) || defined(__NetBSD__)
+	memset(&packet.icmp, 0, sizeof(packet.icmp));
+	packet.icmp.icmp_type = ICMP_ECHO;
+	packet.icmp.icmp_id = id;
 
-#ifdef __linux__
-  memset(&packet.icmp, 0, sizeof(packet.icmp));
-  packet.icmp.icmp_type = ICMP_ECHO;
-  packet.icmp.icmp_id = id;
-  for (j = 0, i = 0; i < sizeof(struct icmp) / 2; i++)
-    j += ((unsigned short *)&packet.icmp)[i];
-  while (j>>16)
-    j = (j & 0xffff) + (j >> 16);  
-  packet.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;
+	for (j = 0, i = 0; i < sizeof(struct icmp) / 2; i++)
+		j += ((unsigned short *)&packet.icmp)[i];
 
-  if (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1) {
-      debug(LOG_ERR, "setsockopt(): %s", strerror(errno));
-  }
-  if (sendto(icmp_fd, (char *)&packet.icmp, sizeof(struct icmp), 0, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
-      debug(LOG_ERR, "sendto(): %s", strerror(errno));
-  }
-  opt = 1;
-  if (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1) {
-      debug(LOG_ERR, "setsockopt(): %s", strerror(errno));
-  }
+	while (j >> 16)
+		j = (j & 0xffff) + (j >> 16);  
+
+	packet.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;
+
+	if (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1)
+		debug(LOG_ERR, "setsockopt(): %s", strerror(errno));
+
+	if (sendto(icmp_fd, (char *)&packet.icmp, sizeof(struct icmp), 0,
+	           (const struct sockaddr *)&saddr, sizeof(saddr)) == -1)
+		debug(LOG_ERR, "sendto(): %s", strerror(errno));
+
+	opt = 1;
+	if (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1)
+		debug(LOG_ERR, "setsockopt(): %s", strerror(errno));
 #endif
 
-  return;
+	return;
 }
 
 unsigned short rand16(void) {
   static int been_seeded = 0;
 
   if (!been_seeded) {
-    int fd, n = 0;
-    unsigned int c = 0, seed = 0;
-    char sbuf[sizeof(seed)];
-    char *s;
+    unsigned int seed = 0;
     struct timeval now;
 
     /* not a very good seed but what the heck, it needs to be quickly acquired */

Modified: cuw/trunk/extern-src/wifidog/src/util.c
===================================================================
--- cuw/trunk/extern-src/wifidog/src/util.c	2007-10-19 22:59:42 UTC (rev 4902)
+++ cuw/trunk/extern-src/wifidog/src/util.c	2007-10-19 23:30:08 UTC (rev 4903)
@@ -41,6 +41,15 @@
 #include <netinet/in.h>
 #include <sys/ioctl.h>
 
+#if defined(__NetBSD__)
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <util.h>
+#endif
+
 #ifdef __linux__
 #include <net/if.h>
 #endif
@@ -144,44 +153,68 @@
 	return h_addr;
 }
 
-char *get_iface_ip(char *ifname) {
-#ifdef __linux__
-    struct ifreq if_data;
-#endif
-    struct in_addr in;
-    char *ip_str;
-    int sockd;
-    u_int32_t ip;
+char *
+get_iface_ip(char *ifname)
+{
+#if defined(__linux__)
+	struct ifreq if_data;
+	struct in_addr in;
+	char *ip_str;
+	int sockd;
+	u_int32_t ip;
 
-#ifdef __linux__
-    
-    /* Create a socket */
-    if ((sockd = socket (AF_INET, SOCK_PACKET, htons(0x8086))) < 0) {
-        debug(LOG_ERR, "socket(): %s", strerror(errno));
-        return NULL;
-    }
+	/* Create a socket */
+	if ((sockd = socket (AF_INET, SOCK_PACKET, htons(0x8086))) < 0) {
+		debug(LOG_ERR, "socket(): %s", strerror(errno));
+		return NULL;
+	}
 
-    /* Get IP of internal interface */
-    strcpy (if_data.ifr_name, ifname);
+	/* Get IP of internal interface */
+	strcpy (if_data.ifr_name, ifname);
 
-    /* Get the IP address */
-    if (ioctl (sockd, SIOCGIFADDR, &if_data) < 0) {
-        debug(LOG_ERR, "ioctl(): SIOCGIFADDR %s", strerror(errno));
-        return NULL;
-    }
-    memcpy ((void *) &ip, (void *) &if_data.ifr_addr.sa_data + 2, 4);
-    in.s_addr = ip;
+	/* Get the IP address */
+	if (ioctl (sockd, SIOCGIFADDR, &if_data) < 0) {
+		debug(LOG_ERR, "ioctl(): SIOCGIFADDR %s", strerror(errno));
+		return NULL;
+	}
+	memcpy ((void *) &ip, (void *) &if_data.ifr_addr.sa_data + 2, 4);
+	in.s_addr = ip;
 
-    ip_str = (char *)inet_ntoa(in);
-    close(sockd);
-    return safe_strdup(ip_str);
+	ip_str = (char *)inet_ntoa(in);
+	close(sockd);
+	return safe_strdup(ip_str);
+#elif defined(__NetBSD__)
+	struct ifaddrs *ifa, *ifap;
+	char *str = NULL;
+
+	if (getifaddrs(&ifap) == -1) {
+		debug(LOG_ERR, "getifaddrs(): %s", strerror(errno));
+		return NULL;
+	}
+	/* XXX arbitrarily pick the first IPv4 address */
+	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+		if (strcmp(ifa->ifa_name, ifname) == 0 &&
+		    ifa->ifa_addr->sa_family == AF_INET)
+			break;
+	}
+	if (ifa == NULL) {
+		debug(LOG_ERR, "%s: no IPv4 address assigned");
+		goto out;
+	}
+	str = safe_strdup(inet_ntoa(
+	    ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr));
+out:
+	freeifaddrs(ifap);
+	return str;
 #else
-    return safe_strdup("0.0.0.0");
+	return safe_strdup("0.0.0.0");
 #endif
 }
 
-char *get_iface_mac (char *ifname) {
-#ifdef __linux__
+char *
+get_iface_mac(char *ifname)
+{
+#if defined(__linux__)
     int r, s;
     struct ifreq ifr;
     char *hwaddr, mac[13];
@@ -202,7 +235,8 @@
     }
 
     hwaddr = ifr.ifr_hwaddr.sa_data;
-    snprintf(mac, 13, "%02X%02X%02X%02X%02X%02X", 
+    close(s);
+    snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X", 
        hwaddr[0] & 0xFF,
        hwaddr[1] & 0xFF,
        hwaddr[2] & 0xFF,
@@ -211,14 +245,45 @@
        hwaddr[5] & 0xFF
        );
        
-    close(s);
     return safe_strdup(mac);
+#elif defined(__NetBSD__)
+	struct ifaddrs *ifa, *ifap;
+	const char *hwaddr;
+	char mac[13], *str = NULL;
+	struct sockaddr_dl *sdl;
+
+	if (getifaddrs(&ifap) == -1) {
+		debug(LOG_ERR, "getifaddrs(): %s", strerror(errno));
+		return NULL;
+	}
+	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+		if (strcmp(ifa->ifa_name, ifname) == 0 &&
+		    ifa->ifa_addr->sa_family == AF_LINK)
+			break;
+	}
+	if (ifa == NULL) {
+		debug(LOG_ERR, "%s: no link-layer address assigned");
+		goto out;
+	}
+	sdl = (struct sockaddr_dl *)ifa->ifa_addr;
+	hwaddr = LLADDR(sdl);
+	snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X",
+	    hwaddr[0] & 0xFF, hwaddr[1] & 0xFF,
+	    hwaddr[2] & 0xFF, hwaddr[3] & 0xFF,
+	    hwaddr[4] & 0xFF, hwaddr[5] & 0xFF);
+
+	str = safe_strdup(mac);
+out:
+	freeifaddrs(ifap);
+	return str;
 #else
     return NULL;
 #endif
 }
 
-char *get_ext_iface (void) {
+char *
+get_ext_iface(void)
+{
 #ifdef __linux__
     FILE *input;
     char *device, *gw;
@@ -233,6 +298,7 @@
     while(keep_detecting) {
         input = fopen("/proc/net/route", "r");
         while (!feof(input)) {
+	    /* XXX scanf(3) is unsafe, risks overrun */ 
             fscanf(input, "%s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s\n", device, gw);
             if (strcmp(gw, "00000000") == 0) {
                 free(gw);

_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----
----- Forwarded message from David Young <dyoung at cuw.ojctech.com> -----

To: cu-wireless-commits at cuwireless.net
Date: Fri, 19 Oct 2007 18:46:22 -0500 (CDT)
From: dyoung at cuw.ojctech.com (David Young)
Subject: [CUWiN-Commits] svn:log 4903 change notice

*** old svn:log r4903 ***

Add implementations for NetBSD, bracketed by #if defined(__NetBSD__).

Linux & NetBSD may be able to share much of this code, especially
if getifaddrs(3) in Linux works anything like it does in NetBSD.


*** new svn:log r4903 ***

Add implementations for NetBSD, bracketed by #if defined(__NetBSD__).

Linux & NetBSD may be able to share much of this code, especially
if getifaddrs(3) in Linux works anything like it does in NetBSD.

While I am here: since fw_init() has return type 'int', make it
always return with a value.  Remove many unused local variables
from rand16().

Use a slightly safer snprintf(3) idiom in get_iface_mac(), and note
risky fscanf(3) usage in get_ext_iface().
_______________________________________________
CU-Wireless-Commits mailing list
CU-Wireless-Commits at cuwireless.net
http://lists.chambana.net/cgi-bin/listinfo/cu-wireless-commits

----- End forwarded message -----

-- 
David Young             OJC Technologies
dyoung at ojctech.com      Urbana, IL * (217) 278-3933 ext 24


Plus d'informations sur la liste de diffusion WiFiDog