Hello community, here is the log from the commit of package insserv for openSUSE:Factory checked in at 2012-11-17 07:24:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/insserv (Old) and /work/SRC/openSUSE:Factory/.insserv.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "insserv", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/insserv/insserv.changes 2012-11-15 10:57:29.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.insserv.new/insserv.changes 2012-11-17 07:24:42.000000000 +0100 @@ -1,0 +2,13 @@ +Fri Nov 16 14:47:39 UTC 2012 - [email protected] + +- Check if systemd has to reload its dependency chains before using + systemclt to enable or disable units + +------------------------------------------------------------------- +Fri Nov 16 13:54:36 UTC 2012 - [email protected] + +- Check if systemd has to reload its dependency chains +- Check existence of /sys/fs/cgroup/systemd only once +- Do not throw fatal messages if service is known by systemd + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ insserv-1.16.0.dif ++++++ --- /var/tmp/diff_new_pack.Uis1Pp/_old 2012-11-17 07:24:43.000000000 +0100 +++ /var/tmp/diff_new_pack.Uis1Pp/_new 2012-11-17 07:24:43.000000000 +0100 @@ -1,6 +1,157 @@ --- insserv.c -+++ insserv.c 2012-11-15 08:54:32.110344983 +0000 -@@ -2942,33 +2942,11 @@ int main (int argc, char *argv[]) ++++ insserv.c 2012-11-16 14:46:39.606344797 +0000 +@@ -1,10 +1,10 @@ + /* + * insserv(.c) + * +- * Copyright 2000-2009 Werner Fink, 2000 SuSE GmbH Nuernberg, Germany, ++ * Copyright 2000-2012 Werner Fink, 2000 SuSE GmbH Nuernberg, Germany, + * 2003 SuSE Linux AG, Germany. + * 2004 SuSE LINUX AG, Germany. +- * 2005-2009 SUSE LINUX Products GmbH, Germany. ++ * 2005-2012 SUSE LINUX Products GmbH, Germany. + * Copyright 2005,2008,2009 Petter Reinholdtsen + * + * This program is free software; you can redistribute it and/or modify +@@ -23,12 +23,6 @@ + * + */ + +-/* +- * Systemd integration +- */ +-#define SYSTEMD_SERVICE_PATH "/lib/systemd/system" +-#define SYSTEMD_BINARY_PATH "/bin/systemd" +- + #define MINIMAL_MAKE 1 /* Remove disabled scripts from .depend.boot, + * .depend.start, .depend.halt, and .depend.stop */ + #define MINIMAL_RULES 1 /* ditto */ +@@ -437,7 +431,7 @@ static boolean chkrequired(service_t *re + must = req->serv; + must = getorig(must); + +- if ((must->attr.flags & (SERV_CMDLINE|SERV_ENABLED)) == 0) { ++ if ((must->attr.flags & (SERV_CMDLINE|SERV_SYSTEMD|SERV_ENABLED)) == 0) { + if (recursive) { + must->attr.flags |= SERV_ENFORCE; + continue; /* Enabled this later even if not on command line */ +@@ -455,7 +449,7 @@ static boolean chkrequired(service_t *re + * Once we may use REQ_MUST for X-Start-Before and/or + * X-Stop-After we may enable this, see reversereq() + */ +- if (serv->attr.flags & (SERV_CMDLINE|SERV_ENABLED)) ++ if (serv->attr.flags & (SERV_CMDLINE|SERV_SYSTEMD|SERV_ENABLED)) + goto out; + np_list_for_each(pos, &serv->sort.rev) { + req_t *rev = getreq(pos); +@@ -512,7 +506,7 @@ static boolean chkdependencies(service_t + if (strcmp(req->serv->name, name) != 0) + continue; + +- if ((cur->attr.flags & SERV_CMDLINE) && (flags & SERV_CMDLINE)) ++ if ((cur->attr.flags & SERV_CMDLINE) && (flags & (SERV_CMDLINE|SERV_SYSTEMD))) + continue; + + warn("FATAL: service %s has to be enabled to use service %s\n", +@@ -2376,9 +2370,11 @@ static void import_systemd_facilities(vo + /* + * Here the systemd servies are imported as services + */ +-static void import_systemd_services(void) ++static boolean import_systemd_services(void) + { ++ boolean reload = false; + list_t *ptr; ++ + list_for_each(ptr, &sdservs) { + sdserv_t *sdserv = list_entry(ptr, sdserv_t, s_list); + const char *this; +@@ -2388,6 +2384,9 @@ static void import_systemd_services(void + if (*sdserv->name == '$') + continue; + ++ if (sdserv->flags & SDREL_RELOAD) ++ reload = true; ++ + this = sdserv->name; + for (n = 0; n < (int)(sizeof(sdmap)/sizeof(sdmap[0])); n += 2) { + if (strcmp(sdmap[n], this) == 0) { +@@ -2418,6 +2417,7 @@ static void import_systemd_services(void + service->attr.flags |= SERV_SYSTEMD; + } + } ++ return reload; + } + + static void expand_faci(list_t *restrict rlist, list_t *restrict head, +@@ -2617,7 +2617,8 @@ out: + /* + * Systemd integration + */ +-static boolean is_overridden_by_systemd(const char *service) { ++static boolean is_overridden_by_systemd(const char *service) ++{ + char *p; + boolean ret = false; + +@@ -2630,7 +2631,8 @@ static boolean is_overridden_by_systemd( + return ret; + } + +-static void forward_to_systemd (const char *initscript, const char *verb, boolean alternative_root) { ++static void forward_to_systemd (const char *initscript, const char *verb, boolean alternative_root, boolean native) ++{ + const char *name; + + if (initscript == NULL) +@@ -2648,10 +2650,7 @@ static void forward_to_systemd (const ch + if (alternative_root && root) + err = asprintf (&p, "/bin/systemctl --quiet --no-reload --root %s %s %s.service", root, verb, name); + else { +- struct statfs stfs; +- if (statfs("/sys/fs/cgroup/systemd", &stfs) < 0 && errno != ENOENT) +- error("statfs(): %s\n", strerror(errno)); +- if (errno == 0 && stfs.f_type == CGROUP_SUPER_MAGIC) ++ if (native) + err = asprintf (&p, "/bin/systemctl --quiet %s %s.service", verb, name); + else + err = asprintf (&p, "/bin/systemctl --quiet --no-reload %s %s.service", verb, name); +@@ -2921,14 +2920,28 @@ int main (int argc, char *argv[]) + /* + * Systemd support + */ +- if (access(SYSTEMD_BINARY_PATH, F_OK) == 0 && (sbus = systemd_open_conn())) { ++ if (access(SYSTEMD_BINARY_PATH, F_OK) == 0) { ++ boolean alternative_root = (path != ipath); ++ boolean native; + +- for (c = 0; c < argc; c++) +- forward_to_systemd (argv[c], del ? "disable": "enable", path != ipath); ++ native = false; ++ if (!alternative_root) { ++ struct statfs stfs; ++ if (statfs("/sys/fs/cgroup/systemd", &stfs) < 0 && errno != ENOENT) ++ error("statfs(): %m\n"); ++ if (errno == 0 && stfs.f_type == CGROUP_SUPER_MAGIC) { ++ native = true; ++ if ((sbus = systemd_open_conn())) { ++ boolean reload = systemd_get_tree(sbus); ++ if (reload) ++ systemd_daemon_reload(sbus); ++ systemd = true; ++ } ++ } ++ } + +- (void)systemd_get_tree(sbus); +- systemd_close_conn(sbus); +- systemd = true; ++ for (c = 0; c < argc; c++) ++ forward_to_systemd (argv[c], del ? "disable": "enable", alternative_root, native); + } + + /* +@@ -2942,39 +2955,21 @@ int main (int argc, char *argv[]) if (systemd) import_systemd_facilities(); @@ -34,9 +185,125 @@ /* * Handle Systemd services (<name>.service -> <name>) */ + if (systemd) { +- import_systemd_services(); +- systemd_free(); /* Not used anymore */ ++ boolean reload = import_systemd_services(); ++ systemd_free(); /* List of systemd services not used anymore */ ++ if (!reload) { ++ systemd_close_conn(sbus); ++ systemd = false; ++ } + } + + /* +@@ -4222,6 +4217,14 @@ int main (int argc, char *argv[]) + #endif /* !DEBUG */ + + /* ++ * If required cause systemd daemon to reload its dependency chains ++ */ ++ if (systemd) { ++ systemd_daemon_reload(sbus); ++ systemd_close_conn(sbus); ++ } ++ ++ /* + * Do the makedep + */ + makedep(); --- systemd.c -+++ systemd.c 2012-11-15 09:23:26.866345317 +0000 -@@ -404,7 +404,8 @@ DBusConnection * systemd_open_conn(void) ++++ systemd.c 2012-11-16 14:44:23.094346444 +0000 +@@ -104,14 +104,18 @@ static void addally(sdserv_t *restrict s + this->flags = flags; + } + +-static void systemd_strip_dot(void) ++static boolean systemd_strip_dot(void) + { ++ boolean reload; + list_t *ptr; + ++ reload = false; + list_for_each_prev(ptr, &sdservs) { + sdserv_t *sdserv = list_entry(ptr, sdserv_t, s_list); + char *dot = strrchr(sdserv->unit, '.'); + const char *tag; ++ if (sdserv->flags & SDREL_RELOAD) ++ reload = true; + if (dot == (char*)0 || *dot == '\0') + continue; + tag = dot+1; +@@ -120,6 +124,7 @@ static void systemd_strip_dot(void) + else + *dot = '_'; + } ++ return reload; + } + + static int iter_get_and_next(DBusMessageIter *iter, int type, void *data) +@@ -150,6 +155,7 @@ static int handle_one_property(sdserv_t + { "Conflicts", SDREL_CONFLICTS }, + { "Before", SDREL_BEFORE }, + { "After", SDREL_AFTER }, ++ { "NeedDaemonReload", SDREL_RELOAD }, + { (const char*)0, 0 } + }; + const relation_t *relation = (relation_t*)0; +@@ -189,7 +195,7 @@ static int handle_one_property(sdserv_t + // services are somehow scripts + // Wants -> Optional + // Requires/Requisite -> Requires +- // After -> ?? ++ // After -> Start this one After ally + + if ((dot = strrchr(ally, '.'))) { + dot++; +@@ -207,6 +213,17 @@ static int handle_one_property(sdserv_t + + } while (TRUE); + } ++ break; ++ case DBUS_TYPE_BOOLEAN: ++ { ++ dbus_bool_t bool; ++ dbus_message_iter_get_basic(iter, &bool); ++#if 0 ++ printf("\tboolean (%s)\t: \"%s\" -> \"%s (%d)\"\n", relation->tag, one->unit, prop, bool); ++#endif ++ if (bool) one->flags |= relation->flag; ++ } ++ break; + } + return 1; + failed: +@@ -290,12 +307,12 @@ err: + return ret; + } + +-int systemd_get_tree(DBusConnection *bus) ++boolean systemd_get_tree(DBusConnection *bus) + { + DBusError error; + DBusMessage *reply, *send; + DBusMessageIter iter, isub; +- int ret = 0; ++ boolean ret = false; + + dbus_error_init(&error); + send = dbus_message_new_method_call("org.freedesktop.systemd1", +@@ -376,9 +393,8 @@ printf("id=%s ls=%s as=%s subs=%s fl=%s + + } while (TRUE); + +- systemd_strip_dot(); ++ ret = systemd_strip_dot(); + +- ret = 1; + goto unref; + failed: + warn ("failed to parse reply from systemd\n"); +@@ -404,7 +420,8 @@ DBusConnection * systemd_open_conn(void) bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error); if (!bus) { @@ -46,7 +313,7 @@ goto err; } dbus_connection_set_exit_on_disconnect(bus, FALSE); -@@ -425,9 +426,9 @@ DBusConnection * systemd_open_conn(void) +@@ -425,14 +442,75 @@ DBusConnection * systemd_open_conn(void) return bus; perm: warn ("can not connect to systemd: %m\n"); @@ -57,3 +324,100 @@ if (dbus_error_is_set(&error)) dbus_error_free(&error); return (DBusConnection*)0; + } + ++void systemd_daemon_reload(DBusConnection *bus) ++{ ++ DBusError error; ++ const char *command = "Reload"; ++ DBusMessage *reply = (DBusMessage*)0, *send; ++ ++ dbus_error_init(&error); ++ send = dbus_message_new_method_call("org.freedesktop.systemd1", ++ "/org/freedesktop/systemd1", ++ "org.freedesktop.systemd1.Manager", ++ command); ++ if (!send) ++ goto err; ++ dbus_message_set_auto_start(send, TRUE); ++ if (!dbus_message_set_destination(send, "org.freedesktop.systemd1")) ++ goto err; ++ ++ reply = dbus_connection_send_with_reply_and_block(bus, send, -1, &error); ++ if (!reply) ++ goto err; ++ if (dbus_message_get_type(reply) != DBUS_MESSAGE_TYPE_METHOD_RETURN) ++ goto err; ++ printf("Reload done\n"); ++ dbus_message_unref(reply); ++ return; ++err: ++ if (reply) ++ dbus_message_unref(reply); ++ if (dbus_error_is_set(&error)) { ++ warn ("can not perfom systemd reload: %s\n", error.message); ++ dbus_error_free(&error); ++ } ++} ++ ++#if 0 ++void systemd_unit_handle(DBusConnection *bus, sdctl what, int argc, char *argv[]) ++{ ++ DBusError error; ++ DBusMessage *reply, *send; ++ DBusMessageIter iter; ++ const char *command; ++ const char *name; ++ ++ if (what == enable) ++ command = "EnableUnitFiles"; ++ else ++ command = "DisableUnitFiles"; ++ ++ dbus_error_init(&error); ++ send = dbus_message_new_method_call("org.freedesktop.systemd1", ++ "/org/freedesktop/systemd1", ++ "org.freedesktop.systemd1.Manager", ++ command); ++ if (!send) ++ goto err; ++ dbus_message_set_auto_start(send, TRUE); ++ if (!dbus_message_set_destination(send, "org.freedesktop.systemd1")) ++ goto err; ++} ++#endif ++ + void systemd_close_conn(DBusConnection *bus) + { + if (bus) { +--- systemd.h ++++ systemd.h 2012-11-16 14:44:43.702344315 +0000 +@@ -20,8 +20,12 @@ + */ + + #include <dbus/dbus.h> +-extern int systemd_get_tree(DBusConnection *bus); ++#define SYSTEMD_SERVICE_PATH "/lib/systemd/system" ++#define SYSTEMD_BINARY_PATH "/bin/systemd" ++ ++extern boolean systemd_get_tree(DBusConnection *bus); + extern DBusConnection * systemd_open_conn(void); ++extern void systemd_daemon_reload(DBusConnection *bus); + extern void systemd_close_conn(DBusConnection *bus); + extern void systemd_free(void); + +@@ -39,6 +43,7 @@ typedef struct { + struct sdserv { + list_t s_list; + list_t a_list; ++ ushort flags; + char *unit; + char *name; + }; +@@ -52,3 +57,6 @@ extern list_t sdservs; + #define SDREL_BEFORE (1<<4) /* Before */ + #define SDREL_AFTER (1<<5) /* After */ + ++#define SDREL_RELOAD (1<<0) /* Needs Daemon Reload */ ++ ++typedef enum _sdctl {disable, enable} sdctl; -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
