[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