summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormicrocai <microcaicai@gmail.com>2011-05-21 15:21:56 +0200
committerHenry Gebhardt <hsggebhardt@googlemail.com>2011-05-21 15:23:46 +0200
commit859553ad771c8aef9d29128159b1a7aa91e8068d (patch)
treea4b4885dd758572b445d339d4a49bdddf4ff18bf
parentnet-dns/dnsmasq-2.57: Copy from main tree (diff)
downloadsystemd-859553ad771c8aef9d29128159b1a7aa91e8068d.tar.gz
systemd-859553ad771c8aef9d29128159b1a7aa91e8068d.tar.bz2
systemd-859553ad771c8aef9d29128159b1a7aa91e8068d.zip
net-dns/dnsmasq-2.57: Enable socket activation with systemd
-rw-r--r--net-dns/dnsmasq/Manifest5
-rw-r--r--net-dns/dnsmasq/dnsmasq-2.57.ebuild8
-rw-r--r--net-dns/dnsmasq/files/dnsmasq-2.57-systemd.patch838
-rw-r--r--net-dns/dnsmasq/files/dnsmasq.service17
-rw-r--r--net-dns/dnsmasq/files/dnsmasq.socket21
5 files changed, 886 insertions, 3 deletions
diff --git a/net-dns/dnsmasq/Manifest b/net-dns/dnsmasq/Manifest
index eca4244..6333b4a 100644
--- a/net-dns/dnsmasq/Manifest
+++ b/net-dns/dnsmasq/Manifest
@@ -1,6 +1,9 @@
AUX dnsmasq-2.47-fbsd-config.patch 505 RMD160 a19a17e94d924a21f79d50420faa4c2ed3ec40d0 SHA1 723580b460c93e2f7829627dee15bb758730b848 SHA256 4e05e46b59254e718550cda505986b9b572a0716636fb6a5405a54df25cfa84a
+AUX dnsmasq-2.57-systemd.patch 26460 RMD160 44ac8963dc13ff8759993204200310d6a9fd92bc SHA1 acd3ade339c134802e5774c8b84a89ec13c89252 SHA256 2fe4e37f883415953612bbf69b8956691beb61096c4bec28def3ae608dae2c08
AUX dnsmasq-init 935 RMD160 8f6278946311abdc4c7ae8034ca8571cb24bb53b SHA1 7c34f475dc3c6afdc14fffdaf24f866e056c334f SHA256 30da83047c1a30e008e38bc398b3ac2a50d78f23d559b5c8ff7a22145786e05b
AUX dnsmasq.confd 140 RMD160 33f6370377b38bf33acab72d8de86cba5e197d79 SHA1 83461d2964dc3f0db777fc26141b07f6f3f5a762 SHA256 8bbc2634ab537ed3a17ee98be9c2667013a2b048f6981138017414e54fe90746
+AUX dnsmasq.service 421 RMD160 caf898e6253aa04dc4c43ed2f8f9567dd7978ca1 SHA1 a02ee875f018aa5f2aa7369f09adfd32f841becd SHA256 0f1b58146e1e21dfe5f2a07f0bd8d2bba97c2b74ac62c2074384ce1492488fe1
+AUX dnsmasq.socket 364 RMD160 2e6ad85a4834a6a283dd9a4741b7c9c1b7b3c2fd SHA1 4ecacd3af1284c84149230362a041ab8a7e11cc6 SHA256 86716eedafb1b49f2e9caa501490318d81c4b6ae0c3ff4f12a0cf8b4039ddb4f
DIST dnsmasq-2.57.tar.lzma 333348 RMD160 e78d2f87804e88b2021da3c593191338d0deaed4 SHA1 cbf0c22a7b856746b23f2d894070c60d32c4a97e SHA256 b35c5a31afce2b7c4bd62566d5dc87e1ce62d0d2ebd9c2baf15b5ea16bcc279d
-EBUILD dnsmasq-2.57.ebuild 1734 RMD160 d630852d5e5ce0cb89157e17967579bd37010aa8 SHA1 0bea49192943f503e6b2d743ebe51a93a88c63b3 SHA256 907bb383ce75a9f10c6b7ad91012874be6980af97c397ef54db34e24876e7ea6
+EBUILD dnsmasq-2.57.ebuild 1884 RMD160 2fe6e1c66c50fe83e15ba869246cbd6ea30366d2 SHA1 c384ffe25f8484e38034e2d7d03d24677fca8e2b SHA256 ae9c40d4f658efed96bc3ee157b87c98a63a64b82f8cce10c3a8bacddba820eb
MISC metadata.xml 409 RMD160 059cae7fc03f12c391df3954a25b50b98f8fd616 SHA1 3b262afb2f3281150f03de7e7ee5019d1ddf3a32 SHA256 b8cb70c6cedee588056993ffa8a720fcb3248dc8d10bf6397910cf8fed07b4e2
diff --git a/net-dns/dnsmasq/dnsmasq-2.57.ebuild b/net-dns/dnsmasq/dnsmasq-2.57.ebuild
index 30af17f..4ee26d5 100644
--- a/net-dns/dnsmasq/dnsmasq-2.57.ebuild
+++ b/net-dns/dnsmasq/dnsmasq-2.57.ebuild
@@ -4,7 +4,7 @@
EAPI=2
-inherit eutils toolchain-funcs flag-o-matic
+inherit eutils toolchain-funcs flag-o-matic systemd
MY_P="${P/_/}"
MY_PV="${PV/_/}"
@@ -14,7 +14,7 @@ SRC_URI="http://www.thekelleys.org.uk/dnsmasq/${MY_P}.tar.lzma"
LICENSE="GPL-2"
SLOT="0"
-KEYWORDS="alpha amd64 arm hppa ia64 ~mips ~ppc ~ppc64 s390 sh sparc x86 ~sparc-fbsd ~x86-fbsd"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~sparc-fbsd ~x86-fbsd"
IUSE="dbus +dhcp idn ipv6 nls tftp"
RDEPEND="dbus? ( sys-apps/dbus )
@@ -33,6 +33,7 @@ S="${WORKDIR}/${PN}-${MY_PV}"
src_prepare() {
# dnsmasq on FreeBSD wants the config file in a silly location, this fixes
epatch "${FILESDIR}/${PN}-2.47-fbsd-config.patch"
+ epatch "${FILESDIR}/${P}-systemd.patch"
}
src_configure() {
@@ -72,4 +73,7 @@ src_install() {
insinto /etc/dbus-1/system.d
doins dbus/dnsmasq.conf
fi
+
+ systemd_dounit "${FILESDIR}/dnsmasq.service"
+ systemd_dounit "${FILESDIR}/dnsmasq.socket"
}
diff --git a/net-dns/dnsmasq/files/dnsmasq-2.57-systemd.patch b/net-dns/dnsmasq/files/dnsmasq-2.57-systemd.patch
new file mode 100644
index 0000000..e12330e
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq-2.57-systemd.patch
@@ -0,0 +1,838 @@
+From d3e08d94f1ede6c3a0bab2e48b3291426c999d36 Mon Sep 17 00:00:00 2001
+From: microcai <microcai@fedoraproject.org>
+Date: Thu, 19 May 2011 01:04:16 +0800
+Subject: [PATCH] systemd socket patch
+
+---
+ Makefile | 2 +-
+ src/dhcp.c | 10 ++
+ src/dnsmasq.c | 10 +-
+ src/dnsmasq.h | 2 +
+ src/network.c | 16 ++
+ src/sd-daemon.c | 439 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/sd-daemon.h | 265 +++++++++++++++++++++++++++++++++
+ 7 files changed, 738 insertions(+), 6 deletions(-)
+ create mode 100644 src/sd-daemon.c
+ create mode 100644 src/sd-daemon.h
+
+diff --git a/Makefile b/Makefile
+index 16c69e4..4cf9181 100644
+--- a/Makefile
++++ b/Makefile
+@@ -40,7 +40,7 @@ SUNOS_LIBS= `if uname | grep SunOS 2>&1 >/dev/null; then echo -lsocket -lnsl -lp
+
+ OBJS = cache.o rfc1035.o util.o option.o forward.o network.o \
+ dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
+- helper.o tftp.o log.o
++ helper.o tftp.o log.o sd-daemon.o
+
+ all :
+ @cd $(SRC) && $(MAKE) \
+diff --git a/src/dhcp.c b/src/dhcp.c
+index 29ddf24..df5edd1 100644
+--- a/src/dhcp.c
++++ b/src/dhcp.c
+@@ -29,6 +29,16 @@ static int complete_context(struct in_addr local, int if_index,
+
+ static int make_fd(int port)
+ {
++ int fd_base, listen_fds = sd_listen_fds(0);
++ // first check if systemd already did that for us
++ for( fd_base = 0 ; fd_base < listen_fds ; fd_base ++)
++ {
++ if (sd_is_socket_inet(fd_base + SD_LISTEN_FDS_START, PF_INET, SOCK_DGRAM,0, port))
++ {
++ return fd_base + SD_LISTEN_FDS_START;
++ }
++ }
++
+ int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ struct sockaddr_in saddr;
+ int oneopt = 1;
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 827b0dc..cd38cfe 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -126,11 +126,11 @@ int main (int argc, char **argv)
+ }
+ #endif
+
+- /* Close any file descriptors we inherited apart from std{in|out|err} */
+- for (i = 0; i < max_fd; i++)
+- if (i != STDOUT_FILENO && i != STDERR_FILENO && i != STDIN_FILENO)
+- close(i);
+-
++ if( sd_listen_fds(0) < 0){
++ /* Close any file descriptors we inherited apart from std{in|out|err} */
++ for (i = 3 ; i < max_fd; i++)
++ close(i);
++ }
+ #ifdef HAVE_LINUX_NETWORK
+ netlink_init();
+ #elif !(defined(IP_RECVDSTADDR) && \
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index a386a31..8d1b87f 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -122,6 +122,8 @@ extern int capget(cap_user_header_t header, cap_user_data_t data);
+ #include <priv.h>
+ #endif
+
++#include "sd-daemon.h"
++
+ /* daemon is function in the C library.... */
+ #define daemon dnsmasq_daemon
+
+diff --git a/src/network.c b/src/network.c
+index 7b2e905..0b84b2d 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -362,6 +362,21 @@ static int make_sock(union mysockaddr *addr, int type)
+ #ifdef HAVE_IPV6
+ static int dad_count = 0;
+ #endif
++ int fd_base, listen_fds = sd_listen_fds(0);
++ // first check if systemd already did that for us
++ for( fd_base = 0 ; fd_base < listen_fds ; fd_base ++)
++ {
++ int port = prettyprint_addr(addr, daemon->namebuff);
++
++ if (sd_is_socket_inet(fd_base + SD_LISTEN_FDS_START, family, type, type==SOCK_STREAM? 1:0, port))
++ {
++ fd = fd_base + SD_LISTEN_FDS_START;
++
++ if (type != SOCK_STREAM)
++ goto setup;
++ return fd;
++ }
++ }
+
+ if ((fd = socket(family, type, 0)) == -1)
+ {
+@@ -412,6 +427,7 @@ static int make_sock(union mysockaddr *addr, int type)
+ if (rc == -1)
+ goto err;
+
++setup:
+ if (type == SOCK_STREAM)
+ {
+ if (listen(fd, 5) == -1)
+diff --git a/src/sd-daemon.c b/src/sd-daemon.c
+new file mode 100644
+index 0000000..47da2fd
+--- /dev/null
++++ b/src/sd-daemon.c
+@@ -0,0 +1,439 @@
++#ifndef _WIN32
++/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
++
++/***
++ Copyright 2010 Lennart Poettering
++
++ Permission is hereby granted, free of charge, to any person
++ obtaining a copy of this software and associated documentation files
++ (the "Software"), to deal in the Software without restriction,
++ including without limitation the rights to use, copy, modify, merge,
++ publish, distribute, sublicense, and/or sell copies of the Software,
++ and to permit persons to whom the Software is furnished to do so,
++ subject to the following conditions:
++
++ The above copyright notice and this permission notice shall be
++ included in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ SOFTWARE.
++***/
++
++#ifndef _GNU_SOURCE
++#define _GNU_SOURCE
++#endif
++
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++#include <sys/fcntl.h>
++#include <netinet/in.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <unistd.h>
++#include <string.h>
++#include <stdarg.h>
++#include <stdio.h>
++#include <stddef.h>
++
++#include "sd-daemon.h"
++
++int sd_listen_fds(int unset_environment) {
++
++#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
++ return 0;
++#else
++ int r, fd;
++ const char *e;
++ char *p = NULL;
++ unsigned long l;
++
++ if (!(e = getenv("LISTEN_PID"))) {
++ r = 0;
++ goto finish;
++ }
++
++ errno = 0;
++ l = strtoul(e, &p, 10);
++
++ if (errno != 0) {
++ r = -errno;
++ goto finish;
++ }
++
++ if (!p || *p || l <= 0) {
++ r = -EINVAL;
++ goto finish;
++ }
++
++ /* Is this for us? */
++ if (getpid() != (pid_t) l) {
++ r = 0;
++ goto finish;
++ }
++
++ if (!(e = getenv("LISTEN_FDS"))) {
++ r = 0;
++ goto finish;
++ }
++
++ errno = 0;
++ l = strtoul(e, &p, 10);
++
++ if (errno != 0) {
++ r = -errno;
++ goto finish;
++ }
++
++ if (!p || *p) {
++ r = -EINVAL;
++ goto finish;
++ }
++
++ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
++ int flags;
++
++ if ((flags = fcntl(fd, F_GETFD)) < 0) {
++ r = -errno;
++ goto finish;
++ }
++
++ if (flags & FD_CLOEXEC)
++ continue;
++
++ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
++ r = -errno;
++ goto finish;
++ }
++ }
++
++ r = (int) l;
++
++finish:
++ if (unset_environment) {
++ unsetenv("LISTEN_PID");
++ unsetenv("LISTEN_FDS");
++ }
++
++ return r;
++#endif
++}
++
++int sd_is_fifo(int fd, const char *path) {
++ struct stat st_fd;
++
++ if (fd < 0)
++ return -EINVAL;
++
++ memset(&st_fd, 0, sizeof(st_fd));
++ if (fstat(fd, &st_fd) < 0)
++ return -errno;
++
++ if (!S_ISFIFO(st_fd.st_mode))
++ return 0;
++
++ if (path) {
++ struct stat st_path;
++
++ memset(&st_path, 0, sizeof(st_path));
++ if (stat(path, &st_path) < 0) {
++
++ if (errno == ENOENT || errno == ENOTDIR)
++ return 0;
++
++ return -errno;
++ }
++
++ return
++ st_path.st_dev == st_fd.st_dev &&
++ st_path.st_ino == st_fd.st_ino;
++ }
++
++ return 1;
++}
++
++static int sd_is_socket_internal(int fd, int type, int listening) {
++ struct stat st_fd;
++
++ if (fd < 0 || type < 0)
++ return -EINVAL;
++
++ if (fstat(fd, &st_fd) < 0)
++ return -errno;
++
++ if (!S_ISSOCK(st_fd.st_mode))
++ return 0;
++
++ if (type != 0) {
++ int other_type = 0;
++ socklen_t l = sizeof(other_type);
++
++ if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
++ return -errno;
++
++ if (l != sizeof(other_type))
++ return -EINVAL;
++
++ if (other_type != type)
++ return 0;
++ }
++
++ if (listening >= 0) {
++ int accepting = 0;
++ socklen_t l = sizeof(accepting);
++
++ if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
++ return -errno;
++
++ if (l != sizeof(accepting))
++ return -EINVAL;
++
++ if (!accepting != !listening)
++ return 0;
++ }
++
++ return 1;
++}
++
++union sockaddr_union {
++ struct sockaddr sa;
++ struct sockaddr_in in4;
++ struct sockaddr_in6 in6;
++ struct sockaddr_un un;
++ struct sockaddr_storage storage;
++};
++
++int sd_is_socket(int fd, int family, int type, int listening) {
++ int r;
++
++ if (family < 0)
++ return -EINVAL;
++
++ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
++ return r;
++
++ if (family > 0) {
++ union sockaddr_union sockaddr;
++ socklen_t l;
++
++ memset(&sockaddr, 0, sizeof(sockaddr));
++ l = sizeof(sockaddr);
++
++ if (getsockname(fd, &sockaddr.sa, &l) < 0)
++ return -errno;
++
++ if (l < sizeof(sa_family_t))
++ return -EINVAL;
++
++ return sockaddr.sa.sa_family == family;
++ }
++
++ return 1;
++}
++
++int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
++ union sockaddr_union sockaddr;
++ socklen_t l;
++ int r;
++
++ if (family != 0 && family != AF_INET && family != AF_INET6)
++ return -EINVAL;
++
++ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
++ return r;
++
++ memset(&sockaddr, 0, sizeof(sockaddr));
++ l = sizeof(sockaddr);
++
++ if (getsockname(fd, &sockaddr.sa, &l) < 0)
++ return -errno;
++
++ if (l < sizeof(sa_family_t))
++ return -EINVAL;
++
++ if (sockaddr.sa.sa_family != AF_INET &&
++ sockaddr.sa.sa_family != AF_INET6)
++ return 0;
++
++ if (family > 0)
++ if (sockaddr.sa.sa_family != family)
++ return 0;
++
++ if (port > 0) {
++ if (sockaddr.sa.sa_family == AF_INET) {
++ if (l < sizeof(struct sockaddr_in))
++ return -EINVAL;
++
++ return htons(port) == sockaddr.in4.sin_port;
++ } else {
++ if (l < sizeof(struct sockaddr_in6))
++ return -EINVAL;
++
++ return htons(port) == sockaddr.in6.sin6_port;
++ }
++ }
++
++ return 1;
++}
++
++int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
++ union sockaddr_union sockaddr;
++ socklen_t l;
++ int r;
++
++ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
++ return r;
++
++ memset(&sockaddr, 0, sizeof(sockaddr));
++ l = sizeof(sockaddr);
++
++ if (getsockname(fd, &sockaddr.sa, &l) < 0)
++ return -errno;
++
++ if (l < sizeof(sa_family_t))
++ return -EINVAL;
++
++ if (sockaddr.sa.sa_family != AF_UNIX)
++ return 0;
++
++ if (path) {
++ if (length <= 0)
++ length = strlen(path);
++
++ if (length <= 0)
++ /* Unnamed socket */
++ return l == offsetof(struct sockaddr_un, sun_path);
++
++ if (path[0])
++ /* Normal path socket */
++ return
++ (l >= offsetof(struct sockaddr_un, sun_path) + length + 1) &&
++ memcmp(path, sockaddr.un.sun_path, length+1) == 0;
++ else
++ /* Abstract namespace socket */
++ return
++ (l == offsetof(struct sockaddr_un, sun_path) + length) &&
++ memcmp(path, sockaddr.un.sun_path, length) == 0;
++ }
++
++ return 1;
++}
++
++int sd_notify(int unset_environment, const char *state) {
++#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
++ return 0;
++#else
++ int fd = -1, r;
++ struct msghdr msghdr;
++ struct iovec iovec;
++ union sockaddr_union sockaddr;
++ const char *e;
++
++ if (!state) {
++ r = -EINVAL;
++ goto finish;
++ }
++
++ if (!(e = getenv("NOTIFY_SOCKET")))
++ return 0;
++
++ /* Must be an abstract socket, or an absolute path */
++ if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
++ r = -EINVAL;
++ goto finish;
++ }
++
++ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
++ r = -errno;
++ goto finish;
++ }
++
++ memset(&sockaddr, 0, sizeof(sockaddr));
++ sockaddr.sa.sa_family = AF_UNIX;
++ strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
++
++ if (sockaddr.un.sun_path[0] == '@')
++ sockaddr.un.sun_path[0] = 0;
++
++ memset(&iovec, 0, sizeof(iovec));
++ iovec.iov_base = (char*) state;
++ iovec.iov_len = strlen(state);
++
++ memset(&msghdr, 0, sizeof(msghdr));
++ msghdr.msg_name = &sockaddr;
++ msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e);
++
++ if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
++ msghdr.msg_namelen = sizeof(struct sockaddr_un);
++
++ msghdr.msg_iov = &iovec;
++ msghdr.msg_iovlen = 1;
++
++ if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
++ r = -errno;
++ goto finish;
++ }
++
++ r = 1;
++
++finish:
++ if (unset_environment)
++ unsetenv("NOTIFY_SOCKET");
++
++ if (fd >= 0)
++ close(fd);
++
++ return r;
++#endif
++}
++
++int sd_notifyf(int unset_environment, const char *format, ...) {
++#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
++ return 0;
++#else
++ va_list ap;
++ char *p = NULL;
++ int r;
++
++ va_start(ap, format);
++ r = vasprintf(&p, format, ap);
++ va_end(ap);
++
++ if (r < 0 || !p)
++ return -ENOMEM;
++
++ r = sd_notify(unset_environment, p);
++ free(p);
++
++ return r;
++#endif
++}
++
++int sd_booted(void) {
++#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
++ return 0;
++#else
++
++ struct stat a, b;
++
++ /* We simply test whether the systemd cgroup hierarchy is
++ * mounted */
++
++ if (lstat("/sys/fs/cgroup", &a) < 0)
++ return 0;
++
++ if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
++ return 0;
++
++ return a.st_dev != b.st_dev;
++#endif
++}
++
++#endif // _WIN32
+diff --git a/src/sd-daemon.h b/src/sd-daemon.h
+new file mode 100644
+index 0000000..4b853a1
+--- /dev/null
++++ b/src/sd-daemon.h
+@@ -0,0 +1,265 @@
++/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
++
++#ifndef foosddaemonhfoo
++#define foosddaemonhfoo
++
++/***
++ Copyright 2010 Lennart Poettering
++
++ Permission is hereby granted, free of charge, to any person
++ obtaining a copy of this software and associated documentation files
++ (the "Software"), to deal in the Software without restriction,
++ including without limitation the rights to use, copy, modify, merge,
++ publish, distribute, sublicense, and/or sell copies of the Software,
++ and to permit persons to whom the Software is furnished to do so,
++ subject to the following conditions:
++
++ The above copyright notice and this permission notice shall be
++ included in all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ SOFTWARE.
++***/
++
++#include <sys/types.h>
++#include <inttypes.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ Reference implementation of a few systemd related interfaces for
++ writing daemons. These interfaces are trivial to implement. To
++ simplify porting we provide this reference implementation.
++ Applications are welcome to reimplement the algorithms described
++ here if they do not want to include these two source files.
++
++ The following functionality is provided:
++
++ - Support for logging with log levels on stderr
++ - File descriptor passing for socket-based activation
++ - Daemon startup and status notification
++ - Detection of systemd boots
++
++ You may compile this with -DDISABLE_SYSTEMD to disable systemd
++ support. This makes all those calls NOPs that are directly related to
++ systemd (i.e. only sd_is_xxx() will stay useful).
++
++ Since this is drop-in code we don't want any of our symbols to be
++ exported in any case. Hence we declare hidden visibility for all of
++ them.
++
++ You may find an up-to-date version of these source files online:
++
++ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h
++ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
++
++ This should compile on non-Linux systems, too, but with the
++ exception of the sd_is_xxx() calls all functions will become NOPs.
++
++ See sd-daemon(7) for more information.
++*/
++
++#ifndef _sd_printf_attr_
++#if __GNUC__ >= 4
++#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
++#else
++#define _sd_printf_attr_(a,b)
++#endif
++#endif
++
++#ifndef _sd_hidden_
++#if (__GNUC__ >= 4) && !defined(SD_EXPORT_SYMBOLS)
++#define _sd_hidden_ __attribute__ ((visibility("hidden")))
++#else
++#define _sd_hidden_
++#endif
++#endif
++
++/*
++ Log levels for usage on stderr:
++
++ fprintf(stderr, SD_NOTICE "Hello World!\n");
++
++ This is similar to printk() usage in the kernel.
++*/
++#define SD_EMERG "<0>" /* system is unusable */
++#define SD_ALERT "<1>" /* action must be taken immediately */
++#define SD_CRIT "<2>" /* critical conditions */
++#define SD_ERR "<3>" /* error conditions */
++#define SD_WARNING "<4>" /* warning conditions */
++#define SD_NOTICE "<5>" /* normal but significant condition */
++#define SD_INFO "<6>" /* informational */
++#define SD_DEBUG "<7>" /* debug-level messages */
++
++/* The first passed file descriptor is fd 3 */
++#define SD_LISTEN_FDS_START 3
++
++/*
++ Returns how many file descriptors have been passed, or a negative
++ errno code on failure. Optionally, removes the $LISTEN_FDS and
++ $LISTEN_PID file descriptors from the environment (recommended, but
++ problematic in threaded environments). If r is the return value of
++ this function you'll find the file descriptors passed as fds
++ SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
++ errno style error code on failure. This function call ensures that
++ the FD_CLOEXEC flag is set for the passed file descriptors, to make
++ sure they are not passed on to child processes. If FD_CLOEXEC shall
++ not be set, the caller needs to unset it after this call for all file
++ descriptors that are used.
++
++ See sd_listen_fds(3) for more information.
++*/
++int sd_listen_fds(int unset_environment) _sd_hidden_;
++
++/*
++ Helper call for identifying a passed file descriptor. Returns 1 if
++ the file descriptor is a FIFO in the file system stored under the
++ specified path, 0 otherwise. If path is NULL a path name check will
++ not be done and the call only verifies if the file descriptor
++ refers to a FIFO. Returns a negative errno style error code on
++ failure.
++
++ See sd_is_fifo(3) for more information.
++*/
++int sd_is_fifo(int fd, const char *path) _sd_hidden_;
++
++/*
++ Helper call for identifying a passed file descriptor. Returns 1 if
++ the file descriptor is a socket of the specified family (AF_INET,
++ ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
++ family is 0 a socket family check will not be done. If type is 0 a
++ socket type check will not be done and the call only verifies if
++ the file descriptor refers to a socket. If listening is > 0 it is
++ verified that the socket is in listening mode. (i.e. listen() has
++ been called) If listening is == 0 it is verified that the socket is
++ not in listening mode. If listening is < 0 no listening mode check
++ is done. Returns a negative errno style error code on failure.
++
++ See sd_is_socket(3) for more information.
++*/
++int sd_is_socket(int fd, int family, int type, int listening) _sd_hidden_;
++
++/*
++ Helper call for identifying a passed file descriptor. Returns 1 if
++ the file descriptor is an Internet socket, of the specified family
++ (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
++ SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
++ check is not done. If type is 0 a socket type check will not be
++ done. If port is 0 a socket port check will not be done. The
++ listening flag is used the same way as in sd_is_socket(). Returns a
++ negative errno style error code on failure.
++
++ See sd_is_socket_inet(3) for more information.
++*/
++int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) _sd_hidden_;
++
++/*
++ Helper call for identifying a passed file descriptor. Returns 1 if
++ the file descriptor is an AF_UNIX socket of the specified type
++ (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
++ a socket type check will not be done. If path is NULL a socket path
++ check will not be done. For normal AF_UNIX sockets set length to
++ 0. For abstract namespace sockets set length to the length of the
++ socket name (including the initial 0 byte), and pass the full
++ socket path in path (including the initial 0 byte). The listening
++ flag is used the same way as in sd_is_socket(). Returns a negative
++ errno style error code on failure.
++
++ See sd_is_socket_unix(3) for more information.
++*/
++int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) _sd_hidden_;
++
++/*
++ Informs systemd about changed daemon state. This takes a number of
++ newline separated environment-style variable assignments in a
++ string. The following variables are known:
++
++ READY=1 Tells systemd that daemon startup is finished (only
++ relevant for services of Type=notify). The passed
++ argument is a boolean "1" or "0". Since there is
++ little value in signaling non-readiness the only
++ value daemons should send is "READY=1".
++
++ STATUS=... Passes a single-line status string back to systemd
++ that describes the daemon state. This is free-from
++ and can be used for various purposes: general state
++ feedback, fsck-like programs could pass completion
++ percentages and failing programs could pass a human
++ readable error message. Example: "STATUS=Completed
++ 66% of file system check..."
++
++ ERRNO=... If a daemon fails, the errno-style error code,
++ formatted as string. Example: "ERRNO=2" for ENOENT.
++
++ BUSERROR=... If a daemon fails, the D-Bus error-style error
++ code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
++
++ MAINPID=... The main pid of a daemon, in case systemd did not
++ fork off the process itself. Example: "MAINPID=4711"
++
++ Daemons can choose to send additional variables. However, it is
++ recommended to prefix variable names not listed above with X_.
++
++ Returns a negative errno-style error code on failure. Returns > 0
++ if systemd could be notified, 0 if it couldn't possibly because
++ systemd is not running.
++
++ Example: When a daemon finished starting up, it could issue this
++ call to notify systemd about it:
++
++ sd_notify(0, "READY=1");
++
++ See sd_notifyf() for more complete examples.
++
++ See sd_notify(3) for more information.
++*/
++int sd_notify(int unset_environment, const char *state) _sd_hidden_;
++
++/*
++ Similar to sd_notify() but takes a format string.
++
++ Example 1: A daemon could send the following after initialization:
++
++ sd_notifyf(0, "READY=1\n"
++ "STATUS=Processing requests...\n"
++ "MAINPID=%lu",
++ (unsigned long) getpid());
++
++ Example 2: A daemon could send the following shortly before
++ exiting, on failure:
++
++ sd_notifyf(0, "STATUS=Failed to start up: %s\n"
++ "ERRNO=%i",
++ strerror(errno),
++ errno);
++
++ See sd_notifyf(3) for more information.
++*/
++int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3) _sd_hidden_;
++
++/*
++ Returns > 0 if the system was booted with systemd. Returns < 0 on
++ error. Returns 0 if the system was not booted with systemd. Note
++ that all of the functions above handle non-systemd boots just
++ fine. You should NOT protect them with a call to this function. Also
++ note that this function checks whether the system, not the user
++ session is controlled by systemd. However the functions above work
++ for both user and system services.
++
++ See sd_booted(3) for more information.
++*/
++int sd_booted(void) _sd_hidden_;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--
+1.7.5.rc3
+
diff --git a/net-dns/dnsmasq/files/dnsmasq.service b/net-dns/dnsmasq/files/dnsmasq.service
new file mode 100644
index 0000000..ac87f2a
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd 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.
+
+[Unit]
+Description=dnsmasq
+After=syslog.socket
+
+[Service]
+StandardOutput=syslog
+StandardError=syslog
+
+ExecStart=/usr/sbin/dnsmasq -d -k
+
diff --git a/net-dns/dnsmasq/files/dnsmasq.socket b/net-dns/dnsmasq/files/dnsmasq.socket
new file mode 100644
index 0000000..fbdd6fa
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq.socket
@@ -0,0 +1,21 @@
+[Unit]
+Description=dnsmasq socket
+
+[Socket]
+
+#DNS
+ListenDatagram=0.0.0.0:53
+ListenStream=0.0.0.0:53
+ListenDatagram=[::1]:53
+ListenStream=[::1]:53
+
+#DHCP uncomment this to use dhcp
+#ListenDatagram=0.0.0.0:67
+#ListenDatagram=[::1]:67
+
+#TFTP, uncomment this to have tftp support
+#ListenDatagram=[::1]:53
+#ListenDatagram=0.0.0.0:53
+
+[Install]
+WantedBy=sockets.target