All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] Ready to commit patches from O.S. Systems
@ 2009-05-09  0:50 Otavio Salvador
  2009-05-09  0:50 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
                   ` (2 more replies)
  0 siblings, 3 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel

Hello,

We'd like to push those patches into dev tree and want some review on
them. I'd also would like to hear advices about:

   [PATCH 11/23] cups: split backends and models

Cheers,





^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH 01/23] gtk-engines: add 2.18.1
  2009-05-09  0:50 [RFC] Ready to commit patches from O.S. Systems Otavio Salvador
@ 2009-05-09  0:50 ` Otavio Salvador
  2009-05-09  0:50   ` [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling Otavio Salvador
  2009-05-09  8:00 ` [RFC] Ready to commit patches from O.S. Systems Koen Kooi
  2009-05-09 16:24 ` Cliff Brake
  2 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                        |    4 +++
 recipes/gtk-engines/gtk-engines_2.18.1.bb |   30 +++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)
 create mode 100644 recipes/gtk-engines/gtk-engines_2.18.1.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 9cac3c7..c47b118 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -9774,6 +9774,10 @@ sha256=15aa3a926307b4b3e40f3a9b05c604df6811eb48814b1534db32aed414aefb0c
 md5=060ea25c471e5f4cf5c1baeac27d0345
 sha256=0d8b6630c546327ddc67c700859731036eebdf77e51ad8b71e4d19d28ca2ff2c
 
+[http://ftp.gnome.org/pub/GNOME/sources/gtk-engines/2.18/gtk-engines-2.18.1.tar.bz2]
+md5=5dc748cfb0587bb412adc49b666fb6f8
+sha256=d7e2672fcf80f5c35d481c24e0ab5b7d0f6526dcc3d8821ab76468c1816dc3bc
+
 [http://ftp.gnome.org/pub/GNOME/sources/gtk-engines/2.2/gtk-engines-2.2.0.tar.bz2]
 md5=78e9276c28b509f3203de4873c20a263
 sha256=140541cae8b003d2f7210e2ef060ac328d7e45a04e2cf5fa943fff73c9955dd6
diff --git a/recipes/gtk-engines/gtk-engines_2.18.1.bb b/recipes/gtk-engines/gtk-engines_2.18.1.bb
new file mode 100644
index 0000000..177c5b8
--- /dev/null
+++ b/recipes/gtk-engines/gtk-engines_2.18.1.bb
@@ -0,0 +1,30 @@
+LICENSE = "GPL"
+SECTION = "x11/base"
+DESCRIPTION = "GTK theme engines"
+DEPENDS = "gtk+ cairo"
+
+RDEPENDS_gtk-theme-redmond = "gtk-engine-redmond95"
+RDEPENDS_gtk-theme-metal = "gtk-engine-metal"
+RDEPENDS_gtk-theme-mist = "gtk-engine-mist"
+RDEPENDS_gtk-theme-crux = "gtk-engine-crux-engine"
+RDEPENDS_gtk-theme-lighthouseblue = "gtk-engine-lighthouseblue"
+RDEPENDS_gtk-theme-thinice = "gtk-engine-thinice"
+RDEPENDS_gtk-theme-industrial = "gtk-engine-industrial"
+RDEPENDS_gtk-theme-clearlooks = "gtk-engine-clearlooks"
+
+inherit gnome  gtk-binver
+
+PACKAGES_DYNAMIC = "gtk-engine-* gtk-theme-*"
+
+python populate_packages_prepend() {
+	import os.path
+
+	engines_ver = ['gtk-2.0/', gtkbinver_find(d), '/engines']
+
+	engines_root = os.path.join(bb.data.getVar('libdir', d, 1), ''.join(engines_ver))
+	themes_root = os.path.join(bb.data.getVar('datadir', d, 1), "themes")
+
+	do_split_packages(d, engines_root, '^lib(.*)\.so$', 'gtk-engine-%s', 'GTK %s theme engine', extra_depends='')
+	do_split_packages(d, themes_root, '(.*)', 'gtk-theme-%s', 'GTK theme %s', allow_dirs=True, extra_depends='')
+}
+
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling
  2009-05-09  0:50 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
@ 2009-05-09  0:50   ` Otavio Salvador
  2009-05-09  0:50     ` [PATCH 03/23] acpid: add 1.0.8 (with netlink support) Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Since the code is now the same for Geode GX and Geode LX we also
merged the tunning files in a single tune-geode.inc, making it easy to
improve from now on.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/machine/geodegx.conf             |    4 ++--
 conf/machine/geodelx.conf             |   15 ++++++++-------
 conf/machine/include/tune-geode.inc   |    5 +++++
 conf/machine/include/tune-geodegx.inc |    6 ------
 conf/machine/include/tune-geodelx.inc |    9 ---------
 5 files changed, 15 insertions(+), 24 deletions(-)
 create mode 100644 conf/machine/include/tune-geode.inc
 delete mode 100644 conf/machine/include/tune-geodegx.inc
 delete mode 100644 conf/machine/include/tune-geodelx.inc

diff --git a/conf/machine/geodegx.conf b/conf/machine/geodegx.conf
index 6fe6a83..0ec6782 100644
--- a/conf/machine/geodegx.conf
+++ b/conf/machine/geodegx.conf
@@ -4,7 +4,7 @@
 
 TARGET_ARCH =  "i486"
 
-require conf/machine/include/tune-geodegx.inc
+require conf/machine/include/tune-geode.inc
 
 PREFERRED_PROVIDER_virtual/kernel = "linux-geodegx"
 BOOTSTRAP_EXTRA_RDEPENDS = "kernel pciutils udev kernel-modules"
@@ -14,4 +14,4 @@ udevdir = "/dev"
 KERNEL_IMAGETYPE = "bzImage"
 
 GLIBC_ADDONS = "nptl"
-GLIBC_EXTRA_OECONF = "--with-tls"
+GLIBC_EXTRA_OECONF = "--with-tls --with-cpu=geode"
diff --git a/conf/machine/geodelx.conf b/conf/machine/geodelx.conf
index de4d9ca..f8874fd 100644
--- a/conf/machine/geodelx.conf
+++ b/conf/machine/geodelx.conf
@@ -1,14 +1,15 @@
-TARGET_ARCH = "i486"
+# Machine file for devices with the AMD Geode LX processor 
+# Copyright (C) 2005, Advanced Micro Devices, Inc.  All Rights Reserved
+# Released under the MIT license (see packages/COPYING)
 
-require conf/machine/include/tune-geodelx.inc
+TARGET_ARCH =  "i486"
 
-PREFERRED_PROVIDERS += " virtual/${TARGET_PREFIX}depmod:module-init-tools-cross"
+require conf/machine/include/tune-geode.inc
 
-PREFERRED_PROVIDER_virtual/kernel="linux-geodelx"
-
-SELECTED_OPTIMIZATION_glibc := "${@'${SELECTED_OPTIMIZATION}'.replace('-fomit-frame-pointer', '')}"
+PREFERRED_PROVIDER_virtual/kernel = "linux-geodelx"
 
 KERNEL_IMAGETYPE = "bzImage"
 
 GLIBC_ADDONS = "nptl"
-GLIBC_EXTRA_OECONF = "--with-tls"
+GLIBC_EXTRA_OECONF = "--with-tls --with-cpu=geode"
+SELECTED_OPTIMIZATION_pn-glibc := "${@'${SELECTED_OPTIMIZATION}'.replace('-fomit-frame-pointer', '')}"
diff --git a/conf/machine/include/tune-geode.inc b/conf/machine/include/tune-geode.inc
new file mode 100644
index 0000000..eda332a
--- /dev/null
+++ b/conf/machine/include/tune-geode.inc
@@ -0,0 +1,5 @@
+TARGET_CC_ARCH = "-march=geode -mtune=geode"
+BASE_PACKAGE_ARCH = "geode"
+PACKAGE_EXTRA_ARCHS += "x86 i386 geode"
+
+FEED_ARCH = "geode"
diff --git a/conf/machine/include/tune-geodegx.inc b/conf/machine/include/tune-geodegx.inc
deleted file mode 100644
index cae285a..0000000
--- a/conf/machine/include/tune-geodegx.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-TARGET_CC_ARCH = "-march=geode"
-BASE_PACKAGE_ARCH = "geode"
-PACKAGE_EXTRA_ARCHS += "x86 i386 geode"
-
-FEED_ARCH = "geode"
-
diff --git a/conf/machine/include/tune-geodelx.inc b/conf/machine/include/tune-geodelx.inc
deleted file mode 100644
index 63e6678..0000000
--- a/conf/machine/include/tune-geodelx.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-# Geode CPU has it's own target in GCC 4.3
-# in older versions k6-2 is closest
-#
-TARGET_CC_ARCH = "-march=geode"
-BASE_PACKAGE_ARCH = "geode"
-PACKAGE_EXTRA_ARCHS += "x86 i386 geode"
-
-FEED_ARCH = "geode"
-
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 03/23] acpid: add 1.0.8 (with netlink support)
  2009-05-09  0:50   ` [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling Otavio Salvador
@ 2009-05-09  0:50     ` Otavio Salvador
  2009-05-09  0:50       ` [PATCH 04/23] hal-info: add 20080414 Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini               |    4 +
 recipes/acpid/acpid/event.c.diff |   43 +
 recipes/acpid/acpid/fixfd.diff   |   12 +
 recipes/acpid/acpid/netlink.diff | 2797 ++++++++++++++++++++++++++++++++++++++
 recipes/acpid/acpid_1.0.8.bb     |    6 +
 5 files changed, 2862 insertions(+), 0 deletions(-)
 create mode 100644 recipes/acpid/acpid/event.c.diff
 create mode 100644 recipes/acpid/acpid/fixfd.diff
 create mode 100644 recipes/acpid/acpid/netlink.diff
 create mode 100644 recipes/acpid/acpid_1.0.8.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index c47b118..ec15afd 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -1298,6 +1298,10 @@ sha256=aa3c42224ec702b6cdb69ca6501284cb6dacb87473a076d7337ee9635c96f160
 md5=5c9b705700df51d232be223b6ab6414d
 sha256=aa3c42224ec702b6cdb69ca6501284cb6dacb87473a076d7337ee9635c96f160
 
+[http://downloads.sourceforge.net/acpid/acpid-1.0.8.tar.gz]
+md5=1d9c52fe2c0b51f8463f357c2a3d3ddb
+sha256=d57ae5302c38c37d060a097fa51600fe06fbfffd575641d638407944f126b7b1
+
 [http://ftp.gnu.org/gnu/classpathx/activation-1.1.1.tar.gz]
 md5=de50d7728e8140eb404f2b4554321f8c
 sha256=b1b5ef560d30fcb11fbf537246857d14110ce4eb2b200d4c54690472305d87b7
diff --git a/recipes/acpid/acpid/event.c.diff b/recipes/acpid/acpid/event.c.diff
new file mode 100644
index 0000000..4ef3baf
--- /dev/null
+++ b/recipes/acpid/acpid/event.c.diff
@@ -0,0 +1,43 @@
+--- acpid-1.0.8.orig/event.c
++++ acpid-1.0.8/event.c
+@@ -23,6 +23,7 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/wait.h>
++#include <libgen.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <stdio.h>
+@@ -90,6 +91,8 @@
+ 	struct dirent *dirent;
+ 	char *file = NULL;
+ 	int nrules = 0;
++	char *basen = NULL;
++	regex_t preg;
+ 
+ 	lock_rules();
+ 
+@@ -139,10 +142,19 @@
+ 			continue; /* skip non-regular files */
+ 		}
+ 
+-		r = parse_file(file);
+-		if (r) {
+-			enlist_rule(&cmd_list, r);
+-			nrules++;
++		/* check for run-parts style filename */
++		basen = basename(file);
++		if (regcomp(&preg, "^[a-zA-Z0-9_-]+$", RULE_REGEX_FLAGS) == 0){
++			if (regexec(&preg, basen, 0, NULL, 0) == 0){
++				r = parse_file(file);
++				if (r) {
++					enlist_rule(&cmd_list, r);
++					nrules++;
++				}
++			} else {
++				acpid_log(LOG_DEBUG, "ignoring conf file %s\n", file);
++			}
++
+ 		}
+ 		free(file);
+ 	}
diff --git a/recipes/acpid/acpid/fixfd.diff b/recipes/acpid/acpid/fixfd.diff
new file mode 100644
index 0000000..93ceb5c
--- /dev/null
+++ b/recipes/acpid/acpid/fixfd.diff
@@ -0,0 +1,12 @@
+diff -Nru a/acpid.c b/acpid.c
+--- a/acpid.c	2008-11-03 14:04:43.000000000 +0100
++++ b/acpid.c	2008-12-19 18:38:14.291127677 +0100
+@@ -456,7 +456,7 @@
+ 	int log_opts;
+ 
+ 	/* open /dev/null */
+-	nullfd = open("/dev/null", O_RDONLY);
++	nullfd = open("/dev/null", O_RDWR);
+ 	if (nullfd < 0) {
+ 		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
+ 			"/dev/null", strerror(errno));
diff --git a/recipes/acpid/acpid/netlink.diff b/recipes/acpid/acpid/netlink.diff
new file mode 100644
index 0000000..5dbbedd
--- /dev/null
+++ b/recipes/acpid/acpid/netlink.diff
@@ -0,0 +1,2797 @@
+diff -ruN acpid-1.0.8.orig/acpid.8 acpid-1.0.8/acpid.8
+--- acpid-1.0.8.orig/acpid.8	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.8	2009-03-29 17:10:14.000000000 +0200
+@@ -10,11 +10,13 @@
+ \fBacpid\fP is designed to notify user-space programs of ACPI events.
+ \fBacpid\fP should be started during the system boot, and will run as a
+ background process, by default.  It will open an events file
+-(\fI/proc/acpi/event\fP by default) and attempt to read whole lines.  When
+-a line is received (an \fIevent\fP), \fBacpid\fP will examine a list of rules,
+-and execute the rules that match the event.
+-\fBacpid\fP will ignore all incoming ACPI events if a lock file exists
+-(\fI/var/lock/acpid\fP by default).
++(\fI/proc/acpi/event\fP by default) and attempt to read whole lines which
++represent ACPI events.  If the events file does not exist, \fBacpid\fP will
++attempt to connect to the Linux kernel via the input layer and netlink.  When an
++ACPI event is received from one of these sources, \fBacpid\fP will examine a
++list of rules, and execute the rules that match the event. \fBacpid\fP will
++ignore all incoming ACPI events if a lock file exists (\fI/var/lock/acpid\fP by
++default).
+ .PP
+ \fIRules\fP are defined by simple configuration files.  \fBacpid\fP
+ will look in a configuration directory (\fI/etc/acpi/events\fP by default),
+@@ -69,6 +71,9 @@
+ This option changes the event file from which \fBacpid\fP reads events.
+ Default is \fI/proc/acpi/event\fP.
+ .TP
++.BI \-n "\fR, \fP" \--netlink
++This option forces \fBacpid\fP to use the Linux kernel input layer and netlink interface for ACPI events.
++.TP
+ .BI \-f "\fR, \fP" \--foreground
+ This option keeps \fBacpid\fP in the foreground by not forking at startup.
+ .TP
+@@ -122,6 +127,8 @@
+ .PD 0
+ .B /proc/acpi/event
+ .br
++.B /dev/input/event*
++.br
+ .B /etc/acpi/
+ .br
+ .B /var/run/acpid.socket
+diff -ruN acpid-1.0.8.orig/acpid.c acpid-1.0.8/acpid.c
+--- acpid-1.0.8.orig/acpid.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.c	2009-03-29 17:10:14.000000000 +0200
+@@ -20,23 +20,23 @@
+  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+ 
+-#include <sys/types.h>
+-#include <sys/stat.h>
++#include <unistd.h>
+ #include <fcntl.h>
+ #include <signal.h>
+-#include <unistd.h>
++#include <string.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
+ #include <errno.h>
+ #include <getopt.h>
+-#include <time.h>
+-#include <sys/poll.h>
+-#include <grp.h>
+-#include <syslog.h>
++#include <stdarg.h>
+ 
+ #include "acpid.h"
+-#include "ud_socket.h"
++#include "event.h"
++#include "connection_list.h"
++#include "proc.h"
++#include "sock.h"
++#include "input_layer.h"
++#include "netlink.h"
+ 
+ static int handle_cmdline(int *argc, char ***argv);
+ static void close_fds(void);
+@@ -45,7 +45,6 @@
+ static int create_pidfile(void);
+ static void clean_exit(int sig);
+ static void reload_conf(int sig);
+-static char *read_line(int fd);
+ 
+ /* global debug level */
+ int acpid_debug;
+@@ -53,23 +52,18 @@
+ /* do we log event info? */
+ int logevents;
+ 
+-static const char *progname;
+-static const char *confdir = ACPID_CONFDIR;
+-static const char *eventfile = ACPID_EVENTFILE;
+-static const char *socketfile = ACPID_SOCKETFILE;
++const char *progname;
++
+ static const char *lockfile = ACPID_LOCKFILE;
++static const char *confdir = ACPID_CONFDIR;
+ static int nosocket;
+-static const char *socketgroup;
+-static mode_t socketmode = ACPID_SOCKETMODE;
+ static int foreground;
+ static const char *pidfile = ACPID_PIDFILE;
++static int netlink;
+ 
+ int
+ main(int argc, char **argv)
+ {
+-	int event_fd;
+-	int sock_fd = -1; /* init to avoid a compiler warning */
+-
+ 	/* learn who we really are */
+ 	progname = (const char *)strrchr(argv[0], '/');
+ 	progname = progname ? (progname + 1) : argv[0];
+@@ -80,14 +74,22 @@
+ 	/* close any extra file descriptors */
+ 	close_fds();
+ 
+-	/* actually open the event file */
+-	event_fd = open(eventfile, O_RDONLY);
+-	if (event_fd < 0) {
+-		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
+-			eventfile, strerror(errno));
+-		exit(EXIT_FAILURE);
++	if (!netlink)
++	{
++		/* open the acpi event file in the proc fs */
++		/* if the open fails, try netlink */
++		if (open_proc())
++			netlink = 1;
++	}
++
++	if (netlink)
++	{
++		/* open the input layer */
++		open_input();
++
++		/* open netlink */
++		open_netlink();
+ 	}
+-	fcntl(event_fd, F_SETFD, FD_CLOEXEC);
+ 
+ /*
+  * if there is data, and the kernel is NOT broken, this eats 1 byte.  We
+@@ -124,34 +126,7 @@
+ 
+ 	/* open our socket */
+ 	if (!nosocket) {
+-		sock_fd = ud_create_socket(socketfile);
+-		if (sock_fd < 0) {
+-			fprintf(stderr, "%s: can't open socket %s: %s\n",
+-				progname, socketfile, strerror(errno));
+-			exit(EXIT_FAILURE);
+-		}
+-		fcntl(sock_fd, F_SETFD, FD_CLOEXEC);
+-		chmod(socketfile, socketmode);
+-		if (socketgroup) {
+-			struct group *gr;
+-			struct stat buf;
+-			gr = getgrnam(socketgroup);
+-			if (!gr) {
+-				fprintf(stderr, "%s: group %s does not exist\n",
+-					progname, socketgroup);
+-				exit(EXIT_FAILURE);
+-			}
+-			if (stat(socketfile, &buf) < 0) {
+-				fprintf(stderr, "%s: can't stat %s\n",
+-					progname, socketfile);
+-				exit(EXIT_FAILURE);
+-			}
+-			if (chown(socketfile, buf.st_uid, gr->gr_gid) < 0) {
+-				fprintf(stderr, "%s: chown(): %s\n",
+-					progname, strerror(errno));
+-				exit(EXIT_FAILURE);
+-			}
+-		}
++		open_sock();
+ 	}
+ 
+ 	/* if we're running in foreground, we don't daemonize */
+@@ -164,7 +139,8 @@
+ 	if (open_log() < 0) {
+ 		exit(EXIT_FAILURE);
+ 	}
+-	acpid_log(LOG_INFO, "starting up\n");
++	acpid_log(LOG_INFO, "starting up with %s\n",
++		netlink ? "netlink and the input layer" : "proc fs");
+ 
+ 	/* trap key signals */
+ 	signal(SIGHUP, reload_conf);
+@@ -183,109 +159,50 @@
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+-	/* main loop */
+ 	acpid_log(LOG_INFO, "waiting for events: event logging is %s\n",
+ 	    logevents ? "on" : "off");
+-	while (1) {
+-		struct pollfd ar[2];
+-		int r;
+-		int fds = 0;
+-		
+-		/* poll for the socket and the event file */
+-		ar[0].fd = event_fd; ar[0].events = POLLIN; fds++;
+-		if (!nosocket) {
+-			ar[1].fd = sock_fd; ar[1].events = POLLIN; fds++;
+-		}
+-		r = poll(ar, fds, -1);
+ 
+-		if (r < 0 && errno == EINTR) {
++	/* main loop */
++	while (1)
++	{
++		fd_set readfds;
++		int nready;
++		int i;
++		struct connection *p;
++
++		/* it's going to get clobbered, so use a copy */
++		readfds = *get_fdset();
++
++		/* wait on data */
++		nready = select(get_highestfd() + 1, &readfds, NULL, NULL, NULL);
++
++		if (nready < 0  &&  errno == EINTR) {
+ 			continue;
+-		} else if (r < 0) {
+-			acpid_log(LOG_ERR, "poll(): %s\n", strerror(errno));
++		} else if (nready < 0) {
++			acpid_log(LOG_ERR, "select(): %s\n", strerror(errno));
+ 			continue;
+ 		}
+ 
+-		/* was it an event? */
+-		if (ar[0].revents) {
+-			char *event;
+-			struct stat trash;
+-			int fexists;
+-
+-			/* check for existence of a lockfile */
+-			fexists = (stat(lockfile, &trash) == 0);
+-
+-			/* this shouldn't happen */
+-			if (!ar[0].revents & POLLIN) {
+-				acpid_log(LOG_DEBUG,
+-				    "odd, poll set flags 0x%x\n",
+-				    ar[0].revents);
+-				continue;
+-			}
++		/* for each connection */
++		for (i = 0; i <= get_number_of_connections(); ++i)
++		{
++			int fd;
+ 
+-			/* read an event */
+-			event = read_line(event_fd);
++			p = get_connection(i);
+ 
+-			/* if we're locked, don't process the event */
+-			if (fexists) {
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "lockfile present, not processing "
+-					    "event \"%s\"\n", event);
+-				}
+-				continue;
+-			}
+-
+-			/* handle the event */
+-			if (event) {
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "received event \"%s\"\n", event);
+-				}
+-				acpid_handle_event(event);
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "completed event \"%s\"\n", event);
+-				}
+-			} else if (errno == EPIPE) {
+-				acpid_log(LOG_WARNING,
+-				    "events file connection closed\n");
++			/* if this connection is invalid, bail */
++			if (!p)
+ 				break;
+-			} else {
+-				static int nerrs;
+-				if (++nerrs >= ACPID_MAX_ERRS) {
+-					acpid_log(LOG_ERR,
+-					    "too many errors reading "
+-					    "events file - aborting\n");
+-					break;
+-				}
+-			}
+-		} 
+ 
+-		/* was it a new connection? */
+-		if (!nosocket && ar[1].revents) {
+-			int cli_fd;
+-			struct ucred creds;
+-			char buf[32];
+-
+-			/* this shouldn't happen */
+-			if (!ar[1].revents & POLLIN) {
+-				acpid_log(LOG_DEBUG,
+-				    "odd, poll set flags 0x%x\n",
+-				    ar[1].revents);
+-				continue;
+-			}
++			/* get the file descriptor */
++			fd = p->fd;
+ 
+-			/* accept and add to our lists */
+-			cli_fd = ud_accept(sock_fd, &creds);
+-			if (cli_fd < 0) {
+-				acpid_log(LOG_ERR, "can't accept client: %s\n",
+-				    strerror(errno));
+-				continue;
++			/* if this file descriptor has data waiting */
++			if (FD_ISSET(fd, &readfds))
++			{
++				/* delegate to this connection's process function */
++				p->process(fd);
+ 			}
+-			fcntl(cli_fd, F_SETFD, FD_CLOEXEC);
+-			snprintf(buf, sizeof(buf)-1, "%d[%d:%d]",
+-				creds.pid, creds.uid, creds.gid);
+-			acpid_add_client(cli_fd, buf);
+ 		}
+ 	}
+ 
+@@ -312,6 +229,7 @@
+ 		{"nosocket", 1, 0, 'S'},
+ 		{"pidfile", 1, 0, 'p'},
+ 		{"lockfile", 1, 0, 'L'},
++		{"netlink", 0, 0, 'n'},
+ 		{"version", 0, 0, 'v'},
+ 		{"help", 0, 0, 'h'},
+ 		{NULL, 0, 0, 0},
+@@ -327,7 +245,8 @@
+ 		"Use the specified socket file.",	/* socketfile */
+ 		"Do not listen on a UNIX socket (overrides -s).",/* nosocket */
+ 		"Use the specified PID file.",		/* pidfile */
+-		"Use the specified lockfile to stop processing.", /* pidfile */
++		"Use the specified lockfile to stop processing.", /* lockfile */
++		"Force netlink/input layer mode. (overrides -e)", /* netlink */
+ 		"Print version information.",		/* version */
+ 		"Print this message.",			/* help */
+ 	};
+@@ -338,7 +257,7 @@
+ 	for (;;) {
+ 		int i;
+ 		i = getopt_long(*argc, *argv,
+-		    "c:de:flg:m:s:Sp:L:vh", opts, NULL);
++		    "c:de:flg:m:s:Sp:L:nvh", opts, NULL);
+ 		if (i == -1) {
+ 			break;
+ 		}
+@@ -377,6 +296,9 @@
+ 		case 'L':
+ 			lockfile = optarg;
+ 			break;
++		case 'n':
++			netlink = 1;
++			break;
+ 		case 'v':
+ 			printf(PACKAGE "-" VERSION "\n");
+ 			exit(EXIT_SUCCESS);
+@@ -550,54 +472,11 @@
+ 	return 0;
+ }
+ 
+-/* 
+- * This depends on fixes in linux ACPI after 2.4.8
+- */
+-#define MAX_BUFLEN	1024
+-static char *
+-read_line(int fd)
++int
++locked()
+ {
+-	static char *buf;
+-	int buflen = 64;
+-	int i = 0;
+-	int r;
+-	int searching = 1;
+-
+-	while (searching) {
+-		buf = realloc(buf, buflen);
+-		if (!buf) {
+-			acpid_log(LOG_ERR, "malloc(%d): %s\n",
+-				buflen, strerror(errno));
+-			return NULL;
+-		}
+-		memset(buf+i, 0, buflen-i);
+-
+-		while (i < buflen) {
+-			r = read(fd, buf+i, 1);
+-			if (r < 0 && errno != EINTR) {
+-				/* we should do something with the data */
+-				acpid_log(LOG_ERR, "read(): %s\n",
+-					strerror(errno));
+-				return NULL;
+-			} else if (r == 0) {
+-				/* signal this in an almost standard way */
+-				errno = EPIPE;
+-				return NULL;
+-			} else if (r == 1) {
+-				/* scan for a newline */
+-				if (buf[i] == '\n') {
+-					searching = 0;
+-					buf[i] = '\0';
+-					break;
+-				}
+-				i++;
+-			}
+-		}
+-		if (buflen >= MAX_BUFLEN) {
+-			break;
+-		} 
+-		buflen *= 2;
+-	}
++	struct stat trash;
+ 
+-	return buf;
++	/* check for existence of a lockfile */
++	return (stat(lockfile, &trash) == 0);
+ }
+diff -ruN acpid-1.0.8.orig/acpid.h acpid-1.0.8/acpid.h
+--- acpid-1.0.8.orig/acpid.h	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.h	2009-03-29 17:10:14.000000000 +0200
+@@ -23,11 +23,7 @@
+ #ifndef ACPID_H__
+ #define ACPID_H__
+ 
+-#include <unistd.h>
+ #include <syslog.h>
+-#include <stdarg.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
+ 
+ #define ACPI_PROCDIR 		"/proc/acpi"
+ #define ACPID_EVENTFILE		ACPI_PROCDIR "/event"
+@@ -40,19 +36,12 @@
+ 
+ #define PACKAGE 		"acpid"
+ 
+-/*
+- * acpid.c
+- */
+ extern int acpid_debug;
+ extern int logevents;
++extern const char *progname;
++
+ extern int acpid_log(int level, const char *fmt, ...);
+ 
+-/*
+- * event.c
+- */
+-extern int acpid_read_conf(const char *confdir);
+-extern int acpid_add_client(int client, const char *origin);
+-extern int acpid_cleanup_rules(int do_detach);
+-extern int acpid_handle_event(const char *event);
++extern int locked();
+ 
+ #endif /* ACPID_H__ */
+diff -ruN acpid-1.0.8.orig/acpi_genetlink.h acpid-1.0.8/acpi_genetlink.h
+--- acpid-1.0.8.orig/acpi_genetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_genetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,33 @@
++#ifndef __ACPI_GENETLINK_H__
++#define __ACPI_GENETLINK_H__ 1
++
++#include <linux/types.h>
++
++struct acpi_genl_event {
++        char device_class[20];
++        char bus_id[15];
++        __u32 type;
++        __u32 data;
++};
++
++/* attributes of acpi_genl_family */
++enum {
++        ACPI_GENL_ATTR_UNSPEC,
++        ACPI_GENL_ATTR_EVENT,   /* ACPI event info needed by user space */
++        __ACPI_GENL_ATTR_MAX,
++};
++#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
++
++/* commands supported by the acpi_genl_family */
++enum {
++        ACPI_GENL_CMD_UNSPEC,
++        ACPI_GENL_CMD_EVENT,    /* kernel->user notifications for ACPI events */        __ACPI_GENL_CMD_MAX,
++};
++#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
++#define GENL_MAX_FAM_OPS        256
++#define GENL_MAX_FAM_GRPS       256
++
++#define ACPI_EVENT_FAMILY_NAME		"acpi_event"
++#define ACPI_EVENT_MCAST_GROUP_NAME	"acpi_mc_group"
++
++#endif
+diff -ruN acpid-1.0.8.orig/acpi_ids.c acpid-1.0.8/acpi_ids.c
+--- acpid-1.0.8.orig/acpi_ids.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_ids.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,254 @@
++/*
++ *  acpi_ids.c - ACPI Netlink Group and Family IDs
++ *
++ *  Copyright (C) 2008 Ted Felix (www.tedfelix.com)
++ *  Portions from acpi_genl Copyright (C) Zhang Rui <rui.zhang@intel.com>
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <stdio.h>
++/* needed by netlink.h, should be in there */
++#include <arpa/inet.h>
++#include <linux/types.h>
++#include <string.h>
++
++#include "genetlink.h"
++#include "libnetlink.h"
++
++#include "acpid.h"
++
++#define GENL_MAX_FAM_GRPS       256
++#define ACPI_EVENT_FAMILY_NAME          "acpi_event"
++#define ACPI_EVENT_MCAST_GROUP_NAME     "acpi_mc_group"
++
++static int initialized = 0;
++static __u16 acpi_event_family_id = 0;
++static __u32 acpi_event_mcast_group_id = 0;
++
++/*
++ *  A CTRL_CMD_GETFAMILY message returns an attribute table that looks
++ *    like this:
++ *
++ *  CTRL_ATTR_FAMILY_ID         Use this to make sure we get the proper msgs
++ *  CTRL_ATTR_MCAST_GROUPS
++ *    CTRL_ATTR_MCAST_GRP_NAME
++ *    CTRL_ATTR_MCAST_GRP_ID    Need this for the group mask
++ *    ...
++ */
++
++static int
++get_ctrl_grp_id(struct rtattr *arg)
++{
++	struct rtattr *tb[CTRL_ATTR_MCAST_GRP_MAX + 1];
++	char *name;
++
++	if (arg == NULL)
++		return -1;
++
++	/* nested within the CTRL_ATTR_MCAST_GROUPS attribute are the  */
++	/* group name and ID  */
++	parse_rtattr_nested(tb, CTRL_ATTR_MCAST_GRP_MAX, arg);
++
++	/* if either of the entries needed cannot be found, bail */
++	if (!tb[CTRL_ATTR_MCAST_GRP_NAME] || !tb[CTRL_ATTR_MCAST_GRP_ID])
++		return -1;
++
++	/* get the name of this multicast group we've found */
++	name = RTA_DATA(tb[CTRL_ATTR_MCAST_GRP_NAME]);
++
++	/* if it does not match the ACPI event multicast group name, bail */
++	if (strcmp(name, ACPI_EVENT_MCAST_GROUP_NAME))
++		return -1;
++
++	/* At this point, we've found what we were looking for.  We now  */
++	/* have the multicast group ID for ACPI events over generic netlink. */
++	acpi_event_mcast_group_id =
++		*((__u32 *)RTA_DATA(tb[CTRL_ATTR_MCAST_GRP_ID]));
++
++	return 0;
++}
++
++/* n = the response to a CTRL_CMD_GETFAMILY message */
++static int
++genl_get_mcast_group_id(struct nlmsghdr *n)
++{
++	/*
++	 *  Attribute table.  Note the type name "rtattr" which means "route
++	 *  attribute".  This is a vestige of one of netlink's main uses:
++	 *  routing.
++	 */
++	struct rtattr *tb[CTRL_ATTR_MAX + 1];
++	/* pointer to the generic netlink header in the incoming message */
++	struct genlmsghdr *ghdr = NLMSG_DATA(n);
++	/* length of the attribute and payload */
++	int len = n->nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN);
++	/* Pointer to the attribute portion of the message */
++	struct rtattr *attrs;
++
++	if (len < 0) {
++		fprintf(stderr, "%s: netlink CTRL_CMD_GETFAMILY response, "
++			"wrong controller message len: %d\n", progname, len);
++		return -1;
++	}
++
++	if (n->nlmsg_type != GENL_ID_CTRL) {
++		fprintf(stderr, "%s: not a netlink controller message, "
++			"nlmsg_len=%d nlmsg_type=0x%x\n", 
++			progname, n->nlmsg_len, n->nlmsg_type);
++		return 0;
++	}
++
++	if (ghdr->cmd != CTRL_CMD_GETFAMILY &&
++	    ghdr->cmd != CTRL_CMD_DELFAMILY &&
++	    ghdr->cmd != CTRL_CMD_NEWFAMILY &&
++	    ghdr->cmd != CTRL_CMD_NEWMCAST_GRP &&
++	    ghdr->cmd != CTRL_CMD_DELMCAST_GRP) {
++		fprintf(stderr, "%s: unknown netlink controller command %d\n",
++			progname, ghdr->cmd);
++		return 0;
++	}
++
++	/* set attrs to point to the attribute */
++	attrs = (struct rtattr *)((char *)ghdr + GENL_HDRLEN);
++	/* Read the table from the message into "tb".  This actually just  */
++	/* places pointers into the message into tb[].  */
++	parse_rtattr(tb, CTRL_ATTR_MAX, attrs, len);
++
++	/* if a family ID attribute is present, get it */
++	if (tb[CTRL_ATTR_FAMILY_ID])
++	{
++		acpi_event_family_id =
++			*((__u32 *)RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]));
++	}
++
++	/* if a "multicast groups" attribute is present... */
++	if (tb[CTRL_ATTR_MCAST_GROUPS]) {
++		struct rtattr *tb2[GENL_MAX_FAM_GRPS + 1];
++		int i;
++
++		/* get the group table within this attribute  */
++		parse_rtattr_nested(tb2, GENL_MAX_FAM_GRPS,
++			tb[CTRL_ATTR_MCAST_GROUPS]);
++
++		/* for each group */
++		for (i = 0; i < GENL_MAX_FAM_GRPS; i++)
++			/* if this group is valid */
++			if (tb2[i])
++				/* Parse the ID.  If successful, we're done. */
++				if (!get_ctrl_grp_id(tb2[i]))
++					return 0;
++	}
++
++	return -1;
++}
++
++static int
++genl_get_ids(char *family_name)
++{
++	/* handle to the netlink connection */
++	struct rtnl_handle rth;
++	/* holds the request we are going to send and the reply */
++	struct {
++		struct nlmsghdr n;
++		char buf[4096];    /* ??? Is this big enough for all cases? */
++	} req;
++	/* pointer to the nlmsghdr in req */
++	struct nlmsghdr *nlh;
++	/* pointer to the generic netlink header in req */
++	struct genlmsghdr *ghdr;
++	/* return value */
++	int ret = -1;
++
++	/* clear out the request */
++	memset(&req, 0, sizeof(req));
++
++	/* set up nlh to point to the netlink header in req */
++	nlh = &req.n;
++	/* set up the netlink header */
++	nlh->nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);
++	nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
++	nlh->nlmsg_type = GENL_ID_CTRL;
++
++	/* set up ghdr to point to the generic netlink header */
++	ghdr = NLMSG_DATA(&req.n);
++	/* set the command we want to run: "GETFAMILY" */
++	ghdr->cmd = CTRL_CMD_GETFAMILY;
++
++	/* the message payload is the family name */
++	addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME,
++			  family_name, strlen(family_name) + 1);
++
++	/* open a generic netlink connection */
++	if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
++		fprintf(stderr, "%s: cannot open generic netlink socket\n", 
++			progname);
++		return -1;
++	}
++
++	/*
++	 *  Send CTRL_CMD_GETFAMILY message (in nlh) to the generic
++	 *  netlink controller.  Reply will be in nlh upon return.
++	 */
++	if (rtnl_talk(&rth, nlh, 0, 0, nlh, NULL, NULL) < 0) {
++		fprintf(stderr, "%s: error talking to the kernel via netlink\n",
++			progname);
++		goto ctrl_done;
++	}
++
++	/* process the response */
++	if (genl_get_mcast_group_id(nlh) < 0) {
++		fprintf(stderr, "%s: failed to get acpi_event netlink "
++			"multicast group\n", progname);
++		goto ctrl_done;
++	}
++
++	ret = 0;
++
++ctrl_done:
++	rtnl_close(&rth);
++	return ret;
++}
++
++/* initialize the ACPI IDs */
++static void
++acpi_ids_init()
++{
++	genl_get_ids(ACPI_EVENT_FAMILY_NAME);
++
++	initialized = 1;
++}
++
++/* returns the netlink family ID for ACPI event messages */
++__u16
++acpi_ids_getfamily()
++{
++	/* if the IDs haven't been initialized, initialize them */
++	if (initialized == 0)
++		acpi_ids_init();
++
++	return acpi_event_family_id;
++}
++
++/* returns the netlink multicast group ID for ACPI event messages */
++__u32
++acpi_ids_getgroup()
++{
++	/* if the IDs haven't been initialized, initialize them */
++	if (initialized == 0)
++		acpi_ids_init();
++
++	return acpi_event_mcast_group_id;
++}
+diff -ruN acpid-1.0.8.orig/acpi_ids.h acpid-1.0.8/acpi_ids.h
+--- acpid-1.0.8.orig/acpi_ids.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_ids.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++ *  acpi_ids.h - ACPI Netlink Group and Family IDs
++ *
++ *  Copyright (C) 2008 Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef ACPI_IDS_H__
++#define ACPI_IDS_H__
++
++/* returns the netlink family ID for ACPI event messages */
++extern __u16 acpi_ids_getfamily();
++
++/* returns the netlink multicast group ID for ACPI event messages */
++extern __u32 acpi_ids_getgroup();
++
++#endif /* ACPI_IDS_H__ */
+diff -ruN acpid-1.0.8.orig/acpi_listen.c acpid-1.0.8/acpi_listen.c
+--- acpid-1.0.8.orig/acpi_listen.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpi_listen.c	2009-03-29 17:10:14.000000000 +0200
+@@ -42,8 +42,8 @@
+ static int handle_cmdline(int *argc, char ***argv);
+ static char *read_line(int fd);
+ 
+-static const char *progname;
+-static const char *socketfile = ACPID_SOCKETFILE;
++const char *progname;
++const char *socketfile = ACPID_SOCKETFILE;
+ static int max_events;
+ 
+ static void
+diff -ruN acpid-1.0.8.orig/connection_list.c acpid-1.0.8/connection_list.c
+--- acpid-1.0.8.orig/connection_list.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/connection_list.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ *  connection_list.c - ACPI daemon connection list
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  Tabs at 4
++ */
++
++#include <unistd.h>
++#include <stdio.h>
++#include <sys/select.h>
++
++#include "acpid.h"
++
++#include "connection_list.h"
++
++#define max(a, b)  (((a)>(b))?(a):(b))
++
++/*---------------------------------------------------------------*/
++/* private objects */
++
++#define MAX_CONNECTIONS 10
++
++static struct connection connection_list[MAX_CONNECTIONS];
++
++static int nconnections = 0;
++
++/* fd_set containing all the fd's that come in */
++static fd_set allfds;
++
++/* highest fd that is opened */
++/* (-2 + 1) causes select() to return immediately */
++static int highestfd = -2;
++
++/*---------------------------------------------------------------*/
++/* public functions */
++
++void
++add_connection(struct connection *p)
++{
++	if (nconnections < 0)
++		return;
++	if (nconnections >= MAX_CONNECTIONS) {
++		acpid_log(LOG_ERR, "Too many connections.\n");
++		return;
++	}
++
++	if (nconnections == 0)
++		FD_ZERO(&allfds);
++	
++	/* add the connection to the connection list */
++	connection_list[nconnections] = *p;
++	++nconnections;
++	
++	/* add to the fd set */
++	FD_SET(p->fd, &allfds);
++	highestfd = max(highestfd, p->fd);
++}
++
++/*---------------------------------------------------------------*/
++
++struct connection *
++find_connection(int fd)
++{
++	int i;
++
++	/* for each connection */
++	for (i = 0; i < nconnections; ++i) {
++		/* if the file descriptors match, return the connection */
++		if (connection_list[i].fd == fd)
++			return &connection_list[i];
++	}
++
++	return NULL;
++}
++
++/*---------------------------------------------------------------*/
++
++int 
++get_number_of_connections()
++{
++	return nconnections;
++}
++
++/*---------------------------------------------------------------*/
++
++struct connection *
++get_connection(int i)
++{
++	if (i < 0  ||  i >= nconnections)
++		return NULL;
++
++	return &connection_list[i];
++}
++
++/*---------------------------------------------------------------*/
++
++const fd_set *
++get_fdset()
++{
++	return &allfds;
++}
++
++/*---------------------------------------------------------------*/
++
++int
++get_highestfd()
++{
++	return highestfd;
++}
+diff -ruN acpid-1.0.8.orig/connection_list.h acpid-1.0.8/connection_list.h
+--- acpid-1.0.8.orig/connection_list.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/connection_list.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,59 @@
++/*
++ *  connection_list.h - ACPI daemon connection list
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  Tabs at 4
++ */
++
++#ifndef CONNECTION_LIST_H__
++#define CONNECTION_LIST_H__
++
++#include <sys/select.h>
++
++/*****************************************************************
++ *  Connection List Public Members
++ *****************************************************************/
++
++struct connection
++{
++	/* file descriptor */
++	int fd;
++
++	/* process incoming data on the connection */
++	void (* process)(int fd);
++};
++
++/* add a connection to the list */
++extern void add_connection(struct connection *p);
++
++/* find a connection in the list by file descriptor */
++extern struct connection *find_connection(int fd);
++
++/* get the number of connections in the list */
++extern int get_number_of_connections();
++
++/* get a specific connection by index from the list */
++extern struct connection *get_connection(int i);
++
++/* get an fd_set with all the fd's that have been added to the list */
++extern const fd_set *get_fdset();
++
++/* get the highest fd that was added to the list */
++extern int get_highestfd();
++
++#endif /* CONNECTION_LIST_H__ */
+diff -ruN acpid-1.0.8.orig/event.c acpid-1.0.8/event.c
+--- acpid-1.0.8.orig/event.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/event.c	2009-03-29 17:10:14.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- *  event.c - ACPI daemon
++ *  event.c - ACPI daemon event handler
+  *
+  *  Copyright (C) 2000 Andrew Henroid
+  *  Copyright (C) 2001 Sun Microsystems (thockin@sun.com)
+diff -ruN acpid-1.0.8.orig/event.h acpid-1.0.8/event.h
+--- acpid-1.0.8.orig/event.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/event.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,31 @@
++/*
++ *  event.h - ACPI daemon event handler
++ *
++ *  Copyright (C) 1999-2000 Andrew Henroid
++ *  Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef EVENT_H__
++#define EVENT_H__
++
++extern int acpid_read_conf(const char *confdir);
++extern int acpid_add_client(int client, const char *origin);
++extern int acpid_cleanup_rules(int do_detach);
++extern int acpid_handle_event(const char *event);
++
++#endif /* EVENT_H__ */
+diff -ruN acpid-1.0.8.orig/genetlink.h acpid-1.0.8/genetlink.h
+--- acpid-1.0.8.orig/genetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/genetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,81 @@
++#ifndef __LINUX_GENERIC_NETLINK_H
++#define __LINUX_GENERIC_NETLINK_H
++
++#include <linux/netlink.h>
++
++#define GENL_NAMSIZ	16	/* length of family name */
++
++#define GENL_MIN_ID	NLMSG_MIN_TYPE
++#define GENL_MAX_ID	1023
++
++struct genlmsghdr {
++	__u8	cmd;
++	__u8	version;
++	__u16	reserved;
++};
++
++#define GENL_HDRLEN	NLMSG_ALIGN(sizeof(struct genlmsghdr))
++
++#define GENL_ADMIN_PERM		0x01
++#define GENL_CMD_CAP_DO		0x02
++#define GENL_CMD_CAP_DUMP	0x04
++#define GENL_CMD_CAP_HASPOL	0x08
++
++/*
++ * List of reserved static generic netlink identifiers:
++ */
++#define GENL_ID_GENERATE	0
++#define GENL_ID_CTRL		NLMSG_MIN_TYPE
++
++/**************************************************************************
++ * Controller
++ **************************************************************************/
++
++enum {
++	CTRL_CMD_UNSPEC,
++	CTRL_CMD_NEWFAMILY,
++	CTRL_CMD_DELFAMILY,
++	CTRL_CMD_GETFAMILY,
++	CTRL_CMD_NEWOPS,
++	CTRL_CMD_DELOPS,
++	CTRL_CMD_GETOPS,
++	CTRL_CMD_NEWMCAST_GRP,
++	CTRL_CMD_DELMCAST_GRP,
++	CTRL_CMD_GETMCAST_GRP, /* unused */
++	__CTRL_CMD_MAX,
++};
++
++#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1)
++
++enum {
++	CTRL_ATTR_UNSPEC,
++	CTRL_ATTR_FAMILY_ID,
++	CTRL_ATTR_FAMILY_NAME,
++	CTRL_ATTR_VERSION,
++	CTRL_ATTR_HDRSIZE,
++	CTRL_ATTR_MAXATTR,
++	CTRL_ATTR_OPS,
++	CTRL_ATTR_MCAST_GROUPS,
++	__CTRL_ATTR_MAX,
++};
++
++#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1)
++
++enum {
++	CTRL_ATTR_OP_UNSPEC,
++	CTRL_ATTR_OP_ID,
++	CTRL_ATTR_OP_FLAGS,
++	__CTRL_ATTR_OP_MAX,
++};
++
++#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1)
++
++enum {
++	CTRL_ATTR_MCAST_GRP_UNSPEC,
++	CTRL_ATTR_MCAST_GRP_NAME,
++	CTRL_ATTR_MCAST_GRP_ID,
++	__CTRL_ATTR_MCAST_GRP_MAX,
++};
++#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
++
++#endif	/* __LINUX_GENERIC_NETLINK_H */
+diff -ruN acpid-1.0.8.orig/input_layer.c acpid-1.0.8/input_layer.c
+--- acpid-1.0.8.orig/input_layer.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/input_layer.c	2009-03-29 17:11:58.000000000 +0200
+@@ -0,0 +1,262 @@
++/*
++ *  input_layer - Kernel ACPI Event Input Layer Interface
++ *
++ *  Handles the details of getting kernel ACPI events from the input
++ *  layer (/dev/input/event*).
++ *
++ *  Inspired by (and in some cases blatantly lifted from) Vojtech Pavlik's
++ *  evtest.c.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++/* system */
++#include <unistd.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <fcntl.h>
++#include <linux/input.h>
++#include <string.h>
++#include <errno.h>
++#include <malloc.h>
++#include <glob.h>
++
++/* local */
++#include "acpid.h"
++#include "connection_list.h"
++#include "event.h"
++
++#define DIM(a)  (sizeof(a) / sizeof(a[0]))
++
++struct evtab_entry {
++	struct input_event event;
++	const char *str;
++};
++	
++/* event table: events we are interested in and their strings */
++/* use evtest.c or acpi_genl to find new events to add to this table */
++static struct evtab_entry evtab[] = {
++	{{{0,0}, EV_KEY, KEY_POWER, 1}, "button/power PBTN 00000080 00000000"},
++	{{{0,0}, EV_KEY, KEY_SLEEP, 1}, "button/sleep SBTN 00000080 00000000"},
++	{{{0,0}, EV_KEY, KEY_SUSPEND, 1}, 
++ 		"button/suspend SUSP 00000080 00000000"},
++	{{{0,0}, EV_SW, SW_LID, 1}, "button/lid LID close"},
++	{{{0,0}, EV_SW, SW_LID, 0}, "button/lid LID open"}
++};
++	
++/*----------------------------------------------------------------------*/
++/* Given an input event, returns the string corresponding to that event.
++   If there is no corresponding string, NULL is returned.  */
++static const char *
++event_string(struct input_event event)
++{
++	unsigned i;
++	
++	/* for each entry in the event table */
++	for (i = 0; i < DIM(evtab); ++i)
++	{
++		/* if this is a matching event, return its string */
++		if (event.type == evtab[i].event.type  &&
++			event.code == evtab[i].event.code  &&
++			event.value == evtab[i].event.value) {
++			return evtab[i].str;
++		}
++	}
++	
++	return NULL;
++}
++
++/*-----------------------------------------------------------------*/
++/* returns non-zero if the event type/code is one we need */
++static int 
++need_event(int type, int code)
++{
++	unsigned i;
++
++	/* for each entry in the event table */
++	for (i = 0; i < DIM(evtab); ++i) {
++		/* if we found a matching event */
++		if (type == evtab[i].event.type  &&
++			code == evtab[i].event.code) {
++			return 1;
++		}
++	}
++
++	return 0;
++}
++
++/*-----------------------------------------------------------------*/
++/* called when an input layer event is received */
++void process_input(int fd)
++{
++	struct input_event event;
++	ssize_t nbytes;
++	const char *str;
++	static int nerrs;
++
++	nbytes = read(fd, &event, sizeof(event));
++
++	if (nbytes == 0) {
++		acpid_log(LOG_WARNING, "input layer connection closed\n");
++		exit(EXIT_FAILURE);
++	}
++	
++	if (nbytes < 0) {
++		/* if it's a signal, bail */
++		if (errno == EINTR)
++			return;
++		
++		acpid_log(LOG_ERR, "input layer read error: %s (%d)\n",
++			strerror(errno), errno);
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading "
++				"input layer - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++		return;
++	}
++
++	/* ??? Is it possible for a partial message to come across? */
++	/*   If so, we've got more code to write... */
++	
++	if (nbytes != sizeof(event)) {
++		acpid_log(LOG_WARNING, "input layer unexpected length: "
++			"%d   expected: %d\n", nbytes, sizeof(event));
++		return;
++	}
++
++	/* convert the event into a string */
++	str = event_string(event);
++	/* if this is not an event we care about, bail */
++	if (str == NULL)
++		return;
++	
++	/* if we're locked, don't process the event */
++	if (locked()) {
++		if (logevents) {
++			acpid_log(LOG_INFO,
++				"lockfile present, not processing "
++				"input layer event \"%s\"\n", str);
++		}
++		return;
++	}
++
++	if (logevents)
++		acpid_log(LOG_INFO,
++			"received input layer event \"%s\"\n", str);
++	
++	/* send the event off to the handler */
++	acpid_handle_event(str);
++
++	if (logevents)
++		acpid_log(LOG_INFO,
++			"completed input layer event \"%s\"\n", str);
++}
++
++#define BITS_PER_LONG (sizeof(long) * 8)
++#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
++#define OFF(x)  ((x)%BITS_PER_LONG)
++#define LONG(x) ((x)/BITS_PER_LONG)
++#define test_bit(bit, array)	((array[LONG(bit)] >> OFF(bit)) & 1)
++
++/*--------------------------------------------------------------------*/
++/* returns non-zero if the file descriptor supports one of the events */
++/* supported by event_string().  */
++static int 
++has_event(int fd)
++{
++	int type, code;
++	unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
++
++	memset(bit, 0, sizeof(bit));
++	/* get the event type bitmap */
++	ioctl(fd, EVIOCGBIT(0, sizeof(bit[0])), bit[0]);
++
++	/* for each event type */
++	for (type = 0; type < EV_MAX; type++) {
++		/* if this event type is supported */
++		if (test_bit(type, bit[0])) {
++			/* skip sync */
++			if (type == EV_SYN) continue;
++			/* get the event code mask */
++			ioctl(fd, EVIOCGBIT(type, sizeof(bit[type])), bit[type]);
++			/* for each event code */
++			for (code = 0; code < KEY_MAX; code++) {
++				/* if this event code is supported */
++				if (test_bit(code, bit[type])) {
++					/* if we need this event */
++					if (need_event(type, code) != 0)
++						return 1;
++				}
++			}
++		}
++	}
++	return 0;
++}
++
++/* ??? make this changeable by commandline option */
++#define INPUT_LAYER_FS "/dev/input/event*"
++
++/*-----------------------------------------------------------------*
++ * open each of the appropriate /dev/input/event* files for input  */
++void open_input(void)
++{
++	char *filename = NULL;
++	glob_t globbuf;
++	unsigned i;
++	int fd;
++	int success = 0;
++	struct connection c;
++
++	/* get all the matching event filenames */
++	glob(INPUT_LAYER_FS, 0, NULL, &globbuf);
++
++	/* for each event file */
++	for (i = 0; i < globbuf.gl_pathc; ++i)
++	{
++		filename = globbuf.gl_pathv[i];
++
++		fd = open(filename, O_RDONLY | O_NONBLOCK);
++		if (fd >= 0) {
++			/* if this file doesn't have events we need, try the next */
++			if (!has_event(fd))
++			{
++				close(fd);
++				continue;
++			}
++
++			success = 1;
++
++			if (acpid_debug)
++				fprintf(stderr, "%s: input layer %s "
++					"opened successfully\n", progname, filename);
++
++			/* add a connection to the list */
++			c.fd = fd;
++			c.process = process_input;
++			add_connection(&c);
++		}
++	}
++
++	if (!success)
++		fprintf(stderr, "%s: cannot open input layer\n", progname);
++
++	globfree(&globbuf);
++}
+diff -ruN acpid-1.0.8.orig/input_layer.h acpid-1.0.8/input_layer.h
+--- acpid-1.0.8.orig/input_layer.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/input_layer.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ *  input_layer.h - Kernel ACPI Event Input Layer Interface
++ *
++ *  Handles the details of getting kernel ACPI events from the input
++ *  layer (/dev/input/event*).
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++#ifndef INPUT_LAYER_H__
++#define INPUT_LAYER_H__
++
++/* Open each of the appropriate /dev/input/event* files for input. */
++extern void open_input(void);
++
++#endif /* INPUT_LAYER_H__ */
+diff -ruN acpid-1.0.8.orig/libnetlink.c acpid-1.0.8/libnetlink.c
+--- acpid-1.0.8.orig/libnetlink.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/libnetlink.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,593 @@
++/*
++ * libnetlink.c	RTnetlink service routines.
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
++ *
++ * Modified by Ted Felix (www.tedfelix.com) to fix warnings.
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <net/if_arp.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <string.h>
++#include <errno.h>
++#include <time.h>
++#include <sys/uio.h>
++
++#include "libnetlink.h"
++
++void rtnl_close(struct rtnl_handle *rth)
++{
++	if (rth->fd >= 0) {
++		close(rth->fd);
++		rth->fd = -1;
++	}
++}
++
++int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions,
++		      int protocol)
++{
++	socklen_t addr_len;
++	int sndbuf = 32768;
++	int rcvbuf = 32768;
++
++	memset(rth, 0, sizeof(rth));
++
++	rth->fd = socket(AF_NETLINK, SOCK_RAW, protocol);
++	if (rth->fd < 0) {
++		perror("Cannot open netlink socket");
++		return -1;
++	}
++
++	if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) {
++		perror("SO_SNDBUF");
++		return -1;
++	}
++
++	if (setsockopt(rth->fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf)) < 0) {
++		perror("SO_RCVBUF");
++		return -1;
++	}
++
++	memset(&rth->local, 0, sizeof(rth->local));
++	rth->local.nl_family = AF_NETLINK;
++	rth->local.nl_groups = subscriptions;
++
++	if (bind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)) < 0) {
++		perror("Cannot bind netlink socket");
++		return -1;
++	}
++	addr_len = sizeof(rth->local);
++	if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) {
++		perror("Cannot getsockname");
++		return -1;
++	}
++	if (addr_len != sizeof(rth->local)) {
++		fprintf(stderr, "Wrong address length %d\n", addr_len);
++		return -1;
++	}
++	if (rth->local.nl_family != AF_NETLINK) {
++		fprintf(stderr, "Wrong address family %d\n", rth->local.nl_family);
++		return -1;
++	}
++	rth->seq = time(NULL);
++	return 0;
++}
++
++int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)
++{
++	return rtnl_open_byproto(rth, subscriptions, NETLINK_ROUTE);
++}
++
++int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
++{
++	struct {
++		struct nlmsghdr nlh;
++		struct rtgenmsg g;
++	} req;
++	struct sockaddr_nl nladdr;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	memset(&req, 0, sizeof(req));
++	req.nlh.nlmsg_len = sizeof(req);
++	req.nlh.nlmsg_type = type;
++	req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
++	req.nlh.nlmsg_pid = 0;
++	req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
++	req.g.rtgen_family = family;
++
++	return sendto(rth->fd, (void*)&req, sizeof(req), 0,
++		      (struct sockaddr*)&nladdr, sizeof(nladdr));
++}
++
++int rtnl_send(struct rtnl_handle *rth, const char *buf, int len)
++{
++	struct sockaddr_nl nladdr;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	return sendto(rth->fd, buf, len, 0, (struct sockaddr*)&nladdr, sizeof(nladdr));
++}
++
++int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
++{
++	struct nlmsghdr nlh;
++	struct sockaddr_nl nladdr;
++	struct iovec iov[2] = {
++		{ .iov_base = &nlh, .iov_len = sizeof(nlh) },
++		{ .iov_base = req, .iov_len = len }
++	};
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = 	sizeof(nladdr),
++		.msg_iov = iov,
++		.msg_iovlen = 2,
++	};
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	nlh.nlmsg_len = NLMSG_LENGTH(len);
++	nlh.nlmsg_type = type;
++	nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
++	nlh.nlmsg_pid = 0;
++	nlh.nlmsg_seq = rth->dump = ++rth->seq;
++
++	return sendmsg(rth->fd, &msg, 0);
++}
++
++int rtnl_dump_filter(struct rtnl_handle *rth,
++		     rtnl_filter_t filter,
++		     void *arg1,
++		     rtnl_filter_t junk,
++		     void *arg2)
++{
++	struct sockaddr_nl nladdr;
++	struct iovec iov;
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char buf[16384];
++
++	iov.iov_base = buf;
++	while (1) {
++		int status;
++		struct nlmsghdr *h;
++
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rth->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++
++		h = (struct nlmsghdr*)buf;
++		while (NLMSG_OK(h, (unsigned)status)) {
++			int err;
++
++			if (nladdr.nl_pid != 0 ||
++			    h->nlmsg_pid != rth->local.nl_pid ||
++			    h->nlmsg_seq != rth->dump) {
++				if (junk) {
++					err = junk(&nladdr, h, arg2);
++					if (err < 0)
++						return err;
++				}
++				goto skip_it;
++			}
++
++			if (h->nlmsg_type == NLMSG_DONE)
++				return 0;
++			if (h->nlmsg_type == NLMSG_ERROR) {
++				struct nlmsgerr *msgerr = (struct nlmsgerr*)NLMSG_DATA(h);
++				if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
++					fprintf(stderr, "ERROR truncated\n");
++				} else {
++					errno = -msgerr->error;
++					perror("RTNETLINK answers");
++				}
++				return -1;
++			}
++			err = filter(&nladdr, h, arg1);
++			if (err < 0)
++				return err;
++
++skip_it:
++			h = NLMSG_NEXT(h, status);
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
++	      unsigned groups, struct nlmsghdr *answer,
++	      rtnl_filter_t junk,
++	      void *jarg)
++{
++	int status;
++	unsigned seq;
++	struct nlmsghdr *h;
++	struct sockaddr_nl nladdr;
++	struct iovec iov = {
++		.iov_base = (void*) n,
++		.iov_len = n->nlmsg_len
++	};
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char   buf[16384];
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = peer;
++	nladdr.nl_groups = groups;
++
++	n->nlmsg_seq = seq = ++rtnl->seq;
++
++	if (answer == NULL)
++		n->nlmsg_flags |= NLM_F_ACK;
++
++	status = sendmsg(rtnl->fd, &msg, 0);
++
++	if (status < 0) {
++		perror("Cannot talk to rtnetlink");
++		return -1;
++	}
++
++	memset(buf,0,sizeof(buf));
++
++	iov.iov_base = buf;
++
++	while (1) {
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rtnl->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++		if (msg.msg_namelen != sizeof(nladdr)) {
++			fprintf(stderr, "sender address length == %d\n", msg.msg_namelen);
++			exit(1);
++		}
++		for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++			int err;
++			int len = h->nlmsg_len;
++			int l = len - sizeof(*h);
++
++			if (l<0 || len>status) {
++				if (msg.msg_flags & MSG_TRUNC) {
++					fprintf(stderr, "Truncated message\n");
++					return -1;
++				}
++				fprintf(stderr, "!!!malformed message: len=%d\n", len);
++				exit(1);
++			}
++
++			if (nladdr.nl_pid != (unsigned)peer ||
++			    h->nlmsg_pid != rtnl->local.nl_pid ||
++			    h->nlmsg_seq != seq) {
++				if (junk) {
++					err = junk(&nladdr, h, jarg);
++					if (err < 0)
++						return err;
++				}
++				/* Don't forget to skip that message. */
++				status -= NLMSG_ALIGN(len);
++				h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++				continue;
++			}
++
++			if (h->nlmsg_type == NLMSG_ERROR) {
++				struct nlmsgerr *msgerr = (struct nlmsgerr*)NLMSG_DATA(h);
++				if ((unsigned)l < sizeof(struct nlmsgerr)) {
++					fprintf(stderr, "ERROR truncated\n");
++				} else {
++					errno = -msgerr->error;
++					if (errno == 0) {
++						if (answer)
++							memcpy(answer, h, h->nlmsg_len);
++						return 0;
++					}
++					perror("RTNETLINK1 answers");
++				}
++				return -1;
++			}
++			if (answer) {
++				memcpy(answer, h, h->nlmsg_len);
++				return 0;
++			}
++
++			fprintf(stderr, "Unexpected reply!!!\n");
++
++			status -= NLMSG_ALIGN(len);
++			h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_listen(struct rtnl_handle *rtnl,
++		rtnl_filter_t handler,
++		void *jarg)
++{
++	int status;
++	struct nlmsghdr *h;
++	struct sockaddr_nl nladdr;
++	struct iovec iov;
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char   buf[8192];
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	iov.iov_base = buf;
++	while (1) {
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rtnl->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++		if (msg.msg_namelen != sizeof(nladdr)) {
++			fprintf(stderr, "Sender address length == %d\n", msg.msg_namelen);
++			exit(1);
++		}
++		for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++			int err;
++			int len = h->nlmsg_len;
++			int l = len - sizeof(*h);
++
++			if (l<0 || len>status) {
++				if (msg.msg_flags & MSG_TRUNC) {
++					fprintf(stderr, "Truncated message\n");
++					return -1;
++				}
++				fprintf(stderr, "!!!malformed message: len=%d\n", len);
++				exit(1);
++			}
++
++			err = handler(&nladdr, h, jarg);
++			if (err < 0)
++				return err;
++
++			status -= NLMSG_ALIGN(len);
++			h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler,
++		   void *jarg)
++{
++	int status;
++	struct sockaddr_nl nladdr;
++	char   buf[8192];
++	struct nlmsghdr *h = (void*)buf;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	while (1) {
++		int err, len, type;
++		int l;
++
++		status = fread(&buf, 1, sizeof(*h), rtnl);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("rtnl_from_file: fread");
++			return -1;
++		}
++		if (status == 0)
++			return 0;
++
++		len = h->nlmsg_len;
++		type= h->nlmsg_type;
++		l = len - sizeof(*h);
++
++		if (l<0 || (unsigned)len>sizeof(buf)) {
++			fprintf(stderr, "!!!malformed message: len=%d @%lu\n",
++				len, ftell(rtnl));
++			return -1;
++		}
++
++		status = fread(NLMSG_DATA(h), 1, NLMSG_ALIGN(l), rtnl);
++
++		if (status < 0) {
++			perror("rtnl_from_file: fread");
++			return -1;
++		}
++		if (status < l) {
++			fprintf(stderr, "rtnl-from_file: truncated message\n");
++			return -1;
++		}
++
++		err = handler(&nladdr, h, jarg);
++		if (err < 0)
++			return err;
++	}
++}
++
++int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data)
++{
++	int len = RTA_LENGTH(4);
++	struct rtattr *rta;
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) {
++		fprintf(stderr,"addattr32: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	rta = NLMSG_TAIL(n);
++	rta->rta_type = type;
++	rta->rta_len = len;
++	memcpy(RTA_DATA(rta), &data, 4);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
++	return 0;
++}
++
++int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data,
++	      int alen)
++{
++	int len = RTA_LENGTH(alen);
++	struct rtattr *rta;
++
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) {
++		fprintf(stderr, "addattr_l ERROR: message exceeded bound of %d\n",maxlen);
++		return -1;
++	}
++	rta = NLMSG_TAIL(n);
++	rta->rta_type = type;
++	rta->rta_len = len;
++	memcpy(RTA_DATA(rta), data, alen);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
++	return 0;
++}
++
++int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len)
++{
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len) > maxlen) {
++		fprintf(stderr, "addraw_l ERROR: message exceeded bound of %d\n",maxlen);
++		return -1;
++	}
++
++	memcpy(NLMSG_TAIL(n), data, len);
++	memset((void *) NLMSG_TAIL(n) + len, 0, NLMSG_ALIGN(len) - len);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len);
++	return 0;
++}
++
++int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data)
++{
++	int len = RTA_LENGTH(4);
++	struct rtattr *subrta;
++
++	if (RTA_ALIGN(rta->rta_len) + len > maxlen) {
++		fprintf(stderr,"rta_addattr32: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
++	subrta->rta_type = type;
++	subrta->rta_len = len;
++	memcpy(RTA_DATA(subrta), &data, 4);
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + len;
++	return 0;
++}
++
++int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
++		  const void *data, int alen)
++{
++	struct rtattr *subrta;
++	int len = RTA_LENGTH(alen);
++
++	if (RTA_ALIGN(rta->rta_len) + RTA_ALIGN(len) > maxlen) {
++		fprintf(stderr,"rta_addattr_l: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
++	subrta->rta_type = type;
++	subrta->rta_len = len;
++	memcpy(RTA_DATA(subrta), data, alen);
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len);
++	return 0;
++}
++
++int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
++{
++	memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
++	while (RTA_OK(rta, len)) {
++		if (rta->rta_type <= max)
++			tb[rta->rta_type] = rta;
++		rta = RTA_NEXT(rta,len);
++	}
++	if (len)
++		fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len);
++	return 0;
++}
++
++int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len)
++{
++	int i = 0;
++
++	memset(tb, 0, sizeof(struct rtattr *) * max);
++	while (RTA_OK(rta, len)) {
++		if (rta->rta_type <= max && i < max)
++			tb[i++] = rta;
++		rta = RTA_NEXT(rta,len);
++	}
++	if (len)
++		fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len);
++	return i;
++}
+diff -ruN acpid-1.0.8.orig/libnetlink.h acpid-1.0.8/libnetlink.h
+--- acpid-1.0.8.orig/libnetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/libnetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,91 @@
++#ifndef __LIBNETLINK_H__
++#define __LIBNETLINK_H__ 1
++
++#include <asm/types.h>
++// needed by netlink.h, should be in there
++#include <arpa/inet.h>
++#include <linux/netlink.h>
++#include <linux/rtnetlink.h>
++
++struct rtnl_handle
++{
++	int			fd;
++	struct sockaddr_nl	local;
++	struct sockaddr_nl	peer;
++	__u32			seq;
++	__u32			dump;
++};
++
++extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions);
++extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol);
++extern void rtnl_close(struct rtnl_handle *rth);
++extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type);
++extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len);
++
++typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
++			     struct nlmsghdr *n, void *);
++extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter,
++			    void *arg1,
++			    rtnl_filter_t junk,
++			    void *arg2);
++extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
++		     unsigned groups, struct nlmsghdr *answer,
++		     rtnl_filter_t junk,
++		     void *jarg);
++extern int rtnl_send(struct rtnl_handle *rth, const char *buf, int);
++
++
++extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
++extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen);
++extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
++extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
++extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen);
++
++extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
++extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len);
++
++#define parse_rtattr_nested(tb, max, rta) \
++	(parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
++
++extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler,
++		       void *jarg);
++extern int rtnl_from_file(FILE *, rtnl_filter_t handler,
++		       void *jarg);
++
++#define NLMSG_TAIL(nmsg) \
++	((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
++
++#ifndef IFA_RTA
++#define IFA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
++#endif
++#ifndef IFA_PAYLOAD
++#define IFA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
++#endif
++
++#ifndef IFLA_RTA
++#define IFLA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#endif
++#ifndef IFLA_PAYLOAD
++#define IFLA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++#endif
++
++#ifndef NDA_RTA
++#define NDA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
++#endif
++#ifndef NDA_PAYLOAD
++#define NDA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
++#endif
++
++#ifndef NDTA_RTA
++#define NDTA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
++#endif
++#ifndef NDTA_PAYLOAD
++#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
++#endif
++
++#endif /* __LIBNETLINK_H__ */
++
+diff -ruN acpid-1.0.8.orig/Makefile acpid-1.0.8/Makefile
+--- acpid-1.0.8.orig/Makefile	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/Makefile	2009-03-29 17:10:14.000000000 +0200
+@@ -12,7 +12,8 @@
+ BIN_PROGS = acpi_listen
+ PROGS = $(SBIN_PROGS) $(BIN_PROGS)
+ 
+-acpid_SRCS = acpid.c event.c ud_socket.c
++acpid_SRCS = acpid.c acpi_ids.c connection_list.c event.c input_layer.c \
++    libnetlink.c netlink.c proc.c sock.c ud_socket.c
+ acpid_OBJS = $(acpid_SRCS:.c=.o)
+ 
+ acpi_listen_SRCS = acpi_listen.c ud_socket.c
+diff -ruN acpid-1.0.8.orig/netlink.c acpid-1.0.8/netlink.c
+--- acpid-1.0.8.orig/netlink.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/netlink.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,239 @@
++/*
++ *  netlink.c - Kernel ACPI Event Netlink Interface
++ *
++ *  Handles the details of getting kernel ACPI events from netlink.
++ *
++ *  Inspired by (and in some cases blatantly lifted from) Zhang Rui's
++ *  acpi_genl and Alexey Kuznetsov's libnetlink.  Thanks also to Yi Yang
++ *  at intel.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++/* system */
++#include <unistd.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++
++/* local */
++#include "acpid.h"
++#include "event.h"
++
++#include "libnetlink.h"
++#include "genetlink.h"
++#include "acpi_genetlink.h"
++
++#include "acpi_ids.h"
++#include "connection_list.h"
++
++static void
++format_netlink(struct nlmsghdr *msg)
++{
++	struct rtattr *tb[ACPI_GENL_ATTR_MAX + 1];
++	struct genlmsghdr *ghdr = NLMSG_DATA(msg);
++	int len;
++	struct rtattr *attrs;
++	
++	len = msg->nlmsg_len;
++	
++	/* if this message doesn't have the proper family ID, drop it */
++	if (msg->nlmsg_type != acpi_ids_getfamily()) {
++		if (logevents) {
++			acpid_log(LOG_INFO, "wrong netlink family ID.\n");
++		}
++		return;
++	}
++
++	len -= NLMSG_LENGTH(GENL_HDRLEN);
++
++	if (len < 0) {
++		acpid_log(LOG_WARNING,
++			"wrong netlink controller message len: %d\n", len);
++		return;
++	}
++
++	attrs = (struct rtattr *)((char *)ghdr + GENL_HDRLEN);
++	/* parse the attributes in this message */
++	parse_rtattr(tb, ACPI_GENL_ATTR_MAX, attrs, len);
++
++	/* if there's an ACPI event attribute... */
++	if (tb[ACPI_GENL_ATTR_EVENT]) {
++		/* get the actual event struct */
++		struct acpi_genl_event *event =
++				RTA_DATA(tb[ACPI_GENL_ATTR_EVENT]);
++		char buf[64];
++
++		/* format it */
++		snprintf(buf, sizeof(buf), "%s %s %08x %08x",
++			event->device_class, event->bus_id, event->type, event->data);
++
++		/* if we're locked, don't process the event */
++		if (locked()) {
++			if (logevents) {
++				acpid_log(LOG_INFO,
++					"lockfile present, not processing "
++					"netlink event \"%s\"\n", buf);
++			}
++			return;
++		}
++
++		if (logevents)
++			acpid_log(LOG_INFO,
++				"received netlink event \"%s\"\n", buf);
++
++		/* send the event off to the handler */
++		acpid_handle_event(buf);
++
++		if (logevents)
++			acpid_log(LOG_INFO,
++				"completed netlink event \"%s\"\n", buf);
++	}
++}
++
++/* (based on rtnl_listen() in libnetlink.c) */
++void
++process_netlink(int fd)
++{
++	int status;
++	struct nlmsghdr *h;
++	/* the address for recvmsg() */
++	struct sockaddr_nl nladdr;
++	/* the io vector for recvmsg() */
++	struct iovec iov;
++	/* recvmsg() parameters */
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	/* buffer for the incoming data */
++	char buf[8192];
++	static int nerrs;
++
++	/* set up the netlink address */
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	/* set up the I/O vector */
++	iov.iov_base = buf;
++	iov.iov_len = sizeof(buf);
++	
++	/* read the data into the buffer */
++	status = recvmsg(fd, &msg, 0);
++
++	/* if there was a problem, print a message and keep trying */
++	if (status < 0) {
++		/* if we were interrupted by a signal, bail */
++		if (errno == EINTR)
++			return;
++		
++		acpid_log(LOG_ERR, "netlink read error: %s (%d)\n",
++			strerror(errno), errno);
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading via "
++				"netlink - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++		return;
++	}
++	/* if an orderly shutdown has occurred, we're done */
++	if (status == 0) {
++		acpid_log(LOG_WARNING, "netlink connection closed\n");
++		exit(EXIT_FAILURE);
++	}
++	/* check to see if the address length has changed */
++	if (msg.msg_namelen != sizeof(nladdr)) {
++		acpid_log(LOG_WARNING, "netlink unexpected length: "
++			"%d   expected: %d\n", msg.msg_namelen, sizeof(nladdr));
++		return;
++	}
++	
++	/* for each message received */
++	for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++		int len = h->nlmsg_len;
++		int l = len - sizeof(*h);
++
++		if (l < 0  ||  len > status) {
++			if (msg.msg_flags & MSG_TRUNC) {
++				acpid_log(LOG_WARNING, "netlink msg truncated (1)\n");
++				return;
++			}
++			acpid_log(LOG_WARNING,
++				"malformed netlink msg, length %d\n", len);
++			return;
++		}
++
++		/* format the message */
++		format_netlink(h);
++
++		status -= NLMSG_ALIGN(len);
++		h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++	}
++	if (msg.msg_flags & MSG_TRUNC) {
++		acpid_log(LOG_WARNING, "netlink msg truncated (2)\n");
++		return;
++	}
++	if (status) {
++		acpid_log(LOG_WARNING, "netlink remnant of size %d\n", status);
++		return;
++	}
++
++	return;
++}
++
++/* convert the netlink multicast group number into a bit map */
++/* (e.g. 4 => 16, 5 => 32) */
++static __u32
++nl_mgrp(__u32 group)
++{
++	if (group > 31) {
++		fprintf(stderr, "%s: unexpected group number %d\n",
++			progname, group);
++		return 0;
++	}
++	return group ? (1 << (group - 1)) : 0;
++}
++
++void open_netlink(void)
++{
++	struct rtnl_handle rth;
++	struct connection c;
++
++	/* open the appropriate netlink socket for input */
++	if (rtnl_open_byproto(
++		&rth, nl_mgrp(acpi_ids_getgroup()), NETLINK_GENERIC) < 0) {
++		fprintf(stderr, "%s: cannot open generic netlink socket\n",
++			progname);
++		return;
++	}
++
++	if (acpid_debug)
++		fprintf(stderr, "%s: netlink opened successfully\n", progname);
++
++	/* add a connection to the list */
++	c.fd = rth.fd;
++	c.process = process_netlink;
++	add_connection(&c);
++}
+diff -ruN acpid-1.0.8.orig/netlink.h acpid-1.0.8/netlink.h
+--- acpid-1.0.8.orig/netlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/netlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,31 @@
++/*
++ *  netlink.h - Kernel ACPI Event Netlink Interface
++ *
++ *  Handles the details of getting kernel ACPI events from netlink.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++#ifndef NETLINK_H__
++#define NETLINK_H__
++
++/* open the netlink connection */
++extern void open_netlink(void);
++
++#endif /* NETLINK_H__ */
+diff -ruN acpid-1.0.8.orig/proc.c acpid-1.0.8/proc.c
+--- acpid-1.0.8.orig/proc.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/proc.c	2009-03-29 17:18:26.000000000 +0200
+@@ -0,0 +1,207 @@
++/*
++ *  proc.c - ACPI daemon proc filesystem interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++
++#include "acpid.h"
++#include "event.h"
++#include "connection_list.h"
++
++const char *eventfile = ACPID_EVENTFILE;
++
++static char *read_line(int fd);
++
++static void
++process_proc(int fd)
++{
++	char *event;
++
++	/* read an event */
++	event = read_line(fd);
++
++	/* if we're locked, don't process the event */
++	if (locked()) {
++		if (logevents  &&  event != NULL) {
++			acpid_log(LOG_INFO,
++				"lockfile present, not processing "
++				"event \"%s\"\n", event);
++		}
++		return;
++	}
++
++	/* handle the event */
++	if (event) {
++		if (logevents) {
++			acpid_log(LOG_INFO,
++			          "procfs received event \"%s\"\n", event);
++		}
++		acpid_handle_event(event);
++		if (logevents) {
++			acpid_log(LOG_INFO,
++				"procfs completed event \"%s\"\n", event);
++		}
++	} else if (errno == EPIPE) {
++		acpid_log(LOG_WARNING,
++			"events file connection closed\n");
++		exit(EXIT_FAILURE);
++	} else {
++		static int nerrs;
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading "
++				"events file - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++	}
++}
++
++int
++open_proc()
++{
++	int fd;
++	struct connection c;
++	
++	fd = open(eventfile, O_RDONLY);
++	if (fd < 0) {
++	    if (acpid_debug)
++		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
++			eventfile, strerror(errno));
++		return -1;
++	}
++	fcntl(fd, F_SETFD, FD_CLOEXEC);
++
++	if (acpid_debug)
++		fprintf(stderr, "%s: proc fs opened successfully\n", progname);
++
++	/* add a connection to the list */
++	c.fd = fd;
++	c.process = process_proc;
++	add_connection(&c);
++
++	return 0;
++}
++
++/*
++ * This depends on fixes in linux ACPI after 2.4.8
++ */
++#define BUFLEN 1024
++static char *
++read_line(int fd)
++{
++	static char buf[BUFLEN];
++	int i = 0;
++	int r;
++	int searching = 1;
++
++	while (searching) {
++		memset(buf+i, 0, BUFLEN-i);
++
++		/* only go to BUFLEN-1 so there will always be a 0 at the end */
++		while (i < BUFLEN-1) {
++			r = read(fd, buf+i, 1);
++			if (r < 0 && errno != EINTR) {
++				/* we should do something with the data */
++				acpid_log(LOG_ERR, "read(): %s\n",
++					strerror(errno));
++				return NULL;
++			} else if (r == 0) {
++				/* signal this in an almost standard way */
++				errno = EPIPE;
++				return NULL;
++			} else if (r == 1) {
++				/* scan for a newline */
++				if (buf[i] == '\n') {
++					searching = 0;
++					buf[i] = '\0';
++					break;
++				}
++				i++;
++			}
++		}
++		if (i >= BUFLEN - 1)
++			break;
++	}
++
++	return buf;
++}
++
++#if 0
++/* This version leaks memory.  The above version is simpler and leak-free. */
++/* Downside is that the above version always uses 1k of RAM. */
++/*
++ * This depends on fixes in linux ACPI after 2.4.8
++ */
++#define MAX_BUFLEN	1024
++static char *
++read_line(int fd)
++{
++	static char *buf;
++	int buflen = 64;
++	int i = 0;
++	int r;
++	int searching = 1;
++
++	while (searching) {
++		/* ??? This memory is leaked since it is never freed */
++		buf = realloc(buf, buflen);
++		if (!buf) {
++			acpid_log(LOG_ERR, "malloc(%d): %s\n",
++				buflen, strerror(errno));
++			return NULL;
++		}
++		memset(buf+i, 0, buflen-i);
++
++		while (i < buflen) {
++			r = read(fd, buf+i, 1);
++			if (r < 0 && errno != EINTR) {
++				/* we should do something with the data */
++				acpid_log(LOG_ERR, "read(): %s\n",
++					strerror(errno));
++				return NULL;
++			} else if (r == 0) {
++				/* signal this in an almost standard way */
++				errno = EPIPE;
++				return NULL;
++			} else if (r == 1) {
++				/* scan for a newline */
++				if (buf[i] == '\n') {
++					searching = 0;
++					buf[i] = '\0';
++					break;
++				}
++				i++;
++			}
++		}
++		if (buflen >= MAX_BUFLEN) {
++			break;
++		} 
++		buflen *= 2;
++	}
++
++	return buf;
++}
++#endif
+diff -ruN acpid-1.0.8.orig/proc.h acpid-1.0.8/proc.h
+--- acpid-1.0.8.orig/proc.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/proc.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++ *  proc.h - ACPI daemon proc filesystem interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef PROC_H__
++#define PROC_H__
++
++extern const char *eventfile;
++
++extern int open_proc();
++
++#endif /* PROC_H__ */
+diff -ruN acpid-1.0.8.orig/sock.c acpid-1.0.8/sock.c
+--- acpid-1.0.8.orig/sock.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/sock.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,98 @@
++/*
++ *  sock.c - ACPI daemon socket interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <grp.h>
++
++#include "acpid.h"
++#include "event.h"
++#include "ud_socket.h"
++#include "connection_list.h"
++
++const char *socketfile = ACPID_SOCKETFILE;
++const char *socketgroup;
++mode_t socketmode = ACPID_SOCKETMODE;
++
++static void
++process_sock(int fd)
++{
++	int cli_fd;
++	struct ucred creds;
++	char buf[32];
++
++	/* accept and add to our lists */
++	cli_fd = ud_accept(fd, &creds);
++	if (cli_fd < 0) {
++		acpid_log(LOG_ERR, "can't accept client: %s\n",
++			  strerror(errno));
++		return;
++	}
++	fcntl(cli_fd, F_SETFD, FD_CLOEXEC);
++	snprintf(buf, sizeof(buf)-1, "%d[%d:%d]",
++		 creds.pid, creds.uid, creds.gid);
++	acpid_add_client(cli_fd, buf);
++}
++
++void
++open_sock()
++{
++	int fd;
++	struct connection c;
++
++	fd = ud_create_socket(socketfile);
++	if (fd < 0) {
++		fprintf(stderr, "%s: can't open socket %s: %s\n",
++			progname, socketfile, strerror(errno));
++		exit(EXIT_FAILURE);
++	}
++	fcntl(fd, F_SETFD, FD_CLOEXEC);
++	chmod(socketfile, socketmode);
++	if (socketgroup) {
++		struct group *gr;
++		struct stat buf;
++		gr = getgrnam(socketgroup);
++		if (!gr) {
++			fprintf(stderr, "%s: group %s does not exist\n",
++				progname, socketgroup);
++			exit(EXIT_FAILURE);
++		}
++		if (stat(socketfile, &buf) < 0) {
++			fprintf(stderr, "%s: can't stat %s\n",
++				progname, socketfile);
++			exit(EXIT_FAILURE);
++		}
++		if (chown(socketfile, buf.st_uid, gr->gr_gid) < 0) {
++			fprintf(stderr, "%s: chown(): %s\n",
++				progname, strerror(errno));
++			exit(EXIT_FAILURE);
++		}
++	}
++	
++	/* add a connection to the list */
++	c.fd = fd;
++	c.process = process_sock;
++	add_connection(&c);
++}
+diff -ruN acpid-1.0.8.orig/sock.h acpid-1.0.8/sock.h
+--- acpid-1.0.8.orig/sock.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/sock.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ *  sock.h - ACPI daemon socket interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef SOCK_H__
++#define SOCK_H__
++
++extern const char *socketfile;
++extern const char *socketgroup;
++extern mode_t socketmode;
++
++extern void open_sock();
++
++#endif /* SOCK_H__ */
diff --git a/recipes/acpid/acpid_1.0.8.bb b/recipes/acpid/acpid_1.0.8.bb
new file mode 100644
index 0000000..98638e6
--- /dev/null
+++ b/recipes/acpid/acpid_1.0.8.bb
@@ -0,0 +1,6 @@
+require acpid.inc
+
+SRC_URI_append = " file://event.c.diff;patch=1 \
+                   file://fixfd.diff;patch=1 \
+                   file://netlink.diff;patch=1"
+
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 04/23] hal-info: add 20080414
  2009-05-09  0:50     ` [PATCH 03/23] acpid: add 1.0.8 (with netlink support) Otavio Salvador
@ 2009-05-09  0:50       ` Otavio Salvador
  2009-05-09  0:50         ` [PATCH 05/23] python-pycups: add Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini               |    4 ++++
 recipes/hal/hal-info_20090414.bb |    1 +
 2 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100644 recipes/hal/hal-info_20090414.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index ec15afd..51f6f04 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -10070,6 +10070,10 @@ sha256=120e6b8019b5d608038d8f9a5a14bb97c4162b803118bb8530d9735d65b553a9
 md5=6fc99d15d38945c17a291ea93e664664
 sha256=80655b3531ea56a5d64085e572dfb8d3ecabffd28af482cd130f72dfdd6254b0
 
+[http://hal.freedesktop.org/releases/hal-info-20090414.tar.gz]
+md5=ae7177ab8f0163d3ef2df71f0de2b357
+sha256=33dd87dc9452227375b8b9cdad940581714a55d55ff18ae2990905ac2f81fa0f
+
 [http://www.soft.uni-linz.ac.at/~vogl/bluez/handsfree-040326.tar.gz]
 md5=488b0f2f346361bba7996b459c5d7b6f
 sha256=dbd0c389a160c9f6dcd9eac81b6c4d5a02866968a33f06201556d6860012f6c3
diff --git a/recipes/hal/hal-info_20090414.bb b/recipes/hal/hal-info_20090414.bb
new file mode 100644
index 0000000..e6d50e3
--- /dev/null
+++ b/recipes/hal/hal-info_20090414.bb
@@ -0,0 +1 @@
+require hal-info.inc
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 05/23] python-pycups: add
  2009-05-09  0:50       ` [PATCH 04/23] hal-info: add 20080414 Otavio Salvador
@ 2009-05-09  0:50         ` Otavio Salvador
  2009-05-09  0:50           ` [PATCH 06/23] checksums.ini: add flash-plugin Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                     |    4 ++++
 recipes/python/python-pycups_1.9.45.bb |   16 ++++++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)
 create mode 100644 recipes/python/python-pycups_1.9.45.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 51f6f04..d314262 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -19534,6 +19534,10 @@ sha256=a6d7db68c87699e283a1f58b637a7e730c350899fd7b35b88e63caa0e85a9ab9
 md5=4d5674f3898a573691ffb335e8d749cd
 sha256=b08d4ed54c9403c77778a3803e53a4f33f359b42d94f6f3e14abb1bf4941e6ea
 
+[http://cyberelk.net/tim/data/pycups/pycups-1.9.45.tar.bz2]
+md5=ff634a6751f8a859ed26751bf03abef0
+sha256=ef6e576e5465da9c338ac8ff9f162825cfb7997359efc52e6a110c295a9f363b
+
 [http://pycurl.sourceforge.net/download/pycurl-7.14.0.tar.gz]
 md5=6f73d518fb520af14634a06ee1b7ddce
 sha256=a60e08b01fc3355ec18ec0e447349b6f8bff3f9628eb42891cff1eb51b9618b1
diff --git a/recipes/python/python-pycups_1.9.45.bb b/recipes/python/python-pycups_1.9.45.bb
new file mode 100644
index 0000000..bd127d5
--- /dev/null
+++ b/recipes/python/python-pycups_1.9.45.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "cups Python Bindings"
+SECTION = "devel/python"
+PRIORITY = "optional"
+LICENSE = "GPLv2"
+DEPENDS = "cups"
+SRCNAME = "pycups"
+
+SRC_URI = "http://cyberelk.net/tim/data/pycups/pycups-${PV}.tar.bz2"
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+inherit distutils
+
+# used during compilation
+CFLAGS += -DVERSION=\\"${PV}\\"
+
+RDEPENDS = "python-core cups"
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 06/23] checksums.ini: add flash-plugin
  2009-05-09  0:50         ` [PATCH 05/23] python-pycups: add Otavio Salvador
@ 2009-05-09  0:50           ` Otavio Salvador
  2009-05-09  0:50             ` [PATCH 07/23] checksums.ini: add sun-jdk Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/conf/checksums.ini b/conf/checksums.ini
index d314262..c606769 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -6066,6 +6066,10 @@ sha256=ce4f7d11b3c04a7368c916ca4abc284dd0c0256f461dfb7f07df1ab445e7a5c0
 md5=8845d4536fcd3a329690c93bce9bbf8e
 sha256=c7345faf10b269b3556f2e1373c4afc35f08891f8bbd54e45d49151a8c8e4ac0
 
+[http://fpdownload.macromedia.com/get/flashplayer/current//flash-plugin-10.0.22.87-release.i386.rpm]
+md5=a3bb1f9a8e2b1238ffaf89193e60be02
+sha256=ec5ace49df7cfe69b7c02c8d1b6df8089f32076a390b931051feed2a9762d554
+
 [http://downloads.sourceforge.net/flex/flex-2.5.31.tar.bz2]
 md5=363dcc4afc917dc51306eb9d3de0152f
 sha256=701353279a17655d78e3b3678ad78d0375f5bf45877ad8b3507d589c42427f26
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 07/23] checksums.ini: add sun-jdk
  2009-05-09  0:50           ` [PATCH 06/23] checksums.ini: add flash-plugin Otavio Salvador
@ 2009-05-09  0:50             ` Otavio Salvador
  2009-05-09  0:50               ` [PATCH 08/23] checksums.ini: firefox-l10n-pt-br Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/conf/checksums.ini b/conf/checksums.ini
index c606769..cc060fb 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -11226,6 +11226,10 @@ sha256=f24ae604a20da87e3716bb1d441c483e56479eaef4e99888f41be06059790bca
 md5=4e979c0dda766ba1dd719905ca975c7b
 sha256=202de62e2f3d0667cc464720d5897d0ccb29767ec24e0a4d4c5bd6c4d37425a4
 
+[http://download.java.net/dlj/binaries/jdk-6u10-dlj-linux-i586.bin]
+md5=b70924c697584ab7955050d7a9b4de57
+sha256=dae79e8c56090ac3fb4ac3fe0df9faf6a0c9694a89ef978dce0ab970557ad264
+
 [http://www.jdom.org/dist/binary/jdom-1.1.tar.gz]
 md5=22745cbaaddb12884ed8ee09083d8fe2
 sha256=a13549087141be24ad176b659afdc2c675f1ffa5288ff999a193d6d44a282056
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 08/23] checksums.ini: firefox-l10n-pt-br
  2009-05-09  0:50             ` [PATCH 07/23] checksums.ini: add sun-jdk Otavio Salvador
@ 2009-05-09  0:50               ` Otavio Salvador
  2009-05-09  0:50                 ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/conf/checksums.ini b/conf/checksums.ini
index cc060fb..5daf8ec 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -19194,6 +19194,10 @@ sha256=6bca237485a352362133792e000a3c8e367a26b0312c5c607db7c2a97717d15f
 md5=2e81938855cf5cc38856bd4a31d79a4c
 sha256=a13c81897c94b3d6e705fc9da07c610492e28cf7abd5ff8e992f0ec95a269d62
 
+[http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.4/linux-i686/xpi/pt-BR.xpi]
+md5=29c672886aa9ca41428ba04196938545
+sha256=1474828a58f893bed20f0e0cd26bc310c7472d69bf7a1ae01c00a371de256b1a
+
 [ftp://ftp.ossp.org/pkg/lib/pth/pth-2.0.0.tar.gz]
 md5=f84a87295fef3b41499f3b728b1f0050
 sha256=1935a06368c1555d5f80329ba1e53f5b1a7dd9efb7fc9354427f2d1a583c81a3
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils
  2009-05-09  0:50               ` [PATCH 08/23] checksums.ini: firefox-l10n-pt-br Otavio Salvador
@ 2009-05-09  0:50                 ` Otavio Salvador
  2009-05-09  0:50                   ` [PATCH 10/23] hal-cups-utils: add Otavio Salvador
  2009-05-09  7:56                   ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Koen Kooi
  0 siblings, 2 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                                 |    4 ++++
 .../system-config-printer_1.1.7.bb                 |   19 +++++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)
 create mode 100644 recipes/system-config-printer/system-config-printer_1.1.7.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 5daf8ec..0df13ba 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -22214,6 +22214,10 @@ sha256=26c05ef7666881eb1d60291a4293e67d75dbf048ca8a30f6b9eb3dc86ad1b6b0
 md5=d7b8f27b83ff080ff824177d65a7dae0
 sha256=0a63da1c99b6a9b6a93b6fd0a9391c7d8216f658d2bea0ba81999e261c6b6649
 
+[http://cyberelk.net/tim/data/system-config-printer/1.1/system-config-printer-1.1.7.tar.bz2]
+md5=a77bde5adc5ee8822b0764ff786ccc09
+sha256=fdd50cb114151c66b8180c0ce90ba0e99f77a69770ac21598a87be935eec2224
+
 [ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz]
 md5=7d5d61c026122ab791ac04c8a84db967
 sha256=035f98fae17d9cff002993c564ccc83dc4ed136127172caeff872b6abdb679d8
diff --git a/recipes/system-config-printer/system-config-printer_1.1.7.bb b/recipes/system-config-printer/system-config-printer_1.1.7.bb
new file mode 100644
index 0000000..e02a814
--- /dev/null
+++ b/recipes/system-config-printer/system-config-printer_1.1.7.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "cups Python Bindings"
+SECTION = "devel/python"
+PRIORITY = "optional"
+LICENSE = "GPLv2"
+DEPENDS = "cups"
+RDEPENDS_python-cupshelpers += "python-pprint python-netclient python-misc" 
+SRC_URI = "http://cyberelk.net/tim/data/${PN}/1.1/${PN}-${PV}.tar.bz2"
+S = "${WORKDIR}/${PN}-${PV}"
+
+inherit distutils
+
+do_configure_prepend() {
+		# disable xmlto usage since we won't use manpages
+		sed -i 's,xmlto,echo xmlto,g' ${S}/Makefile*
+}
+
+PACKAGES="python-cupshelpers"
+
+FILES_python-cupshelpers = "${libdir}"
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 10/23] hal-cups-utils: add
  2009-05-09  0:50                 ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Otavio Salvador
@ 2009-05-09  0:50                   ` Otavio Salvador
  2009-05-09  0:50                     ` [PATCH 11/23] cups: split backends and models Otavio Salvador
  2009-05-09  7:56                   ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Koen Kooi
  1 sibling, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                   |    4 ++++
 recipes/hal/hal-cups-utils_0.6.19.bb |   23 +++++++++++++++++++++++
 2 files changed, 27 insertions(+), 0 deletions(-)
 create mode 100644 recipes/hal/hal-cups-utils_0.6.19.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 0df13ba..57a1e72 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -10058,6 +10058,10 @@ sha256=65d8f8eeb61e7609a8c5001b6660d90e7a482c4b74b4e226d09b433dc1a80c9d
 md5=a6f532770cf9286e1de38d6570cbc6bc
 sha256=65d8f8eeb61e7609a8c5001b6660d90e7a482c4b74b4e226d09b433dc1a80c9d
 
+[https://fedorahosted.org/releases/h/a/hal-cups-utils/hal-cups-utils-0.6.19.tar.gz]
+md5=58e1c8f5597dd39e57dcf3c4aabe60f8
+sha256=f40a7ebd1453d471a8a6bfd8c635708dd739a6160bb661813f936d936ba85618
+
 [http://hal.freedesktop.org/releases/hal-info-20070618.tar.gz]
 md5=c7005ccb1765d8359fd2348350770495
 sha256=bec1b0ad166b6c4d5269e7aa6d7bdbd0eb05c8f2c30042e4dca18993ba5682f0
diff --git a/recipes/hal/hal-cups-utils_0.6.19.bb b/recipes/hal/hal-cups-utils_0.6.19.bb
new file mode 100644
index 0000000..289990e
--- /dev/null
+++ b/recipes/hal/hal-cups-utils_0.6.19.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "Utilities to detect and configure printers automatically"
+HOMEPAGE = "https://fedorahosted.org/hal-cups-utils/"
+SECTION = "console/utils"
+LICENSE = "GPLv2 CUPS"
+DEPENDS = "hal dbus cups"
+RDEPENDS_${PN} += "python-dbus python-pycups python-cupshelpers python-subprocess python-syslog usbutils"
+
+SRC_URI = "https://fedorahosted.org/releases/h/a/hal-cups-utils/hal-cups-utils-${PV}.tar.gz"
+S = "${WORKDIR}/${PN}-${PV}"
+
+inherit autotools
+
+PACKAGES += "cups-backend-hal"
+
+FILES_${PN} += "${libdir}/hal/* ${datadir}/hal/*"
+FILES_${PN}-dbg += "${libdir}/hal/.debug ${libdir}/cups/backend/.debug"
+FILES_cups-backend-hal += "${libdir}/cups/backend/*"
+
+EXTRA_OECONF = "--libexecdir=${libdir}/hal/scripts"
+
+do_configure_append() {
+	sed -i 's,^#!/bin/env python,#!/usr/bin/python,' systemv/hal_lpadmin
+}
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 11/23] cups: split backends and models
  2009-05-09  0:50                   ` [PATCH 10/23] hal-cups-utils: add Otavio Salvador
@ 2009-05-09  0:50                     ` Otavio Salvador
  2009-05-09  0:50                       ` [PATCH 12/23] conf/licenses.conf: add CUPS license Otavio Salvador
  2009-05-09 16:16                       ` [PATCH 11/23] cups: split backends and models Cliff Brake
  0 siblings, 2 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/cups/cups.inc       |   13 ++++++++++++-
 recipes/cups/cups_1.2.12.bb |    2 +-
 recipes/cups/cups_1.2.7.bb  |    8 ++------
 recipes/cups/cups_1.3.8.bb  |    2 +-
 4 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/recipes/cups/cups.inc b/recipes/cups/cups.inc
index 8e2a7a8..074bf83 100644
--- a/recipes/cups/cups.inc
+++ b/recipes/cups/cups.inc
@@ -62,7 +62,18 @@ python do_package_append() {
 	os.system('chmod 0511 %s/install/cups/var/run/cups/certs' % workdir)
 }
 
-PACKAGES =+ "${PN}-lib ${PN}-libimage"
+PACKAGES_DYNAMIC += "${PN}-backend-*"
+
+python populate_packages_prepend() {
+	backend_dir = bb.data.expand('${libdir}/cups/backend/', d)
+	do_split_packages(d, backend_dir, '^(.*)$', 'cups-backend-%s',
+	                  '${PN} backend for %s', prepend=True, allow_links=True)
+}
+
+FILES_${PN}-filters += "${libdir}/cups/filter/*"
+FILES_${PN}-models += "${datadir}/cups/model/*"
+
+PACKAGES =+ "${PN}-lib ${PN}-libimage ${PN}-filters ${PN}-models"
 
 FILES_${PN}-lib = "${libdir}/libcups.so.*"
 
diff --git a/recipes/cups/cups_1.2.12.bb b/recipes/cups/cups_1.2.12.bb
index 4f7d0d4..eb156d5 100644
--- a/recipes/cups/cups_1.2.12.bb
+++ b/recipes/cups/cups_1.2.12.bb
@@ -1,2 +1,2 @@
 require cups.inc
-PR = "r2"
+PR = "r3"
diff --git a/recipes/cups/cups_1.2.7.bb b/recipes/cups/cups_1.2.7.bb
index 8559bfc..b00db42 100644
--- a/recipes/cups/cups_1.2.7.bb
+++ b/recipes/cups/cups_1.2.7.bb
@@ -1,8 +1,8 @@
 DESCRIPTION = "An Internet printing system for Unix."
 SECTION = "console/utils"
 LICENSE = "GPL LGPL"
-DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib fakeroot-native"
-PR = "r1"
+DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib install-native fakeroot-native"
+PR = "r2"
 
 SRC_URI = "ftp://ftp3.easysw.com/pub/cups/${PV}/cups-${PV}-source.tar.bz2 \
 	  "
@@ -70,7 +70,3 @@ FILES_${PN} += "${datadir}/doc/cups/images \
 		${datadir}/doc/cups/*.css \
                 ${datadir}/icons/ \
 	       "
-
-
-
-
diff --git a/recipes/cups/cups_1.3.8.bb b/recipes/cups/cups_1.3.8.bb
index 79cbc32..68a36dd 100644
--- a/recipes/cups/cups_1.3.8.bb
+++ b/recipes/cups/cups_1.3.8.bb
@@ -1,7 +1,7 @@
 require cups.inc
 
 SRC_URI += "file://use_echo_only_in_init.patch;patch=1"
-PR = "r2"
+PR = "r3"
 
 DEFAULT_PREFERENCE = "-1"
 
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 12/23] conf/licenses.conf: add CUPS license
  2009-05-09  0:50                     ` [PATCH 11/23] cups: split backends and models Otavio Salvador
@ 2009-05-09  0:50                       ` Otavio Salvador
  2009-05-09  0:50                         ` [PATCH 13/23] fixes wrong license value usage for GPLv2 Otavio Salvador
  2009-05-09 16:16                       ` [PATCH 11/23] cups: split backends and models Cliff Brake
  1 sibling, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/licenses.conf |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/conf/licenses.conf b/conf/licenses.conf
index 01c4747..c067627 100644
--- a/conf/licenses.conf
+++ b/conf/licenses.conf
@@ -1,6 +1,5 @@
 SRC_DISTRIBUTE_LICENSES += "GPL GPLv2 GPLv3 LGPL LGPLv2.1 LGPLv3"
-SRC_DISTRIBUTE_LICENSES += "BSD Apache-2.0 QPL AFL"
+SRC_DISTRIBUTE_LICENSES += "BSD Apache-2.0 QPL AFL CUPS"
 SRC_DISTRIBUTE_LICENSES += "MIT Sleepycat Classpath Perl PSF PD Artistic"
 SRC_DISTRIBUTE_LICENSES += "bzip2 zlib ntp cron libpng netperf openssl"
 SRC_DISTRIBUTE_LICENSES += "Info-ZIP tcp-wrappers"
-
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 13/23] fixes wrong license value usage for GPLv2
  2009-05-09  0:50                       ` [PATCH 12/23] conf/licenses.conf: add CUPS license Otavio Salvador
@ 2009-05-09  0:50                         ` Otavio Salvador
  2009-05-09  0:50                           ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 classes/xfce.bbclass                  |    2 +-
 recipes/gnash/gnash-minimal.inc       |    2 +-
 recipes/gnash/gnash.inc               |    2 +-
 recipes/linphone/linphone_1.3.99.8.bb |    2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/classes/xfce.bbclass b/classes/xfce.bbclass
index 48e012e..b18313f 100644
--- a/classes/xfce.bbclass
+++ b/classes/xfce.bbclass
@@ -5,7 +5,7 @@
 # Global class to make it easier to maintain XFCE packages
 
 HOMEPAGE = "http://www.xfce.org"
-LICENSE = "LGPL-2"
+LICENSE = "LGPLv2"
 DEPENDS += "startup-notification"
 
 XFCE_VERSION = ${PV}
diff --git a/recipes/gnash/gnash-minimal.inc b/recipes/gnash/gnash-minimal.inc
index a8e5229..5a8a91e 100644
--- a/recipes/gnash/gnash-minimal.inc
+++ b/recipes/gnash/gnash-minimal.inc
@@ -1,6 +1,6 @@
 DESCRIPTION = "Gnash is a GNU Flash movie player that supports many SWF v7 features"
 HOMEPAGE = "http://www.gnu.org/software/gnash"
-LICENSE = "GPL-2"
+LICENSE = "GPLv2"
 
 DEPENDS = "virtual/libiconv virtual/libintl libtool agg libxml2 zlib boost jpeg pango curl freetype \
            ${@base_conditional('ENTERPRISE_DISTRO', '1', '', 'ffmpeg libmad', d)}"
diff --git a/recipes/gnash/gnash.inc b/recipes/gnash/gnash.inc
index 3602f6f..ea20524 100644
--- a/recipes/gnash/gnash.inc
+++ b/recipes/gnash/gnash.inc
@@ -1,6 +1,6 @@
 DESCRIPTION = "Gnash is a GNU Flash movie player that supports many SWF v7 features"
 HOMEPAGE = "http://www.gnu.org/software/gnash"
-LICENSE = "GPL-2"
+LICENSE = "GPLv2"
 DEPENDS = "giflib libtool gtk+ cairo libxml2 libsdl-mixer zlib boost jpeg pango curl freetype \
            ${@base_conditional('ENTERPRISE_DISTRO', '1', '', 'ffmpeg libmad', d)}"
           
diff --git a/recipes/linphone/linphone_1.3.99.8.bb b/recipes/linphone/linphone_1.3.99.8.bb
index f96bd66..4e9b130 100644
--- a/recipes/linphone/linphone_1.3.99.8.bb
+++ b/recipes/linphone/linphone_1.3.99.8.bb
@@ -1,6 +1,6 @@
 DESCRIPTION = "SIP-based IP phone (Console edition)"
 HOMEPAGE = "http://www.linphone.org/?lang=us"
-LICENSE = "GPL-2"
+LICENSE = "GPLv2"
 DEPENDS = "libosip2 speex libogg alsa-lib readline"
 PR = "r0"
 
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore
  2009-05-09  0:50                         ` [PATCH 13/23] fixes wrong license value usage for GPLv2 Otavio Salvador
@ 2009-05-09  0:50                           ` Otavio Salvador
  2009-05-09  0:50                             ` [PATCH 15/23] rt61-firmware: fix installation of binary files Otavio Salvador
  2009-05-09  7:58                             ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Koen Kooi
  0 siblings, 2 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

During the updating we've also grabed two patches from Debian that
improves the stability of mtools in recent kernels. Those are:

 - plainio.patch
 - use-sg_io.patch

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                     |   14 +----
 recipes/mtools/files/no-x11.patch      |   19 --------
 recipes/mtools/files/plainio.patch     |   13 +++++
 recipes/mtools/files/use-sg_io.patch   |   80 ++++++++++++++++++++++++++++++++
 recipes/mtools/mtools-native_3.9.11.bb |    7 ---
 recipes/mtools/mtools-native_4.0.10.bb |    7 +++
 recipes/mtools/mtools_3.9.11.bb        |   19 --------
 recipes/mtools/mtools_4.0.10.bb        |   20 ++++++++
 8 files changed, 123 insertions(+), 56 deletions(-)
 delete mode 100644 recipes/mtools/files/no-x11.patch
 create mode 100644 recipes/mtools/files/plainio.patch
 create mode 100644 recipes/mtools/files/use-sg_io.patch
 delete mode 100644 recipes/mtools/mtools-native_3.9.11.bb
 create mode 100644 recipes/mtools/mtools-native_4.0.10.bb
 delete mode 100644 recipes/mtools/mtools_3.9.11.bb
 create mode 100644 recipes/mtools/mtools_4.0.10.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 57a1e72..3ed00d8 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -16742,17 +16742,9 @@ sha256=0ae0d53ecafdaa9cac7c62aafe8898fe0f5df30ee128385a4895be552721d524
 md5=d5518b678bffb58ceeae898d950ee27e
 sha256=591597c0787822c9fd56c7a3da214e81edd3c98f32d16858221e02dfc0f63779
 
-[http://mtools.linux.lu/mtools-3.9.11.tar.gz]
-md5=3c0ae05b0d98a5d3bd06d3d72fcaf80d
-sha256=3415d425d37338aa4e18e7d60147db23cfbe6192565c697f201f44426665ce42
-
-[http://folks.o-hand.com/richard/poky/sources/mtools-3.9.9.tar.gz]
-md5=3e68b857b4e1f3a6521d1dfefbd30a36
-sha256=af083a73425d664d4607ef6c6564fd9319a0e47ee7c105259a45356cb834690e
-
-[http://mtools.linux.lu/mtools-3.9.9.tar.gz]
-md5=3e68b857b4e1f3a6521d1dfefbd30a36
-sha256=af083a73425d664d4607ef6c6564fd9319a0e47ee7c105259a45356cb834690e
+[http://ftp.gnu.org/gnu/mtools/mtools-4.0.10.tar.bz2]
+md5=750c2beba968a5d46dbaae24551a82b9
+sha256=860fee13acb39365bd28763070e24011ea55f381f96714d2841937525aa02ded
 
 [http://downloads.sourceforge.net/mtpaint/mtpaint-3.02.tar.bz2]
 md5=828013176f135fc24ffdf16a011c51e6
diff --git a/recipes/mtools/files/no-x11.patch b/recipes/mtools/files/no-x11.patch
deleted file mode 100644
index 300f43f..0000000
--- a/recipes/mtools/files/no-x11.patch
+++ /dev/null
@@ -1,19 +0,0 @@
----
- Makefile.in |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- mtools-3.9.9.orig/Makefile.in
-+++ mtools-3.9.9/Makefile.in
-@@ -128,11 +128,11 @@ X_EXTRA_LIBS = @X_EXTRA_LIBS@
- X_PRE_LIBS = @X_PRE_LIBS@
- CFLAGS = $(CPPFLAGS) $(DEFS) $(MYCFLAGS) -I. @extraincludedir@ -I@srcdir@ $(USERCFLAGS) 
- CXXFLAGS  = $(CPPFLAGS) $(DEFS) $(MYCXXFLAGS) -I. @extraincludedir@ -I@srcdir@ $(USERCFLAGS) 
- LINK      = $(CC) $(LDFLAGS) $(USERLDFLAGS) @extralibdir@
- ALLLIBS   = $(USERLDLIBS) $(MACHDEPLIBS) $(SHLIB) $(LIBS)
--X_LDFLAGS = $(X_EXTRA_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lXau -lX11 $(LIBS) 
-+X_LDFLAGS = $(X_EXTRA_LIBS) $(X_LIBS) $(X_PRE_LIBS) $(LIBS)
- X_CCFLAGS = $(X_CFLAGS) $(CFLAGS)
- 
- all:    mtools $(LINKS) mkmanifest @FLOPPYD@
- 
- %.o: %.c
diff --git a/recipes/mtools/files/plainio.patch b/recipes/mtools/files/plainio.patch
new file mode 100644
index 0000000..b4bd1d6
--- /dev/null
+++ b/recipes/mtools/files/plainio.patch
@@ -0,0 +1,13 @@
+01_plainio.dpatch by Martin Pitt <mpitt@debian.org>
+Fixes garbage output of mtype under certain circumstances; closes #217413
+
+--- mtools-3.9.9/plain_io.c	2003-02-16 17:18:58.000000000 +0100
++++ mtools-3.9.9/plain_io.c	2004-01-14 00:56:11.000000000 +0100
+@@ -524,6 +524,7 @@
+ 		printOom();
+ 		return 0;
+ 	}
++    memset((void*)This, 0, sizeof(SimpleFile_t));
+ 	This->scsi_sector_size = 512;
+ 	This->seekable = 1;
+ #ifdef OS_hpux
diff --git a/recipes/mtools/files/use-sg_io.patch b/recipes/mtools/files/use-sg_io.patch
new file mode 100644
index 0000000..33867de
--- /dev/null
+++ b/recipes/mtools/files/use-sg_io.patch
@@ -0,0 +1,80 @@
+08.scsi.c.dpatch by Thomas Richter <thor@mail.math.tu-berlin.de>
+#393878 mzip unreliable on 2.6.18
+
+--- mtools-3.9.10/scsi.c	2002-11-02 13:09:28.000000000 +0100
++++ mtools-3.9.10/scsi.c	2006-10-17 21:11:01.000000000 +0200
+@@ -37,12 +37,7 @@
+ #endif
+ 
+ #ifdef OS_linux
+-#define SCSI_IOCTL_SEND_COMMAND 1
+-struct scsi_ioctl_command {
+-    int  inlen;
+-    int  outlen;
+-    char cmd[5008];
+-};
++#include <scsi/sg.h>
+ #endif
+ 
+ #ifdef _SCO_DS
+--- mtools-3.9.10/scsi.c	2007-05-26 19:02:56.000000000 +1000
++++ mtools-3.9.10/scsi.c	2008-04-08 20:30:16.000000000 +1000
+@@ -148,37 +148,33 @@ int scsi_cmd(int fd, unsigned char *cdb,
+ 	return 0;
+ 	
+ #elif defined OS_linux
+-	struct scsi_ioctl_command my_scsi_cmd;
++	struct sg_io_hdr scsi_cmd;
+ 
++	/*
++	** Init the command
++	*/
++	memset(&scsi_cmd,0,sizeof(scsi_cmd));
++	scsi_cmd.interface_id    = 'S';
++	scsi_cmd.dxfer_direction = (mode == SCSI_IO_READ)?(SG_DXFER_FROM_DEV):(SG_DXFER_TO_DEV);
++	scsi_cmd.cmd_len         = cmdlen;
++	scsi_cmd.mx_sb_len       = 0;
++	scsi_cmd.dxfer_len       = len;
++	scsi_cmd.dxferp          = data;
++	scsi_cmd.cmdp            = cdb;
++	scsi_cmd.timeout         = ~0; /* where is MAX_UINT defined??? */
++
++#if DEBUG
++	printf("CMD(%d): %02x%02x%02x%02x%02x%02x %sdevice\n",cmdlen,cdb[0],cdb[1],cdb[2],cdb[3],cdb[4],cdb[5],
++		(mode==SCSI_IO_READ)?("<-"):("->"));
++	printf("DATA   : len = %d\n",len);
++#endif
+ 
+-	memcpy(my_scsi_cmd.cmd, cdb, cmdlen);        /* copy command */
+-
+-	switch (mode) {
+-		case SCSI_IO_READ:
+-			my_scsi_cmd.inlen = 0;
+-			my_scsi_cmd.outlen = len;
+-			break;
+-		case SCSI_IO_WRITE:
+-			my_scsi_cmd.inlen = len;
+-			my_scsi_cmd.outlen = 0;
+-			memcpy(my_scsi_cmd.cmd + cmdlen,data,len);
+-			break;
+-	}
+-	
+-	if (ioctl(fd, SCSI_IOCTL_SEND_COMMAND, &my_scsi_cmd) < 0) {
++	if (ioctl(fd, SG_IO,&scsi_cmd) < 0) {
+ 		perror("scsi_io");
+ 		return -1;
+ 	}
+ 	
+-	switch (mode) {
+-		case SCSI_IO_READ:
+-			memcpy(data, &my_scsi_cmd.cmd[0], len);
+-			break;
+-		case SCSI_IO_WRITE:
+-			break;
+-    }
+-
+-	return 0;  /* where to get scsi status? */
++	return 0;
+ 
+ #elif (defined _SCO_DS) && (defined SCSIUSERCMD)
+ 	struct scsicmd my_scsi_cmd;
diff --git a/recipes/mtools/mtools-native_3.9.11.bb b/recipes/mtools/mtools-native_3.9.11.bb
deleted file mode 100644
index c82f740..0000000
--- a/recipes/mtools/mtools-native_3.9.11.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-# mtools-native OE build file
-# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
-# Released under the MIT license (see packages/COPYING)
-
-require mtools_${PV}.bb
-
-inherit autotools native
diff --git a/recipes/mtools/mtools-native_4.0.10.bb b/recipes/mtools/mtools-native_4.0.10.bb
new file mode 100644
index 0000000..c82f740
--- /dev/null
+++ b/recipes/mtools/mtools-native_4.0.10.bb
@@ -0,0 +1,7 @@
+# mtools-native OE build file
+# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
+# Released under the MIT license (see packages/COPYING)
+
+require mtools_${PV}.bb
+
+inherit autotools native
diff --git a/recipes/mtools/mtools_3.9.11.bb b/recipes/mtools/mtools_3.9.11.bb
deleted file mode 100644
index 4d1822f..0000000
--- a/recipes/mtools/mtools_3.9.11.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-# mtools OE build file
-# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
-# Released under the MIT license (see packages/COPYING)
-
-DESCRIPTION="Mtools is a collection of utilities for accessing MS-DOS disks from Unix without mounting them."
-HOMEPAGE="http://mtools.linux.lu"
-LICENSE="GPL"
-PR = "r4"
-
-SRC_URI="http://mtools.linux.lu/mtools-${PV}.tar.gz \
-	file://m486.patch;patch=1 \
-	file://mtools-makeinfo.patch;patch=1 \
-	file://no-x11.patch;patch=1"
-
-S = "${WORKDIR}/mtools-${PV}"
-
-inherit autotools
-
-EXTRA_OECONF = "--without-x"
diff --git a/recipes/mtools/mtools_4.0.10.bb b/recipes/mtools/mtools_4.0.10.bb
new file mode 100644
index 0000000..5b7f0cd
--- /dev/null
+++ b/recipes/mtools/mtools_4.0.10.bb
@@ -0,0 +1,20 @@
+# mtools OE build file
+# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
+# Copyright (C) 2009, O.S. Systems Software Ltda. All Rights Reserved
+# Released under the MIT license (see packages/COPYING)
+
+DESCRIPTION="Mtools is a collection of utilities for accessing MS-DOS disks from Unix without mounting them."
+HOMEPAGE="http://mtools.linux.lu"
+LICENSE="GPL"
+
+SRC_URI="http://ftp.gnu.org/gnu/mtools/mtools-${PV}.tar.bz2 \
+	file://m486.patch;patch=1 \
+	file://mtools-makeinfo.patch;patch=1 \
+	file://plainio.patch;patch=1 \
+	file://use-sg_io.patch;patch=1"
+
+S = "${WORKDIR}/mtools-${PV}"
+
+inherit autotools
+
+EXTRA_OECONF = "--without-x"
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 15/23] rt61-firmware: fix installation of binary files
  2009-05-09  0:50                           ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Otavio Salvador
@ 2009-05-09  0:50                             ` Otavio Salvador
  2009-05-09  0:50                               ` [PATCH 16/23] s/IPKG_INSTALL/PACKAGE_INSTALL/ Otavio Salvador
  2009-05-09  7:58                             ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Koen Kooi
  1 sibling, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/rt2x00/rt61-firmware_1.2.bb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/recipes/rt2x00/rt61-firmware_1.2.bb b/recipes/rt2x00/rt61-firmware_1.2.bb
index ae683c8..9fad60d 100644
--- a/recipes/rt2x00/rt61-firmware_1.2.bb
+++ b/recipes/rt2x00/rt61-firmware_1.2.bb
@@ -7,7 +7,7 @@ S = "${WORKDIR}/RT61_Firmware_V${PV}"
 
 do_install() {
 	install -d ${D}/${base_libdir}/firmware
-	install -m 0644 rt61.bin ${D}/${base_libdir}/firmware/
+	install -m 0644 *.bin ${D}/${base_libdir}/firmware/
 }
 
 FILES_${PN} = "${base_libdir}/firmware/"
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 16/23] s/IPKG_INSTALL/PACKAGE_INSTALL/
  2009-05-09  0:50                             ` [PATCH 15/23] rt61-firmware: fix installation of binary files Otavio Salvador
@ 2009-05-09  0:50                               ` Otavio Salvador
  2009-05-09  0:50                                 ` [PATCH 17/23] Documentation for PACKAGE_ARCH is actually for PACKAGE_ARCHS Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

From: Mario Domenech Goulart <mario@ossystems.com.br>

According to the git log (e.g.,
7302c6263934c237da66719bd42505b6c05d10cc), there was a change in the
variable naming.  IPKG_INSTALL was renamed to PACKAGE_INSTALL some time
ago. classes/rootfs_ipk.bbclass currently uses PACKAGE_INSTALL instead
of IPKG_INSTALL.

Signed-off-by: Mario Domenech Goulart <mario@ossystems.com.br>
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 docs/usermanual/reference/class_rootfs_ipkg.xml |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/docs/usermanual/reference/class_rootfs_ipkg.xml b/docs/usermanual/reference/class_rootfs_ipkg.xml
index b60adf8..98e6e25 100644
--- a/docs/usermanual/reference/class_rootfs_ipkg.xml
+++ b/docs/usermanual/reference/class_rootfs_ipkg.xml
@@ -41,7 +41,7 @@
 
     <listitem>
       <para>Installs the list of requested <command>.ipkg</command> packages,
-      <command>${IPKG_INSTALL}</command>;</para>
+      <command>${PACKAGE_INSTALL}</command>;</para>
     </listitem>
 
     <listitem>
@@ -89,7 +89,7 @@
 
   <variablelist>
     <varlistentry>
-      <term>IPKG_INSTALL</term>
+      <term>PACKAGE_INSTALL</term>
 
       <listitem>
         <para>The list of packages which will be installed into the root
@@ -212,4 +212,4 @@
   which is executed without <xref linkend="fakeroot" /> and therefore can be
   used from other classes, such as <xref linkend="image_class" />, that
   are already running under the control of <xref linkend="fakeroot" />.</para>
-</section>
\ No newline at end of file
+</section>
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 17/23] Documentation for PACKAGE_ARCH is actually for PACKAGE_ARCHS
  2009-05-09  0:50                               ` [PATCH 16/23] s/IPKG_INSTALL/PACKAGE_INSTALL/ Otavio Salvador
@ 2009-05-09  0:50                                 ` Otavio Salvador
  2009-05-09  0:50                                   ` [PATCH 18/23] Fixed indentation for Python code Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

From: Mario Domenech Goulart <mario@ossystems.com.br>

Signed-off-by: Mario Domenech Goulart <mario@ossystems.com.br>
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 docs/usermanual/reference/class_rootfs_ipkg.xml |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/docs/usermanual/reference/class_rootfs_ipkg.xml b/docs/usermanual/reference/class_rootfs_ipkg.xml
index 98e6e25..fde8a38 100644
--- a/docs/usermanual/reference/class_rootfs_ipkg.xml
+++ b/docs/usermanual/reference/class_rootfs_ipkg.xml
@@ -114,7 +114,7 @@
     </varlistentry>
 
     <varlistentry>
-      <term>PACKAGE_ARCH</term>
+      <term>PACKAGE_ARCHS</term>
 
       <listitem>
         <para>Defines the list of architectures that are support by the target
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 18/23] Fixed indentation for Python code
  2009-05-09  0:50                                 ` [PATCH 17/23] Documentation for PACKAGE_ARCH is actually for PACKAGE_ARCHS Otavio Salvador
@ 2009-05-09  0:50                                   ` Otavio Salvador
  2009-05-09  0:50                                     ` [PATCH 19/23] initramfs-uniboot: properly setup sysfs and tmp Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

From: Mario Domenech Goulart <mario@ossystems.com.br>

 - recipes/boost/boost-36.inc
 - recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb
 - recipes/gstreamer/gst-plugins-ugly_0.10.10.bb

Signed-off-by: Mario Domenech Goulart <mario@ossystems.com.br>
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/boost/boost-36.inc                       |   22 +++++++++++-----------
 recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb |    8 ++++----
 recipes/gstreamer/gst-plugins-ugly_0.10.10.bb    |    8 ++++----
 3 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/recipes/boost/boost-36.inc b/recipes/boost/boost-36.inc
index 5a4faaf..4bd065f 100644
--- a/recipes/boost/boost-36.inc
+++ b/recipes/boost/boost-36.inc
@@ -43,18 +43,18 @@ S = "${WORKDIR}/${BOOST_P}"
 # Make a package for each library, plus -dev
 PACKAGES = "${PN}-dbg ${BOOST_PACKAGES}"
 python __anonymous () {
-	import bb
-
-	packages = []
-	extras = [] 
-	for lib in bb.data.getVar('BOOST_LIBS', d, 1).split( ):
-		pkg = "boost-%s" % lib.replace("_", "-")
-		extras.append("--with-%s" % lib)
-		packages.append(pkg)
-		if not bb.data.getVar("FILES_%s" % pkg, d, 1):
-			bb.data.setVar("FILES_%s" % pkg, "${libdir}/libboost_%s*.so*" % lib, d)
-	bb.data.setVar("BOOST_PACKAGES", " ".join(packages), d)
-	bb.data.setVar("BJAM_EXTRA", " ".join(extras), d)
+    import bb
+
+    packages = []
+    extras = []
+    for lib in bb.data.getVar('BOOST_LIBS', d, 1).split( ):
+            pkg = "boost-%s" % lib.replace("_", "-")
+            extras.append("--with-%s" % lib)
+            packages.append(pkg)
+            if not bb.data.getVar("FILES_%s" % pkg, d, 1):
+                    bb.data.setVar("FILES_%s" % pkg, "${libdir}/libboost_%s*.so*" % lib, d)
+    bb.data.setVar("BOOST_PACKAGES", " ".join(packages), d)
+    bb.data.setVar("BJAM_EXTRA", " ".join(extras), d)
 }
 
 # Override the contents of specific packages
diff --git a/recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb b/recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb
index 77c4184..545a43a 100644
--- a/recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb
+++ b/recipes/gstreamer/gst-plugins-ugly-sid_0.10.7.bb
@@ -10,8 +10,8 @@ SRC_URI = "\
 S = "${WORKDIR}/gst-plugins-ugly-${PV}"
 
 python() {
-	# Don't build, if we are building an ENTERPRISE distro
-	enterprise = bb.data.getVar("ENTERPRISE_DISTRO", d, 1)
-	if enterprise != "1":
-		raise bb.parse.SkipPackage("gst-plugins-ugly-sid will only build if ENTERPRISE_DISTRO == 1")
+    # Don't build, if we are building an ENTERPRISE distro
+    enterprise = bb.data.getVar("ENTERPRISE_DISTRO", d, 1)
+    if enterprise != "1":
+            raise bb.parse.SkipPackage("gst-plugins-ugly-sid will only build if ENTERPRISE_DISTRO == 1")
 }
diff --git a/recipes/gstreamer/gst-plugins-ugly_0.10.10.bb b/recipes/gstreamer/gst-plugins-ugly_0.10.10.bb
index 0678e22..49350ed 100644
--- a/recipes/gstreamer/gst-plugins-ugly_0.10.10.bb
+++ b/recipes/gstreamer/gst-plugins-ugly_0.10.10.bb
@@ -10,9 +10,9 @@ SRC_URI += "\
 "
 
 python() {
-	# Don't build, if we are building an ENTERPRISE distro
-	enterprise = bb.data.getVar("ENTERPRISE_DISTRO", d, 1)
-	if enterprise == "1":
-		raise bb.parse.SkipPackage("gst-plugins-ugly will only build if ENTERPRISE_DISTRO != 1")
+    # Don't build, if we are building an ENTERPRISE distro
+    enterprise = bb.data.getVar("ENTERPRISE_DISTRO", d, 1)
+    if enterprise == "1":
+            raise bb.parse.SkipPackage("gst-plugins-ugly will only build if ENTERPRISE_DISTRO != 1")
 }
 
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 19/23] initramfs-uniboot: properly setup sysfs and tmp
  2009-05-09  0:50                                   ` [PATCH 18/23] Fixed indentation for Python code Otavio Salvador
@ 2009-05-09  0:50                                     ` Otavio Salvador
  2009-05-09  0:50                                       ` [PATCH 20/23] cups: undo mangle of cups_{datadir, serverbin} in cups-config Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

To make life easier for everybody it is nice to have early_setup to
avoid problems with mdev/udev usage. As a bonus, it also adds a /tmp
dir since some tools require it to exist and it won't hurt anyway.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/initrdscripts/files/init.sh            |    6 ++++--
 recipes/initrdscripts/initramfs-uniboot_1.0.bb |    2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/recipes/initrdscripts/files/init.sh b/recipes/initrdscripts/files/init.sh
index 221b8f5..26fd57f 100644
--- a/recipes/initrdscripts/files/init.sh
+++ b/recipes/initrdscripts/files/init.sh
@@ -5,9 +5,11 @@ BOOT_ROOT=
 ROOT_DEVICE=
 
 early_setup() {
-    mkdir /proc
+    mkdir -p /proc /sys /mnt /tmp
+
     mount -t proc proc /proc
-    mkdir /mnt
+    mount -t sysfs sysfs /sys
+
     modprobe -q mtdblock
 }
 
diff --git a/recipes/initrdscripts/initramfs-uniboot_1.0.bb b/recipes/initrdscripts/initramfs-uniboot_1.0.bb
index 07e94f1..fcbbdbd 100644
--- a/recipes/initrdscripts/initramfs-uniboot_1.0.bb
+++ b/recipes/initrdscripts/initramfs-uniboot_1.0.bb
@@ -1,5 +1,5 @@
 SRC_URI = "file://init.sh"
-PR = "r10"
+PR = "r11"
 DESCRIPTON = "A modular initramfs init script system."
 RRECOMMENDS = "kernel-module-mtdblock"
 
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 20/23] cups: undo mangle of cups_{datadir, serverbin} in cups-config
  2009-05-09  0:50                                     ` [PATCH 19/23] initramfs-uniboot: properly setup sysfs and tmp Otavio Salvador
@ 2009-05-09  0:50                                       ` Otavio Salvador
  2009-05-09  0:50                                         ` [PATCH 21/23] libgnomeprintui: drop gnome-common dependency since it is added by gnome class Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/cups/cups.inc |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/recipes/cups/cups.inc b/recipes/cups/cups.inc
index 074bf83..ba59ab8 100644
--- a/recipes/cups/cups.inc
+++ b/recipes/cups/cups.inc
@@ -62,6 +62,13 @@ python do_package_append() {
 	os.system('chmod 0511 %s/install/cups/var/run/cups/certs' % workdir)
 }
 
+do_stage_append() {
+	# Undo mangle of cups_datadir and cups_serverbin
+	sed -e 's:cups_datadir=.*:cups_datadir=${datadir}/cups:g' \
+	    -e 's:cups_serverbin=.*:cups_serverbin=${libdir}/cups:g' \
+	    -i ${STAGING_BINDIR_CROSS}/cups-config
+}
+
 PACKAGES_DYNAMIC += "${PN}-backend-*"
 
 python populate_packages_prepend() {
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 21/23] libgnomeprintui: drop gnome-common dependency since it is added by gnome class
  2009-05-09  0:50                                       ` [PATCH 20/23] cups: undo mangle of cups_{datadir, serverbin} in cups-config Otavio Salvador
@ 2009-05-09  0:50                                         ` Otavio Salvador
  2009-05-09  0:50                                           ` [PATCH 22/23] ppp: add peers dir Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/gnome/libgnomeprintui_2.18.3.bb |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/recipes/gnome/libgnomeprintui_2.18.3.bb b/recipes/gnome/libgnomeprintui_2.18.3.bb
index 7c6d289..021b9ad 100644
--- a/recipes/gnome/libgnomeprintui_2.18.3.bb
+++ b/recipes/gnome/libgnomeprintui_2.18.3.bb
@@ -1,6 +1,7 @@
 LICENSE = "GPL"
 SECTION = "x11/gnome/libs"
-DEPENDS = "libgnomeprint gtk+ libgnomecanvas gnome-icon-theme gnome-common"
+DEPENDS = "libgnomeprint gtk+ libgnomecanvas gnome-icon-theme"
+PR = "r1"
 
 inherit gnome pkgconfig
 
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 22/23] ppp: add peers dir
  2009-05-09  0:50                                         ` [PATCH 21/23] libgnomeprintui: drop gnome-common dependency since it is added by gnome class Otavio Salvador
@ 2009-05-09  0:50                                           ` Otavio Salvador
  2009-05-09  0:50                                             ` [PATCH 23/23] gnumeric: update to 1.8.4 Otavio Salvador
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 recipes/ppp/ppp_2.4.3.bb |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/recipes/ppp/ppp_2.4.3.bb b/recipes/ppp/ppp_2.4.3.bb
index 295a3fb..3b1f8ad 100644
--- a/recipes/ppp/ppp_2.4.3.bb
+++ b/recipes/ppp/ppp_2.4.3.bb
@@ -3,7 +3,7 @@ DESCRIPTION = "Point-to-Point Protocol (PPP) daemon"
 HOMEPAGE = "http://samba.org/ppp/"
 DEPENDS = "libpcap"
 LICENSE = "BSD GPLv2"
-PR = "r5"
+PR = "r6"
 
 SRC_URI = "http://ppp.samba.org/ftp/ppp/ppp-${PV}.tar.gz \
         file://ppp-2.4.3-mppe-mppc-1.1.patch;patch=1 \
@@ -39,6 +39,7 @@ do_install_append () {
 	mkdir -p ${D}${bindir}/ ${D}${sysconfdir}/init.d
 	mkdir -p ${D}${sysconfdir}/ppp/ip-up.d/
 	mkdir -p ${D}${sysconfdir}/ppp/ip-down.d/
+	mkdir -p ${D}${sysconfdir}/ppp/peers/
  	install -m 0755 ${WORKDIR}/pon ${D}${bindir}/pon
 	install -m 0755 ${WORKDIR}/poff ${D}${bindir}/poff
 	install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/ppp
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 23/23] gnumeric: update to 1.8.4
  2009-05-09  0:50                                           ` [PATCH 22/23] ppp: add peers dir Otavio Salvador
@ 2009-05-09  0:50                                             ` Otavio Salvador
  0 siblings, 0 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09  0:50 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

We updated it to latest stable release and droped the old versions
since noone is preferring those. Another small change is to depends on
gdk-pixbuf-csource-native otherwise the build can fail if the host
doesn't has the development files of GTK+ installed.

The only reference to a gnumeric version has been found at
preferred-om-2008-versions.inc and it referred to a missing
version. This also makes it to point to the latest one.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini                                 |    4 ++
 conf/distro/include/preferred-om-2008-versions.inc |    2 +-
 recipes/gnumeric/gnumeric_1.8.2.bb                 |   31 --------------------
 recipes/gnumeric/gnumeric_1.8.3.bb                 |   31 --------------------
 recipes/gnumeric/gnumeric_1.8.4.bb                 |   31 ++++++++++++++++++++
 5 files changed, 36 insertions(+), 63 deletions(-)
 delete mode 100644 recipes/gnumeric/gnumeric_1.8.2.bb
 delete mode 100644 recipes/gnumeric/gnumeric_1.8.3.bb
 create mode 100644 recipes/gnumeric/gnumeric_1.8.4.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 3ed00d8..e6658ff 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -8314,6 +8314,10 @@ sha256=8418ed3a2e8dad923a6626d22eaffe796aab9cbcf827a17ab95bf99956e22a6d
 md5=3ce6ba6483ccd6fe9974cface582337a
 sha256=173df749482f7391e50a6eb8339107b2b201582978637c63190c4a79f8e66d07
 
+[http://ftp.gnome.org/pub/GNOME/sources/gnumeric/1.8/gnumeric-1.8.4.tar.bz2]
+md5=338f0084f04a16f78797ad01f85d3251
+sha256=a3c7fdbbafa6c9cfee7f16c067b043c3041cd0240292aa92b653a2221ae04503
+
 [ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.2.2.tar.bz2]
 md5=c34736eb7cb687f9e5b6d4df48aaf7c8
 sha256=174e7f78c670d76984c4c4bd6077a0b9fec7b4be700b9f3e40c6889b78110c57
diff --git a/conf/distro/include/preferred-om-2008-versions.inc b/conf/distro/include/preferred-om-2008-versions.inc
index 8c5c4f7..65676ec 100644
--- a/conf/distro/include/preferred-om-2008-versions.inc
+++ b/conf/distro/include/preferred-om-2008-versions.inc
@@ -503,7 +503,7 @@ PREFERRED_VERSION_gnome-vfs ?= "2.22.0"
 PREFERRED_VERSION_gnome-vfs-extras ?= "0.99.13"
 PREFERRED_VERSION_gnome-vfs-obexftp ?= "0.4"
 PREFERRED_VERSION_gnuchess ?= "5.05"
-PREFERRED_VERSION_gnumeric ?= "1.6.3"
+PREFERRED_VERSION_gnumeric ?= "1.8.4"
 PREFERRED_VERSION_gnupg ?= "1.4.2.2"
 PREFERRED_VERSION_gnuplot ?= "4.2.2"
 PREFERRED_VERSION_gnuradio ?= "3.0.4"
diff --git a/recipes/gnumeric/gnumeric_1.8.2.bb b/recipes/gnumeric/gnumeric_1.8.2.bb
deleted file mode 100644
index 8d3b1b5..0000000
--- a/recipes/gnumeric/gnumeric_1.8.2.bb
+++ /dev/null
@@ -1,31 +0,0 @@
-LICENSE = "GPL"
-SECTION = "x11/utils"
-S = "${WORKDIR}/gnumeric-${PV}"
-DEPENDS = "libgsf gtk+ libxml2 goffice libglade libart-lgpl intltool-native libgnomecanvas libgnomeprint libgnomeprintui libbonoboui orbit2-native"
-DESCRIPTION = "Gnumeric spreadsheet for GNOME"
-
-PR = "r1"
-
-PARALLEL_MAKE = ""
-
-inherit gnome flow-lossage
-
-SRC_URI += "file://remove-docs.patch;patch=1"
-
-EXTRA_OECONF=" --without-perl "
-
-PACKAGES_DYNAMIC = "gnumeric-plugin-*"
-
-FILES_${PN}-dbg += "${libdir}/gnumeric/1.8.2/plugins/*/.debug"
-FILES_gnumeric_append = " /usr/lib/libspreadsheet-${PV}.so "
-
-# We need native orbit-idl with target idl files. No way to say it in a clean way:
-do_configure_append () {
-	find -name Makefile -exec sed -i '/\/usr\/bin\/orbit-idl-2/{s:/usr/bin:${STAGING_BINDIR_NATIVE}:;s:/usr/share:${STAGING_DATADIR}:g}' {} \;
-}
-
-python populate_packages_prepend () {
-	gnumeric_libdir = bb.data.expand('${libdir}/gnumeric/${PV}/plugins', d)
-
-	do_split_packages(d, gnumeric_libdir, '(.*)', 'gnumeric-plugin-%s', 'Gnumeric plugin for %s', allow_dirs=True)
-}
diff --git a/recipes/gnumeric/gnumeric_1.8.3.bb b/recipes/gnumeric/gnumeric_1.8.3.bb
deleted file mode 100644
index 92cdc4c..0000000
--- a/recipes/gnumeric/gnumeric_1.8.3.bb
+++ /dev/null
@@ -1,31 +0,0 @@
-LICENSE = "GPL"
-SECTION = "x11/utils"
-S = "${WORKDIR}/gnumeric-${PV}"
-DEPENDS = "libgsf gtk+ libxml2 goffice libglade libart-lgpl intltool-native libgnomecanvas libgnomeprint libgnomeprintui libbonoboui orbit2-native"
-DESCRIPTION = "Gnumeric spreadsheet for GNOME"
-
-PR = "r0"
-
-PARALLEL_MAKE = ""
-
-inherit gnome flow-lossage
-
-SRC_URI += "file://remove-docs.patch;patch=1"
-
-EXTRA_OECONF=" --without-perl "
-
-PACKAGES_DYNAMIC += "gnumeric-plugin-*"
-
-FILES_${PN}-dbg += "${libdir}/gnumeric/${PV}/plugins/*/.debug"
-FILES_gnumeric_append = " /usr/lib/libspreadsheet-${PV}.so "
-
-# We need native orbit-idl with target idl files. No way to say it in a clean way:
-do_configure_append () {
-	find -name Makefile -exec sed -i '/\/usr\/bin\/orbit-idl-2/{s:/usr/bin:${STAGING_BINDIR_NATIVE}:;s:/usr/share:${STAGING_DATADIR}:g}' {} \;
-}
-
-python populate_packages_prepend () {
-	gnumeric_libdir = bb.data.expand('${libdir}/gnumeric/${PV}/plugins', d)
-
-	do_split_packages(d, gnumeric_libdir, '(.*)', 'gnumeric-plugin-%s', 'Gnumeric plugin for %s', allow_dirs=True)
-}
diff --git a/recipes/gnumeric/gnumeric_1.8.4.bb b/recipes/gnumeric/gnumeric_1.8.4.bb
new file mode 100644
index 0000000..e375f27
--- /dev/null
+++ b/recipes/gnumeric/gnumeric_1.8.4.bb
@@ -0,0 +1,31 @@
+LICENSE = "GPL"
+SECTION = "x11/utils"
+S = "${WORKDIR}/gnumeric-${PV}"
+DEPENDS = "gdk-pixbuf-csource-native libgsf gtk+ libxml2 goffice libglade libart-lgpl intltool-native libgnomecanvas libgnomeprint libgnomeprintui libbonoboui orbit2-native"
+DESCRIPTION = "Gnumeric spreadsheet for GNOME"
+
+PR = "r0"
+
+PARALLEL_MAKE = ""
+
+inherit gnome flow-lossage
+
+SRC_URI += "file://remove-docs.patch;patch=1"
+
+EXTRA_OECONF=" --without-perl "
+
+PACKAGES_DYNAMIC += "gnumeric-plugin-*"
+
+FILES_${PN}-dbg += "${libdir}/gnumeric/${PV}/plugins/*/.debug"
+FILES_gnumeric_append = " /usr/lib/libspreadsheet-${PV}.so "
+
+# We need native orbit-idl with target idl files. No way to say it in a clean way:
+do_configure_append () {
+	find -name Makefile -exec sed -i '/\/usr\/bin\/orbit-idl-2/{s:/usr/bin:${STAGING_BINDIR_NATIVE}:;s:/usr/share:${STAGING_DATADIR}:g}' {} \;
+}
+
+python populate_packages_prepend () {
+	gnumeric_libdir = bb.data.expand('${libdir}/gnumeric/${PV}/plugins', d)
+
+	do_split_packages(d, gnumeric_libdir, '(.*)', 'gnumeric-plugin-%s', 'Gnumeric plugin for %s', allow_dirs=True)
+}
-- 
1.6.3.rc1.51.gea0b7




^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils
  2009-05-09  0:50                 ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Otavio Salvador
  2009-05-09  0:50                   ` [PATCH 10/23] hal-cups-utils: add Otavio Salvador
@ 2009-05-09  7:56                   ` Koen Kooi
  2009-05-09 17:14                     ` Otavio Salvador
  1 sibling, 1 reply; 33+ messages in thread
From: Koen Kooi @ 2009-05-09  7:56 UTC (permalink / raw)
  To: openembedded-devel

On 09-05-09 02:50, Otavio Salvador wrote:

> +PACKAGES="python-cupshelpers"

Overwriting PACKAGES is always a bug.

regards,

Koen




^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore
  2009-05-09  0:50                           ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Otavio Salvador
  2009-05-09  0:50                             ` [PATCH 15/23] rt61-firmware: fix installation of binary files Otavio Salvador
@ 2009-05-09  7:58                             ` Koen Kooi
  1 sibling, 0 replies; 33+ messages in thread
From: Koen Kooi @ 2009-05-09  7:58 UTC (permalink / raw)
  To: openembedded-devel

On 09-05-09 02:50, Otavio Salvador wrote:

> -[http://mtools.linux.lu/mtools-3.9.11.tar.gz]
> -md5=3c0ae05b0d98a5d3bd06d3d72fcaf80d
> -sha256=3415d425d37338aa4e18e7d60147db23cfbe6192565c697f201f44426665ce42
> -
> -[http://folks.o-hand.com/richard/poky/sources/mtools-3.9.9.tar.gz]
> -md5=3e68b857b4e1f3a6521d1dfefbd30a36
> -sha256=af083a73425d664d4607ef6c6564fd9319a0e47ee7c105259a45356cb834690e
> -
> -[http://mtools.linux.lu/mtools-3.9.9.tar.gz]
> -md5=3e68b857b4e1f3a6521d1dfefbd30a36
> -sha256=af083a73425d664d4607ef6c6564fd9319a0e47ee7c105259a45356cb834690e

Please don't remove stuff from checksums.ini

regards,

Koen




^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFC] Ready to commit patches from O.S. Systems
  2009-05-09  0:50 [RFC] Ready to commit patches from O.S. Systems Otavio Salvador
  2009-05-09  0:50 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
@ 2009-05-09  8:00 ` Koen Kooi
  2009-05-09 16:24 ` Cliff Brake
  2 siblings, 0 replies; 33+ messages in thread
From: Koen Kooi @ 2009-05-09  8:00 UTC (permalink / raw)
  To: openembedded-devel

On 09-05-09 02:50, Otavio Salvador wrote:
> Hello,
>
> We'd like to push those patches into dev tree and want some review on
> them. I'd also would like to hear advices about:
>
>     [PATCH 11/23] cups: split backends and models

That one looks good, I've given comments on others in seperate mails.

regards,

Koen




^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 11/23] cups: split backends and models
  2009-05-09  0:50                     ` [PATCH 11/23] cups: split backends and models Otavio Salvador
  2009-05-09  0:50                       ` [PATCH 12/23] conf/licenses.conf: add CUPS license Otavio Salvador
@ 2009-05-09 16:16                       ` Cliff Brake
  2009-05-09 17:12                         ` Otavio Salvador
  1 sibling, 1 reply; 33+ messages in thread
From: Cliff Brake @ 2009-05-09 16:16 UTC (permalink / raw)
  To: openembedded-devel

On Fri, May 8, 2009 at 8:50 PM, Otavio Salvador <otavio@ossystems.com.br> wrote:
> -DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib fakeroot-native"
> -PR = "r1"
> +DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib install-native fakeroot-native"
> +PR = "r2"

Patches looks good, and I like splitting cups up.  I don't see a cups
maintainer in MAINTAINERS, so I'd say do what seems best.

Does install-native still exist in dev?  It seems we are now using
coreutils-native for install (ref below).

Thanks,
Cliff

commit d5631dc0546cd152d41529b528ec2635bd103a28
Author: Roman I Khimov <khimov@altell.ru>
Date:   Thu Apr 30 00:05:37 2009 +0400

    remove install-native package

    Sane 'install' program is provided by coreutils-native now.

    Acked-by: Otavio Salvador <otavio@ossystems.com.br>

commit deb50c8b70a08632e779db9ee60d3f2d655fd3aa
Author: Roman I Khimov <khimov@altell.ru>
Date:   Wed Apr 29 23:57:54 2009 +0400

    coreutils-native: make mandatory dep for all packages

    Gives us guaranteed sane GNU coreutils on any host. Should greatly ease
    support for various non-GNU host systems and allow to safely
remove some other
    native packages like 'install-native'.

    Acked-by: Otavio Salvador <otavio@ossystems.com.br>



-- 
=======================
Cliff Brake
http://bec-systems.com



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFC] Ready to commit patches from O.S. Systems
  2009-05-09  0:50 [RFC] Ready to commit patches from O.S. Systems Otavio Salvador
  2009-05-09  0:50 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
  2009-05-09  8:00 ` [RFC] Ready to commit patches from O.S. Systems Koen Kooi
@ 2009-05-09 16:24 ` Cliff Brake
  2 siblings, 0 replies; 33+ messages in thread
From: Cliff Brake @ 2009-05-09 16:24 UTC (permalink / raw)
  To: openembedded-devel

On Fri, May 8, 2009 at 8:50 PM, Otavio Salvador <otavio@ossystems.com.br> wrote:
> Hello,
>
> We'd like to push those patches into dev tree and want some review on
> them. I'd also would like to hear advices about:

Looks good.

>   [PATCH 11/23] cups: split backends and models

Seems like a good idea to me.

Thanks,
Cliff

-- 
=======================
Cliff Brake
http://bec-systems.com



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 11/23] cups: split backends and models
  2009-05-09 16:16                       ` [PATCH 11/23] cups: split backends and models Cliff Brake
@ 2009-05-09 17:12                         ` Otavio Salvador
  0 siblings, 0 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09 17:12 UTC (permalink / raw)
  To: openembedded-devel

Hello,

On Sat, May 9, 2009 at 1:16 PM, Cliff Brake <cliff.brake@gmail.com> wrote:
> On Fri, May 8, 2009 at 8:50 PM, Otavio Salvador <otavio@ossystems.com.br> wrote:
>> -DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib fakeroot-native"
>> -PR = "r1"
>> +DEPENDS = "gnutls jpeg dbus dbus-glib libpng zlib install-native fakeroot-native"
>> +PR = "r2"
>
> Patches looks good, and I like splitting cups up.  I don't see a cups
> maintainer in MAINTAINERS, so I'd say do what seems best.

Right; my major worry is about current cups users. The cups package
itself will not provide a full working cups, as it used to.

And I'm looking for ideas how to solve that before pushing it.

> Does install-native still exist in dev?  It seems we are now using
> coreutils-native for install (ref below).

We use stable at work and this has been done in our branch. I'll
update it in the tree. Thanks by catch it.

-- 
Otavio Salvador                  O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854         http://projetos.ossystems.com.br



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils
  2009-05-09  7:56                   ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Koen Kooi
@ 2009-05-09 17:14                     ` Otavio Salvador
  2009-05-09 17:18                       ` Koen Kooi
  0 siblings, 1 reply; 33+ messages in thread
From: Otavio Salvador @ 2009-05-09 17:14 UTC (permalink / raw)
  To: openembedded-devel; +Cc: openembedded-devel

Hello

On Sat, May 9, 2009 at 4:56 AM, Koen Kooi <k.kooi@student.utwente.nl> wrote:
> On 09-05-09 02:50, Otavio Salvador wrote:
>
>> +PACKAGES="python-cupshelpers"
>
> Overwriting PACKAGES is always a bug.

I did it since the recipe idea is to only provide the helpers that we
need for hal-cups-utils, not a fully working system-config-printer.

-- 
Otavio Salvador                  O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854         http://projetos.ossystems.com.br



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils
  2009-05-09 17:14                     ` Otavio Salvador
@ 2009-05-09 17:18                       ` Koen Kooi
  0 siblings, 0 replies; 33+ messages in thread
From: Koen Kooi @ 2009-05-09 17:18 UTC (permalink / raw)
  To: openembedded-devel

On 09-05-09 19:14, Otavio Salvador wrote:
> Hello
>
> On Sat, May 9, 2009 at 4:56 AM, Koen Kooi<k.kooi@student.utwente.nl>  wrote:
>> On 09-05-09 02:50, Otavio Salvador wrote:
>>
>>> +PACKAGES="python-cupshelpers"
>>
>> Overwriting PACKAGES is always a bug.
>
> I did it since the recipe idea is to only provide the helpers that we
> need for hal-cups-utils, not a fully working system-config-printer.

Well, even in that case overwriting PACKAGES is still a bug, you can 
accomplish the same woth

PACKAGES =+ "python-cupshelpers"
FILES_python-cupshelpers = "foo bar baz"


regards,

Koen





^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH 03/23] acpid: add 1.0.8 (with netlink support)
  2009-05-21  2:39   ` [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling Otavio Salvador
@ 2009-05-21  2:39     ` Otavio Salvador
  0 siblings, 0 replies; 33+ messages in thread
From: Otavio Salvador @ 2009-05-21  2:39 UTC (permalink / raw)
  To: openembedded-devel; +Cc: Otavio Salvador

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 conf/checksums.ini               |    4 +
 recipes/acpid/acpid/event.c.diff |   43 +
 recipes/acpid/acpid/fixfd.diff   |   12 +
 recipes/acpid/acpid/netlink.diff | 2797 ++++++++++++++++++++++++++++++++++++++
 recipes/acpid/acpid_1.0.8.bb     |    6 +
 5 files changed, 2862 insertions(+), 0 deletions(-)
 create mode 100644 recipes/acpid/acpid/event.c.diff
 create mode 100644 recipes/acpid/acpid/fixfd.diff
 create mode 100644 recipes/acpid/acpid/netlink.diff
 create mode 100644 recipes/acpid/acpid_1.0.8.bb

diff --git a/conf/checksums.ini b/conf/checksums.ini
index 855c726..4bce0ee 100644
--- a/conf/checksums.ini
+++ b/conf/checksums.ini
@@ -1298,6 +1298,10 @@ sha256=aa3c42224ec702b6cdb69ca6501284cb6dacb87473a076d7337ee9635c96f160
 md5=5c9b705700df51d232be223b6ab6414d
 sha256=aa3c42224ec702b6cdb69ca6501284cb6dacb87473a076d7337ee9635c96f160
 
+[http://downloads.sourceforge.net/acpid/acpid-1.0.8.tar.gz]
+md5=1d9c52fe2c0b51f8463f357c2a3d3ddb
+sha256=d57ae5302c38c37d060a097fa51600fe06fbfffd575641d638407944f126b7b1
+
 [http://ftp.gnu.org/gnu/classpathx/activation-1.1.1.tar.gz]
 md5=de50d7728e8140eb404f2b4554321f8c
 sha256=b1b5ef560d30fcb11fbf537246857d14110ce4eb2b200d4c54690472305d87b7
diff --git a/recipes/acpid/acpid/event.c.diff b/recipes/acpid/acpid/event.c.diff
new file mode 100644
index 0000000..4ef3baf
--- /dev/null
+++ b/recipes/acpid/acpid/event.c.diff
@@ -0,0 +1,43 @@
+--- acpid-1.0.8.orig/event.c
++++ acpid-1.0.8/event.c
+@@ -23,6 +23,7 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/wait.h>
++#include <libgen.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <stdio.h>
+@@ -90,6 +91,8 @@
+ 	struct dirent *dirent;
+ 	char *file = NULL;
+ 	int nrules = 0;
++	char *basen = NULL;
++	regex_t preg;
+ 
+ 	lock_rules();
+ 
+@@ -139,10 +142,19 @@
+ 			continue; /* skip non-regular files */
+ 		}
+ 
+-		r = parse_file(file);
+-		if (r) {
+-			enlist_rule(&cmd_list, r);
+-			nrules++;
++		/* check for run-parts style filename */
++		basen = basename(file);
++		if (regcomp(&preg, "^[a-zA-Z0-9_-]+$", RULE_REGEX_FLAGS) == 0){
++			if (regexec(&preg, basen, 0, NULL, 0) == 0){
++				r = parse_file(file);
++				if (r) {
++					enlist_rule(&cmd_list, r);
++					nrules++;
++				}
++			} else {
++				acpid_log(LOG_DEBUG, "ignoring conf file %s\n", file);
++			}
++
+ 		}
+ 		free(file);
+ 	}
diff --git a/recipes/acpid/acpid/fixfd.diff b/recipes/acpid/acpid/fixfd.diff
new file mode 100644
index 0000000..93ceb5c
--- /dev/null
+++ b/recipes/acpid/acpid/fixfd.diff
@@ -0,0 +1,12 @@
+diff -Nru a/acpid.c b/acpid.c
+--- a/acpid.c	2008-11-03 14:04:43.000000000 +0100
++++ b/acpid.c	2008-12-19 18:38:14.291127677 +0100
+@@ -456,7 +456,7 @@
+ 	int log_opts;
+ 
+ 	/* open /dev/null */
+-	nullfd = open("/dev/null", O_RDONLY);
++	nullfd = open("/dev/null", O_RDWR);
+ 	if (nullfd < 0) {
+ 		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
+ 			"/dev/null", strerror(errno));
diff --git a/recipes/acpid/acpid/netlink.diff b/recipes/acpid/acpid/netlink.diff
new file mode 100644
index 0000000..5dbbedd
--- /dev/null
+++ b/recipes/acpid/acpid/netlink.diff
@@ -0,0 +1,2797 @@
+diff -ruN acpid-1.0.8.orig/acpid.8 acpid-1.0.8/acpid.8
+--- acpid-1.0.8.orig/acpid.8	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.8	2009-03-29 17:10:14.000000000 +0200
+@@ -10,11 +10,13 @@
+ \fBacpid\fP is designed to notify user-space programs of ACPI events.
+ \fBacpid\fP should be started during the system boot, and will run as a
+ background process, by default.  It will open an events file
+-(\fI/proc/acpi/event\fP by default) and attempt to read whole lines.  When
+-a line is received (an \fIevent\fP), \fBacpid\fP will examine a list of rules,
+-and execute the rules that match the event.
+-\fBacpid\fP will ignore all incoming ACPI events if a lock file exists
+-(\fI/var/lock/acpid\fP by default).
++(\fI/proc/acpi/event\fP by default) and attempt to read whole lines which
++represent ACPI events.  If the events file does not exist, \fBacpid\fP will
++attempt to connect to the Linux kernel via the input layer and netlink.  When an
++ACPI event is received from one of these sources, \fBacpid\fP will examine a
++list of rules, and execute the rules that match the event. \fBacpid\fP will
++ignore all incoming ACPI events if a lock file exists (\fI/var/lock/acpid\fP by
++default).
+ .PP
+ \fIRules\fP are defined by simple configuration files.  \fBacpid\fP
+ will look in a configuration directory (\fI/etc/acpi/events\fP by default),
+@@ -69,6 +71,9 @@
+ This option changes the event file from which \fBacpid\fP reads events.
+ Default is \fI/proc/acpi/event\fP.
+ .TP
++.BI \-n "\fR, \fP" \--netlink
++This option forces \fBacpid\fP to use the Linux kernel input layer and netlink interface for ACPI events.
++.TP
+ .BI \-f "\fR, \fP" \--foreground
+ This option keeps \fBacpid\fP in the foreground by not forking at startup.
+ .TP
+@@ -122,6 +127,8 @@
+ .PD 0
+ .B /proc/acpi/event
+ .br
++.B /dev/input/event*
++.br
+ .B /etc/acpi/
+ .br
+ .B /var/run/acpid.socket
+diff -ruN acpid-1.0.8.orig/acpid.c acpid-1.0.8/acpid.c
+--- acpid-1.0.8.orig/acpid.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.c	2009-03-29 17:10:14.000000000 +0200
+@@ -20,23 +20,23 @@
+  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+ 
+-#include <sys/types.h>
+-#include <sys/stat.h>
++#include <unistd.h>
+ #include <fcntl.h>
+ #include <signal.h>
+-#include <unistd.h>
++#include <string.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
+ #include <errno.h>
+ #include <getopt.h>
+-#include <time.h>
+-#include <sys/poll.h>
+-#include <grp.h>
+-#include <syslog.h>
++#include <stdarg.h>
+ 
+ #include "acpid.h"
+-#include "ud_socket.h"
++#include "event.h"
++#include "connection_list.h"
++#include "proc.h"
++#include "sock.h"
++#include "input_layer.h"
++#include "netlink.h"
+ 
+ static int handle_cmdline(int *argc, char ***argv);
+ static void close_fds(void);
+@@ -45,7 +45,6 @@
+ static int create_pidfile(void);
+ static void clean_exit(int sig);
+ static void reload_conf(int sig);
+-static char *read_line(int fd);
+ 
+ /* global debug level */
+ int acpid_debug;
+@@ -53,23 +52,18 @@
+ /* do we log event info? */
+ int logevents;
+ 
+-static const char *progname;
+-static const char *confdir = ACPID_CONFDIR;
+-static const char *eventfile = ACPID_EVENTFILE;
+-static const char *socketfile = ACPID_SOCKETFILE;
++const char *progname;
++
+ static const char *lockfile = ACPID_LOCKFILE;
++static const char *confdir = ACPID_CONFDIR;
+ static int nosocket;
+-static const char *socketgroup;
+-static mode_t socketmode = ACPID_SOCKETMODE;
+ static int foreground;
+ static const char *pidfile = ACPID_PIDFILE;
++static int netlink;
+ 
+ int
+ main(int argc, char **argv)
+ {
+-	int event_fd;
+-	int sock_fd = -1; /* init to avoid a compiler warning */
+-
+ 	/* learn who we really are */
+ 	progname = (const char *)strrchr(argv[0], '/');
+ 	progname = progname ? (progname + 1) : argv[0];
+@@ -80,14 +74,22 @@
+ 	/* close any extra file descriptors */
+ 	close_fds();
+ 
+-	/* actually open the event file */
+-	event_fd = open(eventfile, O_RDONLY);
+-	if (event_fd < 0) {
+-		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
+-			eventfile, strerror(errno));
+-		exit(EXIT_FAILURE);
++	if (!netlink)
++	{
++		/* open the acpi event file in the proc fs */
++		/* if the open fails, try netlink */
++		if (open_proc())
++			netlink = 1;
++	}
++
++	if (netlink)
++	{
++		/* open the input layer */
++		open_input();
++
++		/* open netlink */
++		open_netlink();
+ 	}
+-	fcntl(event_fd, F_SETFD, FD_CLOEXEC);
+ 
+ /*
+  * if there is data, and the kernel is NOT broken, this eats 1 byte.  We
+@@ -124,34 +126,7 @@
+ 
+ 	/* open our socket */
+ 	if (!nosocket) {
+-		sock_fd = ud_create_socket(socketfile);
+-		if (sock_fd < 0) {
+-			fprintf(stderr, "%s: can't open socket %s: %s\n",
+-				progname, socketfile, strerror(errno));
+-			exit(EXIT_FAILURE);
+-		}
+-		fcntl(sock_fd, F_SETFD, FD_CLOEXEC);
+-		chmod(socketfile, socketmode);
+-		if (socketgroup) {
+-			struct group *gr;
+-			struct stat buf;
+-			gr = getgrnam(socketgroup);
+-			if (!gr) {
+-				fprintf(stderr, "%s: group %s does not exist\n",
+-					progname, socketgroup);
+-				exit(EXIT_FAILURE);
+-			}
+-			if (stat(socketfile, &buf) < 0) {
+-				fprintf(stderr, "%s: can't stat %s\n",
+-					progname, socketfile);
+-				exit(EXIT_FAILURE);
+-			}
+-			if (chown(socketfile, buf.st_uid, gr->gr_gid) < 0) {
+-				fprintf(stderr, "%s: chown(): %s\n",
+-					progname, strerror(errno));
+-				exit(EXIT_FAILURE);
+-			}
+-		}
++		open_sock();
+ 	}
+ 
+ 	/* if we're running in foreground, we don't daemonize */
+@@ -164,7 +139,8 @@
+ 	if (open_log() < 0) {
+ 		exit(EXIT_FAILURE);
+ 	}
+-	acpid_log(LOG_INFO, "starting up\n");
++	acpid_log(LOG_INFO, "starting up with %s\n",
++		netlink ? "netlink and the input layer" : "proc fs");
+ 
+ 	/* trap key signals */
+ 	signal(SIGHUP, reload_conf);
+@@ -183,109 +159,50 @@
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+-	/* main loop */
+ 	acpid_log(LOG_INFO, "waiting for events: event logging is %s\n",
+ 	    logevents ? "on" : "off");
+-	while (1) {
+-		struct pollfd ar[2];
+-		int r;
+-		int fds = 0;
+-		
+-		/* poll for the socket and the event file */
+-		ar[0].fd = event_fd; ar[0].events = POLLIN; fds++;
+-		if (!nosocket) {
+-			ar[1].fd = sock_fd; ar[1].events = POLLIN; fds++;
+-		}
+-		r = poll(ar, fds, -1);
+ 
+-		if (r < 0 && errno == EINTR) {
++	/* main loop */
++	while (1)
++	{
++		fd_set readfds;
++		int nready;
++		int i;
++		struct connection *p;
++
++		/* it's going to get clobbered, so use a copy */
++		readfds = *get_fdset();
++
++		/* wait on data */
++		nready = select(get_highestfd() + 1, &readfds, NULL, NULL, NULL);
++
++		if (nready < 0  &&  errno == EINTR) {
+ 			continue;
+-		} else if (r < 0) {
+-			acpid_log(LOG_ERR, "poll(): %s\n", strerror(errno));
++		} else if (nready < 0) {
++			acpid_log(LOG_ERR, "select(): %s\n", strerror(errno));
+ 			continue;
+ 		}
+ 
+-		/* was it an event? */
+-		if (ar[0].revents) {
+-			char *event;
+-			struct stat trash;
+-			int fexists;
+-
+-			/* check for existence of a lockfile */
+-			fexists = (stat(lockfile, &trash) == 0);
+-
+-			/* this shouldn't happen */
+-			if (!ar[0].revents & POLLIN) {
+-				acpid_log(LOG_DEBUG,
+-				    "odd, poll set flags 0x%x\n",
+-				    ar[0].revents);
+-				continue;
+-			}
++		/* for each connection */
++		for (i = 0; i <= get_number_of_connections(); ++i)
++		{
++			int fd;
+ 
+-			/* read an event */
+-			event = read_line(event_fd);
++			p = get_connection(i);
+ 
+-			/* if we're locked, don't process the event */
+-			if (fexists) {
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "lockfile present, not processing "
+-					    "event \"%s\"\n", event);
+-				}
+-				continue;
+-			}
+-
+-			/* handle the event */
+-			if (event) {
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "received event \"%s\"\n", event);
+-				}
+-				acpid_handle_event(event);
+-				if (logevents) {
+-					acpid_log(LOG_INFO,
+-					    "completed event \"%s\"\n", event);
+-				}
+-			} else if (errno == EPIPE) {
+-				acpid_log(LOG_WARNING,
+-				    "events file connection closed\n");
++			/* if this connection is invalid, bail */
++			if (!p)
+ 				break;
+-			} else {
+-				static int nerrs;
+-				if (++nerrs >= ACPID_MAX_ERRS) {
+-					acpid_log(LOG_ERR,
+-					    "too many errors reading "
+-					    "events file - aborting\n");
+-					break;
+-				}
+-			}
+-		} 
+ 
+-		/* was it a new connection? */
+-		if (!nosocket && ar[1].revents) {
+-			int cli_fd;
+-			struct ucred creds;
+-			char buf[32];
+-
+-			/* this shouldn't happen */
+-			if (!ar[1].revents & POLLIN) {
+-				acpid_log(LOG_DEBUG,
+-				    "odd, poll set flags 0x%x\n",
+-				    ar[1].revents);
+-				continue;
+-			}
++			/* get the file descriptor */
++			fd = p->fd;
+ 
+-			/* accept and add to our lists */
+-			cli_fd = ud_accept(sock_fd, &creds);
+-			if (cli_fd < 0) {
+-				acpid_log(LOG_ERR, "can't accept client: %s\n",
+-				    strerror(errno));
+-				continue;
++			/* if this file descriptor has data waiting */
++			if (FD_ISSET(fd, &readfds))
++			{
++				/* delegate to this connection's process function */
++				p->process(fd);
+ 			}
+-			fcntl(cli_fd, F_SETFD, FD_CLOEXEC);
+-			snprintf(buf, sizeof(buf)-1, "%d[%d:%d]",
+-				creds.pid, creds.uid, creds.gid);
+-			acpid_add_client(cli_fd, buf);
+ 		}
+ 	}
+ 
+@@ -312,6 +229,7 @@
+ 		{"nosocket", 1, 0, 'S'},
+ 		{"pidfile", 1, 0, 'p'},
+ 		{"lockfile", 1, 0, 'L'},
++		{"netlink", 0, 0, 'n'},
+ 		{"version", 0, 0, 'v'},
+ 		{"help", 0, 0, 'h'},
+ 		{NULL, 0, 0, 0},
+@@ -327,7 +245,8 @@
+ 		"Use the specified socket file.",	/* socketfile */
+ 		"Do not listen on a UNIX socket (overrides -s).",/* nosocket */
+ 		"Use the specified PID file.",		/* pidfile */
+-		"Use the specified lockfile to stop processing.", /* pidfile */
++		"Use the specified lockfile to stop processing.", /* lockfile */
++		"Force netlink/input layer mode. (overrides -e)", /* netlink */
+ 		"Print version information.",		/* version */
+ 		"Print this message.",			/* help */
+ 	};
+@@ -338,7 +257,7 @@
+ 	for (;;) {
+ 		int i;
+ 		i = getopt_long(*argc, *argv,
+-		    "c:de:flg:m:s:Sp:L:vh", opts, NULL);
++		    "c:de:flg:m:s:Sp:L:nvh", opts, NULL);
+ 		if (i == -1) {
+ 			break;
+ 		}
+@@ -377,6 +296,9 @@
+ 		case 'L':
+ 			lockfile = optarg;
+ 			break;
++		case 'n':
++			netlink = 1;
++			break;
+ 		case 'v':
+ 			printf(PACKAGE "-" VERSION "\n");
+ 			exit(EXIT_SUCCESS);
+@@ -550,54 +472,11 @@
+ 	return 0;
+ }
+ 
+-/* 
+- * This depends on fixes in linux ACPI after 2.4.8
+- */
+-#define MAX_BUFLEN	1024
+-static char *
+-read_line(int fd)
++int
++locked()
+ {
+-	static char *buf;
+-	int buflen = 64;
+-	int i = 0;
+-	int r;
+-	int searching = 1;
+-
+-	while (searching) {
+-		buf = realloc(buf, buflen);
+-		if (!buf) {
+-			acpid_log(LOG_ERR, "malloc(%d): %s\n",
+-				buflen, strerror(errno));
+-			return NULL;
+-		}
+-		memset(buf+i, 0, buflen-i);
+-
+-		while (i < buflen) {
+-			r = read(fd, buf+i, 1);
+-			if (r < 0 && errno != EINTR) {
+-				/* we should do something with the data */
+-				acpid_log(LOG_ERR, "read(): %s\n",
+-					strerror(errno));
+-				return NULL;
+-			} else if (r == 0) {
+-				/* signal this in an almost standard way */
+-				errno = EPIPE;
+-				return NULL;
+-			} else if (r == 1) {
+-				/* scan for a newline */
+-				if (buf[i] == '\n') {
+-					searching = 0;
+-					buf[i] = '\0';
+-					break;
+-				}
+-				i++;
+-			}
+-		}
+-		if (buflen >= MAX_BUFLEN) {
+-			break;
+-		} 
+-		buflen *= 2;
+-	}
++	struct stat trash;
+ 
+-	return buf;
++	/* check for existence of a lockfile */
++	return (stat(lockfile, &trash) == 0);
+ }
+diff -ruN acpid-1.0.8.orig/acpid.h acpid-1.0.8/acpid.h
+--- acpid-1.0.8.orig/acpid.h	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpid.h	2009-03-29 17:10:14.000000000 +0200
+@@ -23,11 +23,7 @@
+ #ifndef ACPID_H__
+ #define ACPID_H__
+ 
+-#include <unistd.h>
+ #include <syslog.h>
+-#include <stdarg.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
+ 
+ #define ACPI_PROCDIR 		"/proc/acpi"
+ #define ACPID_EVENTFILE		ACPI_PROCDIR "/event"
+@@ -40,19 +36,12 @@
+ 
+ #define PACKAGE 		"acpid"
+ 
+-/*
+- * acpid.c
+- */
+ extern int acpid_debug;
+ extern int logevents;
++extern const char *progname;
++
+ extern int acpid_log(int level, const char *fmt, ...);
+ 
+-/*
+- * event.c
+- */
+-extern int acpid_read_conf(const char *confdir);
+-extern int acpid_add_client(int client, const char *origin);
+-extern int acpid_cleanup_rules(int do_detach);
+-extern int acpid_handle_event(const char *event);
++extern int locked();
+ 
+ #endif /* ACPID_H__ */
+diff -ruN acpid-1.0.8.orig/acpi_genetlink.h acpid-1.0.8/acpi_genetlink.h
+--- acpid-1.0.8.orig/acpi_genetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_genetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,33 @@
++#ifndef __ACPI_GENETLINK_H__
++#define __ACPI_GENETLINK_H__ 1
++
++#include <linux/types.h>
++
++struct acpi_genl_event {
++        char device_class[20];
++        char bus_id[15];
++        __u32 type;
++        __u32 data;
++};
++
++/* attributes of acpi_genl_family */
++enum {
++        ACPI_GENL_ATTR_UNSPEC,
++        ACPI_GENL_ATTR_EVENT,   /* ACPI event info needed by user space */
++        __ACPI_GENL_ATTR_MAX,
++};
++#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
++
++/* commands supported by the acpi_genl_family */
++enum {
++        ACPI_GENL_CMD_UNSPEC,
++        ACPI_GENL_CMD_EVENT,    /* kernel->user notifications for ACPI events */        __ACPI_GENL_CMD_MAX,
++};
++#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
++#define GENL_MAX_FAM_OPS        256
++#define GENL_MAX_FAM_GRPS       256
++
++#define ACPI_EVENT_FAMILY_NAME		"acpi_event"
++#define ACPI_EVENT_MCAST_GROUP_NAME	"acpi_mc_group"
++
++#endif
+diff -ruN acpid-1.0.8.orig/acpi_ids.c acpid-1.0.8/acpi_ids.c
+--- acpid-1.0.8.orig/acpi_ids.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_ids.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,254 @@
++/*
++ *  acpi_ids.c - ACPI Netlink Group and Family IDs
++ *
++ *  Copyright (C) 2008 Ted Felix (www.tedfelix.com)
++ *  Portions from acpi_genl Copyright (C) Zhang Rui <rui.zhang@intel.com>
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <stdio.h>
++/* needed by netlink.h, should be in there */
++#include <arpa/inet.h>
++#include <linux/types.h>
++#include <string.h>
++
++#include "genetlink.h"
++#include "libnetlink.h"
++
++#include "acpid.h"
++
++#define GENL_MAX_FAM_GRPS       256
++#define ACPI_EVENT_FAMILY_NAME          "acpi_event"
++#define ACPI_EVENT_MCAST_GROUP_NAME     "acpi_mc_group"
++
++static int initialized = 0;
++static __u16 acpi_event_family_id = 0;
++static __u32 acpi_event_mcast_group_id = 0;
++
++/*
++ *  A CTRL_CMD_GETFAMILY message returns an attribute table that looks
++ *    like this:
++ *
++ *  CTRL_ATTR_FAMILY_ID         Use this to make sure we get the proper msgs
++ *  CTRL_ATTR_MCAST_GROUPS
++ *    CTRL_ATTR_MCAST_GRP_NAME
++ *    CTRL_ATTR_MCAST_GRP_ID    Need this for the group mask
++ *    ...
++ */
++
++static int
++get_ctrl_grp_id(struct rtattr *arg)
++{
++	struct rtattr *tb[CTRL_ATTR_MCAST_GRP_MAX + 1];
++	char *name;
++
++	if (arg == NULL)
++		return -1;
++
++	/* nested within the CTRL_ATTR_MCAST_GROUPS attribute are the  */
++	/* group name and ID  */
++	parse_rtattr_nested(tb, CTRL_ATTR_MCAST_GRP_MAX, arg);
++
++	/* if either of the entries needed cannot be found, bail */
++	if (!tb[CTRL_ATTR_MCAST_GRP_NAME] || !tb[CTRL_ATTR_MCAST_GRP_ID])
++		return -1;
++
++	/* get the name of this multicast group we've found */
++	name = RTA_DATA(tb[CTRL_ATTR_MCAST_GRP_NAME]);
++
++	/* if it does not match the ACPI event multicast group name, bail */
++	if (strcmp(name, ACPI_EVENT_MCAST_GROUP_NAME))
++		return -1;
++
++	/* At this point, we've found what we were looking for.  We now  */
++	/* have the multicast group ID for ACPI events over generic netlink. */
++	acpi_event_mcast_group_id =
++		*((__u32 *)RTA_DATA(tb[CTRL_ATTR_MCAST_GRP_ID]));
++
++	return 0;
++}
++
++/* n = the response to a CTRL_CMD_GETFAMILY message */
++static int
++genl_get_mcast_group_id(struct nlmsghdr *n)
++{
++	/*
++	 *  Attribute table.  Note the type name "rtattr" which means "route
++	 *  attribute".  This is a vestige of one of netlink's main uses:
++	 *  routing.
++	 */
++	struct rtattr *tb[CTRL_ATTR_MAX + 1];
++	/* pointer to the generic netlink header in the incoming message */
++	struct genlmsghdr *ghdr = NLMSG_DATA(n);
++	/* length of the attribute and payload */
++	int len = n->nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN);
++	/* Pointer to the attribute portion of the message */
++	struct rtattr *attrs;
++
++	if (len < 0) {
++		fprintf(stderr, "%s: netlink CTRL_CMD_GETFAMILY response, "
++			"wrong controller message len: %d\n", progname, len);
++		return -1;
++	}
++
++	if (n->nlmsg_type != GENL_ID_CTRL) {
++		fprintf(stderr, "%s: not a netlink controller message, "
++			"nlmsg_len=%d nlmsg_type=0x%x\n", 
++			progname, n->nlmsg_len, n->nlmsg_type);
++		return 0;
++	}
++
++	if (ghdr->cmd != CTRL_CMD_GETFAMILY &&
++	    ghdr->cmd != CTRL_CMD_DELFAMILY &&
++	    ghdr->cmd != CTRL_CMD_NEWFAMILY &&
++	    ghdr->cmd != CTRL_CMD_NEWMCAST_GRP &&
++	    ghdr->cmd != CTRL_CMD_DELMCAST_GRP) {
++		fprintf(stderr, "%s: unknown netlink controller command %d\n",
++			progname, ghdr->cmd);
++		return 0;
++	}
++
++	/* set attrs to point to the attribute */
++	attrs = (struct rtattr *)((char *)ghdr + GENL_HDRLEN);
++	/* Read the table from the message into "tb".  This actually just  */
++	/* places pointers into the message into tb[].  */
++	parse_rtattr(tb, CTRL_ATTR_MAX, attrs, len);
++
++	/* if a family ID attribute is present, get it */
++	if (tb[CTRL_ATTR_FAMILY_ID])
++	{
++		acpi_event_family_id =
++			*((__u32 *)RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]));
++	}
++
++	/* if a "multicast groups" attribute is present... */
++	if (tb[CTRL_ATTR_MCAST_GROUPS]) {
++		struct rtattr *tb2[GENL_MAX_FAM_GRPS + 1];
++		int i;
++
++		/* get the group table within this attribute  */
++		parse_rtattr_nested(tb2, GENL_MAX_FAM_GRPS,
++			tb[CTRL_ATTR_MCAST_GROUPS]);
++
++		/* for each group */
++		for (i = 0; i < GENL_MAX_FAM_GRPS; i++)
++			/* if this group is valid */
++			if (tb2[i])
++				/* Parse the ID.  If successful, we're done. */
++				if (!get_ctrl_grp_id(tb2[i]))
++					return 0;
++	}
++
++	return -1;
++}
++
++static int
++genl_get_ids(char *family_name)
++{
++	/* handle to the netlink connection */
++	struct rtnl_handle rth;
++	/* holds the request we are going to send and the reply */
++	struct {
++		struct nlmsghdr n;
++		char buf[4096];    /* ??? Is this big enough for all cases? */
++	} req;
++	/* pointer to the nlmsghdr in req */
++	struct nlmsghdr *nlh;
++	/* pointer to the generic netlink header in req */
++	struct genlmsghdr *ghdr;
++	/* return value */
++	int ret = -1;
++
++	/* clear out the request */
++	memset(&req, 0, sizeof(req));
++
++	/* set up nlh to point to the netlink header in req */
++	nlh = &req.n;
++	/* set up the netlink header */
++	nlh->nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);
++	nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
++	nlh->nlmsg_type = GENL_ID_CTRL;
++
++	/* set up ghdr to point to the generic netlink header */
++	ghdr = NLMSG_DATA(&req.n);
++	/* set the command we want to run: "GETFAMILY" */
++	ghdr->cmd = CTRL_CMD_GETFAMILY;
++
++	/* the message payload is the family name */
++	addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME,
++			  family_name, strlen(family_name) + 1);
++
++	/* open a generic netlink connection */
++	if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
++		fprintf(stderr, "%s: cannot open generic netlink socket\n", 
++			progname);
++		return -1;
++	}
++
++	/*
++	 *  Send CTRL_CMD_GETFAMILY message (in nlh) to the generic
++	 *  netlink controller.  Reply will be in nlh upon return.
++	 */
++	if (rtnl_talk(&rth, nlh, 0, 0, nlh, NULL, NULL) < 0) {
++		fprintf(stderr, "%s: error talking to the kernel via netlink\n",
++			progname);
++		goto ctrl_done;
++	}
++
++	/* process the response */
++	if (genl_get_mcast_group_id(nlh) < 0) {
++		fprintf(stderr, "%s: failed to get acpi_event netlink "
++			"multicast group\n", progname);
++		goto ctrl_done;
++	}
++
++	ret = 0;
++
++ctrl_done:
++	rtnl_close(&rth);
++	return ret;
++}
++
++/* initialize the ACPI IDs */
++static void
++acpi_ids_init()
++{
++	genl_get_ids(ACPI_EVENT_FAMILY_NAME);
++
++	initialized = 1;
++}
++
++/* returns the netlink family ID for ACPI event messages */
++__u16
++acpi_ids_getfamily()
++{
++	/* if the IDs haven't been initialized, initialize them */
++	if (initialized == 0)
++		acpi_ids_init();
++
++	return acpi_event_family_id;
++}
++
++/* returns the netlink multicast group ID for ACPI event messages */
++__u32
++acpi_ids_getgroup()
++{
++	/* if the IDs haven't been initialized, initialize them */
++	if (initialized == 0)
++		acpi_ids_init();
++
++	return acpi_event_mcast_group_id;
++}
+diff -ruN acpid-1.0.8.orig/acpi_ids.h acpid-1.0.8/acpi_ids.h
+--- acpid-1.0.8.orig/acpi_ids.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/acpi_ids.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++ *  acpi_ids.h - ACPI Netlink Group and Family IDs
++ *
++ *  Copyright (C) 2008 Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef ACPI_IDS_H__
++#define ACPI_IDS_H__
++
++/* returns the netlink family ID for ACPI event messages */
++extern __u16 acpi_ids_getfamily();
++
++/* returns the netlink multicast group ID for ACPI event messages */
++extern __u32 acpi_ids_getgroup();
++
++#endif /* ACPI_IDS_H__ */
+diff -ruN acpid-1.0.8.orig/acpi_listen.c acpid-1.0.8/acpi_listen.c
+--- acpid-1.0.8.orig/acpi_listen.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/acpi_listen.c	2009-03-29 17:10:14.000000000 +0200
+@@ -42,8 +42,8 @@
+ static int handle_cmdline(int *argc, char ***argv);
+ static char *read_line(int fd);
+ 
+-static const char *progname;
+-static const char *socketfile = ACPID_SOCKETFILE;
++const char *progname;
++const char *socketfile = ACPID_SOCKETFILE;
+ static int max_events;
+ 
+ static void
+diff -ruN acpid-1.0.8.orig/connection_list.c acpid-1.0.8/connection_list.c
+--- acpid-1.0.8.orig/connection_list.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/connection_list.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,124 @@
++/*
++ *  connection_list.c - ACPI daemon connection list
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  Tabs at 4
++ */
++
++#include <unistd.h>
++#include <stdio.h>
++#include <sys/select.h>
++
++#include "acpid.h"
++
++#include "connection_list.h"
++
++#define max(a, b)  (((a)>(b))?(a):(b))
++
++/*---------------------------------------------------------------*/
++/* private objects */
++
++#define MAX_CONNECTIONS 10
++
++static struct connection connection_list[MAX_CONNECTIONS];
++
++static int nconnections = 0;
++
++/* fd_set containing all the fd's that come in */
++static fd_set allfds;
++
++/* highest fd that is opened */
++/* (-2 + 1) causes select() to return immediately */
++static int highestfd = -2;
++
++/*---------------------------------------------------------------*/
++/* public functions */
++
++void
++add_connection(struct connection *p)
++{
++	if (nconnections < 0)
++		return;
++	if (nconnections >= MAX_CONNECTIONS) {
++		acpid_log(LOG_ERR, "Too many connections.\n");
++		return;
++	}
++
++	if (nconnections == 0)
++		FD_ZERO(&allfds);
++	
++	/* add the connection to the connection list */
++	connection_list[nconnections] = *p;
++	++nconnections;
++	
++	/* add to the fd set */
++	FD_SET(p->fd, &allfds);
++	highestfd = max(highestfd, p->fd);
++}
++
++/*---------------------------------------------------------------*/
++
++struct connection *
++find_connection(int fd)
++{
++	int i;
++
++	/* for each connection */
++	for (i = 0; i < nconnections; ++i) {
++		/* if the file descriptors match, return the connection */
++		if (connection_list[i].fd == fd)
++			return &connection_list[i];
++	}
++
++	return NULL;
++}
++
++/*---------------------------------------------------------------*/
++
++int 
++get_number_of_connections()
++{
++	return nconnections;
++}
++
++/*---------------------------------------------------------------*/
++
++struct connection *
++get_connection(int i)
++{
++	if (i < 0  ||  i >= nconnections)
++		return NULL;
++
++	return &connection_list[i];
++}
++
++/*---------------------------------------------------------------*/
++
++const fd_set *
++get_fdset()
++{
++	return &allfds;
++}
++
++/*---------------------------------------------------------------*/
++
++int
++get_highestfd()
++{
++	return highestfd;
++}
+diff -ruN acpid-1.0.8.orig/connection_list.h acpid-1.0.8/connection_list.h
+--- acpid-1.0.8.orig/connection_list.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/connection_list.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,59 @@
++/*
++ *  connection_list.h - ACPI daemon connection list
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  Tabs at 4
++ */
++
++#ifndef CONNECTION_LIST_H__
++#define CONNECTION_LIST_H__
++
++#include <sys/select.h>
++
++/*****************************************************************
++ *  Connection List Public Members
++ *****************************************************************/
++
++struct connection
++{
++	/* file descriptor */
++	int fd;
++
++	/* process incoming data on the connection */
++	void (* process)(int fd);
++};
++
++/* add a connection to the list */
++extern void add_connection(struct connection *p);
++
++/* find a connection in the list by file descriptor */
++extern struct connection *find_connection(int fd);
++
++/* get the number of connections in the list */
++extern int get_number_of_connections();
++
++/* get a specific connection by index from the list */
++extern struct connection *get_connection(int i);
++
++/* get an fd_set with all the fd's that have been added to the list */
++extern const fd_set *get_fdset();
++
++/* get the highest fd that was added to the list */
++extern int get_highestfd();
++
++#endif /* CONNECTION_LIST_H__ */
+diff -ruN acpid-1.0.8.orig/event.c acpid-1.0.8/event.c
+--- acpid-1.0.8.orig/event.c	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/event.c	2009-03-29 17:10:14.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- *  event.c - ACPI daemon
++ *  event.c - ACPI daemon event handler
+  *
+  *  Copyright (C) 2000 Andrew Henroid
+  *  Copyright (C) 2001 Sun Microsystems (thockin@sun.com)
+diff -ruN acpid-1.0.8.orig/event.h acpid-1.0.8/event.h
+--- acpid-1.0.8.orig/event.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/event.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,31 @@
++/*
++ *  event.h - ACPI daemon event handler
++ *
++ *  Copyright (C) 1999-2000 Andrew Henroid
++ *  Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef EVENT_H__
++#define EVENT_H__
++
++extern int acpid_read_conf(const char *confdir);
++extern int acpid_add_client(int client, const char *origin);
++extern int acpid_cleanup_rules(int do_detach);
++extern int acpid_handle_event(const char *event);
++
++#endif /* EVENT_H__ */
+diff -ruN acpid-1.0.8.orig/genetlink.h acpid-1.0.8/genetlink.h
+--- acpid-1.0.8.orig/genetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/genetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,81 @@
++#ifndef __LINUX_GENERIC_NETLINK_H
++#define __LINUX_GENERIC_NETLINK_H
++
++#include <linux/netlink.h>
++
++#define GENL_NAMSIZ	16	/* length of family name */
++
++#define GENL_MIN_ID	NLMSG_MIN_TYPE
++#define GENL_MAX_ID	1023
++
++struct genlmsghdr {
++	__u8	cmd;
++	__u8	version;
++	__u16	reserved;
++};
++
++#define GENL_HDRLEN	NLMSG_ALIGN(sizeof(struct genlmsghdr))
++
++#define GENL_ADMIN_PERM		0x01
++#define GENL_CMD_CAP_DO		0x02
++#define GENL_CMD_CAP_DUMP	0x04
++#define GENL_CMD_CAP_HASPOL	0x08
++
++/*
++ * List of reserved static generic netlink identifiers:
++ */
++#define GENL_ID_GENERATE	0
++#define GENL_ID_CTRL		NLMSG_MIN_TYPE
++
++/**************************************************************************
++ * Controller
++ **************************************************************************/
++
++enum {
++	CTRL_CMD_UNSPEC,
++	CTRL_CMD_NEWFAMILY,
++	CTRL_CMD_DELFAMILY,
++	CTRL_CMD_GETFAMILY,
++	CTRL_CMD_NEWOPS,
++	CTRL_CMD_DELOPS,
++	CTRL_CMD_GETOPS,
++	CTRL_CMD_NEWMCAST_GRP,
++	CTRL_CMD_DELMCAST_GRP,
++	CTRL_CMD_GETMCAST_GRP, /* unused */
++	__CTRL_CMD_MAX,
++};
++
++#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1)
++
++enum {
++	CTRL_ATTR_UNSPEC,
++	CTRL_ATTR_FAMILY_ID,
++	CTRL_ATTR_FAMILY_NAME,
++	CTRL_ATTR_VERSION,
++	CTRL_ATTR_HDRSIZE,
++	CTRL_ATTR_MAXATTR,
++	CTRL_ATTR_OPS,
++	CTRL_ATTR_MCAST_GROUPS,
++	__CTRL_ATTR_MAX,
++};
++
++#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1)
++
++enum {
++	CTRL_ATTR_OP_UNSPEC,
++	CTRL_ATTR_OP_ID,
++	CTRL_ATTR_OP_FLAGS,
++	__CTRL_ATTR_OP_MAX,
++};
++
++#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1)
++
++enum {
++	CTRL_ATTR_MCAST_GRP_UNSPEC,
++	CTRL_ATTR_MCAST_GRP_NAME,
++	CTRL_ATTR_MCAST_GRP_ID,
++	__CTRL_ATTR_MCAST_GRP_MAX,
++};
++#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
++
++#endif	/* __LINUX_GENERIC_NETLINK_H */
+diff -ruN acpid-1.0.8.orig/input_layer.c acpid-1.0.8/input_layer.c
+--- acpid-1.0.8.orig/input_layer.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/input_layer.c	2009-03-29 17:11:58.000000000 +0200
+@@ -0,0 +1,262 @@
++/*
++ *  input_layer - Kernel ACPI Event Input Layer Interface
++ *
++ *  Handles the details of getting kernel ACPI events from the input
++ *  layer (/dev/input/event*).
++ *
++ *  Inspired by (and in some cases blatantly lifted from) Vojtech Pavlik's
++ *  evtest.c.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++/* system */
++#include <unistd.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <fcntl.h>
++#include <linux/input.h>
++#include <string.h>
++#include <errno.h>
++#include <malloc.h>
++#include <glob.h>
++
++/* local */
++#include "acpid.h"
++#include "connection_list.h"
++#include "event.h"
++
++#define DIM(a)  (sizeof(a) / sizeof(a[0]))
++
++struct evtab_entry {
++	struct input_event event;
++	const char *str;
++};
++	
++/* event table: events we are interested in and their strings */
++/* use evtest.c or acpi_genl to find new events to add to this table */
++static struct evtab_entry evtab[] = {
++	{{{0,0}, EV_KEY, KEY_POWER, 1}, "button/power PBTN 00000080 00000000"},
++	{{{0,0}, EV_KEY, KEY_SLEEP, 1}, "button/sleep SBTN 00000080 00000000"},
++	{{{0,0}, EV_KEY, KEY_SUSPEND, 1}, 
++ 		"button/suspend SUSP 00000080 00000000"},
++	{{{0,0}, EV_SW, SW_LID, 1}, "button/lid LID close"},
++	{{{0,0}, EV_SW, SW_LID, 0}, "button/lid LID open"}
++};
++	
++/*----------------------------------------------------------------------*/
++/* Given an input event, returns the string corresponding to that event.
++   If there is no corresponding string, NULL is returned.  */
++static const char *
++event_string(struct input_event event)
++{
++	unsigned i;
++	
++	/* for each entry in the event table */
++	for (i = 0; i < DIM(evtab); ++i)
++	{
++		/* if this is a matching event, return its string */
++		if (event.type == evtab[i].event.type  &&
++			event.code == evtab[i].event.code  &&
++			event.value == evtab[i].event.value) {
++			return evtab[i].str;
++		}
++	}
++	
++	return NULL;
++}
++
++/*-----------------------------------------------------------------*/
++/* returns non-zero if the event type/code is one we need */
++static int 
++need_event(int type, int code)
++{
++	unsigned i;
++
++	/* for each entry in the event table */
++	for (i = 0; i < DIM(evtab); ++i) {
++		/* if we found a matching event */
++		if (type == evtab[i].event.type  &&
++			code == evtab[i].event.code) {
++			return 1;
++		}
++	}
++
++	return 0;
++}
++
++/*-----------------------------------------------------------------*/
++/* called when an input layer event is received */
++void process_input(int fd)
++{
++	struct input_event event;
++	ssize_t nbytes;
++	const char *str;
++	static int nerrs;
++
++	nbytes = read(fd, &event, sizeof(event));
++
++	if (nbytes == 0) {
++		acpid_log(LOG_WARNING, "input layer connection closed\n");
++		exit(EXIT_FAILURE);
++	}
++	
++	if (nbytes < 0) {
++		/* if it's a signal, bail */
++		if (errno == EINTR)
++			return;
++		
++		acpid_log(LOG_ERR, "input layer read error: %s (%d)\n",
++			strerror(errno), errno);
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading "
++				"input layer - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++		return;
++	}
++
++	/* ??? Is it possible for a partial message to come across? */
++	/*   If so, we've got more code to write... */
++	
++	if (nbytes != sizeof(event)) {
++		acpid_log(LOG_WARNING, "input layer unexpected length: "
++			"%d   expected: %d\n", nbytes, sizeof(event));
++		return;
++	}
++
++	/* convert the event into a string */
++	str = event_string(event);
++	/* if this is not an event we care about, bail */
++	if (str == NULL)
++		return;
++	
++	/* if we're locked, don't process the event */
++	if (locked()) {
++		if (logevents) {
++			acpid_log(LOG_INFO,
++				"lockfile present, not processing "
++				"input layer event \"%s\"\n", str);
++		}
++		return;
++	}
++
++	if (logevents)
++		acpid_log(LOG_INFO,
++			"received input layer event \"%s\"\n", str);
++	
++	/* send the event off to the handler */
++	acpid_handle_event(str);
++
++	if (logevents)
++		acpid_log(LOG_INFO,
++			"completed input layer event \"%s\"\n", str);
++}
++
++#define BITS_PER_LONG (sizeof(long) * 8)
++#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
++#define OFF(x)  ((x)%BITS_PER_LONG)
++#define LONG(x) ((x)/BITS_PER_LONG)
++#define test_bit(bit, array)	((array[LONG(bit)] >> OFF(bit)) & 1)
++
++/*--------------------------------------------------------------------*/
++/* returns non-zero if the file descriptor supports one of the events */
++/* supported by event_string().  */
++static int 
++has_event(int fd)
++{
++	int type, code;
++	unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
++
++	memset(bit, 0, sizeof(bit));
++	/* get the event type bitmap */
++	ioctl(fd, EVIOCGBIT(0, sizeof(bit[0])), bit[0]);
++
++	/* for each event type */
++	for (type = 0; type < EV_MAX; type++) {
++		/* if this event type is supported */
++		if (test_bit(type, bit[0])) {
++			/* skip sync */
++			if (type == EV_SYN) continue;
++			/* get the event code mask */
++			ioctl(fd, EVIOCGBIT(type, sizeof(bit[type])), bit[type]);
++			/* for each event code */
++			for (code = 0; code < KEY_MAX; code++) {
++				/* if this event code is supported */
++				if (test_bit(code, bit[type])) {
++					/* if we need this event */
++					if (need_event(type, code) != 0)
++						return 1;
++				}
++			}
++		}
++	}
++	return 0;
++}
++
++/* ??? make this changeable by commandline option */
++#define INPUT_LAYER_FS "/dev/input/event*"
++
++/*-----------------------------------------------------------------*
++ * open each of the appropriate /dev/input/event* files for input  */
++void open_input(void)
++{
++	char *filename = NULL;
++	glob_t globbuf;
++	unsigned i;
++	int fd;
++	int success = 0;
++	struct connection c;
++
++	/* get all the matching event filenames */
++	glob(INPUT_LAYER_FS, 0, NULL, &globbuf);
++
++	/* for each event file */
++	for (i = 0; i < globbuf.gl_pathc; ++i)
++	{
++		filename = globbuf.gl_pathv[i];
++
++		fd = open(filename, O_RDONLY | O_NONBLOCK);
++		if (fd >= 0) {
++			/* if this file doesn't have events we need, try the next */
++			if (!has_event(fd))
++			{
++				close(fd);
++				continue;
++			}
++
++			success = 1;
++
++			if (acpid_debug)
++				fprintf(stderr, "%s: input layer %s "
++					"opened successfully\n", progname, filename);
++
++			/* add a connection to the list */
++			c.fd = fd;
++			c.process = process_input;
++			add_connection(&c);
++		}
++	}
++
++	if (!success)
++		fprintf(stderr, "%s: cannot open input layer\n", progname);
++
++	globfree(&globbuf);
++}
+diff -ruN acpid-1.0.8.orig/input_layer.h acpid-1.0.8/input_layer.h
+--- acpid-1.0.8.orig/input_layer.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/input_layer.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ *  input_layer.h - Kernel ACPI Event Input Layer Interface
++ *
++ *  Handles the details of getting kernel ACPI events from the input
++ *  layer (/dev/input/event*).
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++#ifndef INPUT_LAYER_H__
++#define INPUT_LAYER_H__
++
++/* Open each of the appropriate /dev/input/event* files for input. */
++extern void open_input(void);
++
++#endif /* INPUT_LAYER_H__ */
+diff -ruN acpid-1.0.8.orig/libnetlink.c acpid-1.0.8/libnetlink.c
+--- acpid-1.0.8.orig/libnetlink.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/libnetlink.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,593 @@
++/*
++ * libnetlink.c	RTnetlink service routines.
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
++ *
++ * Modified by Ted Felix (www.tedfelix.com) to fix warnings.
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <net/if_arp.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <string.h>
++#include <errno.h>
++#include <time.h>
++#include <sys/uio.h>
++
++#include "libnetlink.h"
++
++void rtnl_close(struct rtnl_handle *rth)
++{
++	if (rth->fd >= 0) {
++		close(rth->fd);
++		rth->fd = -1;
++	}
++}
++
++int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions,
++		      int protocol)
++{
++	socklen_t addr_len;
++	int sndbuf = 32768;
++	int rcvbuf = 32768;
++
++	memset(rth, 0, sizeof(rth));
++
++	rth->fd = socket(AF_NETLINK, SOCK_RAW, protocol);
++	if (rth->fd < 0) {
++		perror("Cannot open netlink socket");
++		return -1;
++	}
++
++	if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) {
++		perror("SO_SNDBUF");
++		return -1;
++	}
++
++	if (setsockopt(rth->fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf)) < 0) {
++		perror("SO_RCVBUF");
++		return -1;
++	}
++
++	memset(&rth->local, 0, sizeof(rth->local));
++	rth->local.nl_family = AF_NETLINK;
++	rth->local.nl_groups = subscriptions;
++
++	if (bind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)) < 0) {
++		perror("Cannot bind netlink socket");
++		return -1;
++	}
++	addr_len = sizeof(rth->local);
++	if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) {
++		perror("Cannot getsockname");
++		return -1;
++	}
++	if (addr_len != sizeof(rth->local)) {
++		fprintf(stderr, "Wrong address length %d\n", addr_len);
++		return -1;
++	}
++	if (rth->local.nl_family != AF_NETLINK) {
++		fprintf(stderr, "Wrong address family %d\n", rth->local.nl_family);
++		return -1;
++	}
++	rth->seq = time(NULL);
++	return 0;
++}
++
++int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)
++{
++	return rtnl_open_byproto(rth, subscriptions, NETLINK_ROUTE);
++}
++
++int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
++{
++	struct {
++		struct nlmsghdr nlh;
++		struct rtgenmsg g;
++	} req;
++	struct sockaddr_nl nladdr;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	memset(&req, 0, sizeof(req));
++	req.nlh.nlmsg_len = sizeof(req);
++	req.nlh.nlmsg_type = type;
++	req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
++	req.nlh.nlmsg_pid = 0;
++	req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
++	req.g.rtgen_family = family;
++
++	return sendto(rth->fd, (void*)&req, sizeof(req), 0,
++		      (struct sockaddr*)&nladdr, sizeof(nladdr));
++}
++
++int rtnl_send(struct rtnl_handle *rth, const char *buf, int len)
++{
++	struct sockaddr_nl nladdr;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	return sendto(rth->fd, buf, len, 0, (struct sockaddr*)&nladdr, sizeof(nladdr));
++}
++
++int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
++{
++	struct nlmsghdr nlh;
++	struct sockaddr_nl nladdr;
++	struct iovec iov[2] = {
++		{ .iov_base = &nlh, .iov_len = sizeof(nlh) },
++		{ .iov_base = req, .iov_len = len }
++	};
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = 	sizeof(nladdr),
++		.msg_iov = iov,
++		.msg_iovlen = 2,
++	};
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++
++	nlh.nlmsg_len = NLMSG_LENGTH(len);
++	nlh.nlmsg_type = type;
++	nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
++	nlh.nlmsg_pid = 0;
++	nlh.nlmsg_seq = rth->dump = ++rth->seq;
++
++	return sendmsg(rth->fd, &msg, 0);
++}
++
++int rtnl_dump_filter(struct rtnl_handle *rth,
++		     rtnl_filter_t filter,
++		     void *arg1,
++		     rtnl_filter_t junk,
++		     void *arg2)
++{
++	struct sockaddr_nl nladdr;
++	struct iovec iov;
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char buf[16384];
++
++	iov.iov_base = buf;
++	while (1) {
++		int status;
++		struct nlmsghdr *h;
++
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rth->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++
++		h = (struct nlmsghdr*)buf;
++		while (NLMSG_OK(h, (unsigned)status)) {
++			int err;
++
++			if (nladdr.nl_pid != 0 ||
++			    h->nlmsg_pid != rth->local.nl_pid ||
++			    h->nlmsg_seq != rth->dump) {
++				if (junk) {
++					err = junk(&nladdr, h, arg2);
++					if (err < 0)
++						return err;
++				}
++				goto skip_it;
++			}
++
++			if (h->nlmsg_type == NLMSG_DONE)
++				return 0;
++			if (h->nlmsg_type == NLMSG_ERROR) {
++				struct nlmsgerr *msgerr = (struct nlmsgerr*)NLMSG_DATA(h);
++				if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
++					fprintf(stderr, "ERROR truncated\n");
++				} else {
++					errno = -msgerr->error;
++					perror("RTNETLINK answers");
++				}
++				return -1;
++			}
++			err = filter(&nladdr, h, arg1);
++			if (err < 0)
++				return err;
++
++skip_it:
++			h = NLMSG_NEXT(h, status);
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
++	      unsigned groups, struct nlmsghdr *answer,
++	      rtnl_filter_t junk,
++	      void *jarg)
++{
++	int status;
++	unsigned seq;
++	struct nlmsghdr *h;
++	struct sockaddr_nl nladdr;
++	struct iovec iov = {
++		.iov_base = (void*) n,
++		.iov_len = n->nlmsg_len
++	};
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char   buf[16384];
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = peer;
++	nladdr.nl_groups = groups;
++
++	n->nlmsg_seq = seq = ++rtnl->seq;
++
++	if (answer == NULL)
++		n->nlmsg_flags |= NLM_F_ACK;
++
++	status = sendmsg(rtnl->fd, &msg, 0);
++
++	if (status < 0) {
++		perror("Cannot talk to rtnetlink");
++		return -1;
++	}
++
++	memset(buf,0,sizeof(buf));
++
++	iov.iov_base = buf;
++
++	while (1) {
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rtnl->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++		if (msg.msg_namelen != sizeof(nladdr)) {
++			fprintf(stderr, "sender address length == %d\n", msg.msg_namelen);
++			exit(1);
++		}
++		for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++			int err;
++			int len = h->nlmsg_len;
++			int l = len - sizeof(*h);
++
++			if (l<0 || len>status) {
++				if (msg.msg_flags & MSG_TRUNC) {
++					fprintf(stderr, "Truncated message\n");
++					return -1;
++				}
++				fprintf(stderr, "!!!malformed message: len=%d\n", len);
++				exit(1);
++			}
++
++			if (nladdr.nl_pid != (unsigned)peer ||
++			    h->nlmsg_pid != rtnl->local.nl_pid ||
++			    h->nlmsg_seq != seq) {
++				if (junk) {
++					err = junk(&nladdr, h, jarg);
++					if (err < 0)
++						return err;
++				}
++				/* Don't forget to skip that message. */
++				status -= NLMSG_ALIGN(len);
++				h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++				continue;
++			}
++
++			if (h->nlmsg_type == NLMSG_ERROR) {
++				struct nlmsgerr *msgerr = (struct nlmsgerr*)NLMSG_DATA(h);
++				if ((unsigned)l < sizeof(struct nlmsgerr)) {
++					fprintf(stderr, "ERROR truncated\n");
++				} else {
++					errno = -msgerr->error;
++					if (errno == 0) {
++						if (answer)
++							memcpy(answer, h, h->nlmsg_len);
++						return 0;
++					}
++					perror("RTNETLINK1 answers");
++				}
++				return -1;
++			}
++			if (answer) {
++				memcpy(answer, h, h->nlmsg_len);
++				return 0;
++			}
++
++			fprintf(stderr, "Unexpected reply!!!\n");
++
++			status -= NLMSG_ALIGN(len);
++			h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_listen(struct rtnl_handle *rtnl,
++		rtnl_filter_t handler,
++		void *jarg)
++{
++	int status;
++	struct nlmsghdr *h;
++	struct sockaddr_nl nladdr;
++	struct iovec iov;
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	char   buf[8192];
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	iov.iov_base = buf;
++	while (1) {
++		iov.iov_len = sizeof(buf);
++		status = recvmsg(rtnl->fd, &msg, 0);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("OVERRUN");
++			continue;
++		}
++		if (status == 0) {
++			fprintf(stderr, "EOF on netlink\n");
++			return -1;
++		}
++		if (msg.msg_namelen != sizeof(nladdr)) {
++			fprintf(stderr, "Sender address length == %d\n", msg.msg_namelen);
++			exit(1);
++		}
++		for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++			int err;
++			int len = h->nlmsg_len;
++			int l = len - sizeof(*h);
++
++			if (l<0 || len>status) {
++				if (msg.msg_flags & MSG_TRUNC) {
++					fprintf(stderr, "Truncated message\n");
++					return -1;
++				}
++				fprintf(stderr, "!!!malformed message: len=%d\n", len);
++				exit(1);
++			}
++
++			err = handler(&nladdr, h, jarg);
++			if (err < 0)
++				return err;
++
++			status -= NLMSG_ALIGN(len);
++			h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++		}
++		if (msg.msg_flags & MSG_TRUNC) {
++			fprintf(stderr, "Message truncated\n");
++			continue;
++		}
++		if (status) {
++			fprintf(stderr, "!!!Remnant of size %d\n", status);
++			exit(1);
++		}
++	}
++}
++
++int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler,
++		   void *jarg)
++{
++	int status;
++	struct sockaddr_nl nladdr;
++	char   buf[8192];
++	struct nlmsghdr *h = (void*)buf;
++
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	while (1) {
++		int err, len, type;
++		int l;
++
++		status = fread(&buf, 1, sizeof(*h), rtnl);
++
++		if (status < 0) {
++			if (errno == EINTR)
++				continue;
++			perror("rtnl_from_file: fread");
++			return -1;
++		}
++		if (status == 0)
++			return 0;
++
++		len = h->nlmsg_len;
++		type= h->nlmsg_type;
++		l = len - sizeof(*h);
++
++		if (l<0 || (unsigned)len>sizeof(buf)) {
++			fprintf(stderr, "!!!malformed message: len=%d @%lu\n",
++				len, ftell(rtnl));
++			return -1;
++		}
++
++		status = fread(NLMSG_DATA(h), 1, NLMSG_ALIGN(l), rtnl);
++
++		if (status < 0) {
++			perror("rtnl_from_file: fread");
++			return -1;
++		}
++		if (status < l) {
++			fprintf(stderr, "rtnl-from_file: truncated message\n");
++			return -1;
++		}
++
++		err = handler(&nladdr, h, jarg);
++		if (err < 0)
++			return err;
++	}
++}
++
++int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data)
++{
++	int len = RTA_LENGTH(4);
++	struct rtattr *rta;
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) {
++		fprintf(stderr,"addattr32: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	rta = NLMSG_TAIL(n);
++	rta->rta_type = type;
++	rta->rta_len = len;
++	memcpy(RTA_DATA(rta), &data, 4);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
++	return 0;
++}
++
++int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data,
++	      int alen)
++{
++	int len = RTA_LENGTH(alen);
++	struct rtattr *rta;
++
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) {
++		fprintf(stderr, "addattr_l ERROR: message exceeded bound of %d\n",maxlen);
++		return -1;
++	}
++	rta = NLMSG_TAIL(n);
++	rta->rta_type = type;
++	rta->rta_len = len;
++	memcpy(RTA_DATA(rta), data, alen);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
++	return 0;
++}
++
++int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len)
++{
++	if ((int)NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len) > maxlen) {
++		fprintf(stderr, "addraw_l ERROR: message exceeded bound of %d\n",maxlen);
++		return -1;
++	}
++
++	memcpy(NLMSG_TAIL(n), data, len);
++	memset((void *) NLMSG_TAIL(n) + len, 0, NLMSG_ALIGN(len) - len);
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len);
++	return 0;
++}
++
++int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data)
++{
++	int len = RTA_LENGTH(4);
++	struct rtattr *subrta;
++
++	if (RTA_ALIGN(rta->rta_len) + len > maxlen) {
++		fprintf(stderr,"rta_addattr32: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
++	subrta->rta_type = type;
++	subrta->rta_len = len;
++	memcpy(RTA_DATA(subrta), &data, 4);
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + len;
++	return 0;
++}
++
++int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
++		  const void *data, int alen)
++{
++	struct rtattr *subrta;
++	int len = RTA_LENGTH(alen);
++
++	if (RTA_ALIGN(rta->rta_len) + RTA_ALIGN(len) > maxlen) {
++		fprintf(stderr,"rta_addattr_l: Error! max allowed bound %d exceeded\n",maxlen);
++		return -1;
++	}
++	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
++	subrta->rta_type = type;
++	subrta->rta_len = len;
++	memcpy(RTA_DATA(subrta), data, alen);
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len);
++	return 0;
++}
++
++int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
++{
++	memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
++	while (RTA_OK(rta, len)) {
++		if (rta->rta_type <= max)
++			tb[rta->rta_type] = rta;
++		rta = RTA_NEXT(rta,len);
++	}
++	if (len)
++		fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len);
++	return 0;
++}
++
++int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len)
++{
++	int i = 0;
++
++	memset(tb, 0, sizeof(struct rtattr *) * max);
++	while (RTA_OK(rta, len)) {
++		if (rta->rta_type <= max && i < max)
++			tb[i++] = rta;
++		rta = RTA_NEXT(rta,len);
++	}
++	if (len)
++		fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len);
++	return i;
++}
+diff -ruN acpid-1.0.8.orig/libnetlink.h acpid-1.0.8/libnetlink.h
+--- acpid-1.0.8.orig/libnetlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/libnetlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,91 @@
++#ifndef __LIBNETLINK_H__
++#define __LIBNETLINK_H__ 1
++
++#include <asm/types.h>
++// needed by netlink.h, should be in there
++#include <arpa/inet.h>
++#include <linux/netlink.h>
++#include <linux/rtnetlink.h>
++
++struct rtnl_handle
++{
++	int			fd;
++	struct sockaddr_nl	local;
++	struct sockaddr_nl	peer;
++	__u32			seq;
++	__u32			dump;
++};
++
++extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions);
++extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol);
++extern void rtnl_close(struct rtnl_handle *rth);
++extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type);
++extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len);
++
++typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
++			     struct nlmsghdr *n, void *);
++extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter,
++			    void *arg1,
++			    rtnl_filter_t junk,
++			    void *arg2);
++extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
++		     unsigned groups, struct nlmsghdr *answer,
++		     rtnl_filter_t junk,
++		     void *jarg);
++extern int rtnl_send(struct rtnl_handle *rth, const char *buf, int);
++
++
++extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
++extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen);
++extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
++extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
++extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen);
++
++extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
++extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len);
++
++#define parse_rtattr_nested(tb, max, rta) \
++	(parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
++
++extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler,
++		       void *jarg);
++extern int rtnl_from_file(FILE *, rtnl_filter_t handler,
++		       void *jarg);
++
++#define NLMSG_TAIL(nmsg) \
++	((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
++
++#ifndef IFA_RTA
++#define IFA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
++#endif
++#ifndef IFA_PAYLOAD
++#define IFA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
++#endif
++
++#ifndef IFLA_RTA
++#define IFLA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#endif
++#ifndef IFLA_PAYLOAD
++#define IFLA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++#endif
++
++#ifndef NDA_RTA
++#define NDA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
++#endif
++#ifndef NDA_PAYLOAD
++#define NDA_PAYLOAD(n)	NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
++#endif
++
++#ifndef NDTA_RTA
++#define NDTA_RTA(r) \
++	((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
++#endif
++#ifndef NDTA_PAYLOAD
++#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
++#endif
++
++#endif /* __LIBNETLINK_H__ */
++
+diff -ruN acpid-1.0.8.orig/Makefile acpid-1.0.8/Makefile
+--- acpid-1.0.8.orig/Makefile	2008-11-03 14:04:43.000000000 +0100
++++ acpid-1.0.8/Makefile	2009-03-29 17:10:14.000000000 +0200
+@@ -12,7 +12,8 @@
+ BIN_PROGS = acpi_listen
+ PROGS = $(SBIN_PROGS) $(BIN_PROGS)
+ 
+-acpid_SRCS = acpid.c event.c ud_socket.c
++acpid_SRCS = acpid.c acpi_ids.c connection_list.c event.c input_layer.c \
++    libnetlink.c netlink.c proc.c sock.c ud_socket.c
+ acpid_OBJS = $(acpid_SRCS:.c=.o)
+ 
+ acpi_listen_SRCS = acpi_listen.c ud_socket.c
+diff -ruN acpid-1.0.8.orig/netlink.c acpid-1.0.8/netlink.c
+--- acpid-1.0.8.orig/netlink.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/netlink.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,239 @@
++/*
++ *  netlink.c - Kernel ACPI Event Netlink Interface
++ *
++ *  Handles the details of getting kernel ACPI events from netlink.
++ *
++ *  Inspired by (and in some cases blatantly lifted from) Zhang Rui's
++ *  acpi_genl and Alexey Kuznetsov's libnetlink.  Thanks also to Yi Yang
++ *  at intel.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++/* system */
++#include <unistd.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++
++/* local */
++#include "acpid.h"
++#include "event.h"
++
++#include "libnetlink.h"
++#include "genetlink.h"
++#include "acpi_genetlink.h"
++
++#include "acpi_ids.h"
++#include "connection_list.h"
++
++static void
++format_netlink(struct nlmsghdr *msg)
++{
++	struct rtattr *tb[ACPI_GENL_ATTR_MAX + 1];
++	struct genlmsghdr *ghdr = NLMSG_DATA(msg);
++	int len;
++	struct rtattr *attrs;
++	
++	len = msg->nlmsg_len;
++	
++	/* if this message doesn't have the proper family ID, drop it */
++	if (msg->nlmsg_type != acpi_ids_getfamily()) {
++		if (logevents) {
++			acpid_log(LOG_INFO, "wrong netlink family ID.\n");
++		}
++		return;
++	}
++
++	len -= NLMSG_LENGTH(GENL_HDRLEN);
++
++	if (len < 0) {
++		acpid_log(LOG_WARNING,
++			"wrong netlink controller message len: %d\n", len);
++		return;
++	}
++
++	attrs = (struct rtattr *)((char *)ghdr + GENL_HDRLEN);
++	/* parse the attributes in this message */
++	parse_rtattr(tb, ACPI_GENL_ATTR_MAX, attrs, len);
++
++	/* if there's an ACPI event attribute... */
++	if (tb[ACPI_GENL_ATTR_EVENT]) {
++		/* get the actual event struct */
++		struct acpi_genl_event *event =
++				RTA_DATA(tb[ACPI_GENL_ATTR_EVENT]);
++		char buf[64];
++
++		/* format it */
++		snprintf(buf, sizeof(buf), "%s %s %08x %08x",
++			event->device_class, event->bus_id, event->type, event->data);
++
++		/* if we're locked, don't process the event */
++		if (locked()) {
++			if (logevents) {
++				acpid_log(LOG_INFO,
++					"lockfile present, not processing "
++					"netlink event \"%s\"\n", buf);
++			}
++			return;
++		}
++
++		if (logevents)
++			acpid_log(LOG_INFO,
++				"received netlink event \"%s\"\n", buf);
++
++		/* send the event off to the handler */
++		acpid_handle_event(buf);
++
++		if (logevents)
++			acpid_log(LOG_INFO,
++				"completed netlink event \"%s\"\n", buf);
++	}
++}
++
++/* (based on rtnl_listen() in libnetlink.c) */
++void
++process_netlink(int fd)
++{
++	int status;
++	struct nlmsghdr *h;
++	/* the address for recvmsg() */
++	struct sockaddr_nl nladdr;
++	/* the io vector for recvmsg() */
++	struct iovec iov;
++	/* recvmsg() parameters */
++	struct msghdr msg = {
++		.msg_name = &nladdr,
++		.msg_namelen = sizeof(nladdr),
++		.msg_iov = &iov,
++		.msg_iovlen = 1,
++	};
++	/* buffer for the incoming data */
++	char buf[8192];
++	static int nerrs;
++
++	/* set up the netlink address */
++	memset(&nladdr, 0, sizeof(nladdr));
++	nladdr.nl_family = AF_NETLINK;
++	nladdr.nl_pid = 0;
++	nladdr.nl_groups = 0;
++
++	/* set up the I/O vector */
++	iov.iov_base = buf;
++	iov.iov_len = sizeof(buf);
++	
++	/* read the data into the buffer */
++	status = recvmsg(fd, &msg, 0);
++
++	/* if there was a problem, print a message and keep trying */
++	if (status < 0) {
++		/* if we were interrupted by a signal, bail */
++		if (errno == EINTR)
++			return;
++		
++		acpid_log(LOG_ERR, "netlink read error: %s (%d)\n",
++			strerror(errno), errno);
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading via "
++				"netlink - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++		return;
++	}
++	/* if an orderly shutdown has occurred, we're done */
++	if (status == 0) {
++		acpid_log(LOG_WARNING, "netlink connection closed\n");
++		exit(EXIT_FAILURE);
++	}
++	/* check to see if the address length has changed */
++	if (msg.msg_namelen != sizeof(nladdr)) {
++		acpid_log(LOG_WARNING, "netlink unexpected length: "
++			"%d   expected: %d\n", msg.msg_namelen, sizeof(nladdr));
++		return;
++	}
++	
++	/* for each message received */
++	for (h = (struct nlmsghdr*)buf; (unsigned)status >= sizeof(*h); ) {
++		int len = h->nlmsg_len;
++		int l = len - sizeof(*h);
++
++		if (l < 0  ||  len > status) {
++			if (msg.msg_flags & MSG_TRUNC) {
++				acpid_log(LOG_WARNING, "netlink msg truncated (1)\n");
++				return;
++			}
++			acpid_log(LOG_WARNING,
++				"malformed netlink msg, length %d\n", len);
++			return;
++		}
++
++		/* format the message */
++		format_netlink(h);
++
++		status -= NLMSG_ALIGN(len);
++		h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
++	}
++	if (msg.msg_flags & MSG_TRUNC) {
++		acpid_log(LOG_WARNING, "netlink msg truncated (2)\n");
++		return;
++	}
++	if (status) {
++		acpid_log(LOG_WARNING, "netlink remnant of size %d\n", status);
++		return;
++	}
++
++	return;
++}
++
++/* convert the netlink multicast group number into a bit map */
++/* (e.g. 4 => 16, 5 => 32) */
++static __u32
++nl_mgrp(__u32 group)
++{
++	if (group > 31) {
++		fprintf(stderr, "%s: unexpected group number %d\n",
++			progname, group);
++		return 0;
++	}
++	return group ? (1 << (group - 1)) : 0;
++}
++
++void open_netlink(void)
++{
++	struct rtnl_handle rth;
++	struct connection c;
++
++	/* open the appropriate netlink socket for input */
++	if (rtnl_open_byproto(
++		&rth, nl_mgrp(acpi_ids_getgroup()), NETLINK_GENERIC) < 0) {
++		fprintf(stderr, "%s: cannot open generic netlink socket\n",
++			progname);
++		return;
++	}
++
++	if (acpid_debug)
++		fprintf(stderr, "%s: netlink opened successfully\n", progname);
++
++	/* add a connection to the list */
++	c.fd = rth.fd;
++	c.process = process_netlink;
++	add_connection(&c);
++}
+diff -ruN acpid-1.0.8.orig/netlink.h acpid-1.0.8/netlink.h
+--- acpid-1.0.8.orig/netlink.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/netlink.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,31 @@
++/*
++ *  netlink.h - Kernel ACPI Event Netlink Interface
++ *
++ *  Handles the details of getting kernel ACPI events from netlink.
++ *
++ *  Copyright (C) 2008, Ted Felix (www.tedfelix.com)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  (tabs at 4)
++ */
++
++#ifndef NETLINK_H__
++#define NETLINK_H__
++
++/* open the netlink connection */
++extern void open_netlink(void);
++
++#endif /* NETLINK_H__ */
+diff -ruN acpid-1.0.8.orig/proc.c acpid-1.0.8/proc.c
+--- acpid-1.0.8.orig/proc.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/proc.c	2009-03-29 17:18:26.000000000 +0200
+@@ -0,0 +1,207 @@
++/*
++ *  proc.c - ACPI daemon proc filesystem interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++
++#include "acpid.h"
++#include "event.h"
++#include "connection_list.h"
++
++const char *eventfile = ACPID_EVENTFILE;
++
++static char *read_line(int fd);
++
++static void
++process_proc(int fd)
++{
++	char *event;
++
++	/* read an event */
++	event = read_line(fd);
++
++	/* if we're locked, don't process the event */
++	if (locked()) {
++		if (logevents  &&  event != NULL) {
++			acpid_log(LOG_INFO,
++				"lockfile present, not processing "
++				"event \"%s\"\n", event);
++		}
++		return;
++	}
++
++	/* handle the event */
++	if (event) {
++		if (logevents) {
++			acpid_log(LOG_INFO,
++			          "procfs received event \"%s\"\n", event);
++		}
++		acpid_handle_event(event);
++		if (logevents) {
++			acpid_log(LOG_INFO,
++				"procfs completed event \"%s\"\n", event);
++		}
++	} else if (errno == EPIPE) {
++		acpid_log(LOG_WARNING,
++			"events file connection closed\n");
++		exit(EXIT_FAILURE);
++	} else {
++		static int nerrs;
++		if (++nerrs >= ACPID_MAX_ERRS) {
++			acpid_log(LOG_ERR,
++				"too many errors reading "
++				"events file - aborting\n");
++			exit(EXIT_FAILURE);
++		}
++	}
++}
++
++int
++open_proc()
++{
++	int fd;
++	struct connection c;
++	
++	fd = open(eventfile, O_RDONLY);
++	if (fd < 0) {
++	    if (acpid_debug)
++		fprintf(stderr, "%s: can't open %s: %s\n", progname, 
++			eventfile, strerror(errno));
++		return -1;
++	}
++	fcntl(fd, F_SETFD, FD_CLOEXEC);
++
++	if (acpid_debug)
++		fprintf(stderr, "%s: proc fs opened successfully\n", progname);
++
++	/* add a connection to the list */
++	c.fd = fd;
++	c.process = process_proc;
++	add_connection(&c);
++
++	return 0;
++}
++
++/*
++ * This depends on fixes in linux ACPI after 2.4.8
++ */
++#define BUFLEN 1024
++static char *
++read_line(int fd)
++{
++	static char buf[BUFLEN];
++	int i = 0;
++	int r;
++	int searching = 1;
++
++	while (searching) {
++		memset(buf+i, 0, BUFLEN-i);
++
++		/* only go to BUFLEN-1 so there will always be a 0 at the end */
++		while (i < BUFLEN-1) {
++			r = read(fd, buf+i, 1);
++			if (r < 0 && errno != EINTR) {
++				/* we should do something with the data */
++				acpid_log(LOG_ERR, "read(): %s\n",
++					strerror(errno));
++				return NULL;
++			} else if (r == 0) {
++				/* signal this in an almost standard way */
++				errno = EPIPE;
++				return NULL;
++			} else if (r == 1) {
++				/* scan for a newline */
++				if (buf[i] == '\n') {
++					searching = 0;
++					buf[i] = '\0';
++					break;
++				}
++				i++;
++			}
++		}
++		if (i >= BUFLEN - 1)
++			break;
++	}
++
++	return buf;
++}
++
++#if 0
++/* This version leaks memory.  The above version is simpler and leak-free. */
++/* Downside is that the above version always uses 1k of RAM. */
++/*
++ * This depends on fixes in linux ACPI after 2.4.8
++ */
++#define MAX_BUFLEN	1024
++static char *
++read_line(int fd)
++{
++	static char *buf;
++	int buflen = 64;
++	int i = 0;
++	int r;
++	int searching = 1;
++
++	while (searching) {
++		/* ??? This memory is leaked since it is never freed */
++		buf = realloc(buf, buflen);
++		if (!buf) {
++			acpid_log(LOG_ERR, "malloc(%d): %s\n",
++				buflen, strerror(errno));
++			return NULL;
++		}
++		memset(buf+i, 0, buflen-i);
++
++		while (i < buflen) {
++			r = read(fd, buf+i, 1);
++			if (r < 0 && errno != EINTR) {
++				/* we should do something with the data */
++				acpid_log(LOG_ERR, "read(): %s\n",
++					strerror(errno));
++				return NULL;
++			} else if (r == 0) {
++				/* signal this in an almost standard way */
++				errno = EPIPE;
++				return NULL;
++			} else if (r == 1) {
++				/* scan for a newline */
++				if (buf[i] == '\n') {
++					searching = 0;
++					buf[i] = '\0';
++					break;
++				}
++				i++;
++			}
++		}
++		if (buflen >= MAX_BUFLEN) {
++			break;
++		} 
++		buflen *= 2;
++	}
++
++	return buf;
++}
++#endif
+diff -ruN acpid-1.0.8.orig/proc.h acpid-1.0.8/proc.h
+--- acpid-1.0.8.orig/proc.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/proc.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,30 @@
++/*
++ *  proc.h - ACPI daemon proc filesystem interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef PROC_H__
++#define PROC_H__
++
++extern const char *eventfile;
++
++extern int open_proc();
++
++#endif /* PROC_H__ */
+diff -ruN acpid-1.0.8.orig/sock.c acpid-1.0.8/sock.c
+--- acpid-1.0.8.orig/sock.c	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/sock.c	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,98 @@
++/*
++ *  sock.c - ACPI daemon socket interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <grp.h>
++
++#include "acpid.h"
++#include "event.h"
++#include "ud_socket.h"
++#include "connection_list.h"
++
++const char *socketfile = ACPID_SOCKETFILE;
++const char *socketgroup;
++mode_t socketmode = ACPID_SOCKETMODE;
++
++static void
++process_sock(int fd)
++{
++	int cli_fd;
++	struct ucred creds;
++	char buf[32];
++
++	/* accept and add to our lists */
++	cli_fd = ud_accept(fd, &creds);
++	if (cli_fd < 0) {
++		acpid_log(LOG_ERR, "can't accept client: %s\n",
++			  strerror(errno));
++		return;
++	}
++	fcntl(cli_fd, F_SETFD, FD_CLOEXEC);
++	snprintf(buf, sizeof(buf)-1, "%d[%d:%d]",
++		 creds.pid, creds.uid, creds.gid);
++	acpid_add_client(cli_fd, buf);
++}
++
++void
++open_sock()
++{
++	int fd;
++	struct connection c;
++
++	fd = ud_create_socket(socketfile);
++	if (fd < 0) {
++		fprintf(stderr, "%s: can't open socket %s: %s\n",
++			progname, socketfile, strerror(errno));
++		exit(EXIT_FAILURE);
++	}
++	fcntl(fd, F_SETFD, FD_CLOEXEC);
++	chmod(socketfile, socketmode);
++	if (socketgroup) {
++		struct group *gr;
++		struct stat buf;
++		gr = getgrnam(socketgroup);
++		if (!gr) {
++			fprintf(stderr, "%s: group %s does not exist\n",
++				progname, socketgroup);
++			exit(EXIT_FAILURE);
++		}
++		if (stat(socketfile, &buf) < 0) {
++			fprintf(stderr, "%s: can't stat %s\n",
++				progname, socketfile);
++			exit(EXIT_FAILURE);
++		}
++		if (chown(socketfile, buf.st_uid, gr->gr_gid) < 0) {
++			fprintf(stderr, "%s: chown(): %s\n",
++				progname, strerror(errno));
++			exit(EXIT_FAILURE);
++		}
++	}
++	
++	/* add a connection to the list */
++	c.fd = fd;
++	c.process = process_sock;
++	add_connection(&c);
++}
+diff -ruN acpid-1.0.8.orig/sock.h acpid-1.0.8/sock.h
+--- acpid-1.0.8.orig/sock.h	1970-01-01 01:00:00.000000000 +0100
++++ acpid-1.0.8/sock.h	2009-03-29 17:10:14.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ *  sock.h - ACPI daemon socket interface
++ *
++ *  Portions Copyright (C) 2000 Andrew Henroid
++ *  Portions Copyright (C) 2001 Sun Microsystems
++ *  Portions Copyright (C) 2004 Tim Hockin (thockin@hockin.org)
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#ifndef SOCK_H__
++#define SOCK_H__
++
++extern const char *socketfile;
++extern const char *socketgroup;
++extern mode_t socketmode;
++
++extern void open_sock();
++
++#endif /* SOCK_H__ */
diff --git a/recipes/acpid/acpid_1.0.8.bb b/recipes/acpid/acpid_1.0.8.bb
new file mode 100644
index 0000000..98638e6
--- /dev/null
+++ b/recipes/acpid/acpid_1.0.8.bb
@@ -0,0 +1,6 @@
+require acpid.inc
+
+SRC_URI_append = " file://event.c.diff;patch=1 \
+                   file://fixfd.diff;patch=1 \
+                   file://netlink.diff;patch=1"
+
-- 
1.6.3.1.54.g99dd




^ permalink raw reply related	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2009-05-21  2:47 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-09  0:50 [RFC] Ready to commit patches from O.S. Systems Otavio Salvador
2009-05-09  0:50 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
2009-05-09  0:50   ` [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling Otavio Salvador
2009-05-09  0:50     ` [PATCH 03/23] acpid: add 1.0.8 (with netlink support) Otavio Salvador
2009-05-09  0:50       ` [PATCH 04/23] hal-info: add 20080414 Otavio Salvador
2009-05-09  0:50         ` [PATCH 05/23] python-pycups: add Otavio Salvador
2009-05-09  0:50           ` [PATCH 06/23] checksums.ini: add flash-plugin Otavio Salvador
2009-05-09  0:50             ` [PATCH 07/23] checksums.ini: add sun-jdk Otavio Salvador
2009-05-09  0:50               ` [PATCH 08/23] checksums.ini: firefox-l10n-pt-br Otavio Salvador
2009-05-09  0:50                 ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Otavio Salvador
2009-05-09  0:50                   ` [PATCH 10/23] hal-cups-utils: add Otavio Salvador
2009-05-09  0:50                     ` [PATCH 11/23] cups: split backends and models Otavio Salvador
2009-05-09  0:50                       ` [PATCH 12/23] conf/licenses.conf: add CUPS license Otavio Salvador
2009-05-09  0:50                         ` [PATCH 13/23] fixes wrong license value usage for GPLv2 Otavio Salvador
2009-05-09  0:50                           ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Otavio Salvador
2009-05-09  0:50                             ` [PATCH 15/23] rt61-firmware: fix installation of binary files Otavio Salvador
2009-05-09  0:50                               ` [PATCH 16/23] s/IPKG_INSTALL/PACKAGE_INSTALL/ Otavio Salvador
2009-05-09  0:50                                 ` [PATCH 17/23] Documentation for PACKAGE_ARCH is actually for PACKAGE_ARCHS Otavio Salvador
2009-05-09  0:50                                   ` [PATCH 18/23] Fixed indentation for Python code Otavio Salvador
2009-05-09  0:50                                     ` [PATCH 19/23] initramfs-uniboot: properly setup sysfs and tmp Otavio Salvador
2009-05-09  0:50                                       ` [PATCH 20/23] cups: undo mangle of cups_{datadir, serverbin} in cups-config Otavio Salvador
2009-05-09  0:50                                         ` [PATCH 21/23] libgnomeprintui: drop gnome-common dependency since it is added by gnome class Otavio Salvador
2009-05-09  0:50                                           ` [PATCH 22/23] ppp: add peers dir Otavio Salvador
2009-05-09  0:50                                             ` [PATCH 23/23] gnumeric: update to 1.8.4 Otavio Salvador
2009-05-09  7:58                             ` [PATCH 14/23] mtools: update to 4.0.10 since 3.9.11 was not available anymore Koen Kooi
2009-05-09 16:16                       ` [PATCH 11/23] cups: split backends and models Cliff Brake
2009-05-09 17:12                         ` Otavio Salvador
2009-05-09  7:56                   ` [PATCH 09/23] system-config-printer: add to provide python-cupshelpers to hal-cups-utils Koen Kooi
2009-05-09 17:14                     ` Otavio Salvador
2009-05-09 17:18                       ` Koen Kooi
2009-05-09  8:00 ` [RFC] Ready to commit patches from O.S. Systems Koen Kooi
2009-05-09 16:24 ` Cliff Brake
2009-05-21  2:39 Final sent before pushing, please ack Otavio Salvador
2009-05-21  2:39 ` [PATCH 01/23] gtk-engines: add 2.18.1 Otavio Salvador
2009-05-21  2:39   ` [PATCH 02/23] machine/geode[gl]x: use more optimization while compiling Otavio Salvador
2009-05-21  2:39     ` [PATCH 03/23] acpid: add 1.0.8 (with netlink support) Otavio Salvador

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.