[yocto] [PATCH 2/3] [meta-ivi] portmap: Write portmap.pid file at startup
Shakeel, Muhammad
muhammad_shakeel at mentor.com
Tue Jun 11 08:31:42 PDT 2013
From: Muhammad Shakeel <muhammad_shakeel at mentor.com>
Portmap systemd service is expecting this file to be present and
without this patch portmap service will fail, with timeout status.
Signed-off-by: Muhammad Shakeel <muhammad_shakeel at mentor.com>
---
.../portmap/portmap/pid_file_creation.patch | 162 ++++++++++++++++++++
recipes-connectivity/portmap/portmap_6.0.bbappend | 3 +-
2 files changed, 164 insertions(+), 1 deletion(-)
diff --git a/recipes-connectivity/portmap/portmap/pid_file_creation.patch b/recipes-connectivity/portmap/portmap/pid_file_creation.patch
new file mode 100644
index 0000000..ec99968
--- /dev/null
+++ b/recipes-connectivity/portmap/portmap/pid_file_creation.patch
@@ -0,0 +1,162 @@
+Create portmap.pid file at startup
+
+This patch has been taken from:
+http://debian.2.n7.nabble.com/Bug-448470-Portmap-does-not-start-if-a-random-user-has-a-process-named-portmap-td440179.html
+Witout this patch systemd service was failing to start because no pidfile
+was getting generated by portmap. This problem is solved by getting
+portmap to write a pidfile, making sure the correct process is checked by
+the start script instead of a random one with the portmap name.
+
+Upstream-Status: Pending
+
+Signed-off-by: Muhammad Shakeel <muhammad_shakeel at mentor.com>
+===================================================================
+--- portmap-6.0.orig/portmap.c
++++ portmap-6.0/portmap.c
+@@ -98,6 +98,8 @@
+
+ #include <stdlib.h>
+ #include <pwd.h>
++#include <stdarg.h>
++#include <sys/stat.h>
+
+ #ifndef LOG_PERROR
+ #define LOG_PERROR 0
+@@ -169,6 +171,126 @@
+ int priv;
+ };
+
++#ifndef PIDFILE
++# define PIDFILE "/var/run/portmap.pid"
++#endif
++
++/*
++ * Copied from the atd source
++ */
++static int
++lock_fd(int fd)
++{
++ struct flock lock;
++
++ lock.l_type = F_WRLCK;
++ lock.l_whence = SEEK_SET;
++ lock.l_start = 0;
++ lock.l_len = 0;
++
++ return fcntl(fd, F_SETLK, &lock);
++}
++
++void
++perr(const char *fmt,...)
++{
++ char buf[1024];
++ va_list args;
++
++ va_start(args, fmt);
++ vsnprintf(buf, sizeof(buf), fmt, args);
++ va_end(args);
++
++ if (debugging) {
++ perror(buf);
++ } else
++ syslog(LOG_ERR, "%s: %m", buf);
++
++ exit(EXIT_FAILURE);
++}
++
++void
++pabort(const char *fmt,...)
++{
++ char buf[1024];
++ va_list args;
++
++ va_start(args, fmt);
++ vsnprintf(buf, sizeof(buf), fmt, args);
++ va_end(args);
++
++ if (debugging) {
++ fprintf(stderr, "%s\n", buf);
++ } else
++ syslog(LOG_ERR, "%s", buf);
++
++ exit(EXIT_FAILURE);
++}
++
++FILE *
++save_pidfile(void) {
++ pid_t pid;
++ int fd;
++ FILE *fp;
++ fd = open(PIDFILE, O_RDWR | O_CREAT | O_EXCL,
++ S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
++
++ if (fd == -1) {
++
++ if (errno != EEXIST)
++ perr("Cannot open " PIDFILE);
++
++ if ((fd = open(PIDFILE, O_RDWR)) < 0)
++ perr("Cannot open " PIDFILE);
++
++ fp = fdopen(fd, "rw");
++ if (fp == NULL) {
++ perr("Cannot open " PIDFILE " for reading");
++ }
++ pid = -1;
++ if ((fscanf(fp, "%d", &pid) != 1) || (pid == getpid())
++ || (lock_fd(fileno(fp)) == 0)) {
++ int rc;
++
++ syslog(LOG_NOTICE, "Removing stale lockfile for pid %d", pid);
++
++ rc = unlink(PIDFILE);
++
++ if (rc == -1) {
++ perr("Cannot unlink " PIDFILE);
++ }
++ } else {
++ pabort("Another atd already running with pid %d", pid);
++ }
++ fclose(fp);
++
++ unlink(PIDFILE);
++ fd = open(PIDFILE, O_RDWR | O_CREAT | O_EXCL,
++ S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
++
++
++ if (fd == -1)
++ perr("Cannot open " PIDFILE " the second time round");
++
++ }
++
++ if (lock_fd(fd) == -1)
++ perr("Cannot lock " PIDFILE);
++
++ fp = fdopen(fd, "w");
++ if (fp == NULL)
++ perr("Special weirdness: fdopen failed");
++
++ fprintf(fp, "%d\n", getpid());
++
++ /* We do NOT close fd, since we want to keep the lock. However, we don't
++ * want to keep the file descriptor in case of an exec().
++ */
++ fflush(fp);
++ fcntl(fd, F_SETFD, (long) 1);
++ return fp;
++}
++
+ int
+ main(int argc, char **argv)
+ {
+@@ -252,6 +374,8 @@
+ exit(1);
+ }
+
++ save_pidfile();
++
+ #ifdef LOG_DAEMON
+ openlog("portmap", LOG_PID|LOG_NDELAY | ( foreground ? LOG_PERROR : 0),
+ FACILITY);
+
+
diff --git a/recipes-connectivity/portmap/portmap_6.0.bbappend b/recipes-connectivity/portmap/portmap_6.0.bbappend
index 0432982..512b826 100644
--- a/recipes-connectivity/portmap/portmap_6.0.bbappend
+++ b/recipes-connectivity/portmap/portmap_6.0.bbappend
@@ -1,4 +1,4 @@
-PRINC := "${@int(PRINC) + 5}"
+PRINC := "${@int(PRINC) + 6}"
# Find local ${PN} directory
FILESEXTRAPATHS := "${THISDIR}/${PN}"
@@ -12,6 +12,7 @@ FILES_${PN} =+ "${systemd_unitdir}/system/portmap.service"
SRC_URI_append = " \
file://portmap.service \
+ file://pid_file_creation.patch\
"
do_install_append() {
--
1.7.9.5
More information about the yocto
mailing list