]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/amd/amd/ops_ext.c
MFC r308493, r308619: Update amd from am-utils 6.1.5 to 6.2.
[FreeBSD/stable/10.git] / contrib / amd / amd / ops_ext.c
1 /*
2  * Copyright (c) 1997-2014 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. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *
36  * File: am-utils/amd/ops_ext.c
37  *
38  */
39
40 /*
41  * Irix UN*X file system: EXT (Extended File System)
42  */
43
44 #ifdef HAVE_CONFIG_H
45 # include <config.h>
46 #endif /* HAVE_CONFIG_H */
47 #include <am_defs.h>
48 #include <amd.h>
49
50 /* forward declarations */
51 static char *ext_match(am_opts *fo);
52 static int ext2_mount(am_node *am, mntfs *mf);
53 static int ext3_mount(am_node *am, mntfs *mf);
54 static int ext4_mount(am_node *am, mntfs *mf);
55 static int ext_umount(am_node *am, mntfs *mf);
56
57 /*
58  * Ops structure
59  */
60 am_ops ext2_ops =
61 {
62   "ext2",
63   ext_match,
64   0,                            /* ext_init */
65   ext2_mount,
66   ext_umount,
67   amfs_error_lookup_child,
68   amfs_error_mount_child,
69   amfs_error_readdir,
70   0,                            /* ext_readlink */
71   0,                            /* ext_mounted */
72   0,                            /* ext_umounted */
73   amfs_generic_find_srvr,
74   0,                            /* ext_get_wchan */
75   FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
76 #ifdef HAVE_FS_AUTOFS
77   AUTOFS_EXT_FS_FLAGS,
78 #endif /* HAVE_FS_AUTOFS */
79 };
80
81 am_ops ext3_ops =
82 {
83   "ext3",
84   ext_match,
85   0,                            /* ext_init */
86   ext3_mount,
87   ext_umount,
88   amfs_error_lookup_child,
89   amfs_error_mount_child,
90   amfs_error_readdir,
91   0,                            /* ext_readlink */
92   0,                            /* ext_mounted */
93   0,                            /* ext_umounted */
94   amfs_generic_find_srvr,
95   0,                            /* ext_get_wchan */
96   FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
97 #ifdef HAVE_FS_AUTOFS
98   AUTOFS_EXT_FS_FLAGS,
99 #endif /* HAVE_FS_AUTOFS */
100 };
101
102 am_ops ext4_ops =
103 {
104   "ext4",
105   ext_match,
106   0,                            /* ext_init */
107   ext4_mount,
108   ext_umount,
109   amfs_error_lookup_child,
110   amfs_error_mount_child,
111   amfs_error_readdir,
112   0,                            /* ext_readlink */
113   0,                            /* ext_mounted */
114   0,                            /* ext_umounted */
115   amfs_generic_find_srvr,
116   0,                            /* ext_get_wchan */
117   FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */
118 #ifdef HAVE_FS_AUTOFS
119   AUTOFS_EXT_FS_FLAGS,
120 #endif /* HAVE_FS_AUTOFS */
121 };
122
123 /*
124  * EXT needs local filesystem and device.
125  */
126 static char *
127 ext_match(am_opts *fo)
128 {
129
130   if (!fo->opt_dev) {
131     plog(XLOG_USER, "ext: no device specified");
132     return 0;
133   }
134
135   dlog("EXT: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs);
136
137   /*
138    * Determine magic cookie to put in mtab
139    */
140   return xstrdup(fo->opt_dev);
141 }
142
143
144 static int
145 mount_ext(char *mntdir, char *fs_name, char *opts, int on_autofs, char *
146     mount_type, const char *mnttab_type)
147 {
148   ext_args_t ext_args;
149   mntent_t mnt;
150   int flags;
151
152   /*
153    * Figure out the name of the file system type.
154    */
155   MTYPE_TYPE type = mount_type;
156
157   memset((voidp) &ext_args, 0, sizeof(ext_args)); /* Paranoid */
158
159   /*
160    * Fill in the mount structure
161    */
162   memset((voidp) &mnt, 0, sizeof(mnt));
163   mnt.mnt_dir = mntdir;
164   mnt.mnt_fsname = fs_name;
165   mnt.mnt_type = mnttab_type;
166   mnt.mnt_opts = opts;
167
168   flags = compute_mount_flags(&mnt);
169 #ifdef HAVE_FS_AUTOFS
170   if (on_autofs)
171     flags |= autofs_compute_mount_flags(&mnt);
172 #endif /* HAVE_FS_AUTOFS */
173
174   /*
175    * Call generic mount routine
176    */
177   return mount_fs(&mnt, flags, (caddr_t) &ext_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
178 }
179
180
181 static int
182 ext_mount(am_node *am, mntfs *mf, char *mount_type,
183   const char *mnttab_type)
184 {
185   int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
186   int error;
187
188   error = mount_ext(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs,
189       mount_type, mnttab_type);
190   if (error) {
191     errno = error;
192     plog(XLOG_ERROR, "mount_ext: %m");
193     return error;
194   }
195
196   return 0;
197 }
198
199 static int
200 ext2_mount(am_node *am, mntfs *mf)
201 {
202   return ext_mount(am, mf, MOUNT_TYPE_EXT2, MNTTAB_TYPE_EXT2);
203 }
204
205 static int
206 ext3_mount(am_node *am, mntfs *mf)
207 {
208   return ext_mount(am, mf, MOUNT_TYPE_EXT3, MNTTAB_TYPE_EXT3);
209 }
210
211 static int
212 ext4_mount(am_node *am, mntfs *mf)
213 {
214   return ext_mount(am, mf, MOUNT_TYPE_EXT4, MNTTAB_TYPE_EXT4);
215 }
216
217 static int
218 ext_umount(am_node *am, mntfs *mf)
219 {
220   int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
221
222   return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
223 }