Author: Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>
Description: log to syslog instead of stderr
--- a/mouseemu.8
+++ b/mouseemu.8
@@ -56,6 +56,9 @@
 Automatically scan every 5s for new devices. This is normally not need, as udev should
 inform mouseemu about new devices.
 .TP
+.B -debug
+print debugging messages about device scans
+.TP
 .B -help
 show usage message
 .PP
--- a/mouseemu.c
+++ b/mouseemu.c
@@ -18,12 +18,14 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <string.h>
 #include <signal.h>
 #include <wait.h>
+#include <syslog.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -61,6 +63,17 @@
 static int debug	= 0;
 static int autorescan   = 0;
 
+/* print debug messages to syslog or stderr */
+void debugf(const char *format, ...) {
+	va_list ap;
+	
+	if (debug) {
+		va_start(ap, format);	
+		vsyslog(LOG_DEBUG, format, ap);
+		va_end(ap);
+	}
+}
+
 static void send_event(int fd, int type, int code, int value)
 {
 	struct input_event event;
@@ -238,7 +251,7 @@
 						unregister_inputhandler(eventdevs[m].handle);
 						close(eventdevs[m].handle);
 					}
-					if (debug) fprintf(stderr, "keyboard: fd %d event%d, vendor %4x product %4x\n", fd, n, id[ID_VENDOR], id[ID_PRODUCT]);
+					debugf("keyboard: fd %d event%d, vendor %4x product %4x\n", fd, n, id[ID_VENDOR], id[ID_PRODUCT]);
 					eventdevs[m].handle= fd;
 					eventdevs[m].product = id[ID_PRODUCT];
 					eventdevs[m].vendor = id[ID_VENDOR];
@@ -258,7 +271,7 @@
 						unregister_inputhandler(eventdevs[m].handle);
 						close(eventdevs[m].handle);
 					}
-					if (debug) fprintf(stderr, "mouse   : fd %d event%d, vendor %4x product %4x\n", fd, n, id[ID_VENDOR], id[ID_PRODUCT]);
+					debugf("mouse   : fd %d event%d, vendor %4x product %4x\n", fd, n, id[ID_VENDOR], id[ID_PRODUCT]);
 					eventdevs[m].handle= fd;
 					eventdevs[m].product = id[ID_PRODUCT];
 					eventdevs[m].vendor = id[ID_VENDOR];
@@ -373,27 +386,27 @@
 {
 	int fd = -1;
 
-	printf("Trying to open %s...", uinputdev);
+	syslog(LOG_NOTICE, "Trying to open %s...", uinputdev);
 	fd = open (uinputdev, O_RDWR);
-	printf(" %s.\n", (fd > 0)?"ok":"error");
+	syslog(LOG_NOTICE, " %s.\n", (fd > 0)?"ok":"error");
 	if (fd > 0)
 		return fd;
 
-	printf("Trying to open /dev/uinput...");
+	syslog(LOG_NOTICE, "Trying to open /dev/uinput...");
 	fd = open("/dev/uinput", O_RDWR);
-	printf(" %s.\n", (fd > 0)?"ok":"error");
+	syslog(LOG_NOTICE, " %s.\n", (fd > 0)?"ok":"error");
 	if (fd > 0)
 		return fd;
 
-	printf("Trying to open /dev/input/uinput...");
+	syslog(LOG_NOTICE, "Trying to open /dev/input/uinput...");
 	fd = open("/dev/input/uinput", O_RDWR);
-	printf(" %s.\n", (fd > 0)?"ok":"error");
+	syslog(LOG_NOTICE, " %s.\n", (fd > 0)?"ok":"error");
 	if (fd > 0)
 		return fd;
 
-	printf("Trying to open /dev/misc/uinput...");
+	syslog(LOG_NOTICE, "Trying to open /dev/misc/uinput...");
 	fd = open("/dev/misc/uinput", O_RDWR);
-	printf(" %s.\n", (fd > 0)?"ok":"error");
+	syslog(LOG_NOTICE, " %s.\n", (fd > 0)?"ok":"error");
 	if (fd > 0)
 		return fd;
 
@@ -499,7 +512,7 @@
 {
 	int i, cfd;
 	
-	printf("mouseemu: cleaning...\n");
+	syslog(LOG_NOTICE, "mouseemu: cleaning...\n");
 
         uinput_close(ui_keyb_fd);
         uinput_close(ui_mouse_fd);
@@ -575,7 +588,8 @@
 	                "\t[-typing-block DELAY]\n"
 	                "\t[-device UINPUT_DEVICE]\n"
 	                "\t[-nofork]\n"
-			"\t[-autorescan]\n",
+			"\t[-autorescan]\n"
+			"\t[-debug]\n",
 					argv[0]);
 	fprintf(stream, "All modifier and button key arguments are\n"
 	                "key scancodes. They can be found in \n"
@@ -608,8 +622,6 @@
 	int nofork = 0;
 	//int argv0size = strlen(argv[0]);
 
-	printf("mouseemu " VERSION " (C) Colin Leroy <colin@colino.net>\n");
-
 	install_sighandler();
 
 #ifdef __powerpc__
@@ -694,23 +706,33 @@
 					autorescan=1;
 					i += 1;
 					continue;
+				}
+				else if (!strcmp(argv[i], "-debug")) {
+					debug=1;
+					i += 1;
+					continue;
 				} else {
 					usage(stderr, argv);
                 }
 			}
 		}
 	}
-	printf("using (%d+%d) as middle button, (%d+%d) as right button, (%d) as scroll.\n",
+	
+	if (nofork) 
+		openlog("mouseemu", LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_DAEMON); 
+	else
+		openlog("mouseemu", LOG_NDELAY | LOG_PID, LOG_DAEMON);
+	
+	syslog(LOG_NOTICE, "mouseemu " VERSION " (C) Colin Leroy <colin@colino.net>\n");
+	syslog(LOG_NOTICE, "using (%d+%d) as middle button, (%d+%d) as right button, (%d) as scroll.\n",
 		b2_mod, b2_key, b3_mod, b3_key, scroll_mod);
-	printf("using %s.\n", uinputdev);
 
-	
 	if (nofork)
 		goto startops;
 
 	fpid = fork();
 	if (fpid == -1) {
-		printf("can't fork\n");
+		syslog(LOG_NOTICE, "can't fork\n");
 		goto startops;
 	}
 	if (fpid != 0) {
@@ -720,7 +742,7 @@
 	setsid();
 	pid = fork();
 	if (pid == -1) {
-		printf("can't fork\n");
+		syslog(LOG_NOTICE, "can't fork\n");
 		goto startops;
 	}
 
@@ -761,7 +783,7 @@
 			}
 			
 		}
-		printf("terminating, %i\n",answer);	
+		syslog(LOG_NOTICE, "terminating, %i\n",answer);	
 		if (kill(pid, SIGTERM)<0)
 			perror("mouseemu: termination of uinput handlers failed\n");
 			
@@ -773,8 +795,6 @@
 	
 	//strncpy(argv[0],"mouseemu",argv0size);
 startops:
-	if (nofork)
-		debug = 1;
 
 	for (i=0; i<EVENT_DEVS; i++) {
 		eventdevs[i].handle = -1;
@@ -791,8 +811,8 @@
 
 	running = uinput_setup();
 	if (running < 0) {
-		printf("mouseemu: Make sure uinput module is loaded or available "
-			"in the kernel.\n");
+		syslog(LOG_NOTICE, "Make sure uinput module is loaded or available "
+		                   "in the kernel.\n");
 	}
                                                          
 
@@ -818,7 +838,7 @@
 				usleep(10);
 			else {
 				if (errno == ENODEV) {
-					if (debug) fprintf(stderr, "select returned %d, errno %d, rescanning devices\n", val, errno);
+					debugf("device disconnect detected (select %d, errno %d), rescanning devices\n", val, errno);
 					errno = 0;
 					rescan_devs();
 					usleep(500);
