1/*	$NetBSD: mount_svr4.c,v 1.1.1.3 2015/01/17 16:34:16 christos Exp $	*/
2
3/*
4 * Copyright (c) 1997-2014 Erez Zadok
5 * Copyright (c) 1990 Jan-Simon Pendry
6 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
7 * Copyright (c) 1990 The Regents of the University of California.
8 * All rights reserved.
9 *
10 * This code is derived from software contributed to Berkeley by
11 * Jan-Simon Pendry at Imperial College, London.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the University nor the names of its contributors
22 *    may be used to endorse or promote products derived from this software
23 *    without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 *
38 * File: am-utils/conf/mount/mount_svr4.c
39 *
40 */
41
42/*
43 * SVR4:
44 * Solaris 2.x (SunOS 5.x) and HPUX-11 Mount helper.
45 *      -Erez Zadok <ezk@cs.columbia.edu>
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/*
56 * On Solaris 8 with in-kernel mount table, pass mount options to kernel to
57 * have them evaluated.  They will also show up in /etc/mnttab.
58 */
59#if defined(MNT2_GEN_OPT_OPTIONSTR) && defined(MAX_MNTOPT_STR)
60# define sys_mount(fsname, dir, flags, type, data, datasize) \
61	mount((fsname), (dir), (MNT2_GEN_OPT_OPTIONSTR | flags), (type), \
62	      (data), (datasize), mountopts, sizeof(mountopts))
63#else /* not defined(MNT2_GEN_OPT_OPTIONSTR) && defined(MAX_MNTOPT_STR) */
64# define sys_mount(fsname, dir, flags, type, data, datasize) \
65	mount((fsname), (dir), (flags), (type), (data), (datasize))
66#endif /* not defined(MNT2_GEN_OPT_OPTIONSTR) && defined(MAX_MNTOPT_STR) */
67
68
69/*
70 * Map from conventional mount arguments
71 * to Solaris 2.x (SunOS 5.x) style arguments.
72 */
73int
74mount_svr4(char *fsname, char *dir, int flags, MTYPE_TYPE type, caddr_t data, const char *optstr)
75{
76#if defined(MNT2_GEN_OPT_OPTIONSTR) && defined(MAX_MNTOPT_STR)
77  char mountopts[MAX_MNTOPT_STR];
78
79  /*
80   * Save a copy of the mount options.  The kernel will overwrite them with
81   * those it recognizes.
82   */
83  xstrlcpy(mountopts, optstr, MAX_MNTOPT_STR);
84#endif /* defined(MNT2_GEN_OPT_OPTIONSTR) && defined(MAX_MNTOPT_STR) */
85
86#if defined(MOUNT_TYPE_NFS3) && defined(MNTTAB_TYPE_NFS3)
87  if (STREQ(type, MOUNT_TYPE_NFS3)) {
88    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
89		     type, (char *) data, sizeof(nfs_args_t));
90  }
91#endif /* defined(MOUNT_TYPE_NFS3) && defined(MNTTAB_TYPE_NFS3) */
92
93#if defined(MOUNT_TYPE_NFS) && defined(MNTTAB_TYPE_NFS)
94  if (STREQ(type, MOUNT_TYPE_NFS)) {
95    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
96		     type, (char *) data, sizeof(nfs_args_t));
97  }
98#endif /* defined(MOUNT_TYPE_NFS) && defined(MNTTAB_TYPE_NFS) */
99
100#if defined(MOUNT_TYPE_AUTOFS) && defined(MNTTAB_TYPE_AUTOFS)
101  if (STREQ(type, MOUNT_TYPE_AUTOFS)) {
102    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
103		     type, (char *) data, sizeof(autofs_args_t));
104  }
105#endif /* defined(MOUNT_TYPE_AUTOFS) && defined(MNTTAB_TYPE_AUTOFS) */
106
107#if defined(MOUNT_TYPE_UFS) && defined(MNTTAB_TYPE_UFS)
108  if (STREQ(type, MOUNT_TYPE_UFS))
109    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
110		     type, (char *) data, sizeof(ufs_args_t));
111#endif /* defined(MOUNT_TYPE_UFS) && defined(MNTTAB_TYPE_UFS) */
112
113#if defined(MOUNT_TYPE_PCFS) && defined(MNTTAB_TYPE_PCFS)
114  if (STREQ(type, MOUNT_TYPE_PCFS))
115    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
116		     type, (char *) data, sizeof(pcfs_args_t));
117#endif /* defined(MOUNT_TYPE_PCFS) && defined(MNTTAB_TYPE_PCFS) */
118
119#if defined(MOUNT_TYPE_CDFS) && defined(MNTTAB_TYPE_CDFS)
120  /*
121   * HSFS on Solaris allows for 3 HSFSMNT_* flags to be passed
122   * as arguments to the mount().  These flags are bit fields in an
123   * integer, and that integer is passed as the "data" of this system
124   * call.  The flags are described in <sys/fs/hsfs_rrip.h>.  However,
125   * Solaris does not have an interface to these.  It does not define
126   * a structure hsfs_args or anything that one can figure out what
127   * arguments to pass to mount(2) for this type of filesystem.
128   * Therefore, until Sun does, no arguments are passed to this mount
129   * below.
130   * -Erez Zadok <ezk@cs.columbia.edu>.
131   */
132  if (STREQ(type, MOUNT_TYPE_CDFS))
133    return sys_mount(fsname, dir, (MNT2_GEN_OPT_FSS | flags),
134		     type, (char *) NULL, 0);
135#endif /* defined(MOUNT_TYPE_CDFS) && defined(MNTTAB_TYPE_CDFS) */
136
137#if defined(MOUNT_TYPE_LOFS) && defined(MNTTAB_TYPE_LOFS)
138  if (STREQ(type, MOUNT_TYPE_LOFS))
139    return sys_mount(fsname, dir, (MNT2_GEN_OPT_FSS | flags),
140		     type, (char *) NULL, 0);
141#endif /* defined(MOUNT_TYPE_LOFS) && defined(MNTTAB_TYPE_LOFS) */
142
143#ifdef HAVE_FS_CACHEFS
144# if defined(MOUNT_TYPE_CACHEFS) && defined(MNTTAB_TYPE_CACHEFS)
145  if (STREQ(type, MOUNT_TYPE_CACHEFS))
146    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
147		     type, (char *) data, sizeof(cachefs_args_t));
148# endif /* defined(MOUNT_TYPE_CACHEFS) && defined(MNTTAB_TYPE_CACHEFS) */
149#endif /*HAVE_FS_CACHEFS */
150
151#ifdef HAVE_FS_AUTOFS
152# if defined(MOUNT_TYPE_AUTOFS) && defined(MNTTAB_TYPE_AUTOFS)
153  if (STREQ(type, MOUNT_TYPE_AUTOFS))
154    return sys_mount(fsname, dir, (MNT2_GEN_OPT_DATA | flags),
155		     type, (char *) data, sizeof(autofs_args_t));
156# endif /* defined(MOUNT_TYPE_AUTOFS) && defined(MNTTAB_TYPE_AUTOFS) */
157#endif /* HAVE_FS_AUTOFS */
158
159  return EINVAL;
160}
161