From 0dca330e46ffe5fe5dc5973af026f83b4d06be01 Mon Sep 17 00:00:00 2001
From: michael <michael>
Date: Sun, 8 Apr 2007 19:07:05 +0000
Subject: [PATCH] make parallel port numbers permanent across program restarts

---
 usb-driver.c | 62 ++++++++++++++++++++++++----------------------------
 usb-driver.h |  6 -----
 2 files changed, 29 insertions(+), 39 deletions(-)

diff --git a/usb-driver.c b/usb-driver.c
index 7efb628..bdf3350 100644
--- a/usb-driver.c
+++ b/usb-driver.c
@@ -48,8 +48,9 @@ static int windrvrfd = -1;
 static int parportfd = -1;
 static unsigned long ppbase = 0;
 static unsigned long ecpbase = 0;
-static struct pports *pplist = NULL;
 FILE *modulesfp = NULL;
+FILE *baseaddrfp = NULL;
+int baseaddrnum = 0;
 static int modules_read = 0;
 static struct usb_bus *busses = NULL;
 static struct usb_device *usbdevice;
@@ -354,7 +355,7 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 	switch(request & ~(0xc0000000)) {
 		case VERSION:
 			version = (struct version_struct*)(wdheader->data);
-			strcpy(version->version, "libusb-driver.so $Revision: 1.59 $");
+			strcpy(version->version, "libusb-driver.so $Revision: 1.60 $");
 			version->versionul = 802;
 			DPRINTF("VERSION\n");
 			break;
@@ -385,36 +386,8 @@ int do_wdioctl(int fd, unsigned int request, unsigned char *wdioctl) {
 				ret = (*ioctl_func) (fd, request, wdioctl);
 #else
 				if (parportfd < 0) {
-					int max = -1;
-					struct pports **port = &pplist;
-
-					while (*port) {
-						DPRINTF("Looking up parallel port in linked list, entry: %d\n", (*port)->num);
-						if (max < (*port)->num)
-							max = (*port)->num;
-
-						if ((*port)->base == (unsigned long)cr->Card.Item[0].I.IO.dwAddr) {
-							break;
-						}
-
-						port = &((*port)->next);
-					}
-
-					if (!(*port)) { /* not found */
-						(*port) = malloc(sizeof(struct pports));
-						if (!(*port)) {
-							perror("malloc");
-							exit(EXIT_FAILURE);
-						}
-
-						(*port)->base = (unsigned long)cr->Card.Item[0].I.IO.dwAddr;
-						(*port)->num = max+1;
-						(*port)->next = NULL;
-
-						DPRINTF("parallel port not in linked list, new entry: %d\n", (*port)->num);
-					}
-
-					snprintf(ppdev, sizeof(ppdev), "/dev/parport%d", (*port)->num);
+					snprintf(ppdev, sizeof(ppdev), "/dev/parport%lu",
+						(unsigned long)cr->Card.Item[0].I.IO.dwAddr / 0x10);
 					DPRINTF("opening %s\n", ppdev);
 					parportfd = open(ppdev, O_RDWR|O_EXCL);
 
@@ -976,19 +949,32 @@ int close(int fd) {
 FILE *fopen(const char *path, const char *mode) {
 	FILE *ret;
 	static FILE* (*func) (const char*, const char*) = NULL;
+	char buf[256];
+	int i;
 
 	if (!func)
 		func = (FILE* (*) (const char*, const char*)) dlsym(RTLD_NEXT, "fopen");
 
 	ret = (*func) (path, mode);
 
-	if (!strcmp (path, "/proc/modules")) {
+	if (!strcmp(path, "/proc/modules")) {
 		DPRINTF("opening /proc/modules\n");
 #ifdef NO_WINDRVR
 		modulesfp = ret;
 		modules_read = 0;
 #endif
 	}
+	
+	if (ret) {
+		for (i = 0; i < 4; i++) {
+			snprintf(buf, sizeof(buf), "/proc/sys/dev/parport/parport%d/base-addr", i);
+			if (!strcmp(path, buf)) {
+				DPRINTF("open base-addr of parport%d\n", i);
+				baseaddrfp = ret;
+				baseaddrnum = i;
+			}
+		}
+	}
 
 	return ret;
 }
@@ -996,6 +982,7 @@ FILE *fopen(const char *path, const char *mode) {
 char *fgets(char *s, int size, FILE *stream) {
         static char* (*func) (char*, int, FILE*) = NULL;
 	const char modules[][256] = {"windrvr6 1 0 - Live 0xdeadbeef\n", "parport_pc 1 0 - Live 0xdeadbeef\n"};
+	char buf[256];
 	char *ret = NULL;
 
 
@@ -1008,6 +995,11 @@ char *fgets(char *s, int size, FILE *stream) {
 			ret = s;
 			modules_read++;
 		}
+	} else if (baseaddrfp == stream) {
+		snprintf(s, sizeof(buf), "%d\t%d\n",
+			(baseaddrnum) * 0x10,
+			((baseaddrnum) * 0x10) + 0x400);
+		ret = s;
 	} else {
 		ret = (*func)(s,size,stream);
 	}
@@ -1024,6 +1016,10 @@ int fclose(FILE *fp) {
 	if (fp == modulesfp) {
 		modulesfp = NULL;
 	}
+
+	if (fp == baseaddrfp) {
+		baseaddrfp = NULL;
+	}
 	
 	return (*func)(fp);
 }
diff --git a/usb-driver.h b/usb-driver.h
index 5bfd937..3487b7b 100644
--- a/usb-driver.h
+++ b/usb-driver.h
@@ -33,12 +33,6 @@
 
 #define WDU_GET_MAX_PACKET_SIZE(x)                ((unsigned short) (((x) & 0x7ff) * (1 + (((x) & 0x1800) >> 11))))
 
-struct pports {
-	unsigned long base;
-	int num;
-	struct pports *next;
-};
-
 /* http://www.jungo.com/support/documentation/windriver/811/wdusb_man_mhtml/node78.html#SECTION001734000000000000000 */
 
 struct header_struct {
-- 
2.39.5