commit e74a86dd3c2964d55aface077c27eb09165d8ca3
parent de4759d9b5515141c7097f4a118da29e2d86c7ae
Author: Christoph Lohmann <20h@r-36.net>
Date:   Fri,  8 Apr 2011 20:09:59 +0200
Better burst and memory handling.
Diffstat:
2 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/config.mk b/config.mk
@@ -1,11 +1,11 @@
 # rfkilld metadata
 NAME = rfkilld
-VERSION = 0.2
+VERSION = 0.3
 
 # Customize below to fit your system
 
 # paths
-PREFIX ?= /usr
+PREFIX ?= /usr/local
 MANPREFIX = ${PREFIX}/share/man
 
 # includes and libs
@@ -14,7 +14,7 @@ LIBS = -L/usr/lib -lc -ludev
 
 # flags
 CPPFLAGS = -DVERSION=\"${VERSION}\"
-CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
+CFLAGS = -g -std=gnu99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
 LDFLAGS = -g ${LIBS}
 #LDFLAGS = -s ${LIBS}
 
diff --git a/rfkilld.c b/rfkilld.c
@@ -3,7 +3,6 @@
  * by 20h
  */
 
-#define _XOPEN_SOURCE
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -24,6 +23,9 @@
 
 char *argv0;
 char *etcdir = "/etc/rfkilld";
+char *lastname = NULL;
+char *lasttype = NULL;
+char *laststate = NULL;
 int running = 1;
 int dolog = 0;
 
@@ -58,7 +60,7 @@ runifexecutable(char *file, char *oname, char *ostate)
 			if (!fork())
 				if(execl(cmd, name, state, NULL) < 0)
 					perror("execl");
-			exit(EXIT_SUCCESS);
+			exit(0);
 		}
 		waitpid(pid, NULL, 0);
 	}
@@ -75,12 +77,30 @@ runscripts(struct udev_device *dev)
 	name = (char *)udev_device_get_property_value(dev, "RFKILL_TYPE");
 	state = (char *)udev_device_get_property_value(dev, "RFKILL_STATE");
 
+	if (lasttype != NULL && lastname != NULL && laststate != NULL) {
+		if (!strcmp(lasttype, type) && !strcmp(lastname, name)
+				&& !strcmp(laststate, state))
+			goto runscriptshandlecleanup;
+	}
+
 	if (dolog)
 		syslog(LOG_NOTICE, "name: %s; type: %s; state: %s;\n",
 				name, type, state);
 
 	runifexecutable(name, type, state);
 	runifexecutable(type, name, state);
+
+runscriptshandlecleanup:
+	if (lasttype != NULL)
+		free(lasttype);
+	if (lastname != NULL)
+		free(lastname);
+	if (laststate != NULL)
+		free(laststate);
+
+	lasttype = strdup(type);
+	lastname = strdup(name);
+	laststate = strdup(state);
 }
 
 void
@@ -119,9 +139,10 @@ initsignals(void)
 void
 usage(void)
 {
-	fprintf(stderr, "usage: %s [-hbl] [-e etcdir]\n", argv0);
+	fprintf(stderr, "usage: %s [-hbl] [-e etcdir]\n",
+			argv0);
 	fflush(stderr);
-	exit(EXIT_FAILURE);
+	exit(1);
 }
 
 int
@@ -160,7 +181,7 @@ main(int argc, char *argv[])
 	udev = udev_new();
 	if (!udev) {
 		perror("udev_new");
-		exit(EXIT_FAILURE);
+		exit(1);
 	}
 
 	mon = udev_monitor_new_from_netlink(udev, "kernel");
@@ -171,7 +192,7 @@ main(int argc, char *argv[])
 	fds[0].events = POLLIN|POLLPRI;
 	if (setnonblocking(fds[0].fd)) {
 		perror("setnonblocking");
-		exit(EXIT_FAILURE);
+		exit(1);
 	}
 	while(running) {
 		ret = poll(fds, 1, -1);
@@ -187,8 +208,16 @@ main(int argc, char *argv[])
 		}
 	}
 
+	udev_monitor_unref(mon);
+	udev_unref(udev);
 	if (dolog)
 		closelog();
-	exit(EXIT_SUCCESS);
+	if (lasttype != NULL)
+		free(lasttype);
+	if (lastname != NULL)
+		free(lastname);
+	if (laststate != NULL)
+		free(laststate);
+	exit(0);
 }