| From a3dac1c3cee169e52c7d644dd565235a1cd833e3 Mon Sep 17 00:00:00 2001 |
| From: Brendan Heading <brendanheading@gmail.com> |
| Date: Wed, 22 Jul 2015 23:10:11 +0100 |
| Subject: [PATCH] support for non-glibc libcs |
| |
| Added a TEMP_FAILURE_RETRY macro. This is a glibcism provided by |
| glibc and uclibc, but missing from musl (& possibly other libcs). |
| |
| Upstream-status: submitted (see https://sourceforge.net/p/acpid2/tickets/7/) |
| --- |
| acpi_listen.c | 2 ++ |
| acpid.c | 1 + |
| event.c | 2 ++ |
| input_layer.c | 1 + |
| kacpimon/libnetlink.h | 2 ++ |
| libc_compat.h | 40 ++++++++++++++++++++++++++++++++++++++++ |
| libnetlink.c | 2 ++ |
| netlink.c | 1 + |
| proc.c | 1 + |
| ud_socket.c | 1 + |
| 10 files changed, 53 insertions(+) |
| create mode 100644 libc_compat.h |
| |
| diff --git a/acpi_listen.c b/acpi_listen.c |
| index d0bc175..839e4f9 100644 |
| --- a/acpi_listen.c |
| +++ b/acpi_listen.c |
| @@ -39,6 +39,8 @@ |
| #include "acpid.h" |
| #include "ud_socket.h" |
| |
| +#include "libc_compat.h" |
| + |
| static int handle_cmdline(int *argc, char ***argv); |
| static char *read_line(int fd); |
| |
| diff --git a/acpid.c b/acpid.c |
| index 23f1e58..8555c82 100644 |
| --- a/acpid.c |
| +++ b/acpid.c |
| @@ -41,6 +41,7 @@ |
| #include "input_layer.h" |
| #include "inotify_handler.h" |
| #include "netlink.h" |
| +#include "libc_compat.h" |
| |
| static int handle_cmdline(int *argc, char ***argv); |
| static void close_fds(void); |
| diff --git a/event.c b/event.c |
| index 324078f..3b069a2 100644 |
| --- a/event.c |
| +++ b/event.c |
| @@ -39,6 +39,8 @@ |
| #include "log.h" |
| #include "sock.h" |
| #include "ud_socket.h" |
| +#include "libc_compat.h" |
| + |
| #include "event.h" |
| /* |
| * What is a rule? It's polymorphic, pretty much. |
| diff --git a/input_layer.c b/input_layer.c |
| index 9aa19c6..cbf8085 100644 |
| --- a/input_layer.c |
| +++ b/input_layer.c |
| @@ -42,6 +42,7 @@ |
| #include "log.h" |
| #include "connection_list.h" |
| #include "event.h" |
| +#include "libc_compat.h" |
| |
| #include "input_layer.h" |
| |
| diff --git a/kacpimon/libnetlink.h b/kacpimon/libnetlink.h |
| index 6185cbc..0c61896 100644 |
| --- a/kacpimon/libnetlink.h |
| +++ b/kacpimon/libnetlink.h |
| @@ -7,6 +7,8 @@ |
| #include <linux/netlink.h> |
| #include <linux/rtnetlink.h> |
| |
| +#include "libc_compat.h" |
| + |
| struct rtnl_handle |
| { |
| int fd; |
| diff --git a/libc_compat.h b/libc_compat.h |
| new file mode 100644 |
| index 0000000..39f2336 |
| --- /dev/null |
| +++ b/libc_compat.h |
| @@ -0,0 +1,40 @@ |
| +/* |
| + * libc_compat.h - implement defs/macros missing from some libcs |
| + * |
| + * 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 LIBC_COMPAT_H__ |
| +#define LIBC_COMPAT_H__ |
| + |
| +/* Evaluate EXPRESSION, and repeat as long as it returns -1 with `errno' |
| + set to EINTR. This macro is present on glibc/uclibc but may not be in other cases. */ |
| + |
| +#ifndef ____GLIBC__ |
| +#ifndef TEMP_FAILURE_RETRY |
| +#define TEMP_FAILURE_RETRY(expression) \ |
| + (__extension__ \ |
| + ({ long int __result; \ |
| + do __result = (long int) (expression); \ |
| + while (__result == -1L && errno == EINTR); \ |
| + __result; })) |
| +#endif |
| +#endif /* __GLIBC__ */ |
| + |
| +#endif /* LIBC_COMPAT_H__ */ |
| diff --git a/libnetlink.c b/libnetlink.c |
| index e61d417..cc7aedc 100644 |
| --- a/libnetlink.c |
| +++ b/libnetlink.c |
| @@ -24,6 +24,8 @@ |
| #include <time.h> |
| #include <sys/uio.h> |
| |
| +#include "libc_compat.h" |
| + |
| #include "libnetlink.h" |
| |
| void rtnl_close(struct rtnl_handle *rth) |
| diff --git a/netlink.c b/netlink.c |
| index c64e878..27e3536 100644 |
| --- a/netlink.c |
| +++ b/netlink.c |
| @@ -41,6 +41,7 @@ |
| #include "libnetlink.h" |
| #include "genetlink.h" |
| #include "acpi_genetlink.h" |
| +#include "libc_compat.h" |
| |
| #include "acpi_ids.h" |
| #include "connection_list.h" |
| diff --git a/proc.c b/proc.c |
| index 5bb8fa2..f96b913 100644 |
| --- a/proc.c |
| +++ b/proc.c |
| @@ -31,6 +31,7 @@ |
| #include "log.h" |
| #include "event.h" |
| #include "connection_list.h" |
| +#include "libc_compat.h" |
| |
| #include "proc.h" |
| |
| diff --git a/ud_socket.c b/ud_socket.c |
| index 2790686..1790917 100644 |
| --- a/ud_socket.c |
| +++ b/ud_socket.c |
| @@ -21,6 +21,7 @@ |
| #include "acpid.h" |
| #include "log.h" |
| #include "ud_socket.h" |
| +#include "libc_compat.h" |
| |
| int |
| ud_create_socket(const char *name, mode_t socketmode) |
| -- |
| 2.4.3 |
| |