initctl: show exit status/signaled like systemctl

- Show if exited/signaled
 - Show status code and the std /NAME
 - Show signal value and the std /NAME

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2021-04-10 11:51:29 +02:00
parent 93039e40cc
commit c9e1c2f80f
3 changed files with 139 additions and 6 deletions
+42 -5
View File
@@ -607,15 +607,32 @@ static char *svc_environ(svc_t *svc, char *buf, size_t len)
return buf;
}
static char *status(svc_t *svc, int pretty)
static char *exit_status(int status, char *buf, size_t len)
{
static char buf[25];
int rc, sig;
rc = WEXITSTATUS(status);
sig = WTERMSIG(status);
if (WIFEXITED(status))
snprintf(buf, len, " (code=exited, status=%d%s)", rc, code2str(rc));
else if (WIFSIGNALED(status))
snprintf(buf, len, " (code=signaled, signal=%d%s)", sig, sig2str(sig));
return buf;
}
static char *status(svc_t *svc, int full)
{
static char buf[64];
const char *color;
char ok[64] = {0};
char *s;
s = svc_status(svc);
switch (svc->state) {
case SVC_HALTED_STATE:
exit_status(svc->status, ok, sizeof(ok));
color = "\e[1m";
break;
@@ -623,16 +640,36 @@ static char *status(svc_t *svc, int pretty)
color = "\e[1;32m";
break;
case SVC_DONE_STATE:
exit_status(svc->status, ok, sizeof(ok));
if (WIFEXITED(svc->status)) {
if (WEXITSTATUS(svc->status))
color = "\e[1;31m";
else
color = "\e[1;32m";
} else {
if (full && WIFSIGNALED(svc->status))
color = "\e[1;31m";
else
color = "\e[1;33m";
}
break;
default:
exit_status(svc->status, ok, sizeof(ok));
color = "\e[1;33m";
break;
}
if (!pretty || plain)
if (!full || plain)
color = NULL;
snprintf(buf, sizeof(buf), "%s%-8.8s%s",
color ? color : "", s, color ? "\e[0m" : "");
if (!full)
snprintf(buf, sizeof(buf), "%s%-8.8s%s",
color ? color : "", s, color ? "\e[0m" : "");
else
snprintf(buf, sizeof(buf), "%s%s%s%s",
color ? color : "", s, ok, color ? "\e[0m" : "");
return buf;
}
+94
View File
@@ -61,6 +61,77 @@ int ttrows = 24;
int ttcols = 80;
char *prognm = NULL;
static char *signames[] = {
""
"HUP", /* 1 */
"INT",
"QUIT",
"ILL",
"TRAP",
"ABRT",
"BUS",
"FPE", /* 8 */
"KILL",
"USR1",
"SEGV",
"USR2",
"PIPE",
"ALRM",
"TERM",
"STKFLT", /* 16 */
"CHLD",
"CONT",
"STOP",
"TSTP",
"TTIN",
"TTOU",
"URG",
"XCPU", /* 24 */
"XFSZ",
"VTALRM",
"PROF",
"WINCH",
"IO",
"PWR",
"SYS",
};
/* https://freedesktop.org/software/systemd/man/systemd.exec.html#id-1.20.8 */
static char *exitcodes[] = {
"SUCCESS", /* 0: Std C exit OK */
"FAILURE", /* 1: Std C exit FAIL */
/* 2-7: LSB init scripts (usually) */
"INVALIDARGUMENT", /* 2: Invalid or excess args */
"NOTIMPLEMENTED", /* 3: Unimplemented feature, e.g. 'reload' */
"NOPERMISSION", /* 4: Insufficient privilege */
"NOTINSTALLED", /* 5: Program is not installed */
"NOTCONFIGURED", /* 6: Program is not configured */
"NOTRUNNING", /* 7: Program is not running */
"", "", "", "", "", "", "", "", /* 8-63: Not standardized */
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 32-47 */
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 48-63 */
/* 64-78: BSD, from sysexit.h */
"USAGE", /* 64: Command line usage error */
"DATAERR", /* 65: data format error */
"NOINPUT", /* 66: cannot open input */
"NOUSER", /* 67: addressee unknown */
"NOHOST", /* 68: host name unknown */
"UNAVAILABLE", /* 69: service unavailable */
"SOFTWARE", /* 70: internal software error */
"OSERR", /* 71: system error (e.g., can't fork) */
"OSFILE", /* 72: critical OS file missing */
"CANTCREAT", /* 73: can't create (user) output file */
"IOERR", /* 74: input/output error */
"TEMPFAIL", /* 75: temp failure; user is invited to retry */
"PROTOCOL", /* 76: remote error in protocol */
"NOPERM", /* 77: permission denied */
"CONFIG", /* 78: configuration error */
/* 79-199: Not standardized, typically 127 == -1 */
/* >= 200: reserved (LSB), used by systemd */
};
char *progname(char *arg0)
{
prognm = strrchr(arg0, '/');
@@ -154,6 +225,29 @@ int strtobytes(char *arg)
return bytes;
}
char *sig2str(int sig)
{
static char signame[8];
if (sig < 1 || sig >= (int)NELEMS(signames))
return "";
snprintf(signame, sizeof(signame), "/%s", signames[sig]);
return signame;
}
char *code2str(int code)
{
static char codename[20];
if (code < 0 || code >= (int)NELEMS(exitcodes))
return "";
snprintf(codename, sizeof(codename), "/%s", exitcodes[code]);
return codename;
}
void do_sleep(unsigned int sec)
{
struct timespec requested_sleep = {
+3 -1
View File
@@ -52,8 +52,10 @@ int fnwrite (char *value, char *fmt, ...);
int has_utmp (void);
int strtobytes (char *arg);
void do_sleep (unsigned int sec);
char *sig2str (int sig);
char *code2str (int code);
void do_sleep (unsigned int sec);
long jiffies (void);
char *uptime (long secs, char *buf, size_t len);
char *memsz (uint64_t sz, char *buf, size_t len);