X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmount.c;h=b667ae52c9e00dbdc1f83aa6deaca387c369fb26;hb=93a45c562a1989dfbb2dd08c65f8a21b02959934;hp=9a201f33eda61990af100a41d0f935d48668713f;hpb=e364ad0628b5930a671ae5be863b960f4bd748a8;p=elogind.git diff --git a/src/mount.c b/src/mount.c index 9a201f33e..b667ae52c 100644 --- a/src/mount.c +++ b/src/mount.c @@ -1,4 +1,4 @@ -/*-*- Mode: C; c-basic-offset: 8 -*-*/ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ /*** This file is part of systemd. @@ -361,7 +361,7 @@ static int mount_load(Unit *u) { else if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what) what = m->parameters_proc_self_mountinfo.what; - if (what) + if (what && !path_equal(m->where, "/")) if ((r = unit_add_node_link(u, what, u->meta.manager->running_as == MANAGER_SYSTEM)) < 0) return r; @@ -1005,6 +1005,9 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { default: assert_not_reached("Uh, control process died at wrong time."); } + + /* Notify clients about changed exit status */ + unit_add_to_dbus_queue(u); } static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) { @@ -1172,7 +1175,7 @@ fail: } static char *fstab_node_to_udev_node(char *p) { - char *dn, *t; + char *dn, *t, *u; int r; /* FIXME: to follow udev's logic 100% we need to leave valid @@ -1180,7 +1183,13 @@ static char *fstab_node_to_udev_node(char *p) { if (startswith(p, "LABEL=")) { - if (!(t = xescape(p+6, "/ "))) + if (!(u = unquote(p+6, '"'))) + return NULL; + + t = xescape(u, "/ "); + free(u); + + if (!t) return NULL; r = asprintf(&dn, "/dev/disk/by-label/%s", t); @@ -1194,7 +1203,13 @@ static char *fstab_node_to_udev_node(char *p) { if (startswith(p, "UUID=")) { - if (!(t = xescape(p+5, "/ "))) + if (!(u = unquote(p+5, '"'))) + return NULL; + + t = xescape(u, "/ "); + free(u); + + if (!t) return NULL; r = asprintf(&dn, "/dev/disk/by-uuid/%s", ascii_strlower(t)); @@ -1487,57 +1502,6 @@ void mount_fd_event(Manager *m, int events) { } } -int mount_path_is_mounted(Manager *m, const char* path) { - char *t; - int r; - - assert(m); - assert(path); - - if (path[0] != '/') - return 1; - - if (!(t = strdup(path))) - return -ENOMEM; - - path_kill_slashes(t); - - for (;;) { - char *e, *slash; - Unit *u; - - if (!(e = unit_name_from_path(t, ".mount"))) { - r = -ENOMEM; - goto finish; - } - - u = manager_get_unit(m, e); - free(e); - - if (u && - (MOUNT(u)->from_etc_fstab || MOUNT(u)->from_fragment) && - MOUNT(u)->state != MOUNT_MOUNTED) { - r = 0; - goto finish; - } - - assert_se(slash = strrchr(t, '/')); - - if (slash == t) { - r = 1; - goto finish; - } - - *slash = 0; - } - - r = 1; - -finish: - free(t); - return r; -} - static void mount_reset_maintenance(Unit *u) { Mount *m = MOUNT(u); @@ -1608,7 +1572,9 @@ const UnitVTable mount_vtable = { .reset_maintenance = mount_reset_maintenance, + .bus_interface = "org.freedesktop.systemd1.Mount", .bus_message_handler = bus_mount_message_handler, + .bus_invalidating_properties = bus_mount_invalidating_properties, .enumerate = mount_enumerate, .shutdown = mount_shutdown