2007-04-05 16:48:42 +05:30
|
|
|
/*
|
|
|
|
rc-depend
|
|
|
|
rc service dependency and ordering
|
|
|
|
Copyright 2006-2007 Gentoo Foundation
|
|
|
|
Released under the GPLv2
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2007-07-31 21:35:56 +05:30
|
|
|
#include "builtins.h"
|
2007-04-05 16:48:42 +05:30
|
|
|
#include "einfo.h"
|
|
|
|
#include "rc.h"
|
|
|
|
#include "rc-misc.h"
|
|
|
|
#include "strlist.h"
|
|
|
|
|
2007-09-29 22:12:08 +05:30
|
|
|
rc_depinfo_t *_rc_deptree_load (void) {
|
|
|
|
if (rc_deptree_update_needed ()) {
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
ebegin ("Caching service dependencies");
|
|
|
|
retval = rc_deptree_update ();
|
|
|
|
eend (retval, "Failed to update the dependency tree");
|
|
|
|
}
|
|
|
|
|
|
|
|
return (rc_deptree_load ());
|
|
|
|
}
|
|
|
|
|
2007-07-31 21:35:56 +05:30
|
|
|
int rc_depend (int argc, char **argv)
|
2007-04-05 16:48:42 +05:30
|
|
|
{
|
2007-04-11 18:14:47 +05:30
|
|
|
char **types = NULL;
|
|
|
|
char **services = NULL;
|
|
|
|
char **depends = NULL;
|
|
|
|
rc_depinfo_t *deptree = NULL;
|
|
|
|
rc_depinfo_t *di;
|
|
|
|
char *service;
|
|
|
|
int options = RC_DEP_TRACE;
|
|
|
|
bool first = true;
|
|
|
|
int i;
|
|
|
|
bool update = false;
|
|
|
|
char *runlevel = getenv ("RC_SOFTLEVEL");
|
|
|
|
|
|
|
|
if (! runlevel)
|
|
|
|
runlevel = rc_get_runlevel ();
|
|
|
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
if (strcmp (argv[i], "--update") == 0) {
|
|
|
|
if (! update) {
|
2007-09-29 22:12:08 +05:30
|
|
|
ebegin ("Caching service dependencies");
|
|
|
|
update = (rc_deptree_update () == 0);
|
|
|
|
eend (update ? 0 : -1, "Failed to update the dependency tree");
|
2007-04-11 18:14:47 +05:30
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strcmp (argv[i], "--strict") == 0) {
|
|
|
|
options |= RC_DEP_STRICT;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strcmp (argv[i], "--notrace") == 0) {
|
|
|
|
options &= RC_DEP_TRACE;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argv[i][0] == '-') {
|
|
|
|
argv[i]++;
|
2007-09-18 17:06:55 +05:30
|
|
|
rc_strlist_add (&types, argv[i]);
|
2007-04-11 18:14:47 +05:30
|
|
|
} else {
|
2007-09-29 22:12:08 +05:30
|
|
|
if ((deptree = _rc_deptree_load ()) == NULL)
|
2007-04-11 18:14:47 +05:30
|
|
|
eerrorx ("failed to load deptree");
|
|
|
|
|
2007-09-29 22:12:08 +05:30
|
|
|
di = rc_deptree_depinfo (deptree, argv[i]);
|
2007-04-11 18:14:47 +05:30
|
|
|
if (! di)
|
|
|
|
eerror ("no dependency info for service `%s'", argv[i]);
|
|
|
|
else
|
2007-09-18 17:06:55 +05:30
|
|
|
rc_strlist_add (&services, argv[i]);
|
2007-04-11 18:14:47 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! services) {
|
|
|
|
rc_strlist_free (types);
|
2007-09-29 22:12:08 +05:30
|
|
|
rc_deptree_free (deptree);
|
2007-04-11 18:14:47 +05:30
|
|
|
if (update)
|
|
|
|
return (EXIT_SUCCESS);
|
|
|
|
eerrorx ("no services specified");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If we don't have any types, then supply some defaults */
|
|
|
|
if (! types) {
|
2007-09-18 17:06:55 +05:30
|
|
|
rc_strlist_add (&types, "ineed");
|
|
|
|
rc_strlist_add (&types, "iuse");
|
2007-04-11 18:14:47 +05:30
|
|
|
}
|
|
|
|
|
2007-09-29 22:12:08 +05:30
|
|
|
depends = rc_deptree_depends (deptree, types, services, runlevel, options);
|
2007-04-11 18:14:47 +05:30
|
|
|
|
|
|
|
if (depends) {
|
|
|
|
STRLIST_FOREACH (depends, service, i) {
|
|
|
|
if (first)
|
|
|
|
first = false;
|
|
|
|
else
|
|
|
|
printf (" ");
|
|
|
|
|
|
|
|
if (service)
|
|
|
|
printf ("%s", service);
|
|
|
|
|
|
|
|
}
|
|
|
|
printf ("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
rc_strlist_free (types);
|
|
|
|
rc_strlist_free (services);
|
|
|
|
rc_strlist_free (depends);
|
2007-09-29 22:12:08 +05:30
|
|
|
rc_deptree_free (deptree);
|
2007-04-11 18:14:47 +05:30
|
|
|
|
|
|
|
return (EXIT_SUCCESS);
|
2007-04-05 16:48:42 +05:30
|
|
|
}
|