Hello Chen, May I know why your patch series is still pending merge?
Noor -----Original Message----- From: openembedded-core-boun...@lists.openembedded.org [mailto:openembedded-core-boun...@lists.openembedded.org] On Behalf Of Chen Qi Sent: Sunday, September 28, 2014 8:00 AM To: openembedded-core@lists.openembedded.org Subject: [OE-core] [PATCH V3 3/4] sysklogd: add systemd support This patch includes the following changes: 1. Add socket activation support for sysklogd 2. Add systemd service file 3. Use ALTERNATIVE mechanism in OE to manage the syslog service 4. Set ALTERNATIVE_PRIORITY to "100" regardless of whether 'systemd' is in DISTRO_FEATURES or not because sysklogd now has systemd support. Signed-off-by: Chen Qi <qi.c...@windriver.com> --- .../files/0001-syslogd.c-add-systemd-support.patch | 246 +++++++++++++++++++++ meta/recipes-extended/sysklogd/files/klogd.service | 9 + .../sysklogd/files/sysklogd.service | 14 ++ meta/recipes-extended/sysklogd/sysklogd.inc | 38 +++- 4 files changed, 300 insertions(+), 7 deletions(-) create mode 100644 meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch create mode 100644 meta/recipes-extended/sysklogd/files/klogd.service create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service diff --git a/meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch b/meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch new file mode 100644 index 0000000..1706906 --- /dev/null +++ b/meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-su +++ pport.patch @@ -0,0 +1,246 @@ +Upstream-Status: Pending + +Subject: syslogd.c: add systemd support + +1. add socket activation support +2. unlink /dev/log if it's not provided by systemd + +Signed-off-by: Chen Qi <qi.c...@windriver.com> +--- + syslogd.c | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 137 insertions(+), 20 deletions(-) + +diff --git a/syslogd.c b/syslogd.c +index acfd8f1..81e45e6 100644 +--- a/syslogd.c ++++ b/syslogd.c +@@ -602,6 +602,9 @@ static char sccsid[] = "@(#)syslogd.c 5.27 (Berkeley) 10/10/88"; + #define _PATH_LOG "/dev/log" + #endif + ++/* systemd support */ ++#define SD_LISTEN_FDS_START 3 ++ + char *ConfFile = _PATH_LOGCONF; + char *PidFile = _PATH_LOGPID; + char ctty[] = _PATH_CONSOLE; +@@ -612,6 +615,7 @@ int inetm = 0; + static int debugging_on = 0; + static int nlogs = -1; + static int restart = 0; ++static int socket_from_systemd = 0; + + #define MAXFUNIX 20 + +@@ -822,6 +826,8 @@ int decode(char *name, struct code *codetab); +static void dprintf(char *, ...); static void allocate_log(void); +void sighup_handler(); ++/* systemd support */ ++int sd_listen_fds(void); + + #ifdef SYSLOG_UNIXAF + static int create_unix_socket(const char *path); @@ -963,9 +969,37 @@ +int main(argc, argv) + */ + exit(1); + } ++ ++ /* We keep stdout and stderr open in case we have to emit something */ ++ close(0); ++ i = 3; ++ ++ /* Trying to pass on LISTEN_PID with appropriate value */ ++ const char *e; ++ unsigned long l; ++ char buf[24] = { '\0' }; ++ int sd_fds; ++ ++ if ( (e = getenv("LISTEN_PID")) ) { ++ errno = 0; ++ l = strtoul(e, NULL, 10); ++ if (errno == 0) { ++ if (getppid() == (pid_t)l) { ++ snprintf(buf,sizeof(buf), "%d", (int)getpid()); ++ setenv("LISTEN_PID", buf, 1); ++ } ++ } ++ } ++ + signal (SIGTERM, SIG_DFL); + num_fds = getdtablesize(); +- for (i= 0; i < num_fds; i++) ++ ++ /* close all further fds except of the fds provided by systemd */ ++ sd_fds = sd_listen_fds(); ++ if (sd_fds > 0) { ++ i = SD_LISTEN_FDS_START + sd_fds; ++ } ++ for ( ; i < num_fds; i++) + (void) close(i); + untty(); + } +@@ -1248,28 +1282,37 @@ static int create_unix_socket(const char *path) +{ + struct sockaddr_un sunx; + int fd; ++ int n; + char line[MAXLINE +1]; + +- if (path[0] == '\0') ++ n = sd_listen_fds(); ++ if (n > 1) { + return -1; +- +- (void) unlink(path); +- +- memset(&sunx, 0, sizeof(sunx)); +- sunx.sun_family = AF_UNIX; +- (void) strncpy(sunx.sun_path, path, sizeof(sunx.sun_path)); +- fd = socket(AF_UNIX, SOCK_DGRAM, 0); +- if (fd < 0 || bind(fd, (struct sockaddr *) &sunx, +- sizeof(sunx.sun_family)+strlen(sunx.sun_path)) < 0 || +- chmod(path, 0666) < 0) { +- (void) snprintf(line, sizeof(line), "cannot create %s", path); +- logerror(line); +- dprintf("cannot create %s (%d).\n", path, errno); +- close(fd); ++ } else if (n == 1) { ++ socket_from_systemd = 1; ++ fd = SD_LISTEN_FDS_START + 0; ++ } else { ++ if (path[0] == '\0') ++ return -1; ++ ++ (void) unlink(path); ++ ++ memset(&sunx, 0, sizeof(sunx)); ++ sunx.sun_family = AF_UNIX; ++ (void) strncpy(sunx.sun_path, path, sizeof(sunx.sun_path)); ++ fd = socket(AF_UNIX, SOCK_DGRAM, 0); ++ if (fd < 0 || bind(fd, (struct sockaddr *) &sunx, ++ sizeof(sunx.sun_family)+strlen(sunx.sun_path)) < 0 || ++ chmod(path, 0666) < 0) { ++ (void) snprintf(line, sizeof(line), "cannot create %s", path); ++ logerror(line); ++ dprintf("cannot create %s (%d).\n", path, errno); ++ close(fd); + #ifndef SYSV +- die(0); ++ die(0); + #endif +- return -1; ++ return -1; ++ } + } + return fd; + } +@@ -1998,12 +2041,27 @@ void wallmsg(f, iov) + /* open the user login file */ + setutent(); + +- + /* + * Might as well fork instead of using nonblocking I/O + * and doing notty(). + */ + if (fork() == 0) { ++ /* Trying to pass on the LISTEN_PID with appropriate value */ ++ const char *e; ++ unsigned long l; ++ char buf[24] = { '\0' }; ++ ++ if ( (e = getenv("LISTEN_PID")) ) { ++ errno = 0; ++ l = strtoul(e, NULL, 10); ++ if (errno == 0) { ++ if (getppid() == (pid_t)l) { ++ snprintf(buf,sizeof(buf), "%d", (int)getpid()); ++ setenv("LISTEN_PID", buf, 1); ++ } ++ } ++ } ++ + (void) signal(SIGTERM, SIG_DFL); + (void) alarm(0); + #ifndef SYSV +@@ -2254,9 +2312,15 @@ void die(sig) + if (InetInuse) close(inetm); + + /* Clean-up files. */ +- for (i = 0; i < nfunix; i++) ++ if (socket_from_systemd) { ++ i = 1; ++ } else { ++ i = 0; ++ } ++ for (; i < nfunix; i++) + if (funixn[i] && funix[i] != -1) + (void)unlink(funixn[i]); ++ + #ifndef TESTING + (void) remove_pid(PidFile); + #endif +@@ -2896,6 +2960,59 @@ void sighup_handler() + return; + } + ++int sd_listen_fds() { ++ int r, fd; ++ const char *e; ++ unsigned long l; ++ ++ e = getenv("LISTEN_PID"); ++ if (!e) { ++ return 0; ++ } ++ ++ errno = 0; ++ l = strtoul(e, NULL, 10); ++ ++ if (errno != 0) { ++ return -errno; ++ } ++ ++ if (getpid() != (pid_t)l) { ++ return 0; ++ } ++ ++ e = getenv("LISTEN_FDS"); ++ if (!e) { ++ return 0; ++ } ++ ++ errno = 0; ++ l = strtoul(e, NULL, 10); ++ ++ if (errno != 0) { ++ return -errno; ++ } ++ ++ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int)l; fd++) { ++ int flags; ++ ++ flags = fcntl(fd, F_GETFD); ++ if (flags < 0) { ++ return -errno; ++ } ++ ++ if (flags & FD_CLOEXEC) ++ continue; ++ ++ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { ++ return -errno; ++ } ++ } ++ ++ r = (int)l; ++ ++ return r; ++} + /* + * Local variables: + * c-indent-level: 8 +-- +1.9.1 + diff --git a/meta/recipes-extended/sysklogd/files/klogd.service b/meta/recipes-extended/sysklogd/files/klogd.service new file mode 100644 index 0000000..cf97e9c --- /dev/null +++ b/meta/recipes-extended/sysklogd/files/klogd.service @@ -0,0 +1,9 @@ +[Unit] +Description=sysklogd Kernel Logging Service + +[Service] +Type=forking +EnvironmentFile=-@SYSCONFDIR@/default/klogd +PIDFile=/var/run/klogd.pid +ExecStart=@BASE_SBINDIR@/klogd $KLOGD +StandardOutput=null diff --git a/meta/recipes-extended/sysklogd/files/sysklogd.service b/meta/recipes-extended/sysklogd/files/sysklogd.service new file mode 100644 index 0000000..7806320 --- /dev/null +++ b/meta/recipes-extended/sysklogd/files/sysklogd.service @@ -0,0 +1,14 @@ +[Unit] +Description=System Logging Service +Wants=klogd.service +Requires=syslog.socket + +[Service] +Type=forking +EnvironmentFile=-@SYSCONFDIR@/default/sysklogd +PIDFile=/var/run/syslogd.pid +ExecStart=@BASE_SBINDIR@/syslogd $SYSLOGD StandardOutput=null + +[Install] +Also=klogd.service diff --git a/meta/recipes-extended/sysklogd/sysklogd.inc b/meta/recipes-extended/sysklogd/sysklogd.inc index bcf8aa7..294eb4f 100644 --- a/meta/recipes-extended/sysklogd/sysklogd.inc +++ b/meta/recipes-extended/sysklogd/sysklogd.inc @@ -11,12 +11,15 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b \ file://klogd.c;beginline=2;endline=19;md5=7e87ed0ae6142de079bce738c10c899d \ " -inherit update-rc.d update-alternatives +inherit update-rc.d systemd update-alternatives SRC_URI = "http://www.infodrom.org/projects/sysklogd/download/sysklogd-${PV}.tar.gz \ file://no-strip-install.patch \ + file://0001-syslogd.c-add-systemd-support.patch \ file://sysklogd \ file://syslog.conf \ + file://sysklogd.service \ + file://klogd.service \ " SRC_URI_append_e500v2 = " file://no-vectorization.patch" @@ -24,6 +27,8 @@ SRC_URI_append_e500v2 = " file://no-vectorization.patch" INITSCRIPT_NAME = "syslog" CONFFILES_${PN} = "${sysconfdir}/syslog.conf.${BPN}" +SYSTEMD_SERVICE_${PN} = "sysklogd.service" + CFLAGS_append = " -DSYSV" do_install () { @@ -35,20 +40,39 @@ do_install () { install -d ${D}${sysconfdir} install -m 644 ${WORKDIR}/syslog.conf ${D}${sysconfdir}/syslog.conf install -d ${D}${sysconfdir}/init.d - install -m 755 ${WORKDIR}/sysklogd ${D}${sysconfdir}/init.d/syslog + install -m 755 ${WORKDIR}/sysklogd +${D}${sysconfdir}/init.d/syslog.${BPN} + + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/sysklogd.service ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/klogd.service ${D}${systemd_unitdir}/system + sed -i -e 's,@BASE_SBINDIR@,${base_sbindir},g' \ + -e 's,@SYSCONFDIR@,${sysconfdir},g' \ + ${D}${systemd_unitdir}/system/*.service } -# sysklogd package has no internal systemd support, so we weigh busybox's -# sysklogd utility over it in case of systemd -ALTERNATIVE_PRIORITY = "${@bb.utils.contains('DISTRO_FEATURES','systemd','10','100',d)}" +ALTERNATIVE_PRIORITY = '100' -ALTERNATIVE_${PN} = "syslogd klogd syslog-init syslog-conf" +ALTERNATIVE_${PN} = "syslogd klogd syslog-conf" ALTERNATIVE_LINK_NAME[syslogd] = "${base_sbindir}/syslogd" ALTERNATIVE_LINK_NAME[klogd] = "${base_sbindir}/klogd" -ALTERNATIVE_LINK_NAME[syslog-init] = "${sysconfdir}/init.d/syslog" ALTERNATIVE_LINK_NAME[syslog-conf] = "${sysconfdir}/syslog.conf" +python () { + if bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d): + pn = d.getVar('PN', True) + sysconfdir = d.getVar('sysconfdir', True) + d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-init') + d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-init', '%s/init.d/syslog' % (sysconfdir)) + d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-init', +'%s/init.d/syslog.%s' % (d.getVar('sysconfdir', True), d.getVar('BPN', +True))) + + if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d): + pn = d.getVar('PN', True) + d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-service') + d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-service', '%s/systemd/system/syslog.service' % (d.getVar('sysconfdir', True))) + d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-service', +'%s/system/sysklogd.service' % (d.getVar('systemd_unitdir', True))) } + pkg_prerm_${PN} () { if test "x$D" = "x"; then if test "$1" = "upgrade" -o "$1" = "remove"; then -- 1.9.1 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core