Improve style for KNF

This commit is contained in:
Roy Marples 2009-04-23 21:31:22 +00:00
parent 6953474655
commit ade85d4bd8
20 changed files with 760 additions and 667 deletions

View File

@ -1,7 +1,7 @@
/*
einfo.c
Informational functions
*/
einfo.c
Informational functions
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -110,10 +110,10 @@ hidden_proto(ewendv)
#define UP "\033[A"
#define _GET_CAP(_d, _c) strlcpy(_d, tgoto(_c, 0, 0), sizeof(_d));
#define _ASSIGN_CAP(_v) { \
_v = p; \
p += strlcpy(p, tmp, sizeof(ebuffer) - (p - ebuffer)) + 1; \
}
#define _ASSIGN_CAP(_v) do { \
_v = p; \
p += strlcpy(p, tmp, sizeof(ebuffer) - (p - ebuffer)) + 1; \
} while (0)
/* A pointer to a string to prefix to einfo/ewarn/eerror messages */
static const char *_eprefix = NULL;
@ -497,7 +497,7 @@ colour_terminal(FILE * EINFO_RESTRICT f)
_GET_CAP(tmp, _me);
if (tmp[0])
_ASSIGN_CAP(ecolors_str[i])
_ASSIGN_CAP(ecolors_str[i]);
else
ecolors_str[i] = &nullstr;
}
@ -624,13 +624,13 @@ ecolor(ECOLOR color)
return _ecolor(f, color);
}
#define LASTCMD(_cmd) { \
unsetenv("EINFO_LASTCMD"); \
setenv("EINFO_LASTCMD", _cmd, 1); \
}
#define LASTCMD(_cmd) { \
unsetenv("EINFO_LASTCMD"); \
setenv("EINFO_LASTCMD", _cmd, 1); \
}
static int EINFO_PRINTF(3, 0)
_einfo(FILE *f, ECOLOR color, const char *EINFO_RESTRICT fmt, va_list va)
_einfo(FILE *f, ECOLOR color, const char *EINFO_RESTRICT fmt, va_list va)
{
int retval = 0;
char *last = getenv("EINFO_LASTCMD");
@ -836,8 +836,8 @@ _eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg)
* valuable columns when running on 80 column screens. */
if (cols > 0 && colour_terminal(fp)) {
fprintf(fp, "%s%s %s[%s%s%s]%s\n", up, tgoto(goto_column, 0, cols),
ecolor(ECOLOR_BRACKET), ecolor(color), msg,
ecolor(ECOLOR_BRACKET), ecolor(ECOLOR_NORMAL));
ecolor(ECOLOR_BRACKET), ecolor(color), msg,
ecolor(ECOLOR_BRACKET), ecolor(ECOLOR_NORMAL));
} else {
if (col > 0)
for (i = 0; i < cols - col; i++)
@ -847,7 +847,8 @@ _eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg)
}
static int EINFO_PRINTF(3, 0)
_do_eend(const char *cmd, int retval, const char *EINFO_RESTRICT fmt, va_list ap)
_do_eend(const char *cmd, int retval,
const char *EINFO_RESTRICT fmt, va_list ap)
{
int col = 0;
FILE *fp = stdout;
@ -864,8 +865,8 @@ _do_eend(const char *cmd, int retval, const char *EINFO_RESTRICT fmt, va_list ap
va_end(apc);
}
_eend(fp, col,
retval == 0 ? ECOLOR_GOOD : ECOLOR_BAD,
retval == 0 ? OK : NOT_OK);
retval == 0 ? ECOLOR_GOOD : ECOLOR_BAD,
retval == 0 ? OK : NOT_OK);
return retval;
}

View File

@ -1,7 +1,7 @@
/*
librc-daemon
Finds PID for given daemon criteria
*/
librc-daemon
Finds PID for given daemon criteria
*/
/*
* Copyright 2007-2009 Roy Marples <roy@marples.name>
@ -32,7 +32,8 @@
#include "librc.h"
#if defined(__linux__)
static bool pid_is_exec(pid_t pid, const char *exec)
static bool
pid_is_exec(pid_t pid, const char *exec)
{
char buffer[32];
FILE *fp;
@ -55,7 +56,8 @@ static bool pid_is_exec(pid_t pid, const char *exec)
return retval;
}
static bool pid_is_argv(pid_t pid, const char *const *argv)
static bool
pid_is_argv(pid_t pid, const char *const *argv)
{
char cmdline[32];
int fd;
@ -84,8 +86,8 @@ static bool pid_is_argv(pid_t pid, const char *const *argv)
return true;
}
RC_PIDLIST *rc_find_pids(const char *exec, const char *const *argv,
uid_t uid, pid_t pid)
RC_PIDLIST *
rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
{
DIR *procdir;
struct dirent *entry;
@ -101,15 +103,15 @@ RC_PIDLIST *rc_find_pids(const char *exec, const char *const *argv,
return NULL;
/*
We never match RC_RUNSCRIPT_PID if present so we avoid the below
scenario
We never match RC_RUNSCRIPT_PID if present so we avoid the below
scenario
/etc/init.d/ntpd stop does
start-stop-daemon --stop --name ntpd
catching /etc/init.d/ntpd stop
/etc/init.d/ntpd stop does
start-stop-daemon --stop --name ntpd
catching /etc/init.d/ntpd stop
nasty
*/
nasty
*/
if ((pp = getenv("RC_RUNSCRIPT_PID"))) {
if (sscanf(pp, "%d", &runscript_pid) != 1)
@ -170,8 +172,8 @@ librc_hidden_def(rc_find_pids)
# define _KVM_FLAGS O_RDONLY
# endif
RC_PIDLIST *rc_find_pids(const char *exec, const char *const *argv,
uid_t uid, pid_t pid)
RC_PIDLIST *
rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
{
static kvm_t *kd = NULL;
char errbuf[_POSIX2_LINE_MAX];
@ -187,7 +189,7 @@ RC_PIDLIST *rc_find_pids(const char *exec, const char *const *argv,
int match;
if ((kd = kvm_openfiles(_KVM_PATH, _KVM_PATH,
NULL, _KVM_FLAGS, errbuf)) == NULL)
NULL, _KVM_FLAGS, errbuf)) == NULL)
{
fprintf(stderr, "kvm_open: %s\n", errbuf);
return NULL;
@ -249,8 +251,8 @@ librc_hidden_def(rc_find_pids)
# error "Platform not supported!"
#endif
static bool _match_daemon(const char *path, const char *file,
RC_STRINGLIST *match)
static bool
_match_daemon(const char *path, const char *file, RC_STRINGLIST *match)
{
char *line = NULL;
size_t len = 0;
@ -266,10 +268,10 @@ static bool _match_daemon(const char *path, const char *file,
while ((rc_getline(&line, &len, fp))) {
TAILQ_FOREACH(m, match, entries)
if (strcmp(line, m->value) == 0) {
TAILQ_REMOVE(match, m, entries);
break;
}
if (strcmp(line, m->value) == 0) {
TAILQ_REMOVE(match, m, entries);
break;
}
if (!TAILQ_FIRST(match))
break;
}
@ -280,8 +282,8 @@ static bool _match_daemon(const char *path, const char *file,
return true;
}
static RC_STRINGLIST *_match_list(const char *exec, const char* const* argv,
const char *pidfile)
static RC_STRINGLIST *
_match_list(const char *exec, const char* const* argv, const char *pidfile)
{
RC_STRINGLIST *match = rc_stringlist_new();
int i = 0;
@ -315,9 +317,10 @@ static RC_STRINGLIST *_match_list(const char *exec, const char* const* argv,
return match;
}
bool rc_service_daemon_set(const char *service, const char *exec,
const char *const *argv,
const char *pidfile, bool started)
bool
rc_service_daemon_set(const char *service, const char *exec,
const char *const *argv,
const char *pidfile, bool started)
{
char dirpath[PATH_MAX];
char file[PATH_MAX];
@ -336,7 +339,7 @@ bool rc_service_daemon_set(const char *service, const char *exec,
}
snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
basename_c(service));
basename_c(service));
/* Regardless, erase any existing daemon info */
if ((dp = opendir(dirpath))) {
@ -346,7 +349,7 @@ bool rc_service_daemon_set(const char *service, const char *exec,
continue;
snprintf(file, sizeof(file), "%s/%s",
dirpath, d->d_name);
dirpath, d->d_name);
nfiles++;
if (!*oldfile) {
@ -368,7 +371,7 @@ bool rc_service_daemon_set(const char *service, const char *exec,
if (started) {
if (mkdir(dirpath, 0755) == 0 || errno == EEXIST) {
snprintf(file, sizeof(file), "%s/%03d",
dirpath, nfiles + 1);
dirpath, nfiles + 1);
if ((fp = fopen(file, "w"))) {
fprintf(fp, "exec=");
if (exec)
@ -392,9 +395,9 @@ bool rc_service_daemon_set(const char *service, const char *exec,
}
librc_hidden_def(rc_service_daemon_set)
bool rc_service_started_daemon(const char *service,
const char *exec, const char *const *argv,
int indx)
bool
rc_service_started_daemon(const char *service,
const char *exec, const char *const *argv, int indx)
{
char dirpath[PATH_MAX];
char file[16];
@ -407,7 +410,7 @@ bool rc_service_started_daemon(const char *service,
return false;
snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
basename_c(service));
basename_c(service));
match = _match_list(exec, argv, NULL);
if (indx > 0) {
@ -431,7 +434,8 @@ bool rc_service_started_daemon(const char *service,
}
librc_hidden_def(rc_service_started_daemon)
bool rc_service_daemons_crashed(const char *service)
bool
rc_service_daemons_crashed(const char *service)
{
char dirpath[PATH_MAX];
DIR *dp;
@ -456,7 +460,7 @@ bool rc_service_daemons_crashed(const char *service)
size_t i;
path += snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
basename_c(service));
basename_c(service));
if (!(dp = opendir(dirpath)))
return false;
@ -466,7 +470,7 @@ bool rc_service_daemons_crashed(const char *service)
continue;
snprintf(path, sizeof(dirpath) - (path - dirpath), "/%s",
d->d_name);
d->d_name);
fp = fopen(dirpath, "r");
if (!fp)
break;
@ -529,19 +533,19 @@ bool rc_service_daemons_crashed(const char *service)
/* We need to flatten our linked list into an array */
i = 0;
TAILQ_FOREACH(s, list, entries)
i++;
i++;
argv = xmalloc(sizeof(char *) * (i + 1));
i = 0;
TAILQ_FOREACH(s, list, entries)
argv[i++] = s->value;
argv[i++] = s->value;
argv[i] = '\0';
}
}
if (!retval) {
if ((pids = rc_find_pids(exec,
(const char *const *)argv,
0, pid)))
(const char *const *)argv,
0, pid)))
{
p1 = LIST_FIRST(pids);
while (p1) {

View File

@ -1,7 +1,7 @@
/*
rc-misc.c
rc misc functions
*/
rc-misc.c
rc misc functions
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -31,7 +31,8 @@
#include "librc.h"
bool rc_yesno(const char *value)
bool
rc_yesno(const char *value)
{
if (!value) {
errno = ENOENT;
@ -54,7 +55,8 @@ bool rc_yesno(const char *value)
}
librc_hidden_def(rc_yesno)
ssize_t rc_getline(char **line, size_t *len, FILE *fp)
ssize_t
rc_getline(char **line, size_t *len, FILE *fp)
{
char *p;
size_t last = 0;
@ -78,7 +80,8 @@ ssize_t rc_getline(char **line, size_t *len, FILE *fp)
}
librc_hidden_def(rc_getline)
RC_STRINGLIST *rc_config_list(const char *file)
RC_STRINGLIST *
rc_config_list(const char *file)
{
FILE *fp;
char *buffer = NULL;
@ -116,7 +119,8 @@ RC_STRINGLIST *rc_config_list(const char *file)
}
librc_hidden_def(rc_config_list)
RC_STRINGLIST *rc_config_load(const char *file)
RC_STRINGLIST *
rc_config_load(const char *file)
{
RC_STRINGLIST *list;
RC_STRINGLIST *config;
@ -172,7 +176,7 @@ RC_STRINGLIST *rc_config_load(const char *file)
TAILQ_FOREACH(cline, config, entries) {
p = strchr(cline->value, '=');
if (p && strncmp(entry, cline->value,
(size_t)(p - cline->value)) == 0)
(size_t)(p - cline->value)) == 0)
{
/* We have a match now - to save time we directly replace it */
free(cline->value);
@ -194,7 +198,8 @@ RC_STRINGLIST *rc_config_load(const char *file)
}
librc_hidden_def(rc_config_load)
char *rc_config_value(RC_STRINGLIST *list, const char *entry)
char *
rc_config_value(RC_STRINGLIST *list, const char *entry)
{
RC_STRING *line;
char *p;

View File

@ -1,7 +1,7 @@
/*
librc-strlist.h
String list functions to make using queue(3) a little easier.
*/
librc-strlist.h
String list functions to make using queue(3) a little easier.
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -31,7 +31,8 @@
#include "librc.h"
RC_STRINGLIST *rc_stringlist_new(void)
RC_STRINGLIST *
rc_stringlist_new(void)
{
RC_STRINGLIST *l = xmalloc(sizeof(*l));
TAILQ_INIT(l);
@ -39,7 +40,8 @@ RC_STRINGLIST *rc_stringlist_new(void)
}
librc_hidden_def(rc_stringlist_new)
RC_STRING *rc_stringlist_add (RC_STRINGLIST *list, const char *value)
RC_STRING *
rc_stringlist_add (RC_STRINGLIST *list, const char *value)
{
RC_STRING *s = xmalloc(sizeof(*s));
@ -49,51 +51,55 @@ RC_STRING *rc_stringlist_add (RC_STRINGLIST *list, const char *value)
}
librc_hidden_def(rc_stringlist_add)
RC_STRING *rc_stringlist_addu (RC_STRINGLIST *list, const char *value)
RC_STRING *
rc_stringlist_addu (RC_STRINGLIST *list, const char *value)
{
RC_STRING *s;
TAILQ_FOREACH(s, list, entries)
if (strcmp(s->value, value) == 0) {
errno = EEXIST;
return NULL;
}
if (strcmp(s->value, value) == 0) {
errno = EEXIST;
return NULL;
}
return rc_stringlist_add(list, value);
}
librc_hidden_def(rc_stringlist_addu)
bool rc_stringlist_delete(RC_STRINGLIST *list, const char *value)
bool
rc_stringlist_delete(RC_STRINGLIST *list, const char *value)
{
RC_STRING *s;
TAILQ_FOREACH(s, list, entries)
if (strcmp(s->value, value) == 0) {
TAILQ_REMOVE(list, s, entries);
free (s->value);
free (s);
return true;
}
if (strcmp(s->value, value) == 0) {
TAILQ_REMOVE(list, s, entries);
free (s->value);
free (s);
return true;
}
errno = EEXIST;
return false;
}
librc_hidden_def(rc_stringlist_delete)
RC_STRING *rc_stringlist_find(RC_STRINGLIST *list, const char *value)
RC_STRING *
rc_stringlist_find(RC_STRINGLIST *list, const char *value)
{
RC_STRING *s;
if (list) {
TAILQ_FOREACH(s, list, entries)
if (strcmp(s->value, value) == 0)
return s;
if (strcmp(s->value, value) == 0)
return s;
}
return NULL;
}
librc_hidden_def(rc_stringlist_find)
RC_STRINGLIST *rc_stringlist_split(const char *value, const char *sep)
RC_STRINGLIST *
rc_stringlist_split(const char *value, const char *sep)
{
RC_STRINGLIST *list = rc_stringlist_new();
char *d = xstrdup(value);
@ -107,7 +113,8 @@ RC_STRINGLIST *rc_stringlist_split(const char *value, const char *sep)
}
librc_hidden_def(rc_stringlist_split)
void rc_stringlist_sort(RC_STRINGLIST **list)
void
rc_stringlist_sort(RC_STRINGLIST **list)
{
RC_STRINGLIST *l = *list;
RC_STRINGLIST *new = rc_stringlist_new();
@ -119,7 +126,7 @@ void rc_stringlist_sort(RC_STRINGLIST **list)
TAILQ_FOREACH_SAFE(s, l, entries, sn) {
TAILQ_REMOVE(l, s, entries);
last = NULL;
TAILQ_FOREACH (n, new, entries) {
TAILQ_FOREACH(n, new, entries) {
if (strcmp (s->value, n->value) < 0)
break;
last = n;
@ -136,7 +143,8 @@ void rc_stringlist_sort(RC_STRINGLIST **list)
}
librc_hidden_def(rc_stringlist_sort)
void rc_stringlist_free(RC_STRINGLIST *list)
void
rc_stringlist_free(RC_STRINGLIST *list)
{
RC_STRING *s1;
RC_STRING *s2;

View File

@ -1,7 +1,7 @@
/*
librc
core RC functions
*/
librc
core RC functions
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -33,13 +33,13 @@ const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include "librc.h"
#ifdef __FreeBSD__
#include <sys/sysctl.h>
# include <sys/sysctl.h>
#endif
#define RC_RUNLEVEL RC_SVCDIR "/softlevel"
#ifndef S_IXUGO
# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
#endif
/* File stream used for plugins to write environ vars to */
@ -88,7 +88,7 @@ ls_dir(const char *dir, int options)
* This is important as a service maybe in a
* runlevel, but could have been removed. */
snprintf(file, sizeof(file), "%s/%s",
dir, d->d_name);
dir, d->d_name);
r = stat(file, &buf);
if (r != 0)
continue;
@ -130,7 +130,7 @@ rm_dir(const char *pathname, bool top)
strcmp(d->d_name, "..") != 0)
{
snprintf(file, sizeof(file),
"%s/%s", pathname, d->d_name);
"%s/%s", pathname, d->d_name);
if (stat(file, &s) != 0) {
retval = false;
break;
@ -229,12 +229,12 @@ rc_sys(void)
} else if (file_regex("/proc/cpuinfo", "UML"))
return RC_SYS_UML;
else if (file_regex("/proc/self/status",
"(s_context|VxID):[[:space:]]*[1-9]"))
"(s_context|VxID):[[:space:]]*[1-9]"))
return RC_SYS_VSERVER;
else if (exists("/proc/vz/veinfo") && !exists("/proc/vz/version"))
return RC_SYS_OPENVZ;
else if (file_regex("/proc/self/status",
"envID:[[:space:]]*[1-9]"))
"envID:[[:space:]]*[1-9]"))
return RC_SYS_OPENVZ; /* old test */
#endif
@ -349,7 +349,7 @@ rc_service_resolve(const char *service)
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s", "started", service);
if (lstat(file, &buf) || ! S_ISLNK(buf.st_mode)) {
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
"inactive", service);
"inactive", service);
if (lstat(file, &buf) || ! S_ISLNK(buf.st_mode))
*file = '\0';
}
@ -497,7 +497,7 @@ rc_service_in_runlevel(const char *service, const char *runlevel)
char file[PATH_MAX];
snprintf(file, sizeof(file), RC_RUNLEVELDIR "/%s/%s",
runlevel, basename_c(service));
runlevel, basename_c(service));
return exists(file);
}
librc_hidden_def(rc_service_in_runlevel)
@ -528,7 +528,7 @@ rc_service_mark(const char *service, const RC_SERVICE state)
}
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
rc_parse_service_state(state), base);
rc_parse_service_state(state), base);
if (exists(file))
unlink(file);
i = symlink(init, file);
@ -549,22 +549,22 @@ rc_service_mark(const char *service, const RC_SERVICE state)
s = rc_service_state_names[i].state;
if ((s != skip_state &&
s != RC_SERVICE_STOPPED &&
s != RC_SERVICE_HOTPLUGGED &&
s != RC_SERVICE_SCHEDULED) &&
s != RC_SERVICE_STOPPED &&
s != RC_SERVICE_HOTPLUGGED &&
s != RC_SERVICE_SCHEDULED) &&
(! skip_wasinactive || s != RC_SERVICE_WASINACTIVE))
{
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
rc_service_state_names[i].name, base);
rc_service_state_names[i].name, base);
if (exists(file)) {
if ((state == RC_SERVICE_STARTING ||
state == RC_SERVICE_STOPPING) &&
state == RC_SERVICE_STOPPING) &&
s == RC_SERVICE_INACTIVE)
{
snprintf(was, sizeof(was),
RC_SVCDIR "/%s/%s",
rc_parse_service_state(RC_SERVICE_WASINACTIVE),
base);
RC_SVCDIR "/%s/%s",
rc_parse_service_state(RC_SERVICE_WASINACTIVE),
base);
if (symlink(init, was) == -1)
return false;
skip_wasinactive = true;
@ -583,18 +583,18 @@ rc_service_mark(const char *service, const RC_SERVICE state)
state == RC_SERVICE_INACTIVE)
{
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
"exclusive", base);
"exclusive", base);
unlink(file);
}
/* Remove any options and daemons the service may have stored */
if (state == RC_SERVICE_STOPPED) {
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
"options", base);
"options", base);
rm_dir(file, true);
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
"daemons", base);
"daemons", base);
rm_dir(file, true);
rc_service_schedule_clear(service);
@ -606,7 +606,7 @@ rc_service_mark(const char *service, const RC_SERVICE state)
dirs = ls_dir(file, 0);
TAILQ_FOREACH(dir, dirs, entries) {
snprintf(was, sizeof(was), "%s/%s/%s",
file, dir->value, base);
file, dir->value, base);
unlink(was);
/* Try and remove the dir; we don't care about errors */
@ -634,7 +634,7 @@ rc_service_state(const char *service)
for (i = 0; rc_service_state_names[i].name; i++) {
snprintf(file, sizeof(file), RC_SVCDIR "/%s/%s",
rc_service_state_names[i].name, base);
rc_service_state_names[i].name, base);
if (exists(file)) {
if (rc_service_state_names[i].state <= 0x10)
state = rc_service_state_names[i].state;
@ -647,8 +647,8 @@ rc_service_state(const char *service)
dirs = ls_dir(RC_SVCDIR "/scheduled", 0);
TAILQ_FOREACH (dir, dirs, entries) {
snprintf(file, sizeof(file),
RC_SVCDIR "/scheduled/%s/%s",
dir->value, service);
RC_SVCDIR "/scheduled/%s/%s",
dir->value, service);
if (exists(file)) {
state |= RC_SERVICE_SCHEDULED;
break;
@ -670,7 +670,7 @@ rc_service_value_get(const char *service, const char *option)
char file[PATH_MAX];
snprintf(file, sizeof(file), RC_SVCDIR "/options/%s/%s",
service, option);
service, option);
if ((fp = fopen(file, "r"))) {
rc_getline(&line, &len, fp);
fclose(fp);
@ -682,7 +682,7 @@ librc_hidden_def(rc_service_value_get)
bool
rc_service_value_set(const char *service, const char *option,
const char *value)
const char *value)
{
FILE *fp;
char file[PATH_MAX];
@ -716,13 +716,13 @@ rc_service_schedule_start(const char *service, const char *service_to_start)
return false;
p += snprintf(file, sizeof(file), RC_SVCDIR "/scheduled/%s",
basename_c(service));
basename_c(service));
if (mkdir(file, 0755) != 0 && errno != EEXIST)
return false;
init = rc_service_resolve(service_to_start);
snprintf(p, sizeof(file) - (p - file),
"/%s", basename_c(service_to_start));
"/%s", basename_c(service_to_start));
retval = (exists(file) || symlink(init, file) == 0);
free(init);
return retval;
@ -735,7 +735,7 @@ rc_service_schedule_clear(const char *service)
char dir[PATH_MAX];
snprintf(dir, sizeof(dir), RC_SVCDIR "/scheduled/%s",
basename_c(service));
basename_c(service));
if (!rm_dir(dir, true) && errno == ENOENT)
return true;
return false;
@ -791,7 +791,7 @@ rc_services_in_state(RC_SERVICE state)
char *p = dir;
p += snprintf(dir, sizeof(dir), RC_SVCDIR "/%s",
rc_parse_service_state(state));
rc_parse_service_state(state));
if (state != RC_SERVICE_SCHEDULED)
return ls_dir(dir, LS_INITD);
@ -837,7 +837,7 @@ rc_service_add(const char *runlevel, const char *service)
i = init = rc_service_resolve(service);
snprintf(file, sizeof(file), RC_RUNLEVELDIR "/%s/%s",
runlevel, basename_c(service));
runlevel, basename_c(service));
/* We need to ensure that only things in /etc/init.d are added
* to the boot runlevel */
@ -868,7 +868,7 @@ rc_service_delete(const char *runlevel, const char *service)
char file[PATH_MAX];
snprintf(file, sizeof(file), RC_RUNLEVELDIR "/%s/%s",
runlevel, basename_c(service));
runlevel, basename_c(service));
if (unlink(file) == 0)
return true;
return false;
@ -885,7 +885,7 @@ rc_services_scheduled_by(const char *service)
TAILQ_FOREACH (dir, dirs, entries) {
snprintf(file, sizeof(file), RC_SVCDIR "/scheduled/%s/%s",
dir->value, service);
dir->value, service);
if (exists(file))
rc_stringlist_add(list, file);
}
@ -900,7 +900,7 @@ rc_services_scheduled(const char *service)
char dir[PATH_MAX];
snprintf(dir, sizeof(dir), RC_SVCDIR "/scheduled/%s",
basename_c(service));
basename_c(service));
return ls_dir(dir, LS_INITD);
}
librc_hidden_def(rc_services_scheduled)

View File

@ -25,15 +25,16 @@
*/
#if lint
# define _noreturn
# define _noreturn
#endif
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
# define _noreturn __attribute__ ((__noreturn__))
# define _noreturn __attribute__ ((__noreturn__))
#else
# define _noreturn
# define _noreturn
#endif
_noreturn static void usage(int exit_status)
_noreturn static void
usage(int exit_status)
{
const char * const has_arg[] = { "", "<arg>", "[arg]" };
int i;
@ -53,7 +54,7 @@ _noreturn static void usage(int exit_status)
printf("\n\nOptions: [" getoptstring "]\n");
for (i = 0; longopts[i].name; ++i) {
len = printf(" -%c, --%s %s", longopts[i].val, longopts[i].name,
has_arg[longopts[i].has_arg]);
has_arg[longopts[i].has_arg]);
lo = p = xstrdup(longopts_help[i]);
while ((token = strsep(&p, "\n"))) {

View File

@ -26,17 +26,17 @@
#define getoptstring_COMMON "Chqv"
#define longopts_COMMON \
{ "help", 0, NULL, 'h'}, \
{ "nocolor", 0, NULL, 'C'}, \
{ "verbose", 0, NULL, 'v'}, \
{ "quiet", 0, NULL, 'q'}, \
#define longopts_COMMON \
{ "help", 0, NULL, 'h'}, \
{ "nocolor", 0, NULL, 'C'}, \
{ "verbose", 0, NULL, 'v'}, \
{ "quiet", 0, NULL, 'q'}, \
{ NULL, 0, NULL, 0 }
#define longopts_help_COMMON \
"Display this help output", \
"Disable color output", \
"Run verbosely", \
#define longopts_help_COMMON \
"Display this help output", \
"Disable color output", \
"Run verbosely", \
"Run quietly"
#define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1);
@ -45,9 +45,9 @@
#define case_RC_COMMON_getopt_case_q setenv ("EINFO_QUIET", "YES", 1);
#define case_RC_COMMON_getopt_default usage (EXIT_FAILURE);
#define case_RC_COMMON_GETOPT \
case 'C': case_RC_COMMON_getopt_case_C; break; \
case 'h': case_RC_COMMON_getopt_case_h; break; \
case 'v': case_RC_COMMON_getopt_case_v; break; \
case 'q': case_RC_COMMON_getopt_case_q; break; \
#define case_RC_COMMON_GETOPT \
case 'C': case_RC_COMMON_getopt_case_C; break; \
case 'h': case_RC_COMMON_getopt_case_h; break; \
case 'v': case_RC_COMMON_getopt_case_v; break; \
case 'q': case_RC_COMMON_getopt_case_q; break; \
default: case_RC_COMMON_getopt_default; break;

View File

@ -1,8 +1,8 @@
/*
checkpath.c
Checks for the existance of a file or directory and creates it
if necessary. It can also correct its ownership.
*/
checkpath.c
Checks for the existance of a file or directory and creates it
if necessary. It can also correct its ownership.
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -49,7 +49,8 @@
extern const char *applet;
static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
static int
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
{
struct stat st;
int fd;
@ -57,8 +58,9 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
if (stat(path, &st)) {
if (file) {
einfo("%s: creating file", path);
if (! mode)
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
if (!mode)
mode = S_IRUSR | S_IWUSR | S_IRGRP |
S_IWGRP | S_IROTH;
if ((fd = open(path, O_CREAT, mode)) == -1) {
eerror("%s: open: %s", applet, strerror(errno));
return -1;
@ -66,17 +68,18 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
close (fd);
} else {
einfo("%s: creating directory", path);
if (! mode)
if (!mode)
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
if (mkdir(path, mode)) {
eerror("%s: mkdir: %s", applet, strerror (errno));
eerror("%s: mkdir: %s", applet,
strerror (errno));
return -1;
}
mode = 0;
}
} else {
if ((file && S_ISDIR(st.st_mode)) ||
(! file && ! S_ISDIR(st.st_mode)))
(!file && !S_ISDIR(st.st_mode)))
{
if (file)
eerror("%s: is a directory", path);
@ -106,8 +109,8 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
return 0;
}
static int parse_owner(struct passwd **user, struct group **group,
const char *owner)
static int
parse_owner(struct passwd **user, struct group **group, const char *owner)
{
char *u = xstrdup (owner);
char *g = strchr (u, ':');
@ -122,7 +125,7 @@ static int parse_owner(struct passwd **user, struct group **group,
*user = getpwuid((uid_t) id);
else
*user = getpwnam(u);
if (! *user)
if (*user == NULL)
retval = -1;
}
@ -131,7 +134,7 @@ static int parse_owner(struct passwd **user, struct group **group,
*group = getgrgid((gid_t) id);
else
*group = getgrnam(g);
if (! *group)
if (*group == NULL)
retval = -1;
}
@ -158,7 +161,8 @@ static const char * const longopts_help[] = {
};
#include "_usage.c"
int checkpath(int argc, char **argv)
int
checkpath(int argc, char **argv)
{
int opt;
uid_t uid = geteuid();
@ -170,7 +174,7 @@ int checkpath(int argc, char **argv)
int retval = EXIT_SUCCESS;
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'd':
@ -181,14 +185,16 @@ int checkpath(int argc, char **argv)
break;
case 'm':
if (parse_mode(&mode, optarg) != 0)
eerrorx("%s: invalid mode `%s'", applet, optarg);
eerrorx("%s: invalid mode `%s'",
applet, optarg);
break;
case 'o':
if (parse_owner(&pw, &gr, optarg) != 0)
eerrorx("%s: owner `%s' not found", applet, optarg);
eerrorx("%s: owner `%s' not found",
applet, optarg);
break;
case_RC_COMMON_GETOPT
case_RC_COMMON_GETOPT;
}
}

View File

@ -1,7 +1,7 @@
/*
fstabinfo.c
Gets information about /etc/fstab.
*/
fstabinfo.c
Gets information about /etc/fstab.
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -42,31 +42,31 @@
Okay, we could use getfsent but the man page says use getmntent instead
AND we don't have getfsent on uclibc or dietlibc for some odd reason. */
#ifdef __linux__
#define HAVE_GETMNTENT
#include <mntent.h>
#define ENT mntent
#define START_ENT fp = setmntent ("/etc/fstab", "r");
#define GET_ENT getmntent (fp)
#define GET_ENT_FILE(_name) getmntfile (_name)
#define END_ENT endmntent (fp)
#define ENT_BLOCKDEVICE(_ent) ent->mnt_fsname
#define ENT_FILE(_ent) ent->mnt_dir
#define ENT_TYPE(_ent) ent->mnt_type
#define ENT_OPTS(_ent) ent->mnt_opts
#define ENT_PASS(_ent) ent->mnt_passno
# define HAVE_GETMNTENT
# include <mntent.h>
# define ENT mntent
# define START_ENT fp = setmntent ("/etc/fstab", "r");
# define GET_ENT getmntent (fp)
# define GET_ENT_FILE(_name) getmntfile (_name)
# define END_ENT endmntent (fp)
# define ENT_BLOCKDEVICE(_ent) ent->mnt_fsname
# define ENT_FILE(_ent) ent->mnt_dir
# define ENT_TYPE(_ent) ent->mnt_type
# define ENT_OPTS(_ent) ent->mnt_opts
# define ENT_PASS(_ent) ent->mnt_passno
#else
#define HAVE_GETFSENT
#include <fstab.h>
#define ENT fstab
#define START_ENT
#define GET_ENT getfsent ()
#define GET_ENT_FILE(_name) getfsfile (_name)
#define END_ENT endfsent ()
#define ENT_BLOCKDEVICE(_ent) ent->fs_spec
#define ENT_TYPE(_ent) ent->fs_vfstype
#define ENT_FILE(_ent) ent->fs_file
#define ENT_OPTS(_ent) ent->fs_mntops
#define ENT_PASS(_ent) ent->fs_passno
# define HAVE_GETFSENT
# include <fstab.h>
# define ENT fstab
# define START_ENT
# define GET_ENT getfsent ()
# define GET_ENT_FILE(_name) getfsfile (_name)
# define END_ENT endfsent ()
# define ENT_BLOCKDEVICE(_ent) ent->fs_spec
# define ENT_TYPE(_ent) ent->fs_vfstype
# define ENT_FILE(_ent) ent->fs_file
# define ENT_OPTS(_ent) ent->fs_mntops
# define ENT_PASS(_ent) ent->fs_passno
#endif
#include "builtins.h"
@ -93,7 +93,8 @@ getmntfile(const char *file)
extern const char *applet;
static int do_mount(struct ENT *ent)
static int
do_mount(struct ENT *ent)
{
char *argv[8];
pid_t pid;
@ -176,7 +177,7 @@ fstabinfo(int argc, char **argv)
unsetenv("EINFO_QUIET");
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'M':
@ -199,7 +200,7 @@ fstabinfo(int argc, char **argv)
case '>':
if (sscanf(optarg + 1, "%d", &i) != 1)
eerrorx("%s: invalid passno %s",
argv[0], optarg + 1);
argv[0], optarg + 1);
filtered = true;
opt = optarg[0];
@ -212,7 +213,7 @@ fstabinfo(int argc, char **argv)
(opt == '<' && i > p && p != 0) ||
(opt == '>' && i < p && p != 0))
rc_stringlist_add(files,
ENT_FILE(ent));
ENT_FILE(ent));
}
END_ENT;
break;
@ -222,7 +223,7 @@ fstabinfo(int argc, char **argv)
output = OUTPUT_PASSNO;
break;
}
break;
break;
case 't':
filtered = true;
@ -230,13 +231,14 @@ fstabinfo(int argc, char **argv)
START_ENT;
while ((ent = GET_ENT))
if (strcmp(token, ENT_TYPE(ent)) == 0)
rc_stringlist_add(files, ENT_FILE(ent));
rc_stringlist_add(files,
ENT_FILE(ent));
END_ENT;
}
break;
case_RC_COMMON_GETOPT
}
}
}
if (optind < argc) {
@ -246,7 +248,8 @@ fstabinfo(int argc, char **argv)
if (strcmp(argv[i], file->value) == 0)
break;
if (i >= argc)
rc_stringlist_delete(files, file->value);
rc_stringlist_delete(files,
file->value);
}
} else {
while (optind < argc)
@ -290,10 +293,10 @@ fstabinfo(int argc, char **argv)
case OUTPUT_MOUNTARGS:
printf("-o %s -t %s %s %s\n",
ENT_OPTS(ent),
ENT_TYPE(ent),
ENT_BLOCKDEVICE(ent),
file->value);
ENT_OPTS(ent),
ENT_TYPE(ent),
ENT_BLOCKDEVICE(ent),
file->value);
break;
case OUTPUT_OPTIONS:

View File

@ -1,7 +1,7 @@
/*
mountinfo.c
Obtains information about mounted filesystems.
*/
mountinfo.c
Obtains information about mounted filesystems.
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -33,15 +33,15 @@
#include <sys/param.h>
#if defined(__DragonFly__) || defined(__FreeBSD__)
# include <sys/ucred.h>
# include <sys/mount.h>
# define F_FLAGS f_flags
# include <sys/ucred.h>
# include <sys/mount.h>
# define F_FLAGS f_flags
#elif defined(BSD)
# include <sys/statvfs.h>
# define statfs statvfs
# define F_FLAGS f_flag
# include <sys/statvfs.h>
# define statfs statvfs
# define F_FLAGS f_flag
#elif defined (__linux__)
#include <mntent.h>
# include <mntent.h>
#endif
#include <errno.h>
@ -84,9 +84,10 @@ struct args {
net_opts netdev;
};
static int process_mount(RC_STRINGLIST *list, struct args *args,
char *from, char *to, char *fstype, char *options,
int netdev)
static int
process_mount(RC_STRINGLIST *list, struct args *args,
char *from, char *to, char *fstype, char *options,
int netdev)
{
char *p;
RC_STRING *s;
@ -105,7 +106,7 @@ static int process_mount(RC_STRINGLIST *list, struct args *args,
if (netdev != 0)
return 1;
} else if (args->netdev == net_no &&
(netdev != -1 || TAILQ_FIRST(args->mounts)))
(netdev != -1 || TAILQ_FIRST(args->mounts)))
{
if (netdev != 1)
return 1;
@ -134,8 +135,8 @@ static int process_mount(RC_STRINGLIST *list, struct args *args,
if (TAILQ_FIRST(args->mounts)) {
TAILQ_FOREACH(s, args->mounts, entries)
if (strcmp(s->value, to) == 0)
break;
if (strcmp(s->value, to) == 0)
break;
if (! s)
return -1;
}
@ -211,7 +212,8 @@ static struct opt {
{ 0, NULL }
};
static RC_STRINGLIST *find_mounts(struct args *args)
static RC_STRINGLIST *
find_mounts(struct args *args)
{
struct statfs *mnts;
int nmnts;
@ -238,9 +240,11 @@ static RC_STRINGLIST *find_mounts(struct args *args)
if (! options)
options = xstrdup(o->o_name);
else {
l = strlen(options) + strlen(o->o_name) + 2;
l = strlen(options) +
strlen(o->o_name) + 2;
tmp = xmalloc(sizeof (char) * l);
snprintf(tmp, l, "%s,%s", options, o->o_name);
snprintf(tmp, l, "%s,%s", options,
o->o_name);
free(options);
options = tmp;
}
@ -249,11 +253,11 @@ static RC_STRINGLIST *find_mounts(struct args *args)
}
process_mount(list, args,
mnts[i].f_mntfromname,
mnts[i].f_mntonname,
mnts[i].f_fstypename,
options,
netdev);
mnts[i].f_mntfromname,
mnts[i].f_mntonname,
mnts[i].f_fstypename,
options,
netdev);
free(options);
options = NULL;
@ -263,7 +267,8 @@ static RC_STRINGLIST *find_mounts(struct args *args)
}
#elif defined (__linux__)
static struct mntent *getmntfile(const char *file)
static struct mntent *
getmntfile(const char *file)
{
struct mntent *ent = NULL;
FILE *fp;
@ -277,7 +282,8 @@ static struct mntent *getmntfile(const char *file)
return ent;
}
static RC_STRINGLIST *find_mounts(struct args *args)
static RC_STRINGLIST *
find_mounts(struct args *args)
{
FILE *fp;
char *buffer;
@ -321,7 +327,8 @@ static RC_STRINGLIST *find_mounts(struct args *args)
# error "Operating system not supported!"
#endif
static regex_t *get_regex(const char *string)
static regex_t *
get_regex(const char *string)
{
regex_t *reg = xmalloc(sizeof (*reg));
int result;
@ -373,7 +380,8 @@ static const char * const longopts_help[] = {
};
#include "_usage.c"
int mountinfo(int argc, char **argv)
int
mountinfo(int argc, char **argv)
{
struct args args;
regex_t *point_regex = NULL;
@ -387,10 +395,10 @@ int mountinfo(int argc, char **argv)
/* Ensure that we are only quiet when explicitly told to be */
unsetenv("EINFO_QUIET");
#define DO_REG(_var) \
if (_var) free(_var); \
#define DO_REG(_var) \
if (_var) free(_var); \
_var = get_regex(optarg);
#define REG_FREE(_var) \
#define REG_FREE(_var) \
if (_var) { regfree(_var); free(_var); }
memset (&args, 0, sizeof(args));
@ -399,7 +407,7 @@ int mountinfo(int argc, char **argv)
args.mounts = rc_stringlist_new();
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'e':
@ -442,13 +450,14 @@ int mountinfo(int argc, char **argv)
args.mount_type = mount_from;
break;
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
}
while (optind < argc) {
if (argv[optind][0] != '/')
eerrorx("%s: `%s' is not a mount point", argv[0], argv[optind]);
eerrorx("%s: `%s' is not a mount point",
argv[0], argv[optind]);
rc_stringlist_add(args.mounts, argv[optind++]);
}
nodes = find_mounts(&args);

View File

@ -1,10 +1,10 @@
/*
rc-applets.c
rc-applets.c
Handle multicall applets for use in our init scripts.
Basically this makes us a lot faster for the most part, and removes
any shell incompatabilities we might otherwise encounter.
*/
Handle multicall applets for use in our init scripts.
Basically this makes us a lot faster for the most part, and removes
any shell incompatabilities we might otherwise encounter.
*/
/*
* Copyright 2007-2009 Roy Marples <roy@marples.name>
@ -60,7 +60,8 @@
/* Applet is first parsed in rc.c - no point in doing it again */
extern const char *applet;
static int syslog_decode(char *name, CODE *codetab)
static int
syslog_decode(char *name, CODE *codetab)
{
CODE *c;
@ -74,7 +75,8 @@ static int syslog_decode(char *name, CODE *codetab)
return -1;
}
static int do_e(int argc, char **argv)
static int
do_e(int argc, char **argv)
{
int retval = EXIT_SUCCESS;
int i;
@ -93,12 +95,12 @@ static int do_e(int argc, char **argv)
if (strcmp(applet, "eval_ecolors") == 0) {
printf("GOOD='%s'\nWARN='%s'\nBAD='%s'\nHILITE='%s'\nBRACKET='%s'\nNORMAL='%s'\n",
ecolor(ECOLOR_GOOD),
ecolor(ECOLOR_WARN),
ecolor(ECOLOR_BAD),
ecolor(ECOLOR_HILITE),
ecolor(ECOLOR_BRACKET),
ecolor(ECOLOR_NORMAL));
ecolor(ECOLOR_GOOD),
ecolor(ECOLOR_WARN),
ecolor(ECOLOR_BAD),
ecolor(ECOLOR_HILITE),
ecolor(ECOLOR_BRACKET),
ecolor(ECOLOR_NORMAL));
exit(EXIT_SUCCESS);
}
@ -120,9 +122,10 @@ static int do_e(int argc, char **argv)
argv++;
}
} else if (strcmp(applet, "esyslog") == 0 ||
strcmp(applet, "elog") == 0) {
strcmp(applet, "elog") == 0) {
p = strchr(argv[0], '.');
if (!p || (level = syslog_decode(p + 1, prioritynames)) == -1)
if (!p ||
(level = syslog_decode(p + 1, prioritynames)) == -1)
eerrorx("%s: invalid log level `%s'", applet, argv[0]);
if (argc < 3)
@ -160,7 +163,7 @@ static int do_e(int argc, char **argv)
if (timercmp(&now, &stop, <))
continue;
eendv(EXIT_FAILURE,
"timed out waiting for %s", argv[i]);
"timed out waiting for %s", argv[i]);
return EXIT_FAILURE;
}
eendv(EXIT_SUCCESS, NULL);
@ -251,7 +254,8 @@ static int do_e(int argc, char **argv)
return retval;
}
static int do_service(int argc, char **argv)
static int
do_service(int argc, char **argv)
{
bool ok = false;
char *service;
@ -263,7 +267,7 @@ static int do_service(int argc, char **argv)
else
service = getenv("RC_SVCNAME");
if (! service || *service == '\0')
if (service == NULL || *service == '\0')
eerrorx("%s: no service specified", applet);
if (strcmp(applet, "service_started") == 0)
@ -297,15 +301,16 @@ static int do_service(int argc, char **argv)
} else if (strcmp(applet, "service_crashed") == 0) {
ok = (_rc_can_find_pids() &&
rc_service_daemons_crashed(service) &&
errno != EACCES);
rc_service_daemons_crashed(service) &&
errno != EACCES);
} else
eerrorx("%s: unknown applet", applet);
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
static int do_mark_service(int argc, char **argv)
static int
do_mark_service(int argc, char **argv)
{
bool ok = false;
char *svcname = getenv("RC_SVCNAME");
@ -320,7 +325,7 @@ static int do_mark_service(int argc, char **argv)
else
service = getenv("RC_SVCNAME");
if (! service || *service == '\0')
if (service == NULL || *service == '\0')
eerrorx("%s: no service specified", applet);
if (strcmp(applet, "mark_service_started") == 0)
@ -340,22 +345,22 @@ static int do_mark_service(int argc, char **argv)
else
eerrorx("%s: unknown applet", applet);
/* If we're marking ourselves then we need to inform our parent runscript
process so they do not mark us based on our exit code */
/* If we're marking ourselves then we need to inform our parent
runscript process so they do not mark us based on our exit code */
if (ok && svcname && strcmp(svcname, service) == 0) {
runscript_pid = getenv("RC_RUNSCRIPT_PID");
if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
if (kill(pid, SIGHUP) != 0)
eerror("%s: failed to signal parent %d: %s",
applet, pid, strerror(errno));
applet, pid, strerror(errno));
/* Remove the exclusive time test. This ensures that it's not
in control as well */
l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
strlen(runscript_pid) + 4;
strlen(runscript_pid) + 4;
mtime = xmalloc(l);
snprintf(mtime, l, RC_SVCDIR "/exclusive/%s.%s",
svcname, runscript_pid);
svcname, runscript_pid);
if (exists(mtime) && unlink(mtime) != 0)
eerror("%s: unlink: %s", applet, strerror(errno));
free(mtime);
@ -364,13 +369,14 @@ static int do_mark_service(int argc, char **argv)
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
static int do_value(int argc, char **argv)
static int
do_value(int argc, char **argv)
{
bool ok = false;
char *service = getenv("RC_SVCNAME");
char *option;
if (! service)
if (service == NULL)
eerrorx("%s: no service specified", applet);
if (argc < 2 || ! argv[1] || *argv[1] == '\0')
@ -386,7 +392,7 @@ static int do_value(int argc, char **argv)
ok = true;
}
} else if (strcmp(applet, "service_set_value") == 0 ||
strcmp(applet, "save_options") == 0)
strcmp(applet, "save_options") == 0)
ok = rc_service_value_set(service, argv[1], argv[2]);
else
eerrorx("%s: unknown applet", applet);
@ -394,7 +400,8 @@ static int do_value(int argc, char **argv)
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
static int do_shell_var(int argc, char **argv)
static int
do_shell_var(int argc, char **argv)
{
int i;
char *p;
@ -402,10 +409,8 @@ static int do_shell_var(int argc, char **argv)
for (i = 1; i < argc; i++) {
p = argv[i];
if (i != 1)
putchar(' ');
while (*p) {
c = (unsigned char)*p++;
if (! isalnum(c))
@ -414,11 +419,11 @@ static int do_shell_var(int argc, char **argv)
}
}
putchar('\n');
return EXIT_SUCCESS;
}
void run_applets(int argc, char **argv)
void
run_applets(int argc, char **argv)
{
int i = 2;
char *p;
@ -436,7 +441,7 @@ void run_applets(int argc, char **argv)
else if (strcmp(applet, "rc-status") == 0)
exit(rc_status(argc, argv));
else if (strcmp(applet, "rc-update") == 0 ||
strcmp(applet, "update-rc") == 0)
strcmp(applet, "update-rc") == 0)
exit(rc_update(argc, argv));
else if (strcmp(applet, "runscript") == 0)
exit(runscript(argc, argv));
@ -498,7 +503,7 @@ void run_applets(int argc, char **argv)
if (p && sscanf(p, "%d", &pid) == 1) {
if (kill(pid, SIGUSR1) != 0)
eerrorx("rc-abort: failed to signal parent %d: %s",
pid, strerror(errno));
pid, strerror(errno));
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);

View File

@ -1,7 +1,7 @@
/*
rc-depend
rc service dependency and ordering
*/
rc-depend
rc service dependency and ordering
*/
/*
* Copyright 2007-2009 Roy Marples <roy@marples.name>
@ -85,7 +85,7 @@ _rc_deptree_load(int force, int *regen) {
if (st.st_mtime < t) {
eerror("Clock skew detected with `%s'", file);
eerrorn("Adjusting mtime of `" RC_DEPTREE_CACHE
"' to %s", ctime(&t));
"' to %s", ctime(&t));
fp = fopen(RC_DEPTREE_SKEWED, "w");
if (fp != NULL) {
fprintf(fp, "%s\n", file);
@ -144,7 +144,7 @@ rc_depend(int argc, char **argv)
types = rc_stringlist_new();
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'a':
@ -167,8 +167,8 @@ rc_depend(int argc, char **argv)
options &= RC_DEP_TRACE;
break;
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
}
if (!(deptree = _rc_deptree_load(update, NULL)))
@ -185,7 +185,7 @@ rc_depend(int argc, char **argv)
depends = rc_deptree_depends(deptree, NULL, list, runlevel, 0);
if (!depends && errno == ENOENT)
eerror("no dependency info for service `%s'",
argv[optind]);
argv[optind]);
else
rc_stringlist_add(services, argv[optind]);
@ -210,7 +210,7 @@ rc_depend(int argc, char **argv)
}
depends = rc_deptree_depends(deptree, types, services,
runlevel, options);
runlevel, options);
if (TAILQ_FIRST(depends)) {
TAILQ_FOREACH(s, depends, entries) {

View File

@ -1,8 +1,8 @@
/*
rc-logger.c
Spawns a logging daemon to capture stdout and stderr so we can log
them to a buffer and/or files.
*/
rc-logger.c
Spawns a logging daemon to capture stdout and stderr so we can log
them to a buffer and/or files.
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -46,11 +46,11 @@
#include <unistd.h>
#ifdef __linux__
# include <pty.h>
# include <pty.h>
#elif defined(__NetBSD__) || defined(__OpenBSD__)
# include <util.h>
# include <util.h>
#else
# include <libutil.h>
# include <libutil.h>
#endif
#include "einfo.h"
@ -60,7 +60,7 @@
#define LOGFILE RC_SVCDIR "/rc.log"
#define PERMLOG "/var/log/rc.log"
#define MOVELOG "cat " LOGFILE " 2>/dev/null >>" PERMLOG " && " \
#define MOVELOG "cat " LOGFILE " 2>/dev/null >>" PERMLOG " && " \
"rm -f " LOGFILE
static int signal_pipe[2] = { -1, -1 };
@ -78,11 +78,12 @@ pid_t rc_logger_pid = -1;
int rc_logger_tty = -1;
bool rc_in_logger = false;
static void write_log(int logfd, const char *buffer, size_t bytes)
static void
write_log(int logfd, const char *buffer, size_t bytes)
{
const char *p = buffer;
while ((size_t) (p - buffer) < bytes) {
while ((size_t)(p - buffer) < bytes) {
switch (*p) {
case '\r':
goto cont;
@ -110,7 +111,9 @@ cont:
p++;
}
}
static void write_time(FILE *f, const char *s)
static void
write_time(FILE *f, const char *s)
{
time_t now = time(NULL);
struct tm *tm = localtime(&now);
@ -119,7 +122,8 @@ static void write_time(FILE *f, const char *s)
fflush(f);
}
void rc_logger_close(void)
void
rc_logger_close(void)
{
int sig = SIGTERM;
@ -138,7 +142,8 @@ void rc_logger_close(void)
dup2(fd_stderr, STDERR_FILENO);
}
void rc_logger_open(const char *level)
void
rc_logger_open(const char *level)
{
int slave_tty;
struct termios tt;
@ -157,7 +162,7 @@ void rc_logger_open(const char *level)
eerrorx("pipe: %s", strerror(errno));
for (i = 0; i < 2; i++)
if ((s = fcntl (signal_pipe[i], F_GETFD, 0) == -1 ||
fcntl (signal_pipe[i], F_SETFD, s | FD_CLOEXEC) == -1))
fcntl (signal_pipe[i], F_SETFD, s | FD_CLOEXEC) == -1))
eerrorx("fcntl: %s", strerror (errno));
if (isatty(STDOUT_FILENO)) {
@ -202,36 +207,38 @@ void rc_logger_open(const char *level)
if (rc_logger_tty >= 0)
fd[1].fd = rc_logger_tty;
for (;;) {
if ((s = poll(fd, rc_logger_tty >= 0 ? 2 : 1, -1)) == -1) {
if ((s = poll(fd,
rc_logger_tty >= 0 ? 2 : 1, -1)) == -1)
{
eerror("poll: %s", strerror(errno));
break;
}
} else if (s == 0)
continue;
if (s > 0) {
if (fd[1].revents & (POLLIN | POLLHUP)) {
memset(buffer, 0, BUFSIZ);
bytes = read(rc_logger_tty, buffer, BUFSIZ);
write(STDOUT_FILENO, buffer, bytes);
if (fd[1].revents & (POLLIN | POLLHUP)) {
memset(buffer, 0, BUFSIZ);
bytes = read(rc_logger_tty, buffer, BUFSIZ);
write(STDOUT_FILENO, buffer, bytes);
if (log)
write_log(fileno (log), buffer, bytes);
else {
if (logbuf_size - logbuf_len < bytes) {
logbuf_size += BUFSIZ * 10;
logbuf = xrealloc(logbuf,
sizeof(char ) *
logbuf_size);
}
memcpy(logbuf + logbuf_len, buffer, bytes);
logbuf_len += bytes;
if (log)
write_log(fileno (log), buffer, bytes);
else {
if (logbuf_size - logbuf_len < bytes) {
logbuf_size += BUFSIZ * 10;
logbuf = xrealloc(logbuf,
sizeof(char ) *
logbuf_size);
}
}
/* Only SIGTERMS signals come down this pipe */
if (fd[0].revents & (POLLIN | POLLHUP))
break;
memcpy(logbuf + logbuf_len,
buffer, bytes);
logbuf_len += bytes;
}
}
/* Only SIGTERMS signals come down this pipe */
if (fd[0].revents & (POLLIN | POLLHUP))
break;
}
free(buffer);
if (logbuf) {
@ -246,10 +253,9 @@ void rc_logger_open(const char *level)
fclose(log);
}
/* Try and cat our new logfile to a more permament location and then
* punt it */
/* Try and cat our new logfile to a more permament location
and then punt it */
system(MOVELOG);
exit(0);
/* NOTREACHED */

View File

@ -1,7 +1,7 @@
/*
librc-misc.c
rc misc functions
*/
librc-misc.c
rc misc functions
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -34,8 +34,8 @@
#include <sys/utsname.h>
#ifdef __linux__
#include <sys/sysinfo.h>
#include <regex.h>
# include <sys/sysinfo.h>
# include <regex.h>
#endif
#include <ctype.h>
@ -244,7 +244,8 @@ env_config(void)
if (sys)
setenv("RC_SYS", sys, 1);
/* Some scripts may need to take a different code path if Linux/FreeBSD, etc
/* Some scripts may need to take a different code path if
Linux/FreeBSD, etc
To save on calling uname, we store it in an environment variable */
if (uname(&uts) == 0)
setenv("RC_UNAME", uts.sysname, 1);
@ -346,7 +347,7 @@ exec_service(const char *service, const char *arg)
/* Safe to run now */
execl(file, file, "--lockfd", sfd, arg, (char *) NULL);
fprintf(stderr, "unable to exec `%s': %s\n",
file, strerror(errno));
file, strerror(errno));
svc_unlock(basename_c(service), fd);
_exit(EXIT_FAILURE);
}

View File

@ -1,7 +1,7 @@
/*
librc-plugin.c
Simple plugin handler
*/
librc-plugin.c
Simple plugin handler
*/
/*
* Copyright 2007-2008 Roy Marples <roy@marples.name>
@ -62,7 +62,8 @@ typedef struct plugin
TAILQ_HEAD(, plugin) plugins;
#ifndef __FreeBSD__
dlfunc_t dlfunc(void * __restrict handle, const char * __restrict symbol)
dlfunc_t
dlfunc(void * __restrict handle, const char * __restrict symbol)
{
union {
void *d;
@ -74,7 +75,8 @@ dlfunc_t dlfunc(void * __restrict handle, const char * __restrict symbol)
}
#endif
void rc_plugin_load(void)
void
rc_plugin_load(void)
{
DIR *dp;
struct dirent *d;
@ -89,7 +91,7 @@ void rc_plugin_load(void)
TAILQ_INIT(&plugins);
if (! (dp = opendir(RC_PLUGINDIR)))
if (!(dp = opendir(RC_PLUGINDIR)))
return;
while ((d = readdir(dp))) {
@ -98,14 +100,16 @@ void rc_plugin_load(void)
snprintf(file, sizeof(file), RC_PLUGINDIR "/%s", d->d_name);
h = dlopen(file, RTLD_LAZY);
if (! h) {
if (h == NULL) {
eerror("dlopen: %s", dlerror());
continue;
}
fptr = (int (*)(RC_HOOK, const char*))dlfunc(h, RC_PLUGIN_HOOK);
if (! fptr) {
eerror("%s: cannot find symbol `%s'", d->d_name, RC_PLUGIN_HOOK);
fptr = (int (*)(RC_HOOK, const char*))
dlfunc(h, RC_PLUGIN_HOOK);
if (fptr == NULL) {
eerror("%s: cannot find symbol `%s'",
d->d_name, RC_PLUGIN_HOOK);
dlclose(h);
} else {
plugin = xmalloc(sizeof(*plugin));
@ -118,7 +122,8 @@ void rc_plugin_load(void)
closedir(dp);
}
int rc_waitpid(pid_t pid)
int
rc_waitpid(pid_t pid)
{
int status;
@ -131,7 +136,8 @@ int rc_waitpid(pid_t pid)
return status;
}
void rc_plugin_run(RC_HOOK hook, const char *value)
void
rc_plugin_run(RC_HOOK hook, const char *value)
{
PLUGIN *plugin;
struct sigaction sa;
@ -234,7 +240,8 @@ void rc_plugin_run(RC_HOOK hook, const char *value)
}
}
void rc_plugin_unload(void)
void
rc_plugin_unload(void)
{
PLUGIN *plugin = TAILQ_FIRST(&plugins);
PLUGIN *next;

View File

@ -1,7 +1,7 @@
/*
rc-service.c
Finds all OpenRC services
*/
rc-service.c
Finds all OpenRC services
*/
/*
* Copyright 2008 Roy Marples <roy@marples.name>
@ -70,7 +70,7 @@ rc_service(int argc, char **argv)
unsetenv("EINFO_QUIET");
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'e':
@ -87,7 +87,7 @@ rc_service(int argc, char **argv)
return EXIT_FAILURE;
rc_stringlist_sort(&list);
TAILQ_FOREACH(s, list, entries)
printf("%s\n", s->value);
printf("%s\n", s->value);
#ifdef DEBUG_MEMORY
rc_stringlist_free(list);
#endif
@ -104,8 +104,8 @@ rc_service(int argc, char **argv)
return EXIT_SUCCESS;
/* NOTREACHED */
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
}
argc -= optind;

View File

@ -1,7 +1,7 @@
/*
rc-update
Manage init scripts and runlevels
*/
rc-update
Manage init scripts and runlevels
*/
/*
* Copyright 2007-2009 Roy Marples <roy@marples.name>
@ -57,19 +57,21 @@ add(const char *runlevel, const char *service)
if (!rc_service_exists(service)) {
if (errno == ENOEXEC)
eerror("%s: service `%s' is not executeable", applet, service);
eerror("%s: service `%s' is not executeable",
applet, service);
else
eerror("%s: service `%s' does not exist", applet, service);
eerror("%s: service `%s' does not exist",
applet, service);
} else if (rc_service_in_runlevel(service, runlevel)) {
ewarn ("%s: %s already installed in runlevel `%s'; skipping",
applet, service, runlevel);
applet, service, runlevel);
retval = 0;
} else if (rc_service_add(runlevel, service)) {
einfo ("%s added to runlevel %s", service, runlevel);
retval = 1;
} else
eerror("%s: failed to add service `%s' to runlevel `%s': %s",
applet, service, runlevel, strerror (errno));
applet, service, runlevel, strerror (errno));
return retval;
}
@ -87,10 +89,10 @@ delete(const char *runlevel, const char *service)
if (errno == ENOENT)
eerror ("%s: service `%s' is not in the runlevel `%s'",
applet, service, runlevel);
applet, service, runlevel);
else
eerror ("%s: failed to remove service `%s' from runlevel `%s': %s",
applet, service, runlevel, strerror (errno));
applet, service, runlevel, strerror (errno));
return retval;
}
@ -112,7 +114,7 @@ show(RC_STRINGLIST *runlevels, bool verbose)
TAILQ_FOREACH(runlevel, runlevels, entries) {
if (rc_service_in_runlevel(service->value,
runlevel->value))
runlevel->value))
{
rc_stringlist_add(in, runlevel->value);
inone = true;
@ -127,7 +129,7 @@ show(RC_STRINGLIST *runlevels, bool verbose)
if (inone || verbose) {
printf(" %20s |", service->value);
TAILQ_FOREACH(runlevel, in, entries)
printf (" %s", runlevel->value);
printf (" %s", runlevel->value);
printf ("\n");
}
rc_stringlist_free(in);
@ -137,9 +139,9 @@ show(RC_STRINGLIST *runlevels, bool verbose)
}
#include "_usage.h"
#define usagestring "" \
"Usage: rc-update [options] add service <runlevel>\n" \
" rc-update [options] del service <runlevel>\n" \
#define usagestring "" \
"Usage: rc-update [options] add service <runlevel>\n" \
" rc-update [options] del service <runlevel>\n" \
" rc-update [options] show"
#define getoptstring "u" getoptstring_COMMON
static const struct option longopts[] = {
@ -172,13 +174,13 @@ rc_update(int argc, char **argv)
int ret;
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *)0)) != -1)
longopts, (int *)0)) != -1)
switch (opt) {
case 'u':
_rc_deptree_load(-1, &ret);
return ret;
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
verbose = rc_yesno(getenv ("EINFO_VERBOSE"));
@ -192,14 +194,15 @@ rc_update(int argc, char **argv)
if (strcmp(argv[optind], "add") == 0)
action = DOADD;
else if (strcmp(argv[optind], "delete") == 0 ||
strcmp(argv[optind], "del") == 0)
strcmp(argv[optind], "del") == 0)
action = DODELETE;
else if (strcmp(argv[optind], "show") == 0)
action = DOSHOW;
if (action)
optind++;
else
eerrorx("%s: invalid command `%s'", applet, argv[optind]);
eerrorx("%s: invalid command `%s'",
applet, argv[optind]);
}
if (!action)
action = DOSHOW;
@ -219,7 +222,7 @@ rc_update(int argc, char **argv)
else {
rc_stringlist_free(runlevels);
eerrorx ("%s: `%s' is not a valid runlevel",
applet, argv[optind]);
applet, argv[optind]);
}
}
@ -254,13 +257,13 @@ rc_update(int argc, char **argv)
if (!TAILQ_FIRST(runlevels)) {
free(runlevels);
eerrorx ("%s: no runlevels found", applet);
eerrorx("%s: no runlevels found", applet);
}
TAILQ_FOREACH(runlevel, runlevels, entries) {
if (!rc_runlevel_exists(runlevel->value)) {
eerror ("%s: runlevel `%s' does not exist",
applet, runlevel->value);
applet, runlevel->value);
continue;
}
@ -273,8 +276,8 @@ rc_update(int argc, char **argv)
if (retval == EXIT_SUCCESS &&
num_updated == 0 && action & DODELETE)
ewarnx("%s: service `%s' not found in any"
" of the specified runlevels",
applet, service);
" of the specified runlevels",
applet, service);
}
}

View File

@ -44,7 +44,7 @@ const char rc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include <sys/wait.h>
#ifdef __linux__
# include <asm/setup.h> /* for COMMAND_LINE_SIZE */
# include <asm/setup.h> /* for COMMAND_LINE_SIZE */
#endif
#include <errno.h>
@ -108,17 +108,17 @@ clean_failed(void)
while ((d = readdir(dp))) {
if (d->d_name[0] == '.' &&
(d->d_name[1] == '\0' ||
(d->d_name[1] == '.' && d->d_name[2] == '\0')))
(d->d_name[1] == '.' && d->d_name[2] == '\0')))
continue;
l = strlen(RC_SVCDIR "/failed/") +
strlen(d->d_name) + 1;
strlen(d->d_name) + 1;
path = xmalloc(sizeof(char) * l);
snprintf(path, l, RC_SVCDIR "/failed/%s", d->d_name);
if (path) {
if (unlink(path))
eerror("%s: unlink `%s': %s",
applet, path, strerror(errno));
applet, path, strerror(errno));
free(path);
}
}
@ -217,8 +217,8 @@ read_key(bool block)
if (!isatty(fd))
return false;
/* Now save our terminal settings. We need to restore them at exit as we
* will be changing it for non-blocking reads for Interactive */
/* Now save our terminal settings. We need to restore them at exit as
we will be changing it for non-blocking reads for Interactive */
if (!termios_orig) {
termios_orig = xmalloc(sizeof(*termios_orig));
tcgetattr(fd, termios_orig);
@ -301,7 +301,7 @@ run_program(const char *prog)
execl(prog, prog, (char *) NULL);
eerror("%s: unable to exec `%s': %s", applet, prog,
strerror(errno));
strerror(errno));
_exit(EXIT_FAILURE);
}
@ -323,7 +323,7 @@ sulogin(bool cont)
{
execl("/sbin/halt", "/sbin/halt", "-f", (char *) NULL);
eerrorx("%s: unable to exec `/sbin/halt': %s",
applet, strerror(errno));
applet, strerror(errno));
}
#endif
if (!cont) {
@ -343,7 +343,7 @@ single_user(void)
rc_logger_close();
execl(SHUTDOWN, SHUTDOWN, "now", (char *) NULL);
eerrorx("%s: unable to exec `" SHUTDOWN "': %s",
applet, strerror(errno));
applet, strerror(errno));
}
static bool
@ -359,7 +359,7 @@ set_krunlevel(const char *level)
if (exists(RC_KRUNLEVEL) &&
unlink(RC_KRUNLEVEL) != 0)
eerror("unlink `%s': %s", RC_KRUNLEVEL,
strerror(errno));
strerror(errno));
return false;
}
@ -409,11 +409,11 @@ remove_pid(pid_t pid)
RC_PID *p;
LIST_FOREACH(p, &service_pids, entries)
if (p->pid == pid) {
LIST_REMOVE(p, entries);
free(p);
return;
}
if (p->pid == pid) {
LIST_REMOVE(p, entries);
free(p);
return;
}
}
static void
@ -484,7 +484,7 @@ handle_signal(int sig)
/* Kill any running services we have started */
LIST_FOREACH(pi, &service_pids, entries)
kill(pi->pid, SIGTERM);
kill(pi->pid, SIGTERM);
/* Notify plugins we are aborting */
rc_plugin_run(RC_HOOK_ABORT, NULL);
@ -514,15 +514,15 @@ do_sysinit()
uname(&uts);
printf("\n %sOpenRC %s" VERSION "%s is starting up %s",
ecolor(ECOLOR_GOOD), ecolor(ECOLOR_HILITE),
ecolor(ECOLOR_NORMAL), ecolor(ECOLOR_BRACKET));
ecolor(ECOLOR_GOOD), ecolor(ECOLOR_HILITE),
ecolor(ECOLOR_NORMAL), ecolor(ECOLOR_BRACKET));
#ifdef BRANDING
printf(BRANDING " (%s)", uts.machine);
#else
printf("%s %s (%s)",
uts.sysname,
uts.release,
uts.machine);
uts.sysname,
uts.release,
uts.machine);
#endif
if ((sys = rc_sys()))
@ -533,7 +533,7 @@ do_sysinit()
if (!rc_yesno(getenv ("EINFO_QUIET")) &&
rc_conf_yesno("rc_interactive"))
printf("Press %sI%s to enter interactive boot mode\n\n",
ecolor(ECOLOR_GOOD), ecolor(ECOLOR_NORMAL));
ecolor(ECOLOR_GOOD), ecolor(ECOLOR_NORMAL));
setenv("RC_RUNLEVEL", RC_LEVEL_SYSINIT, 1);
run_program(INITSH);
@ -611,13 +611,14 @@ do_stop_services(const char *newlevel, bool parallel)
if (!svc1) {
tmplist = rc_stringlist_new();
rc_stringlist_add(tmplist, service->value);
deporder = rc_deptree_depends(deptree, types_n, tmplist,
newlevel ? newlevel : runlevel,
RC_DEP_STRICT | RC_DEP_TRACE);
deporder = rc_deptree_depends(deptree, types_n,
tmplist, newlevel ? newlevel : runlevel,
RC_DEP_STRICT | RC_DEP_TRACE);
rc_stringlist_free(tmplist);
svc2 = NULL;
TAILQ_FOREACH(svc1, deporder, entries) {
svc2 = rc_stringlist_find(start_services, svc1->value);
svc2 = rc_stringlist_find(start_services,
svc1->value);
if (svc2)
break;
}
@ -661,21 +662,21 @@ do_start_services(bool parallel)
interactive = want_interactive();
if (interactive) {
interactive_retry:
interactive_retry:
printf("\n");
einfo("About to start the service %s",
service->value);
service->value);
eindent();
einfo("1) Start the service\t\t2) Skip the service");
einfo("3) Continue boot process\t\t4) Exit to shell");
eoutdent();
interactive_option:
interactive_option:
switch (read_key(true)) {
case '1': break;
case '2': continue;
case '3': interactive = false; break;
case '4': sulogin(true); goto interactive_retry;
default: goto interactive_option;
case '1': break;
case '2': continue;
case '3': interactive = false; break;
case '4': sulogin(true); goto interactive_retry;
default: goto interactive_option;
}
}
@ -693,7 +694,7 @@ interactive_option:
/* Store our interactive status for boot */
if (interactive &&
(strcmp(runlevel, RC_LEVEL_SYSINIT) == 0 ||
strcmp(runlevel, getenv("RC_BOOTLEVEL")) == 0))
strcmp(runlevel, getenv("RC_BOOTLEVEL")) == 0))
mark_interactive();
else {
if (exists(INTERACTIVE))
@ -711,17 +712,17 @@ handle_bad_signal(int sig)
pid_t crashed_pid = getpid();
switch (fork()) {
case -1:
_exit(sig);
/* NOTREACHED */
case 0:
sprintf(pid, "%i", crashed_pid);
printf("\nAuto launching gdb!\n\n");
_exit(execlp("gdb", "gdb", "--quiet", "--pid", pid,
"-ex", "bt full", NULL));
/* NOTREACHED */
default:
wait(&status);
case -1:
_exit(sig);
/* NOTREACHED */
case 0:
sprintf(pid, "%i", crashed_pid);
printf("\nAuto launching gdb!\n\n");
_exit(execlp("gdb", "gdb", "--quiet", "--pid", pid,
"-ex", "bt full", NULL));
/* NOTREACHED */
default:
wait(&status);
}
_exit(1);
/* NOTREACHED */
@ -737,7 +738,8 @@ static const struct option longopts[] = {
longopts_COMMON
};
static const char * const longopts_help[] = {
"override the next runlevel to change into\nwhen leaving single user or boot runlevels",
"override the next runlevel to change into\n"
"when leaving single user or boot runlevels",
"runs the service specified with the rest\nof the arguments",
"output the RC system type, if any",
longopts_help_COMMON
@ -783,9 +785,9 @@ main(int argc, char **argv)
printf(" [%s]", bootlevel);
printf(") " VERSION
#ifdef BRANDING
" (" BRANDING ")"
" (" BRANDING ")"
#endif
"\n");
"\n");
exit(EXIT_SUCCESS);
}
@ -806,7 +808,7 @@ main(int argc, char **argv)
argc++;
argv--;
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'o':
@ -825,7 +827,7 @@ main(int argc, char **argv)
newlevel = rc_service_resolve(optarg);
if (!newlevel)
eerrorx("%s: service `%s' does not exist",
applet, optarg);
applet, optarg);
argv += optind - 1;
*argv = newlevel;
execv(*argv, argv);
@ -837,8 +839,8 @@ main(int argc, char **argv)
printf("%s\n", bootlevel);
exit(EXIT_SUCCESS);
/* NOTREACHED */
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
}
newlevel = argv[optind++];
@ -886,7 +888,7 @@ main(int argc, char **argv)
if (newlevel &&
(strcmp(newlevel, RC_LEVEL_SHUTDOWN) == 0 ||
strcmp(newlevel, RC_LEVEL_SINGLE) == 0))
strcmp(newlevel, RC_LEVEL_SINGLE) == 0))
{
going_down = true;
if (!exists(RC_KRUNLEVEL))
@ -895,10 +897,10 @@ main(int argc, char **argv)
setenv("RC_RUNLEVEL", newlevel, 1);
setenv("RC_GOINGDOWN", "YES", 1);
} else {
/* We should not use krunevel in sysinit or the boot runlevel */
/* We should not use krunevel in sysinit or boot runlevels */
if (!newlevel ||
(strcmp(newlevel, RC_LEVEL_SYSINIT) != 0 &&
strcmp(newlevel, getenv("RC_BOOTLEVEL")) != 0))
strcmp(newlevel, getenv("RC_BOOTLEVEL")) != 0))
{
if (get_krunlevel(krunlevel, sizeof(krunlevel))) {
newlevel = krunlevel;
@ -960,7 +962,7 @@ main(int argc, char **argv)
if (errno == EACCES)
eerrorx("%s: superuser access required", applet);
eerrorx("%s: failed to create stopping dir `%s': %s",
applet, RC_STOPPING, strerror(errno));
applet, RC_STOPPING, strerror(errno));
}
/* Build a list of all services to stop and then work out the
@ -982,7 +984,7 @@ main(int argc, char **argv)
if (stop_services) {
tmplist = rc_deptree_depends(deptree, types_nua, stop_services,
runlevel, depoptions | RC_DEP_STOP);
runlevel, depoptions | RC_DEP_STOP);
rc_stringlist_free(stop_services);
stop_services = tmplist;
}
@ -990,7 +992,7 @@ main(int argc, char **argv)
/* Load our list of start services */
hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED);
start_services = rc_services_in_runlevel(newlevel ?
newlevel : runlevel);
newlevel : runlevel);
if (strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SHUTDOWN) != 0 &&
strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SYSINIT) != 0)
{
@ -998,10 +1000,10 @@ main(int argc, char **argv)
TAILQ_CONCAT(start_services, tmplist, entries);
free(tmplist);
if (strcmp(newlevel ? newlevel : runlevel,
RC_LEVEL_SINGLE) != 0)
RC_LEVEL_SINGLE) != 0)
{
if (strcmp(newlevel ? newlevel : runlevel,
bootlevel) != 0)
bootlevel) != 0)
{
tmplist = rc_services_in_runlevel(bootlevel);
TAILQ_CONCAT(start_services, tmplist, entries);
@ -1009,9 +1011,9 @@ main(int argc, char **argv)
}
if (hotplugged_services) {
TAILQ_FOREACH(service, hotplugged_services,
entries)
rc_stringlist_addu(start_services,
service->value);
entries)
rc_stringlist_addu(start_services,
service->value);
}
}
}
@ -1027,7 +1029,7 @@ main(int argc, char **argv)
/* Notify the plugins we have finished */
rc_plugin_run(RC_HOOK_RUNLEVEL_STOP_OUT,
going_down ? newlevel : runlevel);
going_down ? newlevel : runlevel);
hook_out = 0;
rmdir(RC_STOPPING);
@ -1054,14 +1056,14 @@ main(int argc, char **argv)
/* Re-add our hotplugged services if they stopped */
if (hotplugged_services)
TAILQ_FOREACH(service, hotplugged_services, entries)
rc_service_mark(service->value, RC_SERVICE_HOTPLUGGED);
rc_service_mark(service->value, RC_SERVICE_HOTPLUGGED);
/* Order the services to start */
if (start_services) {
rc_stringlist_sort(&start_services);
deporder = rc_deptree_depends(deptree, types_nua,
start_services, runlevel,
depoptions | RC_DEP_START);
start_services, runlevel,
depoptions | RC_DEP_START);
rc_stringlist_free(start_services);
start_services = deporder;
}

View File

@ -54,11 +54,11 @@
#include <unistd.h>
#ifdef __linux__
# include <pty.h>
# include <pty.h>
#elif defined(__NetBSD__) || defined(__OpenBSD__)
# include <util.h>
# include <util.h>
#else
# include <libutil.h>
# include <libutil.h>
#endif
#include "builtins.h"
@ -121,9 +121,9 @@ setup_selinux(int argc, char **argv)
}
selinux_run_init_old = (void (*)(void))
dlfunc(lib_handle, "selinux_runscript");
dlfunc(lib_handle, "selinux_runscript");
selinux_run_init_new = (void (*)(int, char **))
dlfunc(lib_handle, "selinux_runscript2");
dlfunc(lib_handle, "selinux_runscript2");
/* Use new run_init if it exists, else fall back to old */
if (selinux_run_init_new)
@ -154,7 +154,7 @@ handle_signal(int sig)
if (signal_pipe[1] > -1) {
if (write(signal_pipe[1], &sig, sizeof(sig)) == -1)
eerror("%s: send: %s",
service, strerror(errno));
service, strerror(errno));
} else
rc_waitpid(-1);
break;
@ -217,16 +217,16 @@ start_services(RC_STRINGLIST *list)
{
TAILQ_FOREACH(svc, list, entries) {
if (!(rc_service_state(svc->value) &
RC_SERVICE_STOPPED))
RC_SERVICE_STOPPED))
continue;
if (state & RC_SERVICE_INACTIVE ||
state & RC_SERVICE_WASINACTIVE)
{
rc_service_schedule_start(service,
svc->value);
svc->value);
ewarn("WARNING: %s is scheduled to started"
" when %s has started",
svc->value, applet);
" when %s has started",
svc->value, applet);
} else
service_start(svc->value);
}
@ -269,10 +269,10 @@ cleanup(void)
rc_plugin_run(hook_out, applet);
if (hook_out == RC_HOOK_SERVICE_START_DONE)
rc_plugin_run(RC_HOOK_SERVICE_START_OUT,
applet);
applet);
else if (hook_out == RC_HOOK_SERVICE_STOP_DONE)
rc_plugin_run(RC_HOOK_SERVICE_STOP_OUT,
applet);
applet);
}
if (restart_services)
@ -369,7 +369,7 @@ svc_exec(const char *arg1, const char *arg2)
eerrorx("%s: pipe: %s", service, applet);
for (i = 0; i < 2; i++)
if ((flags = fcntl(signal_pipe[i], F_GETFD, 0) == -1 ||
fcntl(signal_pipe[i], F_SETFD, flags | FD_CLOEXEC) == -1))
fcntl(signal_pipe[i], F_SETFD, flags | FD_CLOEXEC) == -1))
eerrorx("%s: fcntl: %s", service, strerror(errno));
/* Open a pty for our prefixed output
@ -387,11 +387,11 @@ svc_exec(const char *arg1, const char *arg2)
openpty(&master_tty, &slave_tty, NULL, &tt, &ws);
if (master_tty >= 0 &&
(flags = fcntl(master_tty, F_GETFD, 0)) == 0)
fcntl(master_tty, F_SETFD, flags | FD_CLOEXEC);
fcntl(master_tty, F_SETFD, flags | FD_CLOEXEC);
if (slave_tty >=0 &&
(flags = fcntl(slave_tty, F_GETFD, 0)) == 0)
fcntl(slave_tty, F_SETFD, flags | FD_CLOEXEC);
fcntl(slave_tty, F_SETFD, flags | FD_CLOEXEC);
}
service_pid = fork();
@ -405,17 +405,17 @@ svc_exec(const char *arg1, const char *arg2)
if (exists(RC_SVCDIR "/runscript.sh")) {
execl(RC_SVCDIR "/runscript.sh",
RC_SVCDIR "/runscript.sh",
service, arg1, arg2, (char *) NULL);
RC_SVCDIR "/runscript.sh",
service, arg1, arg2, (char *) NULL);
eerror("%s: exec `" RC_SVCDIR "/runscript.sh': %s",
service, strerror(errno));
service, strerror(errno));
_exit(EXIT_FAILURE);
} else {
execl(RC_LIBDIR "/sh/runscript.sh",
RC_LIBDIR "/sh/runscript.sh",
service, arg1, arg2, (char *) NULL);
RC_LIBDIR "/sh/runscript.sh",
service, arg1, arg2, (char *) NULL);
eerror("%s: exec `" RC_LIBDIR "/sh/runscript.sh': %s",
service, strerror(errno));
service, strerror(errno));
_exit(EXIT_FAILURE);
}
}
@ -434,7 +434,7 @@ svc_exec(const char *arg1, const char *arg2)
if ((s = poll(fd, master_tty >= 0 ? 2 : 1, -1)) == -1) {
if (errno != EINTR) {
eerror("%s: poll: %s",
service, strerror(errno));
service, strerror(errno));
break;
}
}
@ -488,7 +488,7 @@ svc_wait(const char *svc)
rc_stringlist_free(keywords);
snprintf(file, sizeof(file), RC_SVCDIR "/exclusive/%s",
basename_c(svc));
basename_c(svc));
interval.tv_sec = 0;
interval.tv_nsec = WAIT_INTERVAL;
@ -521,7 +521,7 @@ svc_wait(const char *svc)
timespecsub(&warn, &interval, &warn);
if (warn.tv_sec <= 0) {
ewarn("%s: waiting for %s (%zu)", applet, svc,
timeout.tv_sec);
timeout.tv_sec);
warn.tv_sec = WARN_TIMEOUT;
warn.tv_nsec = 0;
}
@ -593,7 +593,7 @@ svc_start(bool deps)
rc_service_mark(service, RC_SERVICE_HOTPLUGGED);
if (strcmp(runlevel, RC_LEVEL_SYSINIT) == 0)
ewarnx("WARNING: %s will be started in the"
" next runlevel", applet);
" next runlevel", applet);
}
if (exclusive_fd == -1)
@ -607,14 +607,14 @@ svc_start(bool deps)
ewarnx("WARNING: %s is already starting", applet);
}
fcntl(exclusive_fd, F_SETFD,
fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC);
fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC);
if (state & RC_SERVICE_STARTED) {
ewarn("WARNING: %s has already been started", applet);
return;
} else if (state & RC_SERVICE_INACTIVE && ! background)
ewarnx("WARNING: %s has already started, but is inactive",
applet);
applet);
rc_service_mark(service, RC_SERVICE_STARTING);
hook_out = RC_HOOK_SERVICE_START_OUT;
@ -631,7 +631,7 @@ svc_start(bool deps)
setup_types();
services = rc_deptree_depends(deptree, types_b, applet_list,
runlevel, 0);
runlevel, 0);
if (TAILQ_FIRST(services)) {
eerrorn("ERROR: `%s' needs ", applet);
first = true;
@ -648,11 +648,11 @@ svc_start(bool deps)
services = NULL;
need_services = rc_deptree_depends(deptree, types_n,
applet_list, runlevel,
depoptions);
applet_list, runlevel,
depoptions);
use_services = rc_deptree_depends(deptree, types_nu,
applet_list, runlevel,
depoptions);
applet_list, runlevel,
depoptions);
if (!rc_runlevel_starting()) {
TAILQ_FOREACH(svc, use_services, entries) {
@ -673,7 +673,7 @@ svc_start(bool deps)
/* Now wait for them to start */
services = rc_deptree_depends(deptree, types_nua, applet_list,
runlevel, depoptions);
runlevel, depoptions);
/* We use tmplist to hold our scheduled by list */
tmplist = rc_stringlist_new();
TAILQ_FOREACH(svc, services, entries) {
@ -687,15 +687,15 @@ svc_start(bool deps)
state & RC_SERVICE_WASINACTIVE)
{
if (!rc_stringlist_find(need_services,
svc->value) &&
svc->value) &&
!rc_stringlist_find(use_services,
svc->value))
svc->value))
continue;
}
if (!svc_wait(svc->value))
eerror("%s: timed out waiting for %s",
applet, svc->value);
applet, svc->value);
state = rc_service_state(svc->value);
if (state & RC_SERVICE_STARTED)
continue;
@ -706,8 +706,8 @@ svc_start(bool deps)
rc_stringlist_add(tmplist, svc->value);
} else if (!TAILQ_FIRST(tmplist))
eerrorx("ERROR: cannot start %s as"
" %s would not start",
applet, svc->value);
" %s would not start",
applet, svc->value);
}
}
@ -723,11 +723,11 @@ svc_start(bool deps)
TAILQ_FOREACH(svc, tmplist, entries) {
rc_service_schedule_start(svc->value, service);
use_services = rc_deptree_depend(deptree,
"iprovide",
svc->value);
"iprovide",
svc->value);
TAILQ_FOREACH(svc2, use_services, entries)
rc_service_schedule_start(svc2->value,
service);
rc_service_schedule_start(svc2->value,
service);
rc_stringlist_free(use_services);
use_services = NULL;
len += strlen(svc->value) + 2;
@ -740,12 +740,12 @@ svc_start(bool deps)
if (p != tmp)
p += snprintf(p, len, ", ");
p += snprintf(p, len - (p - tmp),
"%s", svc->value);
"%s", svc->value);
}
rc_stringlist_free(tmplist);
tmplist = NULL;
ewarnx("WARNING: %s is scheduled to start when "
"%s has started", applet, tmp);
"%s has started", applet, tmp);
free(tmp);
}
@ -766,7 +766,7 @@ svc_start(bool deps)
else {
if (rc_service_state(service) & RC_SERVICE_INACTIVE)
ewarnx("WARNING: %s has started, but is inactive",
applet);
applet);
}
rc_service_mark(service, RC_SERVICE_STARTED);
@ -777,8 +777,8 @@ svc_start(bool deps)
/* Now start any scheduled services */
services = rc_services_scheduled(service);
TAILQ_FOREACH(svc, services, entries)
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
service_start(svc->value);
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
service_start(svc->value);
rc_stringlist_free(services);
services = NULL;
@ -788,9 +788,9 @@ svc_start(bool deps)
TAILQ_FOREACH(svc, tmplist, entries) {
services = rc_services_scheduled(svc->value);
TAILQ_FOREACH(svc2, services, entries)
if (rc_service_state(svc2->value) &
RC_SERVICE_STOPPED)
service_start(svc2->value);
if (rc_service_state(svc2->value) &
RC_SERVICE_STOPPED)
service_start(svc2->value);
rc_stringlist_free(services);
services = NULL;
}
@ -829,7 +829,7 @@ svc_stop(bool deps)
eerrorx("ERROR: %s has been stopped by something else", applet);
}
fcntl(exclusive_fd, F_SETFD,
fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC);
fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC);
if (state & RC_SERVICE_STOPPED) {
ewarn("WARNING: %s is already stopped", applet);
@ -859,7 +859,7 @@ svc_stop(bool deps)
setup_types();
services = rc_deptree_depends(deptree, types_m, applet_list,
runlevel, depoptions);
runlevel, depoptions);
tmplist = rc_stringlist_new();
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
state = rc_service_state(svc->value);
@ -898,14 +898,14 @@ svc_stop(bool deps)
* if a dependant failed */
if (runlevel &&
(strcmp(runlevel,
RC_LEVEL_SHUTDOWN) == 0 ||
strcmp(runlevel,
RC_LEVEL_SHUTDOWN) == 0 ||
strcmp(runlevel,
RC_LEVEL_SINGLE) == 0))
continue;
rc_service_mark(service, RC_SERVICE_FAILED);
}
eerrorx("ERROR: cannot stop %s as %s "
"is still up", applet, svc->value);
"is still up", applet, svc->value);
}
rc_stringlist_free(tmplist);
tmplist = NULL;
@ -914,7 +914,7 @@ svc_stop(bool deps)
/* We now wait for other services that may use us and are
* stopping. This is important when a runlevel stops */
services = rc_deptree_depends(deptree, types_mua, applet_list,
runlevel, depoptions);
runlevel, depoptions);
TAILQ_FOREACH(svc, services, entries) {
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
continue;
@ -1062,7 +1062,7 @@ runscript(int argc, char **argv)
if (stat(argv[1], &stbuf) != 0) {
fprintf(stderr, "runscript `%s': %s\n",
argv[1], strerror(errno));
argv[1], strerror(errno));
exit(EXIT_FAILURE);
}
@ -1158,7 +1158,7 @@ runscript(int argc, char **argv)
/* Right then, parse any options there may be */
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *)0)) != -1)
longopts, (int *)0)) != -1)
switch (opt) {
case 'd':
setenv("RC_DEBUG", "YES", 1);
@ -1175,8 +1175,8 @@ runscript(int argc, char **argv)
case 'D':
deps = false;
break;
case_RC_COMMON_GETOPT
}
case_RC_COMMON_GETOPT
}
/* If we're changing runlevels and not called by rc then we cannot
work with any dependencies */
@ -1238,12 +1238,12 @@ runscript(int argc, char **argv)
eprefix(save);
prefix = save;
} else if (strcmp(optarg, "ineed") == 0 ||
strcmp(optarg, "iuse") == 0 ||
strcmp(optarg, "needsme") == 0 ||
strcmp(optarg, "usesme") == 0 ||
strcmp(optarg, "iafter") == 0 ||
strcmp(optarg, "ibefore") == 0 ||
strcmp(optarg, "iprovide") == 0)
strcmp(optarg, "iuse") == 0 ||
strcmp(optarg, "needsme") == 0 ||
strcmp(optarg, "usesme") == 0 ||
strcmp(optarg, "iafter") == 0 ||
strcmp(optarg, "ibefore") == 0 ||
strcmp(optarg, "iprovide") == 0)
{
errno = 0;
if (rc_conf_yesno("rc_depend_strict") ||
@ -1257,11 +1257,11 @@ runscript(int argc, char **argv)
tmplist = rc_stringlist_new();
rc_stringlist_add(tmplist, optarg);
services = rc_deptree_depends(deptree, tmplist,
applet_list,
runlevel, depoptions);
applet_list,
runlevel, depoptions);
rc_stringlist_free(tmplist);
TAILQ_FOREACH(svc, services, entries)
printf("%s ", svc->value);
printf("%s ", svc->value);
printf ("\n");
rc_stringlist_free(services);
services = NULL;
@ -1297,20 +1297,20 @@ runscript(int argc, char **argv)
RC_SERVICE_INACTIVE)
{
TAILQ_FOREACH(svc,
restart_services,
entries)
if (rc_service_state(svc->value) &
RC_SERVICE_STOPPED)
rc_service_schedule_start(service, svc->value);
restart_services,
entries)
if (rc_service_state(svc->value) &
RC_SERVICE_STOPPED)
rc_service_schedule_start(service, svc->value);
}
}
} else if (strcmp(optarg, "zap") == 0) {
einfo("Manually resetting %s to stopped state",
applet);
applet);
if (!rc_service_mark(applet,
RC_SERVICE_STOPPED))
RC_SERVICE_STOPPED))
eerrorx("rc_service_mark: %s",
strerror(errno));
strerror(errno));
unhotplug();
} else
svc_exec(optarg, NULL);

View File

@ -1,11 +1,11 @@
/*
start-stop-daemon
Starts, stops, tests and signals daemons
start-stop-daemon
Starts, stops, tests and signals daemons
This is essentially a ground up re-write of Debians
start-stop-daemon for cleaner code and to integrate into our RC
system so we can monitor daemons a little.
*/
This is essentially a ground up re-write of Debians
start-stop-daemon for cleaner code and to integrate into our RC
system so we can monitor daemons a little.
*/
/*
* Copyright 2007-2009 Roy Marples <roy@marples.name>
@ -75,9 +75,9 @@ static struct pam_conv conv = { NULL, NULL};
/* Some libc implementations don't define this */
#ifndef LIST_FOREACH_SAFE
#define LIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = LIST_FIRST((head)); \
(var) && ((tvar) = LIST_NEXT((var), field), 1); \
#define LIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = LIST_FIRST((head)); \
(var) && ((tvar) = LIST_NEXT((var), field), 1); \
(var) = (tvar))
#endif
@ -85,12 +85,12 @@ static struct pam_conv conv = { NULL, NULL};
typedef struct scheduleitem
{
enum
{
SC_TIMEOUT,
SC_SIGNAL,
SC_GOTO,
SC_FOREVER
} type;
{
SC_TIMEOUT,
SC_SIGNAL,
SC_GOTO,
SC_FOREVER
} type;
int value;
struct scheduleitem *gotoitem;
TAILQ_ENTRY(scheduleitem) entries;
@ -103,7 +103,8 @@ static char *changeuser, *ch_root, *ch_dir;
extern char **environ;
static void free_schedulelist(void)
static void
free_schedulelist(void)
{
SCHEDULEITEM *s1 = TAILQ_FIRST(&schedule);
SCHEDULEITEM *s2;
@ -117,7 +118,8 @@ static void free_schedulelist(void)
}
#ifdef DEBUG_MEMORY
static void cleanup(void)
static void
cleanup(void)
{
free(changeuser);
free(nav);
@ -125,7 +127,8 @@ static void cleanup(void)
}
#endif
static int parse_signal(const char *sig)
static int
parse_signal(const char *sig)
{
typedef struct signalpair
{
@ -181,7 +184,8 @@ static int parse_signal(const char *sig)
/* NOTREACHED */
}
static SCHEDULEITEM *parse_schedule_item(const char *string)
static SCHEDULEITEM *
parse_schedule_item(const char *string)
{
const char *after_hyph;
int sig;
@ -195,21 +199,21 @@ static SCHEDULEITEM *parse_schedule_item(const char *string)
item->type = SC_TIMEOUT;
errno = 0;
if (sscanf(string, "%d", &item->value) != 1)
eerrorx("%s: invalid timeout value in schedule `%s'", applet,
string);
eerrorx("%s: invalid timeout value in schedule `%s'",
applet, string);
} else if ((after_hyph = string + (string[0] == '-')) &&
((sig = parse_signal(after_hyph)) != -1))
((sig = parse_signal(after_hyph)) != -1))
{
item->type = SC_SIGNAL;
item->value = (int)sig;
}
else
} else
eerrorx("%s: invalid schedule item `%s'", applet, string);
return item;
}
static void parse_schedule(const char *string, int timeout)
static void
parse_schedule(const char *string, int timeout)
{
char buffer[20];
const char *slash;
@ -238,7 +242,8 @@ static void parse_schedule(const char *string, int timeout)
TAILQ_INSERT_TAIL(&schedule, item, entries);
if (string) {
if (sscanf(string, "%d", &item->value) != 1)
eerrorx("%s: invalid timeout value in schedule", applet);
eerrorx("%s: invalid timeout in schedule",
applet);
} else
item->value = 5;
@ -251,8 +256,9 @@ static void parse_schedule(const char *string, int timeout)
else
len = strlen(string);
if (len >= (ptrdiff_t) sizeof(buffer))
eerrorx("%s: invalid schedule item, far too long", applet);
if (len >= (ptrdiff_t)sizeof(buffer))
eerrorx("%s: invalid schedule item, far too long",
applet);
memcpy(buffer, string, len);
buffer[len] = 0;
@ -263,7 +269,7 @@ static void parse_schedule(const char *string, int timeout)
if (item->type == SC_FOREVER) {
if (repeatat)
eerrorx("%s: invalid schedule, `forever' "
"appears more than once", applet);
"appears more than once", applet);
repeatat = item;
continue;
@ -281,7 +287,8 @@ static void parse_schedule(const char *string, int timeout)
return;
}
static pid_t get_pid(const char *pidfile, bool quiet)
static pid_t
get_pid(const char *pidfile, bool quiet)
{
FILE *fp;
pid_t pid;
@ -291,7 +298,8 @@ static pid_t get_pid(const char *pidfile, bool quiet)
if ((fp = fopen(pidfile, "r")) == NULL) {
if (!quiet)
eerror("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
eerror("%s: fopen `%s': %s",
applet, pidfile, strerror(errno));
return -1;
}
@ -308,9 +316,10 @@ static pid_t get_pid(const char *pidfile, bool quiet)
}
/* return number of processed killed, -1 on error */
static int do_stop(const char *exec, const char *const *argv,
pid_t pid, uid_t uid,int sig,
bool quiet, bool verbose, bool test)
static int
do_stop(const char *exec, const char *const *argv,
pid_t pid, uid_t uid,int sig,
bool quiet, bool verbose, bool test)
{
RC_PIDLIST *pids;
RC_PID *pi;
@ -330,19 +339,19 @@ static int do_stop(const char *exec, const char *const *argv,
if (test) {
if (!quiet)
einfo("Would send signal %d to PID %d",
sig, pi->pid);
sig, pi->pid);
nkilled++;
} else {
if (verbose)
ebegin("Sending signal %d to PID %d",
sig, pi->pid);
sig, pi->pid);
errno = 0;
killed = (kill(pi->pid, sig) == 0 ||
errno == ESRCH ? true : false);
errno == ESRCH ? true : false);
if (verbose)
eend(killed ? 0 : 1,
"%s: failed to send signal %d to PID %d: %s",
applet, sig, pi->pid, strerror(errno));
"%s: failed to send signal %d to PID %d: %s",
applet, sig, pi->pid, strerror(errno));
if (!killed) {
nkilled = -1;
} else {
@ -357,9 +366,10 @@ static int do_stop(const char *exec, const char *const *argv,
return nkilled;
}
static int run_stop_schedule(const char *exec, const char *const *argv,
const char *pidfile, uid_t uid,
bool quiet, bool verbose, bool test)
static int
run_stop_schedule(const char *exec, const char *const *argv,
const char *pidfile, uid_t uid,
bool quiet, bool verbose, bool test)
{
SCHEDULEITEM *item = TAILQ_FIRST(&schedule);
int nkilled = 0;
@ -403,12 +413,12 @@ static int run_stop_schedule(const char *exec, const char *const *argv,
case SC_SIGNAL:
nrunning = 0;
nkilled = do_stop(exec, argv, pid, uid, item->value,
quiet, verbose, test);
quiet, verbose, test);
if (nkilled == 0) {
if (tkilled == 0) {
if (! quiet)
eerror("%s: no matching "
"processes found", applet);
"processes found", applet);
}
return tkilled;
}
@ -429,24 +439,26 @@ static int run_stop_schedule(const char *exec, const char *const *argv,
while (nloops) {
if ((nrunning = do_stop(exec, argv, pid,
uid, 0, true, false, true)) == 0)
uid, 0, true, false, true)) == 0)
return 0;
if (nanosleep(&ts, NULL) == -1) {
if (errno == EINTR)
eerror("%s: caught an interrupt", applet);
eerror("%s: caught an"
" interrupt", applet);
else {
eerror("%s: nanosleep: %s",
applet, strerror(errno));
applet, strerror(errno));
return 0;
}
}
nloops --;
nloops --;
}
break;
default:
eerror("%s: invalid schedule item `%d'", applet, item->type);
eerror("%s: invalid schedule item `%d'",
applet, item->type);
return 0;
}
@ -459,15 +471,18 @@ static int run_stop_schedule(const char *exec, const char *const *argv,
if (! quiet) {
if (nrunning == 1)
eerror("%s: %d process refused to stop", applet, nrunning);
eerror("%s: %d process refused to stop",
applet, nrunning);
else
eerror("%s: %d process(es) refused to stop", applet, nrunning);
eerror("%s: %d process(es) refused to stop",
applet, nrunning);
}
return -nrunning;
}
static void handle_signal(int sig)
static void
handle_signal(int sig)
{
int status;
int serrno = errno;
@ -492,7 +507,8 @@ static void handle_signal(int sig)
for (;;) {
if (waitpid(-1, &status, WNOHANG) < 0) {
if (errno != ECHILD)
eerror("%s: waitpid: %s", applet, strerror(errno));
eerror("%s: waitpid: %s",
applet, strerror(errno));
break;
}
}
@ -606,7 +622,8 @@ static const char * const longopts_help[] = {
};
#include "_usage.c"
int start_stop_daemon(int argc, char **argv)
int
start_stop_daemon(int argc, char **argv)
{
int devnull_fd = -1;
#ifdef TIOCNOTTY
@ -674,7 +691,7 @@ int start_stop_daemon(int argc, char **argv)
if ((tmp = getenv("SSD_NICELEVEL")))
if (sscanf(tmp, "%d", &nicelevel) != 1)
eerror("%s: invalid nice level `%s' (SSD_NICELEVEL)",
applet, tmp);
applet, tmp);
/* Get our user name and initial dir */
p = getenv("USER");
@ -692,7 +709,7 @@ int start_stop_daemon(int argc, char **argv)
}
while ((opt = getopt_long(argc, argv, getoptstring, longopts,
(int *) 0)) != -1)
(int *) 0)) != -1)
switch (opt) {
case 'K': /* --stop */
stop = true;
@ -700,7 +717,7 @@ int start_stop_daemon(int argc, char **argv)
case 'N': /* --nice */
if (sscanf(optarg, "%d", &nicelevel) != 1)
eerrorx("%s: invalid nice level `%s'",
applet, optarg);
applet, optarg);
break;
case 'R': /* --retry <schedule>|<timeout> */
@ -717,44 +734,44 @@ int start_stop_daemon(int argc, char **argv)
case 'u': /* --user <username>|<uid> */
case 'c': /* --chuid <username>|<uid> */
{
p = optarg;
tmp = strsep(&p, ":");
changeuser = xstrdup(tmp);
{
p = optarg;
tmp = strsep(&p, ":");
changeuser = xstrdup(tmp);
if (sscanf(tmp, "%d", &tid) != 1)
pw = getpwnam(tmp);
else
pw = getpwuid((uid_t)tid);
if (pw == NULL)
eerrorx("%s: user `%s' not found",
applet, tmp);
uid = pw->pw_uid;
home = pw->pw_dir;
unsetenv("HOME");
if (pw->pw_dir)
setenv("HOME", pw->pw_dir, 1);
unsetenv("USER");
if (pw->pw_name)
setenv("USER", pw->pw_name, 1);
if (gid == 0)
gid = pw->pw_gid;
if (p) {
tmp = strsep (&p, ":");
if (sscanf(tmp, "%d", &tid) != 1)
pw = getpwnam(tmp);
gr = getgrnam(tmp);
else
pw = getpwuid((uid_t)tid);
gr = getgrgid((gid_t) tid);
if (pw == NULL)
eerrorx("%s: user `%s' not found",
applet, tmp);
uid = pw->pw_uid;
home = pw->pw_dir;
unsetenv("HOME");
if (pw->pw_dir)
setenv("HOME", pw->pw_dir, 1);
unsetenv("USER");
if (pw->pw_name)
setenv("USER", pw->pw_name, 1);
if (gid == 0)
gid = pw->pw_gid;
if (p) {
tmp = strsep (&p, ":");
if (sscanf(tmp, "%d", &tid) != 1)
gr = getgrnam(tmp);
else
gr = getgrgid((gid_t) tid);
if (gr == NULL)
eerrorx("%s: group `%s'"
" not found",
applet, tmp);
gid = gr->gr_gid;
}
if (gr == NULL)
eerrorx("%s: group `%s'"
" not found",
applet, tmp);
gid = gr->gr_gid;
}
break;
}
break;
case 'd': /* --chdir /new/dir */
ch_dir = optarg;
@ -771,7 +788,7 @@ int start_stop_daemon(int argc, char **argv)
gr = getgrgid((gid_t)tid);
if (gr == NULL)
eerrorx("%s: group `%s' not found",
applet, optarg);
applet, optarg);
gid = gr->gr_gid;
break;
@ -782,7 +799,7 @@ int start_stop_daemon(int argc, char **argv)
case 'k':
if (parse_mode(&numask, optarg))
eerrorx("%s: invalid mode `%s'",
applet, optarg);
applet, optarg);
break;
case 'm': /* --make-pidfile */
@ -819,7 +836,7 @@ int start_stop_daemon(int argc, char **argv)
case 'w':
if (sscanf(optarg, "%d", &start_wait) != 1)
eerrorx("%s: `%s' not a number",
applet, optarg);
applet, optarg);
break;
case 'x': /* --exec <executable> */
exec = optarg;
@ -834,7 +851,7 @@ int start_stop_daemon(int argc, char **argv)
break;
case_RC_COMMON_GETOPT
}
}
endpwent();
argc -= optind;
@ -873,25 +890,25 @@ int start_stop_daemon(int argc, char **argv)
sig = SIGTERM;
if (!*argv && !pidfile && !name && !uid)
eerrorx("%s: --stop needs --exec, --pidfile,"
" --name or --user", applet);
" --name or --user", applet);
if (background)
eerrorx("%s: --background is only relevant with"
" --start", applet);
" --start", applet);
if (makepidfile)
eerrorx("%s: --make-pidfile is only relevant with"
" --start", applet);
" --start", applet);
if (redirect_stdout || redirect_stderr)
eerrorx("%s: --stdout and --stderr are only relevant"
" with --start", applet);
" with --start", applet);
} else {
if (!exec)
eerrorx("%s: nothing to start", applet);
if (makepidfile && !pidfile)
eerrorx("%s: --make-pidfile is only relevant with"
" --pidfile", applet);
" --pidfile", applet);
if ((redirect_stdout || redirect_stderr) && !background)
eerrorx("%s: --stdout and --stderr are only relevant"
" with --background", applet);
" with --background", applet);
}
/* Expand ~ */
@ -908,10 +925,10 @@ int start_stop_daemon(int argc, char **argv)
/* Full or relative path */
if (ch_root)
snprintf(exec_file, sizeof(exec_file),
"%s/%s", ch_root, exec);
"%s/%s", ch_root, exec);
else
snprintf(exec_file, sizeof(exec_file),
"%s", exec);
"%s", exec);
} else {
/* Something in $PATH */
p = tmp = xstrdup(getenv("PATH"));
@ -919,11 +936,11 @@ int start_stop_daemon(int argc, char **argv)
while ((token = strsep(&p, ":"))) {
if (ch_root)
snprintf(exec_file, sizeof(exec_file),
"%s/%s/%s",
ch_root, token, exec);
"%s/%s/%s",
ch_root, token, exec);
else
snprintf(exec_file, sizeof(exec_file),
"%s/%s", token, exec);
"%s/%s", token, exec);
if (exists(exec_file))
break;
*exec_file = '\0';
@ -933,7 +950,7 @@ int start_stop_daemon(int argc, char **argv)
}
if (start && !exists(exec_file)) {
eerror("%s: %s does not exist", applet,
*exec_file ? exec_file : exec);
*exec_file ? exec_file : exec);
exit(EXIT_FAILURE);
}
@ -984,7 +1001,7 @@ int start_stop_daemon(int argc, char **argv)
else
parse_schedule(NULL, sig);
i = run_stop_schedule(exec, (const char *const *)margv,
pidfile, uid, quiet, verbose, test);
pidfile, uid, quiet, verbose, test);
if (i < 0)
/* We failed to stop something */
@ -1000,8 +1017,8 @@ int start_stop_daemon(int argc, char **argv)
unlink(pidfile);
if (svcname)
rc_service_daemon_set(svcname, exec,
(const char *const *)argv,
pidfile, false);
(const char *const *)argv,
pidfile, false);
exit(EXIT_SUCCESS);
}
@ -1011,7 +1028,7 @@ int start_stop_daemon(int argc, char **argv)
pid = 0;
if (do_stop(exec, (const char * const *)margv, pid, uid,
0, true, false, true) > 0)
0, true, false, true) > 0)
eerrorx("%s: %s is already running", applet, exec);
if (test) {
@ -1067,30 +1084,35 @@ int start_stop_daemon(int argc, char **argv)
if (nicelevel) {
if (setpriority(PRIO_PROCESS, mypid, nicelevel) == -1)
eerrorx("%s: setpritory %d: %s", applet, nicelevel,
strerror(errno));
eerrorx("%s: setpritory %d: %s",
applet, nicelevel,
strerror(errno));
}
if (ch_root && chroot(ch_root) < 0)
eerrorx("%s: chroot `%s': %s", applet, ch_root, strerror(errno));
eerrorx("%s: chroot `%s': %s",
applet, ch_root, strerror(errno));
if (ch_dir && chdir(ch_dir) < 0)
eerrorx("%s: chdir `%s': %s", applet, ch_dir, strerror(errno));
eerrorx("%s: chdir `%s': %s",
applet, ch_dir, strerror(errno));
if (makepidfile && pidfile) {
fp = fopen(pidfile, "w");
if (! fp)
eerrorx("%s: fopen `%s': %s", applet, pidfile,
strerror(errno));
strerror(errno));
fprintf(fp, "%d\n", mypid);
fclose(fp);
}
#ifdef HAVE_PAM
if (changeuser != NULL)
pamr = pam_start("start-stop-daemon", changeuser, &conv, &pamh);
pamr = pam_start("start-stop-daemon",
changeuser, &conv, &pamh);
else
pamr = pam_start("start-stop-daemon", "nobody", &conv, &pamh);
pamr = pam_start("start-stop-daemon",
"nobody", &conv, &pamh);
if (pamr == PAM_SUCCESS)
pamr = pam_authenticate(pamh, PAM_SILENT);
@ -1099,15 +1121,19 @@ int start_stop_daemon(int argc, char **argv)
if (pamr == PAM_SUCCESS)
pamr = pam_open_session(pamh, PAM_SILENT);
if (pamr != PAM_SUCCESS)
eerrorx("%s: pam error: %s", applet, pam_strerror(pamh, pamr));
eerrorx("%s: pam error: %s",
applet, pam_strerror(pamh, pamr));
#endif
if (gid && setgid(gid))
eerrorx("%s: unable to set groupid to %d", applet, gid);
eerrorx("%s: unable to set groupid to %d",
applet, gid);
if (changeuser && initgroups(changeuser, gid))
eerrorx("%s: initgroups (%s, %d)", applet, changeuser, gid);
eerrorx("%s: initgroups (%s, %d)",
applet, changeuser, gid);
if (uid && setuid(uid))
eerrorx ("%s: unable to set userid to %d", applet, uid);
eerrorx ("%s: unable to set userid to %d",
applet, uid);
/* Close any fd's to the passwd database */
endpwent();
@ -1137,8 +1163,8 @@ int start_stop_daemon(int argc, char **argv)
TAILQ_FOREACH(env, env_list, entries) {
if ((strncmp(env->value, "RC_", 3) == 0 &&
strncmp(env->value, "RC_SERVICE=", 10) != 0 &&
strncmp(env->value, "RC_SVCNAME=", 10) != 0) ||
strncmp(env->value, "RC_SERVICE=", 10) != 0 &&
strncmp(env->value, "RC_SVCNAME=", 10) != 0) ||
strncmp(env->value, "SSD_NICELEVEL=", 14) == 0)
{
p = strchr(env->value, '=');
@ -1179,16 +1205,20 @@ int start_stop_daemon(int argc, char **argv)
stdout_fd = devnull_fd;
stderr_fd = devnull_fd;
if (redirect_stdout) {
if ((stdout_fd = open(redirect_stdout, O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR)) == -1)
eerrorx("%s: unable to open the logfile for stdout `%s': %s",
applet, redirect_stdout, strerror(errno));
if ((stdout_fd = open(redirect_stdout,
O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR)) == -1)
eerrorx("%s: unable to open the logfile"
" for stdout `%s': %s",
applet, redirect_stdout, strerror(errno));
}
if (redirect_stderr) {
if ((stderr_fd = open(redirect_stderr, O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR)) == -1)
eerrorx("%s: unable to open the logfile for stderr `%s': %s",
applet, redirect_stderr, strerror(errno));
if ((stderr_fd = open(redirect_stderr,
O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR)) == -1)
eerrorx("%s: unable to open the logfile"
" for stderr `%s': %s",
applet, redirect_stderr, strerror(errno));
}
/* We don't redirect stdin as some daemons may need it */
@ -1207,7 +1237,7 @@ int start_stop_daemon(int argc, char **argv)
pam_close_session(pamh, PAM_SILENT);
#endif
eerrorx("%s: failed to exec `%s': %s",
applet, exec,strerror(errno));
applet, exec,strerror(errno));
}
/* Parent process */
@ -1220,13 +1250,15 @@ int start_stop_daemon(int argc, char **argv)
do {
pid = waitpid(spid, &i, 0);
if (pid < 1) {
eerror("waitpid %d: %s", spid, strerror(errno));
eerror("waitpid %d: %s",
spid, strerror(errno));
return -1;
}
} while (!WIFEXITED(i) && !WIFSIGNALED(i));
if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) {
if (!quiet)
eerrorx("%s: failed to start `%s'", applet, exec);
eerrorx("%s: failed to start `%s'",
applet, exec);
exit(EXIT_FAILURE);
}
pid = spid;
@ -1236,7 +1268,7 @@ int start_stop_daemon(int argc, char **argv)
We do this as some badly written daemons fork and then barf */
if (start_wait == 0 &&
((p = getenv("SSD_STARTWAIT")) ||
(p = rc_conf_value("rc_start_wait"))))
(p = rc_conf_value("rc_start_wait"))))
{
if (sscanf(p, "%u", &start_wait) != 1)
start_wait = 0;
@ -1253,7 +1285,7 @@ int start_stop_daemon(int argc, char **argv)
eerror("%s: caught an interrupt", applet);
else {
eerror("%s: nanosleep: %s",
applet, strerror(errno));
applet, strerror(errno));
return 0;
}
}
@ -1265,14 +1297,14 @@ int start_stop_daemon(int argc, char **argv)
pid = get_pid(pidfile, true);
if (pid == -1) {
eerrorx("%s: did not "
"create a valid"
" pid in `%s'",
applet, pidfile);
"create a valid"
" pid in `%s'",
applet, pidfile);
}
} else
pid = 0;
if (do_stop(exec, (const char *const *)margv,
pid, uid, 0, true, false, true) > 0)
pid, uid, 0, true, false, true) > 0)
alive = true;
}
@ -1281,8 +1313,8 @@ int start_stop_daemon(int argc, char **argv)
}
if (svcname)
rc_service_daemon_set(svcname, exec, (const char *const *)margv,
pidfile, true);
rc_service_daemon_set(svcname, exec,
(const char *const *)margv, pidfile, true);
exit(EXIT_SUCCESS);
/* NOTREACHED */