Deleted Added
full compact
mount_nfs.c (9230) mount_nfs.c (9336)
1/*
2 * Copyright (c) 1992, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 45 unchanged lines hidden (view full) ---

54#include <rpc/rpc.h>
55#include <rpc/pmap_clnt.h>
56#include <rpc/pmap_prot.h>
57
58#ifdef ISO
59#include <netiso/iso.h>
60#endif
61
1/*
2 * Copyright (c) 1992, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 45 unchanged lines hidden (view full) ---

54#include <rpc/rpc.h>
55#include <rpc/pmap_clnt.h>
56#include <rpc/pmap_prot.h>
57
58#ifdef ISO
59#include <netiso/iso.h>
60#endif
61
62#ifdef KERBEROS
62#ifdef NFSKERB
63#include <kerberosIV/des.h>
64#include <kerberosIV/krb.h>
65#endif
66
67#include <nfs/rpcv2.h>
63#include <kerberosIV/des.h>
64#include <kerberosIV/krb.h>
65#endif
66
67#include <nfs/rpcv2.h>
68#include <nfs/nfsv2.h>
69#define KERNEL
68#include <nfs/nfsproto.h>
69#define _KERNEL
70#include <nfs/nfs.h>
70#include <nfs/nfs.h>
71#undef KERNEL
71#undef _KERNEL
72#include <nfs/nqnfs.h>
73
74#include <arpa/inet.h>
75
76#include <ctype.h>
77#include <err.h>
78#include <errno.h>
79#include <fcntl.h>
80#include <netdb.h>
81#include <signal.h>
82#include <stdio.h>
83#include <stdlib.h>
84#include <strings.h>
85#include <unistd.h>
86
87#include "mntopts.h"
88
72#include <nfs/nqnfs.h>
73
74#include <arpa/inet.h>
75
76#include <ctype.h>
77#include <err.h>
78#include <errno.h>
79#include <fcntl.h>
80#include <netdb.h>
81#include <signal.h>
82#include <stdio.h>
83#include <stdlib.h>
84#include <strings.h>
85#include <unistd.h>
86
87#include "mntopts.h"
88
89#ifdef __FreeBSD__
89#define ALTF_BG 0x1
90#define ALTF_NOCONN 0x2
91#define ALTF_DUMBTIMR 0x4
92#define ALTF_INTR 0x8
93#define ALTF_KERB 0x10
90#define ALTF_BG 0x1
91#define ALTF_NOCONN 0x2
92#define ALTF_DUMBTIMR 0x4
93#define ALTF_INTR 0x8
94#define ALTF_KERB 0x10
94#define ALTF_NQLOOKLSE 0x20
95#define ALTF_RDIRALOOK 0x40
96#define ALTF_MYWRITE 0x80
95#define ALTF_NFSV3 0x20
96#define ALTF_RDIRPLUS 0x40
97#define ALTF_MNTUDP 0x80
97#define ALTF_RESVPORT 0x100
98#define ALTF_SEQPACKET 0x200
99#define ALTF_NQNFS 0x400
100#define ALTF_SOFT 0x800
101#define ALTF_TCP 0x1000
102#define ALTF_PORT 0x2000
103
104struct mntopt mopts[] = {
105 MOPT_STDOPTS,
106 MOPT_FORCE,
107 MOPT_UPDATE,
108 { "bg", 0, ALTF_BG, 1 },
109 { "conn", 1, ALTF_NOCONN, 1 },
110 { "dumbtimer", 0, ALTF_DUMBTIMR, 1 },
111 { "intr", 0, ALTF_INTR, 1 },
98#define ALTF_RESVPORT 0x100
99#define ALTF_SEQPACKET 0x200
100#define ALTF_NQNFS 0x400
101#define ALTF_SOFT 0x800
102#define ALTF_TCP 0x1000
103#define ALTF_PORT 0x2000
104
105struct mntopt mopts[] = {
106 MOPT_STDOPTS,
107 MOPT_FORCE,
108 MOPT_UPDATE,
109 { "bg", 0, ALTF_BG, 1 },
110 { "conn", 1, ALTF_NOCONN, 1 },
111 { "dumbtimer", 0, ALTF_DUMBTIMR, 1 },
112 { "intr", 0, ALTF_INTR, 1 },
112#ifdef KERBEROS
113#ifdef NFSKERB
113 { "kerb", 0, ALTF_KERB, 1 },
114#endif
114 { "kerb", 0, ALTF_KERB, 1 },
115#endif
115 { "nqlooklease", 0, ALTF_NQLOOKLSE, 1 },
116 { "rdiralook", 0, ALTF_RDIRALOOK, 1 },
117 { "mywrite", 0, ALTF_MYWRITE, 1 },
116 { "nfsv3", 0, ALTF_NFSV3, 1 },
117 { "rdirplus", 0, ALTF_RDIRPLUS, 1 },
118 { "mntudp", 0, ALTF_MNTUDP, 1 },
118 { "resvport", 0, ALTF_RESVPORT, 1 },
119#ifdef ISO
120 { "seqpacket", 0, ALTF_SEQPACKET, 1 },
121#endif
122 { "nqnfs", 0, ALTF_NQNFS, 1 },
123 { "soft", 0, ALTF_SOFT, 1 },
124 { "tcp", 0, ALTF_TCP, 1 },
125 { "port=", 0, ALTF_PORT, 1 },
126 { NULL }
127};
119 { "resvport", 0, ALTF_RESVPORT, 1 },
120#ifdef ISO
121 { "seqpacket", 0, ALTF_SEQPACKET, 1 },
122#endif
123 { "nqnfs", 0, ALTF_NQNFS, 1 },
124 { "soft", 0, ALTF_SOFT, 1 },
125 { "tcp", 0, ALTF_TCP, 1 },
126 { "port=", 0, ALTF_PORT, 1 },
127 { NULL }
128};
129#else
130struct mntopt mopts[] = {
131 MOPT_STDOPTS,
132 MOPT_FORCE,
133 MOPT_UPDATE,
134 { NULL }
135};
136#endif
128
129struct nfs_args nfsdefargs = {
130 (struct sockaddr *)0,
131 sizeof (struct sockaddr_in),
132 SOCK_DGRAM,
133 0,
137
138struct nfs_args nfsdefargs = {
139 (struct sockaddr *)0,
140 sizeof (struct sockaddr_in),
141 SOCK_DGRAM,
142 0,
134 (nfsv2fh_t *)0,
143 (u_char *)0,
135 0,
144 0,
145 0,
136 NFS_WSIZE,
137 NFS_RSIZE,
146 NFS_WSIZE,
147 NFS_RSIZE,
138 NFS_TIMEO,
148 NFS_READDIRSIZE,
149 10,
139 NFS_RETRANS,
140 NFS_MAXGRPS,
141 NFS_DEFRAHEAD,
142 NQ_DEFLEASE,
143 NQ_DEADTHRESH,
144 (char *)0,
145};
146
147struct nfhret {
150 NFS_RETRANS,
151 NFS_MAXGRPS,
152 NFS_DEFRAHEAD,
153 NQ_DEFLEASE,
154 NQ_DEADTHRESH,
155 (char *)0,
156};
157
158struct nfhret {
148 u_long stat;
149 nfsv2fh_t nfh;
159 u_long stat;
160 long vers;
161 long auth;
162 long fhsize;
163 u_char nfh[NFSX_V3FHMAX];
150};
151#define DEF_RETRY 10000
152#define BGRND 1
153#define ISBGRND 2
154int retrycnt = DEF_RETRY;
155int opflags = 0;
164};
165#define DEF_RETRY 10000
166#define BGRND 1
167#define ISBGRND 2
168int retrycnt = DEF_RETRY;
169int opflags = 0;
170int nfsproto = IPPROTO_UDP;
171int mnttcp_ok = 1;
156u_short port_no = 0;
157
172u_short port_no = 0;
173
158#ifdef KERBEROS
174#ifdef NFSKERB
159char inst[INST_SZ];
160char realm[REALM_SZ];
175char inst[INST_SZ];
176char realm[REALM_SZ];
161KTEXT_ST kt;
177struct {
178 u_long kind;
179 KTEXT_ST kt;
180} ktick;
181struct nfsrpc_nickverf kverf;
182struct nfsrpc_fullblock kin, kout;
183NFSKERBKEY_T kivec;
184CREDENTIALS kcr;
185struct timeval ktv;
186NFSKERBKEYSCHED_T kerb_keysched;
162#endif
163
164int getnfsargs __P((char *, struct nfs_args *));
165#ifdef ISO
166struct iso_addr *iso_addr __P((const char *));
167#endif
168void set_rpc_maxgrouplist __P((int));
169__dead void usage __P((void));

--- 7 unchanged lines hidden (view full) ---

177{
178 register int c;
179 register struct nfs_args *nfsargsp;
180 struct nfs_args nfsargs;
181 struct nfsd_cargs ncd;
182 int mntflags, altflags, i, nfssvc_flag, num;
183 char *name, *p, *spec;
184 struct vfsconf *vfc;
187#endif
188
189int getnfsargs __P((char *, struct nfs_args *));
190#ifdef ISO
191struct iso_addr *iso_addr __P((const char *));
192#endif
193void set_rpc_maxgrouplist __P((int));
194__dead void usage __P((void));

--- 7 unchanged lines hidden (view full) ---

202{
203 register int c;
204 register struct nfs_args *nfsargsp;
205 struct nfs_args nfsargs;
206 struct nfsd_cargs ncd;
207 int mntflags, altflags, i, nfssvc_flag, num;
208 char *name, *p, *spec;
209 struct vfsconf *vfc;
185#ifdef KERBEROS
210#ifdef NFSKERB
186 uid_t last_ruid;
211 uid_t last_ruid;
187#endif
188
212
189#ifdef KERBEROS
190 last_ruid = -1;
191 (void)strcpy(realm, KRB_REALM);
213 last_ruid = -1;
214 (void)strcpy(realm, KRB_REALM);
192#endif
215 if (sizeof (struct nfsrpc_nickverf) != RPCX_NICKVERF ||
216 sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK ||
217 ((char *)&ktick.kt) - ((char *)&ktick) != NFSX_UNSIGNED ||
218 ((char *)ktick.kt.dat) - ((char *)&ktick) != 2 * NFSX_UNSIGNED)
219 fprintf(stderr, "Yikes! NFSKERB structs not packed!!\n");
220#endif /* NFSKERB */
193 retrycnt = DEF_RETRY;
194
195 mntflags = 0;
196 altflags = 0;
197 nfsargs = nfsdefargs;
198 nfsargsp = &nfsargs;
199 while ((c = getopt(argc, argv,
221 retrycnt = DEF_RETRY;
222
223 mntflags = 0;
224 altflags = 0;
225 nfsargs = nfsdefargs;
226 nfsargsp = &nfsargs;
227 while ((c = getopt(argc, argv,
200 "a:bcdD:g:iKklL:Mm:o:PpqR:r:sTt:w:x:")) != EOF)
228 "3a:bcdD:g:I:iKL:lm:o:PpqR:r:sTt:w:x:U")) != EOF)
201 switch (c) {
229 switch (c) {
230 case '3':
231 nfsargsp->flags |= NFSMNT_NFSV3;
232 break;
202 case 'a':
203 num = strtol(optarg, &p, 10);
204 if (*p || num < 0)
205 errx(1, "illegal -a value -- %s", optarg);
206 nfsargsp->readahead = num;
207 nfsargsp->flags |= NFSMNT_READAHEAD;
208 break;
209 case 'b':

--- 11 unchanged lines hidden (view full) ---

221 break;
222 case 'd':
223 nfsargsp->flags |= NFSMNT_DUMBTIMR;
224 break;
225 case 'g':
226 num = strtol(optarg, &p, 10);
227 if (*p || num <= 0)
228 errx(1, "illegal -g value -- %s", optarg);
233 case 'a':
234 num = strtol(optarg, &p, 10);
235 if (*p || num < 0)
236 errx(1, "illegal -a value -- %s", optarg);
237 nfsargsp->readahead = num;
238 nfsargsp->flags |= NFSMNT_READAHEAD;
239 break;
240 case 'b':

--- 11 unchanged lines hidden (view full) ---

252 break;
253 case 'd':
254 nfsargsp->flags |= NFSMNT_DUMBTIMR;
255 break;
256 case 'g':
257 num = strtol(optarg, &p, 10);
258 if (*p || num <= 0)
259 errx(1, "illegal -g value -- %s", optarg);
260#ifdef __FreeBSD__
229 set_rpc_maxgrouplist(num);
261 set_rpc_maxgrouplist(num);
262#endif
230 nfsargsp->maxgrouplist = num;
231 nfsargsp->flags |= NFSMNT_MAXGRPS;
232 break;
263 nfsargsp->maxgrouplist = num;
264 nfsargsp->flags |= NFSMNT_MAXGRPS;
265 break;
266 case 'I':
267 num = strtol(optarg, &p, 10);
268 if (*p || num <= 0)
269 errx(1, "illegal -I value -- %s", optarg);
270 nfsargsp->readdirsize = num;
271 nfsargsp->flags |= NFSMNT_READDIRSIZE;
272 break;
233 case 'i':
234 nfsargsp->flags |= NFSMNT_INT;
235 break;
273 case 'i':
274 nfsargsp->flags |= NFSMNT_INT;
275 break;
236#ifdef KERBEROS
276#ifdef NFSKERB
237 case 'K':
238 nfsargsp->flags |= NFSMNT_KERB;
239 break;
240#endif
277 case 'K':
278 nfsargsp->flags |= NFSMNT_KERB;
279 break;
280#endif
241 case 'k':
242 nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
243 break;
244 case 'L':
245 num = strtol(optarg, &p, 10);
246 if (*p || num < 2)
247 errx(1, "illegal -L value -- %s", optarg);
248 nfsargsp->leaseterm = num;
249 nfsargsp->flags |= NFSMNT_LEASETERM;
250 break;
251 case 'l':
281 case 'L':
282 num = strtol(optarg, &p, 10);
283 if (*p || num < 2)
284 errx(1, "illegal -L value -- %s", optarg);
285 nfsargsp->leaseterm = num;
286 nfsargsp->flags |= NFSMNT_LEASETERM;
287 break;
288 case 'l':
252 nfsargsp->flags |= NFSMNT_RDIRALOOK;
289 nfsargsp->flags |= NFSMNT_RDIRPLUS;
253 break;
290 break;
254 case 'M':
255 nfsargsp->flags |= NFSMNT_MYWRITE;
256 break;
257#ifdef KERBEROS
291#ifdef NFSKERB
258 case 'm':
259 (void)strncpy(realm, optarg, REALM_SZ - 1);
260 realm[REALM_SZ - 1] = '\0';
261 break;
262#endif
263 case 'o':
292 case 'm':
293 (void)strncpy(realm, optarg, REALM_SZ - 1);
294 realm[REALM_SZ - 1] = '\0';
295 break;
296#endif
297 case 'o':
298#ifdef __FreeBSD__
264 getmntopts(optarg, mopts, &mntflags, &altflags);
265 if(altflags & ALTF_BG)
266 opflags |= BGRND;
267 if(altflags & ALTF_NOCONN)
268 nfsargsp->flags |= NFSMNT_NOCONN;
269 if(altflags & ALTF_DUMBTIMR)
270 nfsargsp->flags |= NFSMNT_DUMBTIMR;
271 if(altflags & ALTF_INTR)
272 nfsargsp->flags |= NFSMNT_INT;
299 getmntopts(optarg, mopts, &mntflags, &altflags);
300 if(altflags & ALTF_BG)
301 opflags |= BGRND;
302 if(altflags & ALTF_NOCONN)
303 nfsargsp->flags |= NFSMNT_NOCONN;
304 if(altflags & ALTF_DUMBTIMR)
305 nfsargsp->flags |= NFSMNT_DUMBTIMR;
306 if(altflags & ALTF_INTR)
307 nfsargsp->flags |= NFSMNT_INT;
273#ifdef KERBEROS
308#ifdef NFSKERB
274 if(altflags & ALTF_KERB)
275 nfsargsp->flags |= NFSMNT_KERB;
276#endif
309 if(altflags & ALTF_KERB)
310 nfsargsp->flags |= NFSMNT_KERB;
311#endif
277 if(altflags & ALTF_NQLOOKLSE)
278 nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
279 if(altflags & ALTF_RDIRALOOK)
280 nfsargsp->flags |= NFSMNT_RDIRALOOK;
281 if(altflags & ALTF_MYWRITE)
282 nfsargsp->flags |= NFSMNT_MYWRITE;
312 if(altflags & ALTF_NFSV3)
313 nfsargsp->flags |= NFSMNT_NFSV3;
314 if(altflags & ALTF_RDIRPLUS)
315 nfsargsp->flags |= NFSMNT_RDIRPLUS;
316 if(altflags & ALTF_MNTUDP)
317 mnttcp_ok = 0;
283 if(altflags & ALTF_RESVPORT)
284 nfsargsp->flags |= NFSMNT_RESVPORT;
285#ifdef ISO
286 if(altflags & ALTF_SEQPACKET)
287 nfsargsp->sotype = SOCK_SEQPACKET;
288#endif
289 if(altflags & ALTF_NQNFS)
318 if(altflags & ALTF_RESVPORT)
319 nfsargsp->flags |= NFSMNT_RESVPORT;
320#ifdef ISO
321 if(altflags & ALTF_SEQPACKET)
322 nfsargsp->sotype = SOCK_SEQPACKET;
323#endif
324 if(altflags & ALTF_NQNFS)
290 nfsargsp->flags |= NFSMNT_NQNFS;
325 nfsargsp->flags |= (NFSMNT_NQNFS|NFSMNT_NFSV3);
291 if(altflags & ALTF_SOFT)
292 nfsargsp->flags |= NFSMNT_SOFT;
326 if(altflags & ALTF_SOFT)
327 nfsargsp->flags |= NFSMNT_SOFT;
293 if(altflags & ALTF_TCP)
328 if(altflags & ALTF_TCP) {
294 nfsargsp->sotype = SOCK_STREAM;
329 nfsargsp->sotype = SOCK_STREAM;
330 nfsproto = IPPROTO_TCP;
331 }
295 if(altflags & ALTF_PORT)
296 port_no = atoi(strstr(optarg, "port=") + 5);
297 altflags = 0;
332 if(altflags & ALTF_PORT)
333 port_no = atoi(strstr(optarg, "port=") + 5);
334 altflags = 0;
335#else
336 getmntopts(optarg, mopts, &mntflags);
337#endif
298 break;
299 case 'P':
300 nfsargsp->flags |= NFSMNT_RESVPORT;
301 break;
302#ifdef ISO
303 case 'p':
304 nfsargsp->sotype = SOCK_SEQPACKET;
305 break;
306#endif
307 case 'q':
338 break;
339 case 'P':
340 nfsargsp->flags |= NFSMNT_RESVPORT;
341 break;
342#ifdef ISO
343 case 'p':
344 nfsargsp->sotype = SOCK_SEQPACKET;
345 break;
346#endif
347 case 'q':
308 nfsargsp->flags |= NFSMNT_NQNFS;
348 nfsargsp->flags |= (NFSMNT_NQNFS | NFSMNT_NFSV3);
309 break;
310 case 'R':
311 num = strtol(optarg, &p, 10);
312 if (*p || num <= 0)
313 errx(1, "illegal -R value -- %s", optarg);
314 retrycnt = num;
315 break;
316 case 'r':
317 num = strtol(optarg, &p, 10);
318 if (*p || num <= 0)
319 errx(1, "illegal -r value -- %s", optarg);
320 nfsargsp->rsize = num;
321 nfsargsp->flags |= NFSMNT_RSIZE;
322 break;
323 case 's':
324 nfsargsp->flags |= NFSMNT_SOFT;
325 break;
326 case 'T':
327 nfsargsp->sotype = SOCK_STREAM;
349 break;
350 case 'R':
351 num = strtol(optarg, &p, 10);
352 if (*p || num <= 0)
353 errx(1, "illegal -R value -- %s", optarg);
354 retrycnt = num;
355 break;
356 case 'r':
357 num = strtol(optarg, &p, 10);
358 if (*p || num <= 0)
359 errx(1, "illegal -r value -- %s", optarg);
360 nfsargsp->rsize = num;
361 nfsargsp->flags |= NFSMNT_RSIZE;
362 break;
363 case 's':
364 nfsargsp->flags |= NFSMNT_SOFT;
365 break;
366 case 'T':
367 nfsargsp->sotype = SOCK_STREAM;
368 nfsproto = IPPROTO_TCP;
328 break;
329 case 't':
330 num = strtol(optarg, &p, 10);
331 if (*p || num <= 0)
332 errx(1, "illegal -t value -- %s", optarg);
333 nfsargsp->timeo = num;
334 nfsargsp->flags |= NFSMNT_TIMEO;
335 break;

--- 6 unchanged lines hidden (view full) ---

342 break;
343 case 'x':
344 num = strtol(optarg, &p, 10);
345 if (*p || num <= 0)
346 errx(1, "illegal -x value -- %s", optarg);
347 nfsargsp->retrans = num;
348 nfsargsp->flags |= NFSMNT_RETRANS;
349 break;
369 break;
370 case 't':
371 num = strtol(optarg, &p, 10);
372 if (*p || num <= 0)
373 errx(1, "illegal -t value -- %s", optarg);
374 nfsargsp->timeo = num;
375 nfsargsp->flags |= NFSMNT_TIMEO;
376 break;

--- 6 unchanged lines hidden (view full) ---

383 break;
384 case 'x':
385 num = strtol(optarg, &p, 10);
386 if (*p || num <= 0)
387 errx(1, "illegal -x value -- %s", optarg);
388 nfsargsp->retrans = num;
389 nfsargsp->flags |= NFSMNT_RETRANS;
390 break;
391 case 'U':
392 mnttcp_ok = 0;
393 break;
350 default:
351 usage();
352 break;
353 }
354 argc -= optind;
355 argv += optind;
356
357 if (argc != 2)
358 usage();
359
360 spec = *argv++;
361 name = *argv;
362
363 if (!getnfsargs(spec, nfsargsp))
364 exit(1);
365
394 default:
395 usage();
396 break;
397 }
398 argc -= optind;
399 argv += optind;
400
401 if (argc != 2)
402 usage();
403
404 spec = *argv++;
405 name = *argv;
406
407 if (!getnfsargs(spec, nfsargsp))
408 exit(1);
409
410#ifdef __FreeBSD__
366 vfc = getvfsbyname("nfs");
367 if(!vfc && vfsisloadable("nfs")) {
368 if(vfsload("nfs"))
369 err(1, "vfsload(nfs)");
370 endvfsent(); /* flush cache */
371 vfc = getvfsbyname("nfs");
372 }
373
374 if (mount(vfc ? vfc->vfc_index : MOUNT_NFS, name, mntflags, nfsargsp))
411 vfc = getvfsbyname("nfs");
412 if(!vfc && vfsisloadable("nfs")) {
413 if(vfsload("nfs"))
414 err(1, "vfsload(nfs)");
415 endvfsent(); /* flush cache */
416 vfc = getvfsbyname("nfs");
417 }
418
419 if (mount(vfc ? vfc->vfc_index : MOUNT_NFS, name, mntflags, nfsargsp))
420#else
421 if (mount(MOUNT_NFS, name, mntflags, nfsargsp))
422#endif
375 err(1, "%s", name);
376 if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) {
377 if ((opflags & ISBGRND) == 0) {
378 if (i = fork()) {
379 if (i == -1)
380 err(1, "nqnfs 1");
381 exit(0);
382 }

--- 8 unchanged lines hidden (view full) ---

391 ncd.ncd_dirp = name;
392 while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) {
393 if (errno != ENEEDAUTH) {
394 syslog(LOG_ERR, "nfssvc err %m");
395 continue;
396 }
397 nfssvc_flag =
398 NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL;
423 err(1, "%s", name);
424 if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) {
425 if ((opflags & ISBGRND) == 0) {
426 if (i = fork()) {
427 if (i == -1)
428 err(1, "nqnfs 1");
429 exit(0);
430 }

--- 8 unchanged lines hidden (view full) ---

439 ncd.ncd_dirp = name;
440 while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) {
441 if (errno != ENEEDAUTH) {
442 syslog(LOG_ERR, "nfssvc err %m");
443 continue;
444 }
445 nfssvc_flag =
446 NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL;
399#ifdef KERBEROS
447#ifdef NFSKERB
400 /*
401 * Set up as ncd_authuid for the kerberos call.
402 * Must set ruid to ncd_authuid and reset the
403 * ticket name iff ncd_authuid is not the same
404 * as last time, so that the right ticket file
405 * is found.
448 /*
449 * Set up as ncd_authuid for the kerberos call.
450 * Must set ruid to ncd_authuid and reset the
451 * ticket name iff ncd_authuid is not the same
452 * as last time, so that the right ticket file
453 * is found.
454 * Get the Kerberos credential structure so that
455 * we have the seesion key and get a ticket for
456 * this uid.
457 * For more info see the IETF Draft "Authentication
458 * in ONC RPC".
406 */
407 if (ncd.ncd_authuid != last_ruid) {
408 char buf[512];
409 (void)sprintf(buf, "%s%d",
410 TKT_ROOT, ncd.ncd_authuid);
411 krb_set_tkt_string(buf);
412 last_ruid = ncd.ncd_authuid;
413 }
459 */
460 if (ncd.ncd_authuid != last_ruid) {
461 char buf[512];
462 (void)sprintf(buf, "%s%d",
463 TKT_ROOT, ncd.ncd_authuid);
464 krb_set_tkt_string(buf);
465 last_ruid = ncd.ncd_authuid;
466 }
414 if (krb_mk_req(&kt, "rcmd", inst, realm, 0) ==
415 KSUCCESS &&
416 kt.length <= (RPCAUTH_MAXSIZ - 2 * NFSX_UNSIGNED)) {
417 ncd.ncd_authtype = RPCAUTH_NQNFS;
418 ncd.ncd_authlen = kt.length;
419 ncd.ncd_authstr = (char *)kt.dat;
420 nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
467 setreuid(ncd.ncd_authuid, 0);
468 kret = krb_get_cred(NFS_KERBSRV, inst, realm, &kcr);
469 if (kret == RET_NOTKT) {
470 kret = get_ad_tkt(NFS_KERBSRV, inst, realm,
471 DEFAULT_TKT_LIFE);
472 if (kret == KSUCCESS)
473 kret = krb_get_cred(NFS_KERBSRV, inst, realm,
474 &kcr);
421 }
475 }
422#endif /* KERBEROS */
476 if (kret == KSUCCESS)
477 kret = krb_mk_req(&ktick.kt, NFS_KERBSRV, inst,
478 realm, 0);
479
480 /*
481 * Fill in the AKN_FULLNAME authenticator and verfier.
482 * Along with the Kerberos ticket, we need to build
483 * the timestamp verifier and encrypt it in CBC mode.
484 */
485 if (kret == KSUCCESS &&
486 ktick.kt.length <= (RPCAUTH_MAXSIZ-3*NFSX_UNSIGNED)
487 && gettimeofday(&ktv, (struct timezone *)0) == 0) {
488 ncd.ncd_authtype = RPCAUTH_KERB4;
489 ncd.ncd_authstr = (u_char *)&ktick;
490 ncd.ncd_authlen = nfsm_rndup(ktick.kt.length) +
491 3 * NFSX_UNSIGNED;
492 ncd.ncd_verfstr = (u_char *)&kverf;
493 ncd.ncd_verflen = sizeof (kverf);
494 bcopy((caddr_t)kcr.session, (caddr_t)ncd.ncd_key,
495 sizeof (kcr.session));
496 kin.t1 = htonl(ktv.tv_sec);
497 kin.t2 = htonl(ktv.tv_usec);
498 kin.w1 = htonl(NFS_KERBTTL);
499 kin.w2 = htonl(NFS_KERBTTL - 1);
500 bzero((caddr_t)kivec, sizeof (kivec));
501
502 /*
503 * Encrypt kin in CBC mode using the session
504 * key in kcr.
505 */
506 XXX
507
508 /*
509 * Finally, fill the timestamp verifier into the
510 * authenticator and verifier.
511 */
512 ktick.kind = htonl(RPCAKN_FULLNAME);
513 kverf.kind = htonl(RPCAKN_FULLNAME);
514 NFS_KERBW1(ktick.kt) = kout.w1;
515 ktick.kt.length = htonl(ktick.kt.length);
516 kverf.verf.t1 = kout.t1;
517 kverf.verf.t2 = kout.t2;
518 kverf.verf.w2 = kout.w2;
519 nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
520 }
521 setreuid(0, 0);
522#endif /* NFSKERB */
423 }
424 }
425 exit(0);
426}
427
428int
429getnfsargs(spec, nfsargsp)
430 char *spec;

--- 4 unchanged lines hidden (view full) ---

435 static struct sockaddr_in saddr;
436#ifdef ISO
437 static struct sockaddr_iso isoaddr;
438 struct iso_addr *isop;
439 int isoflag = 0;
440#endif
441 struct timeval pertry, try;
442 enum clnt_stat clnt_stat;
523 }
524 }
525 exit(0);
526}
527
528int
529getnfsargs(spec, nfsargsp)
530 char *spec;

--- 4 unchanged lines hidden (view full) ---

535 static struct sockaddr_in saddr;
536#ifdef ISO
537 static struct sockaddr_iso isoaddr;
538 struct iso_addr *isop;
539 int isoflag = 0;
540#endif
541 struct timeval pertry, try;
542 enum clnt_stat clnt_stat;
443 int so = RPC_ANYSOCK, i;
543 int so = RPC_ANYSOCK, i, nfsvers, mntvers;
444 char *hostp, *delimp;
544 char *hostp, *delimp;
445#ifdef KERBEROS
545#ifdef NFSKERB
446 char *cp;
447#endif
448 u_short tport;
449 static struct nfhret nfhret;
450 static char nam[MNAMELEN + 1];
451
452 strncpy(nam, spec, MNAMELEN);
453 nam[MNAMELEN] = '\0';

--- 48 unchanged lines hidden (view full) ---

502 return (0);
503 }
504 } else if ((hp = gethostbyname(hostp)) != NULL) {
505 bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
506 } else {
507 warnx("can't get net id for host");
508 return (0);
509 }
546 char *cp;
547#endif
548 u_short tport;
549 static struct nfhret nfhret;
550 static char nam[MNAMELEN + 1];
551
552 strncpy(nam, spec, MNAMELEN);
553 nam[MNAMELEN] = '\0';

--- 48 unchanged lines hidden (view full) ---

602 return (0);
603 }
604 } else if ((hp = gethostbyname(hostp)) != NULL) {
605 bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
606 } else {
607 warnx("can't get net id for host");
608 return (0);
609 }
510#ifdef KERBEROS
610#ifdef NFSKERB
511 if ((nfsargsp->flags & NFSMNT_KERB)) {
512 if ((hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr,
513 sizeof (u_long), AF_INET)) == (struct hostent *)0) {
514 warnx("can't reverse resolve net address");
515 return (0);
516 }
517 bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
518 strncpy(inst, hp->h_name, INST_SZ);
519 inst[INST_SZ - 1] = '\0';
520 if (cp = strchr(inst, '.'))
521 *cp = '\0';
522 }
611 if ((nfsargsp->flags & NFSMNT_KERB)) {
612 if ((hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr,
613 sizeof (u_long), AF_INET)) == (struct hostent *)0) {
614 warnx("can't reverse resolve net address");
615 return (0);
616 }
617 bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
618 strncpy(inst, hp->h_name, INST_SZ);
619 inst[INST_SZ - 1] = '\0';
620 if (cp = strchr(inst, '.'))
621 *cp = '\0';
622 }
523#endif /* KERBEROS */
623#endif /* NFSKERB */
524
624
625 if (nfsargsp->flags & NFSMNT_NFSV3) {
626 nfsvers = 3;
627 mntvers = 3;
628 } else {
629 nfsvers = 2;
630 mntvers = 1;
631 }
525 nfhret.stat = EACCES; /* Mark not yet successful */
526 while (retrycnt > 0) {
527 saddr.sin_family = AF_INET;
528 saddr.sin_port = htons(PMAPPORT);
529 if ((tport = port_no ? port_no :
530 pmap_getport(&saddr, RPCPROG_NFS,
632 nfhret.stat = EACCES; /* Mark not yet successful */
633 while (retrycnt > 0) {
634 saddr.sin_family = AF_INET;
635 saddr.sin_port = htons(PMAPPORT);
636 if ((tport = port_no ? port_no :
637 pmap_getport(&saddr, RPCPROG_NFS,
531 NFS_VER2, nfsargsp->sotype == SOCK_STREAM ? IPPROTO_TCP :
532 IPPROTO_UDP)) == 0) {
638 nfsvers, nfsproto)) == 0) {
533 if ((opflags & ISBGRND) == 0)
534 clnt_pcreateerror("NFS Portmap");
535 } else {
536 saddr.sin_port = 0;
537 pertry.tv_sec = 10;
538 pertry.tv_usec = 0;
639 if ((opflags & ISBGRND) == 0)
640 clnt_pcreateerror("NFS Portmap");
641 } else {
642 saddr.sin_port = 0;
643 pertry.tv_sec = 10;
644 pertry.tv_usec = 0;
539 if ((clp = (nfsargsp->sotype == SOCK_STREAM ?
540 clnttcp_create(&saddr, RPCPROG_MNT, RPCMNT_VER1,
541 &so, 0, 0) :
542 clntudp_create(&saddr, RPCPROG_MNT, RPCMNT_VER1,
543 pertry, &so))) == NULL) {
645 if (mnttcp_ok && nfsargsp->sotype == SOCK_STREAM)
646 clp = clnttcp_create(&saddr, RPCPROG_MNT, mntvers,
647 &so, 0, 0);
648 else
649 clp = clntudp_create(&saddr, RPCPROG_MNT, mntvers,
650 pertry, &so);
651 if (clp == NULL) {
544 if ((opflags & ISBGRND) == 0)
545 clnt_pcreateerror("Cannot MNT RPC");
546 } else {
547 clp->cl_auth = authunix_create_default();
548 try.tv_sec = 10;
549 try.tv_usec = 0;
652 if ((opflags & ISBGRND) == 0)
653 clnt_pcreateerror("Cannot MNT RPC");
654 } else {
655 clp->cl_auth = authunix_create_default();
656 try.tv_sec = 10;
657 try.tv_usec = 0;
658 if (nfsargsp->flags & NFSMNT_KERB)
659 nfhret.auth = RPCAUTH_KERB4;
660 else
661 nfhret.auth = RPCAUTH_UNIX;
662 nfhret.vers = mntvers;
550 clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
551 xdr_dir, spec, xdr_fh, &nfhret, try);
552 if (clnt_stat != RPC_SUCCESS) {
553 if ((opflags & ISBGRND) == 0)
554 warnx("%s", clnt_sperror(clp,
555 "bad MNT RPC"));
556 } else {
557 auth_destroy(clp->cl_auth);

--- 33 unchanged lines hidden (view full) ---

591 nfsargsp->addr = (struct sockaddr *) &isoaddr;
592 nfsargsp->addrlen = sizeof (isoaddr);
593 } else
594#endif /* ISO */
595 {
596 nfsargsp->addr = (struct sockaddr *) &saddr;
597 nfsargsp->addrlen = sizeof (saddr);
598 }
663 clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
664 xdr_dir, spec, xdr_fh, &nfhret, try);
665 if (clnt_stat != RPC_SUCCESS) {
666 if ((opflags & ISBGRND) == 0)
667 warnx("%s", clnt_sperror(clp,
668 "bad MNT RPC"));
669 } else {
670 auth_destroy(clp->cl_auth);

--- 33 unchanged lines hidden (view full) ---

704 nfsargsp->addr = (struct sockaddr *) &isoaddr;
705 nfsargsp->addrlen = sizeof (isoaddr);
706 } else
707#endif /* ISO */
708 {
709 nfsargsp->addr = (struct sockaddr *) &saddr;
710 nfsargsp->addrlen = sizeof (saddr);
711 }
599 nfsargsp->fh = &nfhret.nfh;
712 nfsargsp->fh = nfhret.nfh;
713 nfsargsp->fhsize = nfhret.fhsize;
600 nfsargsp->hostname = nam;
601 return (1);
602}
603
604/*
605 * xdr routines for mount rpc's
606 */
607int
608xdr_dir(xdrsp, dirp)
609 XDR *xdrsp;
610 char *dirp;
611{
612 return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
613}
614
615int
616xdr_fh(xdrsp, np)
617 XDR *xdrsp;
714 nfsargsp->hostname = nam;
715 return (1);
716}
717
718/*
719 * xdr routines for mount rpc's
720 */
721int
722xdr_dir(xdrsp, dirp)
723 XDR *xdrsp;
724 char *dirp;
725{
726 return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
727}
728
729int
730xdr_fh(xdrsp, np)
731 XDR *xdrsp;
618 struct nfhret *np;
732 register struct nfhret *np;
619{
733{
620 if (!xdr_u_long(xdrsp, &(np->stat)))
734 register int i;
735 long auth, authcnt, authfnd = 0;
736
737 if (!xdr_u_long(xdrsp, &np->stat))
621 return (0);
622 if (np->stat)
623 return (1);
738 return (0);
739 if (np->stat)
740 return (1);
624 return (xdr_opaque(xdrsp, (caddr_t)&(np->nfh), NFSX_FH));
741 switch (np->vers) {
742 case 1:
743 np->fhsize = NFSX_V2FH;
744 return (xdr_opaque(xdrsp, (caddr_t)np->nfh, NFSX_V2FH));
745 case 3:
746 if (!xdr_long(xdrsp, &np->fhsize))
747 return (0);
748 if (np->fhsize <= 0 || np->fhsize > NFSX_V3FHMAX)
749 return (0);
750 if (!xdr_opaque(xdrsp, (caddr_t)np->nfh, np->fhsize))
751 return (0);
752 if (!xdr_long(xdrsp, &authcnt))
753 return (0);
754 for (i = 0; i < authcnt; i++) {
755 if (!xdr_long(xdrsp, &auth))
756 return (0);
757 if (auth == np->auth)
758 authfnd++;
759 }
760
761 /*
762 * Some servers, such as DEC's OSF/1 return a nil authenticator
763 * list to indicate RPCAUTH_UNIX.
764 */
765 if (!authfnd && (authcnt > 0 || np->auth != RPCAUTH_UNIX))
766 np->stat = EAUTH;
767 return (1);
768 };
769 return (0);
625}
626
627__dead void
628usage()
629{
770}
771
772__dead void
773usage()
774{
630 (void)fprintf(stderr, "usage: mount_nfs %s\n%s\n%s\n%s\n",
631"[-bcdiKklMPqsT] [-a maxreadahead] [-D deadthresh]",
632"\t[-g maxgroups] [-L leaseterm] [-m realm] [-o options] [-R retrycnt]",
633"\t[-r readsize] [-t timeout] [-w writesize] [-x retrans]",
634"\trhost:path node");
775 (void)fprintf(stderr, "\
776usage: mount_nfs [-3KPTUbcdilqs] [-D deadthresh] [-I readdirsize]\n\
777 [-L leaseterm] [-R retrycnt] [-a maxreadahead] [-g maxgroups]\n\
778 [-m realm] [-o options] [-r readsize] [-t timeout] [-w writesize]\n\
779 [-x retrans] rhost:path node\n");
635 exit(1);
636}
780 exit(1);
781}