mirror of
https://github.com/troglobit/finit.git
synced 2026-10-02 14:02:52 +07:00
Support touching custom PID files
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
+15
-1
@@ -25,6 +25,7 @@
|
|||||||
#include "config.h" /* Generated by configure script */
|
#include "config.h" /* Generated by configure script */
|
||||||
|
|
||||||
#include <ctype.h> /* isblank() */
|
#include <ctype.h> /* isblank() */
|
||||||
|
#include <sched.h> /* sched_yield() */
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
@@ -430,6 +431,8 @@ static int service_stop(svc_t *svc)
|
|||||||
*/
|
*/
|
||||||
static int service_restart(svc_t *svc)
|
static int service_restart(svc_t *svc)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
/* Ignore if finit is SIGSTOP'ed */
|
/* Ignore if finit is SIGSTOP'ed */
|
||||||
if (is_norespawn())
|
if (is_norespawn())
|
||||||
return 1;
|
return 1;
|
||||||
@@ -449,7 +452,15 @@ static int service_restart(svc_t *svc)
|
|||||||
svc_starting(svc);
|
svc_starting(svc);
|
||||||
|
|
||||||
_d("Sending SIGHUP to PID %d", svc->pid);
|
_d("Sending SIGHUP to PID %d", svc->pid);
|
||||||
return print_result(kill(svc->pid, SIGHUP));
|
rc = kill(svc->pid, SIGHUP);
|
||||||
|
|
||||||
|
/* Service does not maintain a PID file on its own */
|
||||||
|
if (svc_has_pidfile(svc)) {
|
||||||
|
sched_yield();
|
||||||
|
touch(pid_file(svc));
|
||||||
|
}
|
||||||
|
|
||||||
|
return print_result(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -686,6 +697,9 @@ recreate:
|
|||||||
if (desc)
|
if (desc)
|
||||||
strlcpy(svc->desc, desc, sizeof(svc->desc));
|
strlcpy(svc->desc, desc, sizeof(svc->desc));
|
||||||
|
|
||||||
|
/* Always clear svc PID file, for now. See TODO */
|
||||||
|
svc->pidfile[0] = 0;
|
||||||
|
/* Decode any optional pid:/optional/path/to/file.pid */
|
||||||
if (pid && svc_is_daemon(svc) && pid_file_parse(svc, pid))
|
if (pid && svc_is_daemon(svc) && pid_file_parse(svc, pid))
|
||||||
_e("Invalid 'pid' argument to service: %s", pid);
|
_e("Invalid 'pid' argument to service: %s", pid);
|
||||||
|
|
||||||
|
|||||||
@@ -162,8 +162,14 @@ int svc_is_unique (svc_t *svc);
|
|||||||
|
|
||||||
int svc_parse_jobstr (char *str, size_t len, int (*found)(svc_t *), int (not_found)(char *, int));
|
int svc_parse_jobstr (char *str, size_t len, int (*found)(svc_t *), int (not_found)(char *, int));
|
||||||
|
|
||||||
|
static inline int svc_is_inetd (svc_t *svc) { return svc && SVC_TYPE_INETD == svc->type; }
|
||||||
|
static inline int svc_is_inetd_conn(svc_t *svc) { return svc && SVC_TYPE_INETD_CONN == svc->type; }
|
||||||
|
static inline int svc_is_daemon (svc_t *svc) { return svc && SVC_TYPE_SERVICE == svc->type; }
|
||||||
|
static inline int svc_is_runtask (svc_t *svc) { return svc && (SVC_TYPE_RUNTASK & svc->type); }
|
||||||
|
|
||||||
static inline int svc_in_runlevel (svc_t *svc, int runlevel) { return svc && ISSET(svc->runlevels, runlevel); }
|
static inline int svc_in_runlevel (svc_t *svc, int runlevel) { return svc && ISSET(svc->runlevels, runlevel); }
|
||||||
static inline int svc_has_sighup (svc_t *svc) { return svc && 0 != svc->sighup; }
|
static inline int svc_has_sighup (svc_t *svc) { return svc && 0 != svc->sighup; }
|
||||||
|
static inline int svc_has_pidfile (svc_t *svc) { return svc_is_daemon(svc) && svc->pidfile[0] != 0 && svc->pidfile[0] != '!'; }
|
||||||
|
|
||||||
static inline void svc_starting (svc_t *svc) { svc->starting = 1; }
|
static inline void svc_starting (svc_t *svc) { svc->starting = 1; }
|
||||||
static inline void svc_started (svc_t *svc) { svc->starting = 0; }
|
static inline void svc_started (svc_t *svc) { svc->starting = 0; }
|
||||||
@@ -173,11 +179,6 @@ static inline int svc_is_removed (svc_t *svc) { return svc && -1 == svc->dirty
|
|||||||
static inline int svc_is_changed (svc_t *svc) { return svc && 0 != svc->dirty; }
|
static inline int svc_is_changed (svc_t *svc) { return svc && 0 != svc->dirty; }
|
||||||
static inline int svc_is_updated (svc_t *svc) { return svc && 1 == svc->dirty; }
|
static inline int svc_is_updated (svc_t *svc) { return svc && 1 == svc->dirty; }
|
||||||
|
|
||||||
static inline int svc_is_inetd (svc_t *svc) { return svc && SVC_TYPE_INETD == svc->type; }
|
|
||||||
static inline int svc_is_inetd_conn(svc_t *svc) { return svc && SVC_TYPE_INETD_CONN == svc->type; }
|
|
||||||
static inline int svc_is_daemon (svc_t *svc) { return svc && SVC_TYPE_SERVICE == svc->type; }
|
|
||||||
static inline int svc_is_runtask (svc_t *svc) { return svc && (SVC_TYPE_RUNTASK & svc->type); }
|
|
||||||
|
|
||||||
static inline int svc_is_blocked (svc_t *svc) { return svc->block != SVC_BLOCK_NONE; }
|
static inline int svc_is_blocked (svc_t *svc) { return svc->block != SVC_BLOCK_NONE; }
|
||||||
static inline int svc_is_busy (svc_t *svc) { return svc->block == SVC_BLOCK_BUSY; }
|
static inline int svc_is_busy (svc_t *svc) { return svc->block == SVC_BLOCK_BUSY; }
|
||||||
static inline void svc_unblock (svc_t *svc) { svc->block = SVC_BLOCK_NONE; }
|
static inline void svc_unblock (svc_t *svc) { svc->block = SVC_BLOCK_NONE; }
|
||||||
|
|||||||
Reference in New Issue
Block a user