]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/amd/conf/umount/umount_bsd44.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / amd / conf / umount / umount_bsd44.c
1 /*
2  * Copyright (c) 1997-2006 Erez Zadok
3  * Copyright (c) 1990 Jan-Simon Pendry
4  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
5  * Copyright (c) 1990 The Regents of the University of California.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Jan-Simon Pendry at Imperial College, London.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgment:
21  *      This product includes software developed by the University of
22  *      California, Berkeley and its contributors.
23  * 4. Neither the name of the University nor the names of its contributors
24  *    may be used to endorse or promote products derived from this software
25  *    without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  *
39  *
40  * File: am-utils/conf/umount/umount_bsd44.c
41  *
42  */
43
44 /*
45  * Unmounting filesystems under BSD 4.4.
46  */
47
48 #ifdef HAVE_CONFIG_H
49 # include <config.h>
50 #endif /* HAVE_CONFIG_H */
51 #include <am_defs.h>
52 #include <amu.h>
53
54
55 int
56 umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
57 {
58   int error;
59
60 eintr:
61   error = unmount(mntdir, 0);
62   if (error < 0)
63     error = errno;
64
65   switch (error) {
66   case EINVAL:
67   case ENOTBLK:
68   case ENOENT:
69     plog(XLOG_WARNING, "unmount: %s is not mounted", mntdir);
70     error = 0;                  /* Not really an error */
71     break;
72
73   case EINTR:
74     /* not sure why this happens, but it does.  ask kirk one day... */
75     dlog("%s: unmount: %m", mntdir);
76     goto eintr;
77
78 #ifdef MNT2_GEN_OPT_FORCE
79   case EBUSY:
80   case EIO:
81   case ESTALE:
82     /* caller determines if forced unmounts should be used */
83     if (unmount_flags & AMU_UMOUNT_FORCE) {
84       error = umount2_fs(mntdir, unmount_flags);
85       if (error < 0)
86         error = errno;
87       else
88         return error;
89     }
90     /* fallthrough */
91 #endif /* MNT2_GEN_OPT_FORCE */
92
93   default:
94     dlog("%s: unmount: %m", mntdir);
95     break;
96   }
97
98   return error;
99 }
100
101
102 #ifdef MNT2_GEN_OPT_FORCE
103 /* force unmount, no questions asked, without touching mnttab file */
104 int
105 umount2_fs(const char *mntdir, u_int unmount_flags)
106 {
107   int error = 0;
108   if (unmount_flags & AMU_UMOUNT_FORCE) {
109     plog(XLOG_INFO, "umount2_fs: trying unmount/forced on %s", mntdir);
110     error = unmount(mntdir, MNT2_GEN_OPT_FORCE);
111     if (error < 0 && (errno == EINVAL || errno == ENOENT))
112       error = 0;                /* ignore EINVAL/ENOENT */
113     if (error < 0)
114       plog(XLOG_WARNING, "%s: unmount/force: %m", mntdir);
115     else
116       dlog("%s: unmount/force: OK", mntdir);
117   }
118   return error;
119 }
120 #endif /* MNT2_GEN_OPT_FORCE */