1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <linux/auto_dev-ioctl.h>
26 #include <linux/auto_fs4.h>
27 #include <sys/epoll.h>
28 #include <sys/mount.h>
33 #include "automount.h"
34 #include "bus-error.h"
36 #include "dbus-automount.h"
38 #include "formats-util.h"
42 #include "mount-util.h"
44 #include "parse-util.h"
45 #include "path-util.h"
46 #include "process-util.h"
48 #include "stdio-util.h"
49 #include "string-table.h"
50 #include "string-util.h"
51 #include "unit-name.h"
54 static const UnitActiveState state_translation_table
[_AUTOMOUNT_STATE_MAX
] = {
55 [AUTOMOUNT_DEAD
] = UNIT_INACTIVE
,
56 [AUTOMOUNT_WAITING
] = UNIT_ACTIVE
,
57 [AUTOMOUNT_RUNNING
] = UNIT_ACTIVE
,
58 [AUTOMOUNT_FAILED
] = UNIT_FAILED
66 static inline void expire_data_free(struct expire_data
*data
) {
70 safe_close(data
->dev_autofs_fd
);
71 safe_close(data
->ioctl_fd
);
75 DEFINE_TRIVIAL_CLEANUP_FUNC(struct expire_data
*, expire_data_free
);
77 static int open_dev_autofs(Manager
*m
);
78 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
);
80 static void automount_init(Unit
*u
) {
81 Automount
*a
= AUTOMOUNT(u
);
84 assert(u
->load_state
== UNIT_STUB
);
87 a
->directory_mode
= 0755;
88 UNIT(a
)->ignore_on_isolate
= true;
91 static void repeat_unmount(const char *path
) {
95 /* If there are multiple mounts on a mount point, this
98 if (umount2(path
, MNT_DETACH
) >= 0)
102 log_error_errno(errno
, "Failed to unmount: %m");
108 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
110 static void unmount_autofs(Automount
*a
) {
116 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
117 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
119 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
120 a
->pipe_fd
= safe_close(a
->pipe_fd
);
122 /* If we reload/reexecute things we keep the mount point
125 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
126 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
))
127 repeat_unmount(a
->where
);
130 static void automount_done(Unit
*u
) {
131 Automount
*a
= AUTOMOUNT(u
);
137 a
->where
= mfree(a
->where
);
139 a
->tokens
= set_free(a
->tokens
);
140 a
->expire_tokens
= set_free(a
->expire_tokens
);
142 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
145 static int automount_add_mount_links(Automount
*a
) {
146 _cleanup_free_
char *parent
= NULL
;
150 parent
= dirname_malloc(a
->where
);
154 return unit_require_mounts_for(UNIT(a
), parent
);
157 static int automount_add_default_dependencies(Automount
*a
) {
162 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
165 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
172 static int automount_verify(Automount
*a
) {
173 _cleanup_free_
char *e
= NULL
;
178 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
181 if (path_equal(a
->where
, "/")) {
182 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
186 r
= unit_name_from_path(a
->where
, ".automount", &e
);
188 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
190 if (!unit_has_name(UNIT(a
), e
)) {
191 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
198 static int automount_load(Unit
*u
) {
199 Automount
*a
= AUTOMOUNT(u
);
203 assert(u
->load_state
== UNIT_STUB
);
205 /* Load a .automount file */
206 r
= unit_load_fragment_and_dropin_optional(u
);
210 if (u
->load_state
== UNIT_LOADED
) {
214 r
= unit_name_to_path(u
->id
, &a
->where
);
219 path_kill_slashes(a
->where
);
221 r
= unit_load_related_unit(u
, ".mount", &x
);
225 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
229 r
= automount_add_mount_links(a
);
233 if (UNIT(a
)->default_dependencies
) {
234 r
= automount_add_default_dependencies(a
);
240 return automount_verify(a
);
243 static void automount_set_state(Automount
*a
, AutomountState state
) {
244 AutomountState old_state
;
247 old_state
= a
->state
;
250 if (state
!= AUTOMOUNT_WAITING
&&
251 state
!= AUTOMOUNT_RUNNING
)
254 if (state
!= old_state
)
255 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
257 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
260 static int automount_coldplug(Unit
*u
) {
261 Automount
*a
= AUTOMOUNT(u
);
265 assert(a
->state
== AUTOMOUNT_DEAD
);
267 if (a
->deserialized_state
!= a
->state
) {
269 r
= open_dev_autofs(u
->manager
);
273 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
274 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
275 assert(a
->pipe_fd
>= 0);
277 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
281 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
284 automount_set_state(a
, a
->deserialized_state
);
290 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
291 char time_string
[FORMAT_TIMESPAN_MAX
];
292 Automount
*a
= AUTOMOUNT(u
);
297 "%sAutomount State: %s\n"
300 "%sDirectoryMode: %04o\n"
301 "%sTimeoutIdleUSec: %s\n",
302 prefix
, automount_state_to_string(a
->state
),
303 prefix
, automount_result_to_string(a
->result
),
305 prefix
, a
->directory_mode
,
306 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
309 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
312 if (f
!= AUTOMOUNT_SUCCESS
)
315 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
318 static int open_dev_autofs(Manager
*m
) {
319 struct autofs_dev_ioctl param
;
323 if (m
->dev_autofs_fd
>= 0)
324 return m
->dev_autofs_fd
;
326 label_fix("/dev/autofs", false, false);
328 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
329 if (m
->dev_autofs_fd
< 0)
330 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
332 init_autofs_dev_ioctl(¶m
);
333 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
334 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
338 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
340 return m
->dev_autofs_fd
;
343 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
344 struct autofs_dev_ioctl
*param
;
347 assert(dev_autofs_fd
>= 0);
350 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
353 init_autofs_dev_ioctl(param
);
356 param
->openmount
.devid
= devid
;
357 strcpy(param
->path
, where
);
359 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
362 if (param
->ioctlfd
< 0)
365 (void) fd_cloexec(param
->ioctlfd
, true);
366 return param
->ioctlfd
;
369 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
370 uint32_t major
, minor
;
371 struct autofs_dev_ioctl param
;
373 assert(dev_autofs_fd
>= 0);
374 assert(ioctl_fd
>= 0);
376 init_autofs_dev_ioctl(¶m
);
377 param
.ioctlfd
= ioctl_fd
;
379 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
382 major
= param
.protover
.version
;
384 init_autofs_dev_ioctl(¶m
);
385 param
.ioctlfd
= ioctl_fd
;
387 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
390 minor
= param
.protosubver
.sub_version
;
392 log_debug("Autofs protocol version %i.%i", major
, minor
);
396 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
397 struct autofs_dev_ioctl param
;
399 assert(dev_autofs_fd
>= 0);
400 assert(ioctl_fd
>= 0);
402 init_autofs_dev_ioctl(¶m
);
403 param
.ioctlfd
= ioctl_fd
;
405 /* Convert to seconds, rounding up. */
406 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
408 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
414 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
415 struct autofs_dev_ioctl param
;
417 assert(dev_autofs_fd
>= 0);
418 assert(ioctl_fd
>= 0);
420 init_autofs_dev_ioctl(¶m
);
421 param
.ioctlfd
= ioctl_fd
;
424 param
.fail
.token
= token
;
425 param
.fail
.status
= status
;
427 param
.ready
.token
= token
;
429 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
435 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
436 _cleanup_close_
int ioctl_fd
= -1;
443 if (set_isempty(tokens
))
446 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
451 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
453 log_unit_debug(UNIT(a
), "Sending success.");
457 /* Autofs thankfully does not hand out 0 as a token */
458 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
461 /* Autofs fun fact II:
463 * if you pass a positive status code here, the kernel will
466 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
477 static int automount_start_expire(Automount
*a
);
479 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
486 case MOUNT_REMOUNTING
:
487 automount_send_ready(a
, a
->tokens
, 0);
488 r
= automount_start_expire(a
);
490 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
493 case MOUNT_UNMOUNTING
:
494 case MOUNT_MOUNTING_SIGTERM
:
495 case MOUNT_MOUNTING_SIGKILL
:
496 case MOUNT_REMOUNTING_SIGTERM
:
497 case MOUNT_REMOUNTING_SIGKILL
:
498 case MOUNT_UNMOUNTING_SIGTERM
:
499 case MOUNT_UNMOUNTING_SIGKILL
:
501 if (old_state
!= state
)
502 automount_send_ready(a
, a
->tokens
, -ENODEV
);
503 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
511 automount_send_ready(a
, a
->expire_tokens
, 0);
514 case MOUNT_MOUNTING_DONE
:
515 case MOUNT_MOUNTING_SIGTERM
:
516 case MOUNT_MOUNTING_SIGKILL
:
517 case MOUNT_REMOUNTING_SIGTERM
:
518 case MOUNT_REMOUNTING_SIGKILL
:
519 case MOUNT_UNMOUNTING_SIGTERM
:
520 case MOUNT_UNMOUNTING_SIGKILL
:
522 if (old_state
!= state
)
523 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
532 static void automount_enter_waiting(Automount
*a
) {
533 _cleanup_close_
int ioctl_fd
= -1;
534 int p
[2] = { -1, -1 };
535 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
536 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
537 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
538 bool mounted
= false;
539 int r
, dev_autofs_fd
;
543 assert(a
->pipe_fd
< 0);
546 set_clear(a
->tokens
);
548 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
552 (void) mkdir_p_label(a
->where
, 0555);
554 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
556 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
557 if (dev_autofs_fd
< 0) {
562 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
567 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
568 xsprintf(name
, "systemd-"PID_FMT
, getpid());
569 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
576 p
[1] = safe_close(p
[1]);
578 if (stat(a
->where
, &st
) < 0) {
583 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
589 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
593 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
599 * Unless we close the ioctl fd here, for some weird reason
600 * the direct mount will not receive events from the
603 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
607 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
610 a
->dev_id
= st
.st_dev
;
612 automount_set_state(a
, AUTOMOUNT_WAITING
);
620 repeat_unmount(a
->where
);
622 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
623 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
626 static void *expire_thread(void *p
) {
627 struct autofs_dev_ioctl param
;
628 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
631 assert(data
->dev_autofs_fd
>= 0);
632 assert(data
->ioctl_fd
>= 0);
634 init_autofs_dev_ioctl(¶m
);
635 param
.ioctlfd
= data
->ioctl_fd
;
638 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
642 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
647 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
648 Automount
*a
= AUTOMOUNT(userdata
);
649 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
653 assert(source
== a
->expire_event_source
);
655 data
= new0(struct expire_data
, 1);
661 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
662 if (data
->dev_autofs_fd
< 0)
663 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
665 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
666 if (data
->ioctl_fd
< 0)
667 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
669 r
= asynchronous_job(expire_thread
, data
);
671 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
675 return automount_start_expire(a
);
678 static int automount_start_expire(Automount
*a
) {
684 if (a
->timeout_idle_usec
== 0)
687 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
689 if (a
->expire_event_source
) {
690 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
694 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
697 r
= sd_event_add_time(
698 UNIT(a
)->manager
->event
,
699 &a
->expire_event_source
,
700 CLOCK_MONOTONIC
, timeout
, 0,
701 automount_dispatch_expire
, a
);
705 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
710 static void automount_enter_runnning(Automount
*a
) {
711 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
717 /* We don't take mount requests anymore if we are supposed to
718 * shut down anyway */
719 if (unit_stop_pending(UNIT(a
))) {
720 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
721 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
722 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
726 mkdir_p_label(a
->where
, a
->directory_mode
);
728 /* Before we do anything, let's see if somebody is playing games with us? */
729 if (lstat(a
->where
, &st
) < 0) {
730 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
734 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
735 log_unit_info(UNIT(a
), "Automount point already active?");
737 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)),
738 JOB_REPLACE
, true, &error
, NULL
);
740 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
745 automount_set_state(a
, AUTOMOUNT_RUNNING
);
749 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
752 static int automount_start(Unit
*u
) {
753 Automount
*a
= AUTOMOUNT(u
);
756 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
758 if (path_is_mount_point(a
->where
, 0) > 0) {
759 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
763 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
766 a
->result
= AUTOMOUNT_SUCCESS
;
767 automount_enter_waiting(a
);
771 static int automount_stop(Unit
*u
) {
772 Automount
*a
= AUTOMOUNT(u
);
775 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
777 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
781 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
782 Automount
*a
= AUTOMOUNT(u
);
791 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
792 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
793 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
795 SET_FOREACH(p
, a
->tokens
, i
)
796 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
797 SET_FOREACH(p
, a
->expire_tokens
, i
)
798 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
800 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
807 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
808 Automount
*a
= AUTOMOUNT(u
);
814 if (streq(key
, "state")) {
815 AutomountState state
;
817 state
= automount_state_from_string(value
);
819 log_unit_debug(u
, "Failed to parse state value: %s", value
);
821 a
->deserialized_state
= state
;
822 } else if (streq(key
, "result")) {
825 f
= automount_result_from_string(value
);
827 log_unit_debug(u
, "Failed to parse result value: %s", value
);
828 else if (f
!= AUTOMOUNT_SUCCESS
)
831 } else if (streq(key
, "dev-id")) {
834 if (safe_atou(value
, &d
) < 0)
835 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
837 a
->dev_id
= (unsigned) d
;
838 } else if (streq(key
, "token")) {
841 if (safe_atou(value
, &token
) < 0)
842 log_unit_debug(u
, "Failed to parse token value: %s", value
);
844 r
= set_ensure_allocated(&a
->tokens
, NULL
);
850 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
852 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
854 } else if (streq(key
, "expire-token")) {
857 if (safe_atou(value
, &token
) < 0)
858 log_unit_debug(u
, "Failed to parse token value: %s", value
);
860 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
866 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
868 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
870 } else if (streq(key
, "pipe-fd")) {
873 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
874 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
876 safe_close(a
->pipe_fd
);
877 a
->pipe_fd
= fdset_remove(fds
, fd
);
880 log_unit_debug(u
, "Unknown serialization key: %s", key
);
885 static UnitActiveState
automount_active_state(Unit
*u
) {
888 return state_translation_table
[AUTOMOUNT(u
)->state
];
891 static const char *automount_sub_state_to_string(Unit
*u
) {
894 return automount_state_to_string(AUTOMOUNT(u
)->state
);
897 static bool automount_check_gc(Unit
*u
) {
900 if (!UNIT_TRIGGER(u
))
903 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
906 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
907 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
908 union autofs_v5_packet_union packet
;
909 Automount
*a
= AUTOMOUNT(userdata
);
914 assert(fd
== a
->pipe_fd
);
916 if (events
!= EPOLLIN
) {
917 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
921 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
923 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
927 switch (packet
.hdr
.type
) {
929 case autofs_ptype_missing_direct
:
931 if (packet
.v5_packet
.pid
> 0) {
932 _cleanup_free_
char *p
= NULL
;
934 get_process_comm(packet
.v5_packet
.pid
, &p
);
935 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
937 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
939 r
= set_ensure_allocated(&a
->tokens
, NULL
);
941 log_unit_error(UNIT(a
), "Failed to allocate token set.");
945 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
947 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
951 automount_enter_runnning(a
);
954 case autofs_ptype_expire_direct
:
955 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
957 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
959 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
961 log_unit_error(UNIT(a
), "Failed to allocate token set.");
965 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
967 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
971 /* Before we do anything, let's see if somebody is playing games with us? */
972 if (lstat(a
->where
, &st
) < 0) {
973 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
977 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
978 log_unit_info(UNIT(a
), "Automount point already unmounted?");
979 automount_send_ready(a
, a
->expire_tokens
, 0);
983 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, true, &error
, NULL
);
985 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
991 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
998 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
1002 static void automount_shutdown(Manager
*m
) {
1005 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
1008 static void automount_reset_failed(Unit
*u
) {
1009 Automount
*a
= AUTOMOUNT(u
);
1013 if (a
->state
== AUTOMOUNT_FAILED
)
1014 automount_set_state(a
, AUTOMOUNT_DEAD
);
1016 a
->result
= AUTOMOUNT_SUCCESS
;
1019 static bool automount_supported(void) {
1020 static int supported
= -1;
1023 supported
= access("/dev/autofs", F_OK
) >= 0;
1028 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1029 [AUTOMOUNT_SUCCESS
] = "success",
1030 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1033 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1035 const UnitVTable automount_vtable
= {
1036 .object_size
= sizeof(Automount
),
1044 .no_instances
= true,
1046 .init
= automount_init
,
1047 .load
= automount_load
,
1048 .done
= automount_done
,
1050 .coldplug
= automount_coldplug
,
1052 .dump
= automount_dump
,
1054 .start
= automount_start
,
1055 .stop
= automount_stop
,
1057 .serialize
= automount_serialize
,
1058 .deserialize_item
= automount_deserialize_item
,
1060 .active_state
= automount_active_state
,
1061 .sub_state_to_string
= automount_sub_state_to_string
,
1063 .check_gc
= automount_check_gc
,
1065 .reset_failed
= automount_reset_failed
,
1067 .bus_vtable
= bus_automount_vtable
,
1069 .shutdown
= automount_shutdown
,
1070 .supported
= automount_supported
,
1072 .status_message_formats
= {
1073 .finished_start_job
= {
1074 [JOB_DONE
] = "Set up automount %s.",
1075 [JOB_FAILED
] = "Failed to set up automount %s.",
1077 .finished_stop_job
= {
1078 [JOB_DONE
] = "Unset automount %s.",
1079 [JOB_FAILED
] = "Failed to unset automount %s.",