aboutsummaryrefslogtreecommitdiff
path: root/src/librc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/librc.c')
-rw-r--r--src/librc.c97
1 files changed, 32 insertions, 65 deletions
diff --git a/src/librc.c b/src/librc.c
index 96588e3f..83eca265 100644
--- a/src/librc.c
+++ b/src/librc.c
@@ -104,13 +104,15 @@ char *rc_get_runlevel (void)
}
librc_hidden_def(rc_get_runlevel)
-void rc_set_runlevel (const char *runlevel)
+bool rc_set_runlevel (const char *runlevel)
{
FILE *fp = fopen (SOFTLEVEL, "w");
+
if (! fp)
- eerrorx ("failed to open `" SOFTLEVEL "': %s", strerror (errno));
+ return (false);
fprintf (fp, "%s", runlevel);
fclose (fp);
+ return (true);
}
librc_hidden_def(rc_set_runlevel)
@@ -200,17 +202,13 @@ char **rc_service_options (const char *service)
char *p = buffer;
FILE *fp;
- if (! rc_service_exists (service))
+ if (! (svc = rc_resolve_service (service)))
return (NULL);
- svc = rc_resolve_service (service);
-
snprintf (cmd, sizeof (cmd), ". '%s'; echo \"${opts}\"", svc);
- if (! (fp = popen (cmd, "r"))) {
- eerror ("popen `%s': %s", svc, strerror (errno));
- free (svc);
+ free (svc);
+ if (! (fp = popen (cmd, "r")))
return (NULL);
- }
if (fgets (buffer, RC_LINEBUFFER, fp)) {
if (buffer[strlen (buffer) - 1] == '\n')
@@ -232,22 +230,17 @@ char *rc_service_description (const char *service, const char *option)
FILE *fp;
int i;
- if (! rc_service_exists (service))
+ if (! (svc = rc_resolve_service (service)))
return (NULL);
- svc = rc_resolve_service (service);
-
if (! option)
option = "";
snprintf (cmd, sizeof (cmd), ". '%s'; echo \"${description%s%s}\"",
svc, option ? "_" : "", option);
- if (! (fp = popen (cmd, "r"))) {
- eerror ("popen `%s': %s", svc, strerror (errno));
- free (svc);
- return (NULL);
- }
free (svc);
+ if (! (fp = popen (cmd, "r")))
+ return (NULL);
while (fgets (buffer, RC_LINEBUFFER, fp)) {
if (! desc) {
@@ -315,7 +308,6 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)
unlink (file);
i = symlink (init, file);
if (i != 0) {
- eerror ("symlink `%s' to `%s': %s", init, file, strerror (errno));
free (file);
free (init);
free (svc);
@@ -353,18 +345,11 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)
rc_parse_service_state (RC_SERVICE_WASINACTIVE),
base, (char *) NULL);
- if (symlink (init, wasfile) != 0)
- eerror ("symlink `%s' to `%s': %s", init, wasfile,
- strerror (errno));
-
+ symlink (init, wasfile);
skip_wasinactive = true;
free (wasfile);
}
-
- errno = 0;
- if (unlink (file) != 0 && errno != ENOENT)
- eerror ("failed to delete `%s': %s", file,
- strerror (errno));
+ unlink (file);
}
free (file);
}
@@ -376,9 +361,7 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)
state == RC_SERVICE_INACTIVE)
{
file = rc_strcatpaths (RC_SVCDIR, "exclusive", base, (char *) NULL);
- if (rc_exists (file))
- if (unlink (file) != 0)
- eerror ("unlink `%s': %s", file, strerror (errno));
+ unlink (file);
free (file);
}
@@ -408,9 +391,7 @@ bool rc_mark_service (const char *service, const rc_service_state_t state)
STRLIST_FOREACH (dirs, dir, i) {
char *bdir = rc_strcatpaths (sdir, dir, (char *) NULL);
file = rc_strcatpaths (bdir, base, (char *) NULL);
- if (rc_exists (file))
- if (unlink (file) != 0)
- eerror ("unlink `%s': %s", file, strerror (errno));
+ unlink (file);
free (file);
/* Try and remove the dir - we don't care about errors */
@@ -468,18 +449,14 @@ char *rc_get_service_option (const char *service, const char *option)
(char *) NULL);
char *value = NULL;
- if (rc_exists (file)) {
- if ((fp = fopen (file, "r")) == NULL)
- eerror ("fopen `%s': %s", file, strerror (errno));
- else {
- memset (buffer, 0, sizeof (buffer));
- if (fgets (buffer, RC_LINEBUFFER, fp))
- value = rc_xstrdup (buffer);
- fclose (fp);
- }
+ if ((fp = fopen (file, "r"))) {
+ memset (buffer, 0, sizeof (buffer));
+ if (fgets (buffer, RC_LINEBUFFER, fp))
+ value = rc_xstrdup (buffer);
+ fclose (fp);
}
-
free (file);
+
return (value);
}
librc_hidden_def(rc_get_service_option)
@@ -494,16 +471,13 @@ bool rc_set_service_option (const char *service, const char *option,
if (! rc_is_dir (path)) {
if (mkdir (path, 0755) != 0) {
- eerror ("mkdir `%s': %s", path, strerror (errno));
free (path);
free (file);
return (false);
}
}
- if ((fp = fopen (file, "w")) == NULL)
- eerror ("fopen `%s': %s", file, strerror (errno));
- else {
+ if ((fp = fopen (file, "w"))) {
if (value)
fprintf (fp, "%s", value);
fclose (fp);
@@ -537,7 +511,6 @@ static pid_t _exec_service (const char *service, const char *arg)
free (svc);
if (mkfifo (fifo, 0600) != 0 && errno != EEXIST) {
- eerror ("unable to create fifo `%s': %s", fifo, strerror (errno));
free (fifo);
free (file);
return (-1);
@@ -545,7 +518,7 @@ static pid_t _exec_service (const char *service, const char *arg)
if ((pid = vfork ()) == 0) {
execl (file, file, arg, (char *) NULL);
- eerror ("unable to exec `%s': %s", file, strerror (errno));
+ fprintf (stderr, "unable to exec `%s': %s\n", file, strerror (errno));
unlink (fifo);
_exit (EXIT_FAILURE);
}
@@ -554,7 +527,7 @@ static pid_t _exec_service (const char *service, const char *arg)
free (file);
if (pid == -1)
- eerror ("vfork: %s", strerror (errno));
+ fprintf (stderr, "vfork: %s\n", strerror (errno));
return (pid);
}
@@ -593,17 +566,18 @@ pid_t rc_start_service (const char *service)
}
librc_hidden_def(rc_start_service)
-void rc_schedule_start_service (const char *service,
+bool rc_schedule_start_service (const char *service,
const char *service_to_start)
{
char *dir;
char *init;
char *file;
char *svc;
+ bool retval;
/* service may be a provided service, like net */
if (! service || ! rc_service_exists (service_to_start))
- return;
+ return (false);
svc = rc_xstrdup (service);
dir = rc_strcatpaths (RC_SVCDIR, "scheduled", basename (svc),
@@ -611,21 +585,20 @@ void rc_schedule_start_service (const char *service,
free (svc);
if (! rc_is_dir (dir))
if (mkdir (dir, 0755) != 0) {
- eerror ("mkdir `%s': %s", dir, strerror (errno));
free (dir);
- return;
+ return (false);
}
init = rc_resolve_service (service_to_start);
svc = rc_xstrdup (service_to_start);
file = rc_strcatpaths (dir, basename (svc), (char *) NULL);
free (svc);
- if (! rc_exists (file) && symlink (init, file) != 0)
- eerror ("symlink `%s' to `%s': %s", init, file, strerror (errno));
-
+ retval = (rc_exists (file) || symlink (init, file) == 0);
free (init);
free (file);
free (dir);
+
+ return (retval);
}
librc_hidden_def(rc_schedule_start_service)
@@ -674,10 +647,8 @@ bool rc_wait_service (const char *service)
}
if (nanosleep (&ts, NULL) == -1) {
- if (errno != EINTR) {
- eerror ("nanosleep: %s", strerror (errno));
+ if (errno != EINTR)
break;
- }
}
if (! forever)
@@ -703,11 +674,7 @@ char **rc_services_in_runlevel (const char *runlevel)
return (NULL);
dir = rc_strcatpaths (RC_RUNLEVELDIR, runlevel, (char *) NULL);
- if (! rc_is_dir (dir))
- eerror ("runlevel `%s' does not exist", runlevel);
- else
- list = rc_ls_dir (dir, RC_LS_INITD);
-
+ list = rc_ls_dir (dir, RC_LS_INITD);
free (dir);
return (list);
}