]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/amd/amd/ops_cdfs.c
MFC r308493, r308619: Update amd from am-utils 6.1.5 to 6.2.
[FreeBSD/stable/10.git] / contrib / amd / amd / ops_cdfs.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_cdfs.c
37  *
38  */
39
40 /*
41  * High Sierra (CD-ROM) 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 *cdfs_match(am_opts *fo);
52 static int cdfs_mount(am_node *am, mntfs *mf);
53 static int cdfs_umount(am_node *am, mntfs *mf);
54
55 /*
56  * Ops structure
57  */
58 am_ops cdfs_ops =
59 {
60   "cdfs",
61   cdfs_match,
62   0,                            /* cdfs_init */
63   cdfs_mount,
64   cdfs_umount,
65   amfs_error_lookup_child,
66   amfs_error_mount_child,
67   amfs_error_readdir,
68   0,                            /* cdfs_readlink */
69   0,                            /* cdfs_mounted */
70   0,                            /* cdfs_umounted */
71   amfs_generic_find_srvr,
72   0,                            /* cdfs_get_wchan */
73   FS_MKMNT | FS_UBACKGROUND | FS_AMQINFO,       /* nfs_fs_flags */
74 #ifdef HAVE_FS_AUTOFS
75   AUTOFS_CDFS_FS_FLAGS,
76 #endif /* HAVE_FS_AUTOFS */
77 };
78
79
80 /*
81  * CDFS needs remote filesystem.
82  */
83 static char *
84 cdfs_match(am_opts *fo)
85 {
86   if (!fo->opt_dev) {
87     plog(XLOG_USER, "cdfs: no source device specified");
88     return 0;
89   }
90   dlog("CDFS: mounting device \"%s\" on \"%s\"",
91        fo->opt_dev, fo->opt_fs);
92
93   /*
94    * Determine magic cookie to put in mtab
95    */
96   return xstrdup(fo->opt_dev);
97 }
98
99
100 static int
101 mount_cdfs(char *mntdir, char *fs_name, char *opts, int on_autofs)
102 {
103   cdfs_args_t cdfs_args;
104   mntent_t mnt;
105   int genflags, cdfs_flags, retval;
106
107   /*
108    * Figure out the name of the file system type.
109    */
110   MTYPE_TYPE type = MOUNT_TYPE_CDFS;
111
112   memset((voidp) &cdfs_args, 0, sizeof(cdfs_args)); /* Paranoid */
113   cdfs_flags = 0;
114
115   /*
116    * Fill in the mount structure
117    */
118   memset((voidp) &mnt, 0, sizeof(mnt));
119   mnt.mnt_dir = mntdir;
120   mnt.mnt_fsname = fs_name;
121   mnt.mnt_type = MNTTAB_TYPE_CDFS;
122   mnt.mnt_opts = opts;
123
124 #if defined(MNT2_CDFS_OPT_DEFPERM) && defined(MNTTAB_OPT_DEFPERM)
125   if (amu_hasmntopt(&mnt, MNTTAB_OPT_DEFPERM))
126 # ifdef MNT2_CDFS_OPT_DEFPERM
127     cdfs_flags |= MNT2_CDFS_OPT_DEFPERM;
128 # else /* not MNT2_CDFS_OPT_DEFPERM */
129     cdfs_flags &= ~MNT2_CDFS_OPT_NODEFPERM;
130 # endif /* not MNT2_CDFS_OPT_DEFPERM */
131 #endif /* defined(MNT2_CDFS_OPT_DEFPERM) && defined(MNTTAB_OPT_DEFPERM) */
132
133 #if defined(MNT2_CDFS_OPT_NODEFPERM) && defined(MNTTAB_OPT_NODEFPERM)
134   if (amu_hasmntopt(&mnt, MNTTAB_OPT_NODEFPERM))
135     cdfs_flags |= MNT2_CDFS_OPT_NODEFPERM;
136 #endif /* MNTTAB_OPT_NODEFPERM */
137
138 #if defined(MNT2_CDFS_OPT_NOVERSION) && defined(MNTTAB_OPT_NOVERSION)
139   if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOVERSION))
140     cdfs_flags |= MNT2_CDFS_OPT_NOVERSION;
141 #endif /* defined(MNT2_CDFS_OPT_NOVERSION) && defined(MNTTAB_OPT_NOVERSION) */
142
143 #if defined(MNT2_CDFS_OPT_RRIP) && defined(MNTTAB_OPT_RRIP)
144   if (amu_hasmntopt(&mnt, MNTTAB_OPT_RRIP))
145     cdfs_flags |= MNT2_CDFS_OPT_RRIP;
146 #endif /* defined(MNT2_CDFS_OPT_RRIP) && defined(MNTTAB_OPT_RRIP) */
147
148 #if defined(MNT2_CDFS_OPT_NORRIP) && defined(MNTTAB_OPT_NORRIP)
149   if (amu_hasmntopt(&mnt, MNTTAB_OPT_NORRIP))
150     cdfs_flags |= MNT2_CDFS_OPT_NORRIP;
151 #endif /* defined(MNT2_CDFS_OPT_NORRIP) && defined(MNTTAB_OPT_NORRIP) */
152
153 #if defined(MNT2_CDFS_OPT_GENS) && defined(MNTTAB_OPT_GENS)
154   if (amu_hasmntopt(&mnt, MNTTAB_OPT_GENS))
155     cdfs_flags |= MNT2_CDFS_OPT_GENS;
156 #endif /* defined(MNT2_CDFS_OPT_GENS) && defined(MNTTAB_OPT_GENS) */
157
158 #if defined(MNT2_CDFS_OPT_EXTATT) && defined(MNTTAB_OPT_EXTATT)
159   if (amu_hasmntopt(&mnt, MNTTAB_OPT_EXTATT))
160     cdfs_flags |= MNT2_CDFS_OPT_EXTATT;
161 #endif /* defined(MNT2_CDFS_OPT_EXTATT) && defined(MNTTAB_OPT_EXTATT) */
162
163 #if defined(MNT2_CDFS_OPT_NOCASETRANS) && defined(MNTTAB_OPT_NOCASETRANS)
164   if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOCASETRANS))
165     cdfs_flags |= MNT2_CDFS_OPT_NOCASETRANS;
166 #endif /* defined(MNT2_CDFS_OPT_NOCASETRANS) && defined(MNTTAB_OPT_NOCASETRANS) */
167
168 #if defined(MNT2_CDFS_OPT_NOJOLIET) && defined(MNTTAB_OPT_NOJOLIET)
169   if (amu_hasmntopt(&mnt, MNTTAB_OPT_NOJOLIET))
170     cdfs_flags |= MNT2_CDFS_OPT_NOJOLIET;
171 #endif /* defined(MNT2_CDFS_OPT_NOJOLIET) && defined(MNTTAB_OPT_NOJOLIET) */
172
173 #if defined(MNT2_CDFS_OPT_RRCASEINS) && defined(MNTTAB_OPT_RRCASEINS)
174   if (amu_hasmntopt(&mnt, MNTTAB_OPT_RRCASEINS))
175     cdfs_flags |= MNT2_CDFS_OPT_RRCASEINS;
176 #endif /* defined(MNT2_CDFS_OPT_RRCASEINS) && defined(MNTTAB_OPT_RRCASEINS) */
177
178   genflags = compute_mount_flags(&mnt);
179 #ifdef HAVE_FS_AUTOFS
180   if (on_autofs)
181     genflags |= autofs_compute_mount_flags(&mnt);
182 #endif /* HAVE_FS_AUTOFS */
183
184 #ifdef HAVE_CDFS_ARGS_T_FLAGS
185   cdfs_args.flags = cdfs_flags;
186 #endif /* HAVE_CDFS_ARGS_T_FLAGS */
187
188 #ifdef HAVE_CDFS_ARGS_T_ISO_FLAGS
189   cdfs_args.iso_flags = genflags | cdfs_flags;
190 #endif /* HAVE_CDFS_ARGS_T_ISO_FLAGS */
191
192 #ifdef HAVE_CDFS_ARGS_T_ISO_PGTHRESH
193   cdfs_args.iso_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH);
194 #endif /* HAVE_CDFS_ARGS_T_ISO_PGTHRESH */
195
196 #ifdef HAVE_CDFS_ARGS_T_NORRIP
197   /* XXX: need to provide norrip mount opt */
198   cdfs_args.norrip = 0;         /* use Rock-Ridge Protocol extensions */
199 #endif /* HAVE_CDFS_ARGS_T_NORRIP */
200
201 #ifdef HAVE_CDFS_ARGS_T_SSECTOR
202   /* XXX: need to provide ssector mount option */
203   cdfs_args.ssector = 0;        /* use 1st session on disk */
204 #endif /* HAVE_CDFS_ARGS_T_SSECTOR */
205
206 #ifdef HAVE_CDFS_ARGS_T_FSPEC
207   cdfs_args.fspec = fs_name;
208 #endif /* HAVE_CDFS_ARGS_T_FSPEC */
209
210   /*
211    * Call generic mount routine
212    */
213   retval = mount_fs(&mnt, genflags, (caddr_t) &cdfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs);
214
215   return retval;
216 }
217
218
219 static int
220 cdfs_mount(am_node *am, mntfs *mf)
221 {
222   int on_autofs = mf->mf_flags & MFF_ON_AUTOFS;
223   int error;
224
225   error = mount_cdfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs);
226   if (error) {
227     errno = error;
228     plog(XLOG_ERROR, "mount_cdfs: %m");
229     return error;
230   }
231   return 0;
232 }
233
234
235 static int
236 cdfs_umount(am_node *am, mntfs *mf)
237 {
238   int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0;
239
240   return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags);
241 }