X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=automount.c;h=c6ce25d8b254eba93bcc815437bb3e798c906fc0;hp=624bd24349f58f2ea2019e8016850c479e30651e;hb=70fcff314feff469a8e61dbe5017ed74f5e0a09d;hpb=bacffaab22278bca8c6bbb274d650d259a54350b diff --git a/automount.c b/automount.c index 624bd2434..c6ce25d8b 100644 --- a/automount.c +++ b/automount.c @@ -1,5 +1,24 @@ /*-*- Mode: C; c-basic-offset: 8 -*-*/ +/*** + This file is part of systemd. + + Copyright 2010 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with systemd; If not, see . +***/ + #include #include "unit.h" @@ -7,93 +26,80 @@ #include "load-fragment.h" #include "load-dropin.h" -static int automount_init(Unit *u) { - int r; +static const UnitActiveState state_translation_table[_AUTOMOUNT_STATE_MAX] = { + [AUTOMOUNT_DEAD] = UNIT_INACTIVE, + [AUTOMOUNT_WAITING] = UNIT_ACTIVE, + [AUTOMOUNT_RUNNING] = UNIT_ACTIVE, + [AUTOMOUNT_MAINTAINANCE] = UNIT_INACTIVE, +}; + +static const char* const state_string_table[_AUTOMOUNT_STATE_MAX] = { + [AUTOMOUNT_DEAD] = "dead", + [AUTOMOUNT_WAITING] = "waiting", + [AUTOMOUNT_RUNNING] = "running", + [AUTOMOUNT_MAINTAINANCE] = "maintainance" +}; + +static void automount_init(Unit *u) { Automount *a = AUTOMOUNT(u); - assert(a); + a->state = 0; + a->mount = NULL; +} + +static int automount_load(Unit *u) { + int r; + Automount *a = AUTOMOUNT(u); - exec_context_init(&a->exec_context); + assert(u); + assert(u->meta.load_state == UNIT_STUB); /* Load a .automount file */ - if ((r = unit_load_fragment(u)) < 0) + if ((r = unit_load_fragment_and_dropin_optional(u)) < 0) return r; - /* Load drop-in directory data */ - if ((r = unit_load_dropin(u)) < 0) - return r; + if (u->meta.load_state == UNIT_LOADED) { + + if ((r = unit_load_related_unit(u, ".mount", (Unit**) &a->mount)) < 0) + return r; + + if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(a->mount))) < 0) + return r; + } return 0; } static void automount_done(Unit *u) { - Automount *d = AUTOMOUNT(u); + Automount *a = AUTOMOUNT(u); + + assert(a); - assert(d); - free(d->path); + a->mount = NULL; } static void automount_dump(Unit *u, FILE *f, const char *prefix) { - - static const char* const state_table[_AUTOMOUNT_STATE_MAX] = { - [AUTOMOUNT_DEAD] = "dead", - [AUTOMOUNT_START_PRE] = "start-pre", - [AUTOMOUNT_START_POST] = "start-post", - [AUTOMOUNT_WAITING] = "waiting", - [AUTOMOUNT_RUNNING] = "running", - [AUTOMOUNT_STOP_PRE] = "stop-pre", - [AUTOMOUNT_STOP_POST] = "stop-post", - [AUTOMOUNT_MAINTAINANCE] = "maintainance" - }; - - static const char* const command_table[_AUTOMOUNT_EXEC_MAX] = { - [AUTOMOUNT_EXEC_START_PRE] = "StartPre", - [AUTOMOUNT_EXEC_START_POST] = "StartPost", - [AUTOMOUNT_EXEC_STOP_PRE] = "StopPre", - [AUTOMOUNT_EXEC_STOP_POST] = "StopPost" - }; - - AutomountExecCommand c; Automount *s = AUTOMOUNT(u); assert(s); fprintf(f, - "%sAutomount State: %s\n" - "%sPath: %s\n", - prefix, state_table[s->state], - prefix, s->path); - - exec_context_dump(&s->exec_context, f, prefix); - - for (c = 0; c < _AUTOMOUNT_EXEC_MAX; c++) { - ExecCommand *i; - - LIST_FOREACH(command, i, s->exec_command[c]) - fprintf(f, "%s%s: %s\n", prefix, command_table[c], i->path); - } + "%sAutomount State: %s\n", + prefix, state_string_table[s->state]); } static UnitActiveState automount_active_state(Unit *u) { - static const UnitActiveState table[_AUTOMOUNT_STATE_MAX] = { - [AUTOMOUNT_DEAD] = UNIT_INACTIVE, - [AUTOMOUNT_START_PRE] = UNIT_ACTIVATING, - [AUTOMOUNT_START_POST] = UNIT_ACTIVATING, - [AUTOMOUNT_WAITING] = UNIT_ACTIVE, - [AUTOMOUNT_RUNNING] = UNIT_ACTIVE, - [AUTOMOUNT_STOP_PRE] = UNIT_DEACTIVATING, - [AUTOMOUNT_STOP_POST] = UNIT_DEACTIVATING, - [AUTOMOUNT_MAINTAINANCE] = UNIT_INACTIVE, - }; - - return table[AUTOMOUNT(u)->state]; + return state_translation_table[AUTOMOUNT(u)->state]; } const UnitVTable automount_vtable = { .suffix = ".mount", + .no_alias = true, + .init = automount_init, + .load = automount_load, .done = automount_done, .dump = automount_dump,