1 /* 2 * Copyright (c) 2004-09 The DragonFly Project. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * Neither the name of the DragonFly Project nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31 * OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 /* 35 * mount.c 36 * $Id: mount.c,v 1.4 2005/02/10 03:33:49 cpressey Exp $ 37 */ 38 39 #include <sys/stat.h> 40 #include <sys/param.h> 41 #include <sys/ucred.h> 42 #include <sys/mount.h> 43 44 #include <stdarg.h> 45 #include <stdio.h> 46 #include <stdlib.h> 47 #include <string.h> 48 #include <unistd.h> 49 50 #include "libaura/fspred.h" 51 52 #include "commands.h" 53 #include "functions.h" 54 55 static int 56 compare(const void *a, const void *b) 57 { 58 const struct statfs *sa = a; 59 const struct statfs *sb = b; 60 61 return -strcmp(sa->f_mntonname, 62 sb->f_mntonname); 63 } 64 65 /* 66 * Unmount all mountpoints under a given mountpoint in order (e.g. /var/tmp is 67 * unmounted before /var). 68 */ 69 void 70 unmount_all_under(struct i_fn_args *a, struct commands *cmds, const char *fmt, ...) 71 { 72 struct statfs *mt_array; 73 int count, i; 74 char *mtpt; 75 va_list args; 76 77 va_start(args, fmt); 78 vasprintf(&mtpt, fmt, args); 79 va_end(args); 80 81 count = getmntinfo(&mt_array, MNT_WAIT); 82 83 /* Order mount points in reverse lexicographically order. */ 84 qsort((void*)mt_array, count, sizeof(struct statfs), compare); 85 86 for (i = 0; i < count; i++) { 87 if (strncmp(mtpt, mt_array[i].f_mntonname, strlen(mtpt)) != 0) 88 continue; 89 if (strlen(mtpt) > strlen(mt_array[i].f_mntonname)) 90 continue; 91 92 command_add(cmds, "%s%s %s", 93 a->os_root, cmd_name(a, "UMOUNT"), mt_array[i].f_mntonname); 94 } 95 96 free(mtpt); 97 } 98