1
/* IVLE - Informatics Virtual Learning Environment
2
* Copyright (C) 2008 The University of Melbourne
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
* Author: William Grant
22
* Timount ('timeout mounts') cleans up mounts after a period of inactivity.
23
* It looks in the given directory of mountpoints, and attempts to unmount each
24
* with the MNT_EXPIRE flag. This flag is reset whenever a process accesses
25
* the mountpoint, meaning that a mountpoint will be unmounted only if it is
26
* inactive for the interval between two timount invocations.
28
* It is unclear how frequently timount should optimally be run. Empirical data
29
* specific to the installation will likely be required.
31
* Usage: timount <path>
32
* Must run as root, and probably from cron.
41
#include <sys/mount.h>
44
/* For some reason this isn't defined in libc at the moment. */
48
void usage(const char *prog)
50
fprintf(stderr, "usage: %s <path>\n", prog);
54
int main(int argc, const char *argv[])
63
openlog("timount", LOG_CONS | LOG_PID, LOG_USER);
65
rootdir = opendir(argv[1]);
67
while ((mp = readdir(rootdir)))
69
dirname = malloc(strlen(argv[1]) + strlen(mp->d_name) + 2);
70
sprintf(dirname, "%s/%s", argv[1], mp->d_name);
71
if (mp->d_name[0] != '.' && mp->d_name[0] != '_')
73
if (umount2(dirname, MNT_EXPIRE))
75
/* We failed to unmount, but did it set the expire flag? */
77
syslog(LOG_INFO, "marked %s for expiry\n", mp->d_name);
81
syslog(LOG_INFO, "unmounted %s\n", mp->d_name);