chiark / gitweb /
Merge remote-tracking branch 'simonpe/cleanup'
authorLennart Poettering <lennart@poettering.net>
Wed, 8 Aug 2012 16:44:15 +0000 (18:44 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 8 Aug 2012 16:44:15 +0000 (18:44 +0200)
14 files changed:
Makefile.am
TODO
configure.ac
docs/gudev/Makefile.am
man/systemd.service.xml
src/core/dbus-service.c
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/core/service.c
src/core/service.h
src/udev/udev-builtin-kmod.c
src/udev/udev-builtin.c
src/udev/udev-rules.c
src/udev/udevd.c

index b1a8cc19902cfeffaa92ca653400defe901bfe85..278da18e1124be9ef5d284fa01e56230eff25679 100644 (file)
@@ -148,10 +148,11 @@ AM_CPPFLAGS = \
        -I $(top_builddir)/src/core \
        -I $(top_srcdir)/src/core \
        -I $(top_srcdir)/src/libudev \
-       -I $(top_srcdir)/src/udev
+       -I $(top_srcdir)/src/udev \
+       $(OUR_CPPFLAGS)
 
-AM_CFLAGS = $(WARNINGFLAGS)
-AM_LDFLAGS = $(GCLDFLAGS)
+AM_CFLAGS = $(OUR_CFLAGS)
+AM_LDFLAGS = $(OUR_LDFLAGS)
 
 # ------------------------------------------------------------------------------
 if TARGET_GENTOO
@@ -1397,6 +1398,7 @@ systemd_remount_fs_SOURCES = \
        src/core/mount-setup.h
 
 systemd_remount_fs_LDADD = \
+       libsystemd-label.la \
        libsystemd-shared.la
 
 # ------------------------------------------------------------------------------
diff --git a/TODO b/TODO
index 7fb9dd3391147402ed777903fdc426307d720a0d..4914608eb61d02436094b14a9a90e5c473251593 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,10 @@
 Bugfixes:
+* there is nothing to warn about here :)
+  $ systemctl stop systemd-udevd.service systemd-udevd-kernel.socket systemd-udevd-control.socket
+  Warning: Stopping systemd-udevd.service, but it can still be activated by:
+  systemd-udevd-control.socket
+  systemd-udevd-kernel.socket
+
 * kill /etc/timezone handling entirely? What does it provide?
   - /etc/localtime carries the same information already:
       $ ls -l /etc/localtime; cat /etc/timezone
@@ -47,6 +53,8 @@ Bugfixes:
 
 Features:
 
+* properly handle loop back mounts via fstab, especially regards to fsck/passno
+
 * allow services with no ExecStart= but with an ExecStop=
 
 * add proper journal support to "systemctl --user status ..."
index 51452982045bf047a802d0cc0401a57b0f377fb1..679214ad337ed3765a82bfc92b5aac062b75cd7e 100644 (file)
@@ -86,7 +86,6 @@ AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
 CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
         -pipe \
         -Wall \
-        -W \
         -Wextra \
         -Wno-inline \
         -Wundef \
@@ -117,20 +116,27 @@ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
         -Wno-missing-field-initializers \
         -Wno-unused-result \
         -Werror=overflow \
-        -Wp,-D_FORTIFY_SOURCE=2 \
         -ffast-math \
         -fno-common \
         -fdiagnostics-show-option \
         -fno-strict-aliasing \
         -fvisibility=hidden \
         -ffunction-sections \
-        -fdata-sections])
-AC_SUBST([WARNINGFLAGS], $with_cflags)
+        -fdata-sections \
+        -fstack-protector \
+        --param=ssp-buffer-size=4])
+AC_SUBST([OUR_CFLAGS], $with_cflags)
+
+CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
+        -Wp,-D_FORTIFY_SOURCE=2])
+AC_SUBST([OUR_CPPFLAGS], $with_cppflags)
 
 CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
         -Wl,--as-needed \
-        -Wl,--gc-sections])
-AC_SUBST([GCLDFLAGS], $with_ldflags)
+        -Wl,--gc-sections \
+        -Wl,-z,relro \
+        -Wl,-z,now])
+AC_SUBST([OUR_LDFLAGS], $with_ldflags)
 
 AC_SEARCH_LIBS([clock_gettime], [rt], [], [AC_MSG_ERROR([*** POSIX RT library not found])])
 AC_SEARCH_LIBS([dlsym], [dl], [], [AC_MSG_ERROR([*** Dynamic linking loader library not found])])
@@ -753,7 +759,7 @@ AC_MSG_RESULT([
         Split /usr:              ${enable_split_usr}
         man pages:               ${have_manpages}
 
-        CFLAGS:                  ${CFLAGS}
-        CPPLAGS:                 ${CPPFLAGS}
-        LDFLAGS:                 ${LDFLAGS}
+        CFLAGS:                  ${OUR_CFLAGS} ${CFLAGS}
+        CPPLAGS:                 ${OUR_CPPFLAGS} ${CPPFLAGS}
+        LDFLAGS:                 ${OUR_LDFLAGS} ${LDFLAGS}
 ])
index 586dd8d190e5b954b65070fcd1ba36a41cc50d18..152cd3c018cac4694d1915dd772a893fe6132a2f 100644 (file)
@@ -72,6 +72,14 @@ content_files = version.xml
 # e.g. expand_content_files=running.sgml
 expand_content_files=
 
+# Hack, hack. You silly gtk-doc, you must not add  CFLAGS multiple
+# times when calling gcc; it surely can not work with options that must
+# be listed only once.
+# Kill CFLAGS here because gtk-doc thinks adding CFLAGS to CC _and_ also
+# adding CFLAGS itself again would work.
+CFLAGS=
+LDFLAGS=
+
 # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
 # Only needed if you are using gtkdoc-scangobj to dynamically query widget
 # signals and properties.
index f43201dc7e9b9501a1f36631d657c63ce846a75f..1946d85f483ea3e85a98a3c7eab67c100c92a1c3 100644 (file)
                         </varlistentry>
 
                         <varlistentry>
-                                <term><varname>TimeoutSec=</varname></term>
+                                <term><varname>TimeoutStartSec=</varname></term>
                                 <listitem><para>Configures the time to
-                                wait for start-up and stop. If a
+                                wait for start-up. If a
                                 daemon service does not signal
                                 start-up completion within the
-                                configured time the service will be
+                                configured time, the service will be
                                 considered failed and be shut down
-                                again. If a service is asked to stop
-                                but does not terminate in the
-                                specified time it will be terminated
+                                again.
+                                Takes a unit-less value in seconds, or a
+                                time span value such as "5min
+                                20s". Pass 0 to disable the timeout
+                                logic. Defaults to 90s, except when
+                                <varname>Type=oneshot</varname> is
+                                used in which case the timeout
+                                is disabled by default.
+                                </para></listitem>
+                        </varlistentry>
+
+                        <varlistentry>
+                                <term><varname>TimeoutStopSec=</varname></term>
+                                <listitem><para>Configures the time to
+                                wait for stop. If a service is asked
+                                to stop but does not terminate in the
+                                specified time, it will be terminated
                                 forcibly via SIGTERM, and after
                                 another delay of this time with
-                                SIGKILL. (See
+                                SIGKILL (See
                                 <varname>KillMode=</varname>
-                                in <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>) Takes a unit-less value in seconds, or a
+                                in <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
+                                Takes a unit-less value in seconds, or a
                                 time span value such as "5min
                                 20s". Pass 0 to disable the timeout
-                                logic. Defaults to
-                                90s, except when <varname>Type=oneshot</varname> is
-                                used in which case the timeout
-                                is disabled by default.</para></listitem>
+                                logic. Defaults to 90s.
+                                </para></listitem>
+                        </varlistentry>
+
+                        <varlistentry>
+                                <term><varname>TimeoutSec=</varname></term>
+                                <listitem><para>A shorthand for configuring
+                                both <varname>TimeoutStartSec=</varname>
+                                and <varname>TimeoutStopSec=</varname>
+                                to the specified value.
+                                </para></listitem>
                         </varlistentry>
 
                         <varlistentry>
index c0fac16d2b8fd92a4f58429c342bc1d0ed575219..129e131a6552b8f23722509397da6d7695598b6d 100644 (file)
@@ -115,7 +115,9 @@ static const BusProperty bus_service_properties[] = {
         { "PIDFile",                bus_property_append_string,       "s", offsetof(Service, pid_file),               true },
         { "NotifyAccess",           bus_service_append_notify_access, "s", offsetof(Service, notify_access)                },
         { "RestartUSec",            bus_property_append_usec,         "t", offsetof(Service, restart_usec)                 },
-        { "TimeoutUSec",            bus_property_append_usec,         "t", offsetof(Service, timeout_usec)                 },
+        { "TimeoutUSec",            bus_property_append_usec,         "t", offsetof(Service, timeout_start_usec)           },
+        { "TimeoutStartUSec",       bus_property_append_usec,         "t", offsetof(Service, timeout_start_usec)           },
+        { "TimeoutStopUSec",        bus_property_append_usec,         "t", offsetof(Service, timeout_stop_usec)            },
         { "WatchdogUSec",           bus_property_append_usec,         "t", offsetof(Service, watchdog_usec)                },
         { "WatchdogTimestamp",      bus_property_append_usec,         "t", offsetof(Service, watchdog_timestamp.realtime)  },
         { "WatchdogTimestampMonotonic",bus_property_append_usec,      "t", offsetof(Service, watchdog_timestamp.monotonic) },
index 2b1cfa073ca5170028ef1e8377448330624f4073..e738213e27cdca7d3361cfc2c226f2ceb3cfc8cc 100644 (file)
@@ -145,7 +145,9 @@ Service.ExecReload,              config_parse_exec,                  SERVICE_EXE
 Service.ExecStop,                config_parse_exec,                  SERVICE_EXEC_STOP,             offsetof(Service, exec_command)
 Service.ExecStopPost,            config_parse_exec,                  SERVICE_EXEC_STOP_POST,        offsetof(Service, exec_command)
 Service.RestartSec,              config_parse_usec,                  0,                             offsetof(Service, restart_usec)
-Service.TimeoutSec,              config_parse_service_timeout,       0,                             offsetof(Service, timeout_usec)
+Service.TimeoutSec,              config_parse_service_timeout,       0,                             offsetof(Service, timeout_start_usec)
+Service.TimeoutStartSec,         config_parse_service_timeout,       0,                             offsetof(Service, timeout_start_usec)
+Service.TimeoutStopSec,          config_parse_service_timeout,       0,                             offsetof(Service, timeout_stop_usec)
 Service.WatchdogSec,             config_parse_usec,                  0,                             offsetof(Service, watchdog_usec)
 Service.StartLimitInterval,      config_parse_usec,                  0,                             offsetof(Service, start_limit.interval)
 Service.StartLimitBurst,         config_parse_unsigned,              0,                             offsetof(Service, start_limit.burst)
index bbd82b9d2472d4cda178d530fbb49506da80cad4..10681307cfc2fe3d7d628a2f6dca6aa3faae590c 100644 (file)
@@ -1376,10 +1376,16 @@ int config_parse_service_timeout(
 
         r = config_parse_usec(filename, line, section, lvalue, ltype, rvalue, data, userdata);
 
-        if (!r)
-                s->timeout_defined = true;
+        if (r)
+                return r;
 
-        return r;
+        if (streq(lvalue, "TimeoutSec")) {
+                s->start_timeout_defined = true;
+                s->timeout_stop_usec = s->timeout_start_usec;
+        } else if (streq(lvalue, "TimeoutStartSec"))
+                s->start_timeout_defined = true;
+
+        return 0;
 }
 
 int config_parse_unit_env_file(
index 1c127bdbcb2ffc5c6926d210a63d278ea90078a8..e74da54eac5b288ed54c7c839335fb73a460807e 100644 (file)
@@ -134,7 +134,8 @@ static void service_init(Unit *u) {
         assert(u);
         assert(u->load_state == UNIT_STUB);
 
-        s->timeout_usec = DEFAULT_TIMEOUT_USEC;
+        s->timeout_start_usec = DEFAULT_TIMEOUT_USEC;
+        s->timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
         s->restart_usec = DEFAULT_RESTART_USEC;
         s->type = _SERVICE_TYPE_INVALID;
 
@@ -914,9 +915,13 @@ static int service_load_sysv_path(Service *s, const char *path) {
                 UNIT(s)->default_dependencies = false;
 
                 /* Don't timeout special services during boot (like fsck) */
-                s->timeout_usec = 0;
-        } else
-                s->timeout_usec = DEFAULT_SYSV_TIMEOUT_USEC;
+                s->timeout_start_usec = 0;
+                s->timeout_stop_usec = 0;
+        } else {
+                s->timeout_start_usec = DEFAULT_SYSV_TIMEOUT_USEC;
+                s->timeout_stop_usec = DEFAULT_SYSV_TIMEOUT_USEC;
+        }
+
 
         /* Special setting for all SysV services */
         s->type = SERVICE_FORKING;
@@ -1241,9 +1246,9 @@ static int service_load(Unit *u) {
                 if (s->type == _SERVICE_TYPE_INVALID)
                         s->type = s->bus_name ? SERVICE_DBUS : SERVICE_SIMPLE;
 
-                /* Oneshot services have disabled timeout by default */
-                if (s->type == SERVICE_ONESHOT && !s->timeout_defined)
-                        s->timeout_usec = 0;
+                /* Oneshot services have disabled start timeout by default */
+                if (s->type == SERVICE_ONESHOT && !s->start_timeout_defined)
+                        s->timeout_start_usec = 0;
 
                 service_fix_output(s);
 
@@ -1603,11 +1608,10 @@ static int service_coldplug(Unit *u) {
                     s->deserialized_state == SERVICE_FINAL_SIGTERM ||
                     s->deserialized_state == SERVICE_FINAL_SIGKILL ||
                     s->deserialized_state == SERVICE_AUTO_RESTART) {
-
-                        if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_usec > 0) {
+                        if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_start_usec > 0) {
                                 usec_t k;
 
-                                k = s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : s->timeout_usec;
+                                k = s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : s->timeout_start_usec;
 
                                 if ((r = unit_watch_timer(UNIT(s), k, &s->timer_watch)) < 0)
                                         return r;
@@ -1753,8 +1757,9 @@ static int service_spawn(
                 }
         }
 
-        if (timeout && s->timeout_usec) {
-                if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
+        if (timeout && s->timeout_start_usec) {
+                r = unit_watch_timer(UNIT(s), s->timeout_start_usec, &s->timer_watch);
+                if (r < 0)
                         goto fail;
         } else
                 unit_unwatch_timer(UNIT(s), &s->timer_watch);
@@ -2011,9 +2016,11 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f
         }
 
         if (wait_for_exit) {
-                if (s->timeout_usec > 0)
-                        if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
+                if (s->timeout_stop_usec > 0) {
+                        r = unit_watch_timer(UNIT(s), s->timeout_stop_usec, &s->timer_watch);
+                        if (r < 0)
                                 goto fail;
+                }
 
                 service_set_state(s, state);
         } else if (state == SERVICE_STOP_SIGTERM || state == SERVICE_STOP_SIGKILL)
index cc63347c76adbb032eb509880179ef154a31eb66..c78de79a09c9615c1aa0f74ff9f191d454b1cd9d 100644 (file)
@@ -120,7 +120,8 @@ struct Service {
         char *pid_file;
 
         usec_t restart_usec;
-        usec_t timeout_usec;
+        usec_t timeout_start_usec;
+        usec_t timeout_stop_usec;
 
         dual_timestamp watchdog_timestamp;
         usec_t watchdog_usec;
@@ -166,7 +167,7 @@ struct Service {
         bool bus_name_good:1;
         bool forbid_restart:1;
         bool got_socket_fd:1;
-        bool timeout_defined:1;
+        bool start_timeout_defined:1;
 #ifdef HAVE_SYSV_COMPAT
         bool is_sysv:1;
         bool sysv_has_lsb:1;
index 87a81bfaab38603ab86eecbd74f6da13050d8685..9d3605bc6ba92d2cabd436ad3d8e6eb57d5a655c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * load kernel modules
  *
- * Copyright (C) 2011 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2011-2012 Kay Sievers <kay.sievers@vrfy.org>
  * Copyright (C) 2011 ProFUSION embedded systems
  *
  * This program is free software: you can redistribute it and/or modify
@@ -39,6 +39,8 @@ static int load_module(struct udev *udev, const char *alias)
         struct kmod_list *l;
         int err;
 
+        assert(ctx);
+
         err = kmod_module_new_from_lookup(ctx, alias, &list);
         if (err < 0)
                 return err;
@@ -70,22 +72,11 @@ static void udev_kmod_log(void *data, int priority, const char *file, int line,
         udev_main_log(data, priority, file, line, fn, format, args);
 }
 
-/* needs to re-instantiate the context after a reload */
 static int builtin_kmod(struct udev_device *dev, int argc, char *argv[], bool test)
 {
         struct udev *udev = udev_device_get_udev(dev);
         int i;
 
-        if (!ctx) {
-                ctx = kmod_new(NULL, NULL);
-                if (!ctx)
-                        return -ENOMEM;
-
-                log_debug("load module index\n");
-                kmod_set_log_fn(ctx, udev_kmod_log, udev);
-                kmod_load_resources(ctx);
-        }
-
         if (argc < 3 || strcmp(argv[1], "load")) {
                 log_error("expect: %s load <module>\n", argv[0]);
                 return EXIT_FAILURE;
@@ -99,7 +90,7 @@ static int builtin_kmod(struct udev_device *dev, int argc, char *argv[], bool te
         return EXIT_SUCCESS;
 }
 
-/* called at udev startup */
+/* called at udev startup and reload */
 static int builtin_kmod_init(struct udev *udev)
 {
         if (ctx)
@@ -126,9 +117,9 @@ static void builtin_kmod_exit(struct udev *udev)
 static bool builtin_kmod_validate(struct udev *udev)
 {
         log_debug("validate module index\n");
-        if (kmod_validate_resources(ctx) != KMOD_RESOURCES_OK)
-                return true;
-        return false;
+        if (!ctx)
+                return false;
+        return (kmod_validate_resources(ctx) != KMOD_RESOURCES_OK);
 }
 
 const struct udev_builtin udev_builtin_kmod = {
index 6509f5881d4d513e4f1c696b99bb506c5b48ea48..7d89f22792ba25ceea1f6df364cfee6357b85edc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2007-2012 Kay Sievers <kay.sievers@vrfy.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,8 @@
 
 #include "udev.h"
 
+static bool initialized;
+
 static const struct udev_builtin *builtins[] = {
         [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
         [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
@@ -44,6 +46,9 @@ int udev_builtin_init(struct udev *udev)
         unsigned int i;
         int err = 0;
 
+        if (initialized)
+                return 0;
+
         for (i = 0; i < ELEMENTSOF(builtins); i++) {
                 if (builtins[i]->init) {
                         err = builtins[i]->init(udev);
@@ -51,6 +56,8 @@ int udev_builtin_init(struct udev *udev)
                                 break;
                 }
         }
+
+        initialized = true;
         return err;
 }
 
@@ -58,9 +65,14 @@ void udev_builtin_exit(struct udev *udev)
 {
         unsigned int i;
 
+        if (!initialized)
+                return;
+
         for (i = 0; i < ELEMENTSOF(builtins); i++)
                 if (builtins[i]->exit)
                         builtins[i]->exit(udev);
+
+        initialized = false;
 }
 
 bool udev_builtin_validate(struct udev *udev)
index d3b33e4bbf960d597687cfa3a051a426d49fe410..d86e6bc5784aeb6081c43bcbf18ba721784feb57 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2010 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2012 Kay Sievers <kay.sievers@vrfy.org>
  * Copyright (C) 2008 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
  *
  * This program is free software: you can redistribute it and/or modify
@@ -1770,12 +1770,15 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
                 return NULL;
         }
         strv_uniq(rules->dirs);
+
+        rules->dirs_ts_usec = calloc(strv_length(rules->dirs), sizeof(long long));
+        udev_rules_check_timestamp(rules);
+
         r = conf_files_list_strv(&files, ".rules", (const char **)rules->dirs);
         if (r < 0) {
                 log_error("failed to enumerate rules files: %s\n", strerror(-r));
                 return NULL;
         }
-        rules->dirs_ts_usec = calloc(strv_length(rules->dirs), sizeof(long long));
 
         /*
          * The offset value in the rules strct is limited; add all
index b78c18f20a85f930ec7d3fd0308323116bd23bcc..23351aebd5685b9c02e51af23e0ad2a34d30036b 100644 (file)
@@ -1107,7 +1107,7 @@ int main(int argc, char *argv[])
                 case 'D':
                         debug = true;
                         log_set_max_level(LOG_DEBUG);
-                        udev_set_log_priority(udev, LOG_INFO);
+                        udev_set_log_priority(udev, LOG_DEBUG);
                         break;
                 case 'N':
                         if (strcmp (optarg, "early") == 0) {
@@ -1486,7 +1486,7 @@ int main(int argc, char *argv[])
                         worker_kill(udev);
                         rules = udev_rules_unref(rules);
                         udev_builtin_exit(udev);
-                        reload = 0;
+                        reload = false;
                 }
 
                 /* event has finished */
@@ -1506,6 +1506,7 @@ int main(int argc, char *argv[])
 
                 /* start new events */
                 if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) {
+                        udev_builtin_init(udev);
                         if (rules == NULL)
                                 rules = udev_rules_new(udev, resolve_names);
                         if (rules != NULL)