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} |