dslinux/user/wfcdump wfcdump.c
stsp
stsp at user.in-berlin.de
Mon Jul 3 02:08:35 CEST 2006
Update of /cvsroot/dslinux/dslinux/user/wfcdump
In directory antilope:/tmp/cvs-serv14548
Modified Files:
wfcdump.c
Log Message:
Fix wep key printing.
Index: wfcdump.c
===================================================================
RCS file: /cvsroot/dslinux/dslinux/user/wfcdump/wfcdump.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- wfcdump.c 27 Jun 2006 22:07:22 -0000 1.8
+++ wfcdump.c 3 Jul 2006 00:08:33 -0000 1.9
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <errno.h>
typedef int bool;
#define true 1
@@ -33,6 +34,10 @@
#define WEP_MODE_OFFSET 0xE6
#define STATUS_OFFSET 0xE7
+#define WEP_MODE_OFF 0
+#define WEP_MODE_40BIT 1
+#define WEP_MODE_128BIT 2
+
#define FIRMWARE_FILE "/dev/firmware"
#define DEFAULT_CONFIG 0
@@ -66,16 +71,16 @@
exit(1);
}
-/* Prints n in quad dotted notation. If reverse is set,
- * reverse byte order before printing. */
+/* Print n in dotted quad notation. If reverse is set,
+ * print bytes in reverse order. */
void print_dotquad(unsigned long n, bool reverse)
{
if (reverse)
- printf("%lu.%lu.%lu.%lu", (n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff,
- n & 0xff);
+ printf("%lu.%lu.%lu.%lu", (n >> 24) & 0xff, (n >> 16) & 0xff,
+ (n >> 8) & 0xff, n & 0xff);
else
- printf("%lu.%lu.%lu.%lu", n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff,
- (n >> 24) & 0xff);
+ printf("%lu.%lu.%lu.%lu", n & 0xff, (n >> 8) & 0xff,
+ (n >> 16) & 0xff, (n >> 24) & 0xff);
}
unsigned long read_ulong(int offset)
@@ -83,7 +88,7 @@
int base = WFC_SETTINGS + ((config) << 8);
if (fseek(f, base + offset, SEEK_SET) != 0)
die();
- int out = 0;
+ unsigned long out = 0;
if (fread(&out, sizeof(out), 1, f) < 1)
die();
return out;
@@ -130,12 +135,36 @@
void print_wep()
{
- int base, i;
+ int base, i, mode, len;
base = WFC_SETTINGS + ((config) << 8);
+ if (fseek(f, base + WEP_MODE_OFFSET, SEEK_SET) != 0)
+ die();
+
+ len = 0;
+ mode = (fgetc(f) & 0x0F);
+
+ switch (mode) {
+ case WEP_MODE_OFF:
+ fprintf(stderr, "wfcdump: wep is disabled in "
+ "configuration %i\n", config + 1);
+ return;
+ case WEP_MODE_40BIT:
+ len = 5;
+ break;
+ case WEP_MODE_128BIT:
+ len = 13; /* 128 bit is actually 104 bit */
+ break;
+ default:
+ fprintf(stderr, "wfcdump: unknown wep mode %i read from "
+ "firmware\n", mode);
+ errno = EINVAL;
+ die();
+ }
+
if (fseek(f, base + WEP_OFFSET, SEEK_SET) != 0)
die();
- for (i = 0; i < 16; i++)
+ for (i = 0; i < len; i++)
printf("%02x", fgetc(f));
printf("\n");
}
More information about the dslinux-commit
mailing list