-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
src/core/mount-setup.h
systemd_remount_fs_LDADD = \
+ libsystemd-label.la \
libsystemd-shared.la
# ------------------------------------------------------------------------------
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
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 ..."
CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
-pipe \
-Wall \
- -W \
-Wextra \
-Wno-inline \
-Wundef \
-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])])
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}
])
# 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.
</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>
{ "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) },
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)
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(
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;
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;
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);
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;
}
}
- 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);
}
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)
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;
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;
/*
* 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
struct kmod_list *l;
int err;
+ assert(ctx);
+
err = kmod_module_new_from_lookup(ctx, alias, &list);
if (err < 0)
return err;
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;
return EXIT_SUCCESS;
}
-/* called at udev startup */
+/* called at udev startup and reload */
static int builtin_kmod_init(struct udev *udev)
{
if (ctx)
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 = {
/*
- * 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
#include "udev.h"
+static bool initialized;
+
static const struct udev_builtin *builtins[] = {
[UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
[UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
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);
break;
}
}
+
+ initialized = true;
return err;
}
{
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)
/*
- * 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
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
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) {
worker_kill(udev);
rules = udev_rules_unref(rules);
udev_builtin_exit(udev);
- reload = 0;
+ reload = false;
}
/* event has finished */
/* 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)