1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include <errno.h>
30 #include <sys/types.h>
31 #include <rpc/types.h>
32 #include <sys/time.h>
33 #include <sys/mount.h>
34 #include <sys/syscall.h>
35 #include <netinet/in.h>
36
37
38 #define GETFSIND 1 /* translate fs id to ftype index */
39 #define CLIENT 1 /* #defined in <pn.h> */
40 #define MS_RFFLAGS (MS_CACHE)
41
42 /*
43 * Flags bits passed to mount(2), from the SVR4 sys/mount.h header file.
44 */
45 #define MS_RDONLY 0x01 /* read only bit */
46 #define MS_DATA 0x04 /* 6-argument mount */
47 #define MS_NOSUID 0x10 /* Setuid programs disallowed */
48 #define MS_REMOUNT 0x20 /* Remount */
49 #define MS_NOTRUNC 0x40 /* Return ENAMETOOLONG for long filenames */
50
51 /*
52 * structs netbuf, knetconfig, and nfsarg from SVR4
53 */
54
55
56 struct netbuf {
57 unsigned int maxlen;
58 unsigned int len;
59 char *buf;
60 };
61
62 struct knetconfig {
63 unsigned long knc_semantics; /* token name */
64 char *knc_protofmly; /* protocol family */
65 char *knc_proto; /* protocol */
66 dev_t knc_rdev; /* device id */
67 unsigned long knc_unused[8];
68 };
69
70 struct nfsarg {
71 struct netbuf *addr; /* file server address */
72 /* secure NFS time sync address */
73 struct netbuf *syncaddr;
74 /* transport knetconfig struct */
75 struct knetconfig *knconf;
76 char *hostname; /* server's hostname */
77 char *netname; /* server's netname */
78 caddr_t fh; /* File handle to be mounted */
79 int flags; /* flags */
80 int wsize; /* write size in bytes */
81 int rsize; /* read size in bytes */
82 int timeo; /* initial timeout in .1 secs */
83 int retrans; /* times to retry send */
84 int acregmin; /* attr cache file min secs */
85 int acregmax; /* attr cache file max secs */
86 int acdirmin; /* attr cache dir min secs */
87 int acdirmax; /* attr cache dir max secs */
88 };
89
90 int
mount(char * type,char * dir,int flags,caddr_t data)91 mount(char *type, char *dir, int flags, caddr_t data)
92 {
93 int idx, nflags = 0;
94 int returnValue;
95 char fstr[32];
96 struct nfsarg narg;
97 struct nfsarg *na = &narg;
98 struct nfs_args *nfsa;
99
100 if (strcmp(type, "4.2") == 0)
101 strcpy(fstr, "ufs");
102 else if (strcmp(type, "lo") == 0)
103 strcpy(fstr, "lo");
104 else if (strcmp(type, "nfs") == 0)
105 strcpy(fstr, "nfs");
106
107 if ((idx = sysfs(GETFSIND, fstr)) == -1)
108 return (-1);
109
110 nflags = MS_NOTRUNC;
111 switch (flags) {
112 case M_RDONLY: nflags |= MS_RDONLY;
113 case M_NOSUID: nflags |= MS_NOSUID;
114 case M_REMOUNT: nflags |= MS_REMOUNT;
115 }
116
117 if (strcmp(type, "4.2") == 0)
118 return (_syscall(SYS_mount, data, dir, nflags, idx, 0, 0));
119 else if (strcmp(type, "lo") == 0)
120 return (_syscall(SYS_mount, data, dir, nflags, idx, 0, 0));
121 else if (strcmp(type, "nfs") == 0) {
122 nflags |= MS_DATA;
123 nfsa = (struct nfs_args *)data;
124 if ((na->addr =
125 (struct netbuf *)malloc(sizeof (struct netbuf))) == NULL)
126 return (-1);
127 if ((na->syncaddr =
128 (struct netbuf *)malloc(sizeof (struct netbuf))) == NULL) {
129 free(na->addr);
130 return (-1);
131 }
132 if ((na->knconf =
133 (struct knetconfig *)malloc(sizeof (struct knetconfig))) == NULL) {
134 free(na->addr);
135 free(na->syncaddr);
136 return (-1);
137 }
138 na->addr->maxlen = sizeof (struct sockaddr_in);
139 na->addr->len = na->addr->maxlen;
140 na->addr->buf = (char *)nfsa->addr;
141 na->syncaddr->maxlen = na->addr->maxlen;
142 na->syncaddr->len = na->syncaddr->maxlen;
143 na->syncaddr->buf = (char *)nfsa->addr;
144 strcpy(na->hostname, nfsa->hostname);
145 strcpy(na->netname, nfsa->netname);
146 na->fh = nfsa->fh;
147 na->flags = nfsa->flags;
148 na->wsize = nfsa->wsize;
149 na->rsize = nfsa->rsize;
150 na->timeo = nfsa->timeo;
151 na->retrans = nfsa->retrans;
152 na->acregmin = nfsa->acregmin;
153 na->acregmax = nfsa->acregmax;
154 na->acdirmin = nfsa->acdirmin;
155 na->acdirmax = nfsa->acdirmax;
156 returnValue = (_syscall(SYS_mount, data, dir, nflags, idx, na,
157 sizeof (struct nfsarg)));
158 free(na->addr);
159 free(na->syncaddr);
160 free(na->knconf);
161 return (returnValue);
162 }
163 return (-1);
164 }
165