On Tue, 23 Apr 2013 13:34:38 -0400, MUNEDA Takahiro <muneda.takah...@jp.fujitsu.com> wrote:
> This patch escapes a unit name which was derived from udev. > > Please imagine following udev rule. > > ACTION=="online|offline", TAG+="systemd", > ENV{SYSTEMD_WANTS}="muneda@%p.service" > ACTION=="online|offline", TAG+="systemd", > ENV{SYSTEMD_WANTS}="muneda@%r.service" > ACTION=="online|offline", TAG+="systemd", > ENV{SYSTEMD_WANTS}="muneda@%S.service" > > When unit name is derived from udev via > udev_device_get_property_value(), the name may contains '/' if > ENV{SYSTEMD_WANTS} has the udev options $devpath(%p), $root(%r), or > $sys(%S). However, '/' is a invalid char for unit name so processing > of this rule fails as Invalid argument with following message. > > Apr 22 13:21:37 localhost systemd[1]: Failed to load device unit: Invalid > argument > Apr 22 13:21:37 localhost systemd[1]: Failed to process udev device event: > Invalid argument > > This patch escapes those invalid chars in a unit name. > Tested with 202, and confirmed to apply cleanly on top of commit 195f8e36. Ping, any comments? I would like to get information which device had invoked the event. If I sould not use $devpath(%p) in ENV{SYSTEMD_WANTS}, does anyone have good idea to get those? I know I can get them by calling application directly from udev rule, but the command which is called from udev rule may be killed by systemd-udevd if it runs longer than 30 sec. I'm expecting my operations takes longer than 30 sec ;( This idea comes from this thread. http://lists.freedesktop.org/archives/systemd-devel/2012-November/007390.html Thanks in advance, Takahiro > --- > src/core/device.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/src/core/device.c b/src/core/device.c > index 734d3f3..7b28aba 100644 > --- a/src/core/device.c > +++ b/src/core/device.c > @@ -281,16 +281,22 @@ static int device_update_unit(Manager *m, struct > udev_device *dev, const char *p > size_t l; > > FOREACH_WORD_QUOTED(w, l, wants, state) { > - char *e; > + char *e, *n; > > e = strndup(w, l); > if (!e) { > r = -ENOMEM; > goto fail; > } > - > - r = unit_add_dependency_by_name(u, > UNIT_WANTS, e, NULL, true); > + n = unit_name_mangle(e); > + if (!n) { > + r = -ENOMEM; > + goto fail; > + } > free(e); > + > + r = unit_add_dependency_by_name(u, > UNIT_WANTS, n, NULL, true); > + free(n); > if (r < 0) > goto fail; > } > _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel