aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-09-08 00:41:48 +0000
committerRob Landley <rob@landley.net>2006-09-08 00:41:48 +0000
commitc27f4f5445e046d2c719e8d96ad54cfd7133061e (patch)
tree26fc8026542510f783eb5adb12941d1177581c92
parentd35c0efddbb7602512f439f74f0e984331740464 (diff)
downloadbusybox-w32-c27f4f5445e046d2c719e8d96ad54cfd7133061e.tar.gz
busybox-w32-c27f4f5445e046d2c719e8d96ad54cfd7133061e.tar.bz2
busybox-w32-c27f4f5445e046d2c719e8d96ad54cfd7133061e.zip
A quick cleanup pass of some low-hanging mess.
-rw-r--r--util-linux/nfsmount.c141
1 files changed, 26 insertions, 115 deletions
diff --git a/util-linux/nfsmount.c b/util-linux/nfsmount.c
index e7d194f0f..2941b4ddc 100644
--- a/util-linux/nfsmount.c
+++ b/util-linux/nfsmount.c
@@ -41,50 +41,6 @@
41#endif 41#endif
42 42
43 43
44/*
45 * NFS stats. The good thing with these values is that NFSv3 errors are
46 * a superset of NFSv2 errors (with the exception of NFSERR_WFLUSH which
47 * no-one uses anyway), so we can happily mix code as long as we make sure
48 * no NFSv3 errors are returned to NFSv2 clients.
49 * Error codes that have a `--' in the v2 column are not part of the
50 * standard, but seem to be widely used nevertheless.
51 */
52enum nfs_stat {
53 NFS_OK = 0, /* v2 v3 */
54 NFSERR_PERM = 1, /* v2 v3 */
55 NFSERR_NOENT = 2, /* v2 v3 */
56 NFSERR_IO = 5, /* v2 v3 */
57 NFSERR_NXIO = 6, /* v2 v3 */
58 NFSERR_EAGAIN = 11, /* v2 v3 */
59 NFSERR_ACCES = 13, /* v2 v3 */
60 NFSERR_EXIST = 17, /* v2 v3 */
61 NFSERR_XDEV = 18, /* v3 */
62 NFSERR_NODEV = 19, /* v2 v3 */
63 NFSERR_NOTDIR = 20, /* v2 v3 */
64 NFSERR_ISDIR = 21, /* v2 v3 */
65 NFSERR_INVAL = 22, /* v2 v3 that Sun forgot */
66 NFSERR_FBIG = 27, /* v2 v3 */
67 NFSERR_NOSPC = 28, /* v2 v3 */
68 NFSERR_ROFS = 30, /* v2 v3 */
69 NFSERR_MLINK = 31, /* v3 */
70 NFSERR_OPNOTSUPP = 45, /* v2 v3 */
71 NFSERR_NAMETOOLONG = 63, /* v2 v3 */
72 NFSERR_NOTEMPTY = 66, /* v2 v3 */
73 NFSERR_DQUOT = 69, /* v2 v3 */
74 NFSERR_STALE = 70, /* v2 v3 */
75 NFSERR_REMOTE = 71, /* v2 v3 */
76 NFSERR_WFLUSH = 99, /* v2 */
77 NFSERR_BADHANDLE = 10001, /* v3 */
78 NFSERR_NOT_SYNC = 10002, /* v3 */
79 NFSERR_BAD_COOKIE = 10003, /* v3 */
80 NFSERR_NOTSUPP = 10004, /* v3 */
81 NFSERR_TOOSMALL = 10005, /* v3 */
82 NFSERR_SERVERFAULT = 10006, /* v3 */
83 NFSERR_BADTYPE = 10007, /* v3 */
84 NFSERR_JUKEBOX = 10008 /* v3 */
85};
86
87#define NFS_PROGRAM 100003
88 44
89 45
90enum { 46enum {
@@ -97,14 +53,14 @@ enum {
97}; 53};
98 54
99/* Disable the nls stuff */ 55/* Disable the nls stuff */
100# undef bindtextdomain 56//# undef bindtextdomain
101# define bindtextdomain(Domain, Directory) /* empty */ 57//# define bindtextdomain(Domain, Directory) /* empty */
102# undef textdomain 58//# undef textdomain
103# define textdomain(Domain) /* empty */ 59//# define textdomain(Domain) /* empty */
104 60
105enum { 61//enum {
106 S_QUOTA = 128, /* Quota initialized for file/directory/symlink */ 62// S_QUOTA = 128, /* Quota initialized for file/directory/symlink */
107}; 63//};
108 64
109 65
110/* 66/*
@@ -117,10 +73,6 @@ enum {
117 * so it is easiest to ignore the kernel altogether (at compile time). 73 * so it is easiest to ignore the kernel altogether (at compile time).
118 */ 74 */
119 75
120/* NOTE: Do not make this into a 'static const int' because the pre-processor
121 * needs to test this value in some #if statements. */
122#define NFS_MOUNT_VERSION 4
123
124struct nfs2_fh { 76struct nfs2_fh {
125 char data[32]; 77 char data[32];
126}; 78};
@@ -216,7 +168,7 @@ find_kernel_nfs_mount_version(void)
216 if (kernel_version) 168 if (kernel_version)
217 return; 169 return;
218 170
219 nfs_mount_version = NFS_MOUNT_VERSION; /* default */ 171 nfs_mount_version = 4; /* default */
220 172
221 kernel_version = get_linux_version_code(); 173 kernel_version = get_linux_version_code();
222 if (kernel_version) { 174 if (kernel_version) {
@@ -229,8 +181,8 @@ find_kernel_nfs_mount_version(void)
229 else 181 else
230 nfs_mount_version = 4; /* since 2.3.99pre4 */ 182 nfs_mount_version = 4; /* since 2.3.99pre4 */
231 } 183 }
232 if (nfs_mount_version > NFS_MOUNT_VERSION) 184 if (nfs_mount_version > 4)
233 nfs_mount_version = NFS_MOUNT_VERSION; 185 nfs_mount_version = 4;
234} 186}
235 187
236static struct pmap * 188static struct pmap *
@@ -399,9 +351,7 @@ int nfsmount(const char *spec, const char *node, int *flags,
399 data.acregmax = 60; 351 data.acregmax = 60;
400 data.acdirmin = 30; 352 data.acdirmin = 30;
401 data.acdirmax = 60; 353 data.acdirmax = 60;
402#if NFS_MOUNT_VERSION >= 2
403 data.namlen = NAME_MAX; 354 data.namlen = NAME_MAX;
404#endif
405 355
406 bg = 0; 356 bg = 0;
407 soft = 0; 357 soft = 0;
@@ -417,7 +367,7 @@ int nfsmount(const char *spec, const char *node, int *flags,
417 mountvers = 0; 367 mountvers = 0;
418 port = 0; 368 port = 0;
419 mountport = 0; 369 mountport = 0;
420 nfsprog = NFS_PROGRAM; 370 nfsprog = 100003;
421 nfsvers = 0; 371 nfsvers = 0;
422 372
423 /* parse options */ 373 /* parse options */
@@ -474,11 +424,9 @@ int nfsmount(const char *spec, const char *node, int *flags,
474 else 424 else
475 printf("Warning: Unrecognized proto= option.\n"); 425 printf("Warning: Unrecognized proto= option.\n");
476 } else if (!strcmp(opt, "namlen")) { 426 } else if (!strcmp(opt, "namlen")) {
477#if NFS_MOUNT_VERSION >= 2
478 if (nfs_mount_version >= 2) 427 if (nfs_mount_version >= 2)
479 data.namlen = val; 428 data.namlen = val;
480 else 429 else
481#endif
482 printf("Warning: Option namlen is not supported.\n"); 430 printf("Warning: Option namlen is not supported.\n");
483 } else if (!strcmp(opt, "addr")) 431 } else if (!strcmp(opt, "addr"))
484 /* ignore */; 432 /* ignore */;
@@ -531,14 +479,10 @@ int nfsmount(const char *spec, const char *node, int *flags,
531 | (posix ? NFS_MOUNT_POSIX : 0) 479 | (posix ? NFS_MOUNT_POSIX : 0)
532 | (nocto ? NFS_MOUNT_NOCTO : 0) 480 | (nocto ? NFS_MOUNT_NOCTO : 0)
533 | (noac ? NFS_MOUNT_NOAC : 0); 481 | (noac ? NFS_MOUNT_NOAC : 0);
534#if NFS_MOUNT_VERSION >= 2
535 if (nfs_mount_version >= 2) 482 if (nfs_mount_version >= 2)
536 data.flags |= (tcp ? NFS_MOUNT_TCP : 0); 483 data.flags |= (tcp ? NFS_MOUNT_TCP : 0);
537#endif
538#if NFS_MOUNT_VERSION >= 3
539 if (nfs_mount_version >= 3) 484 if (nfs_mount_version >= 3)
540 data.flags |= (nolock ? NFS_MOUNT_NONLM : 0); 485 data.flags |= (nolock ? NFS_MOUNT_NONLM : 0);
541#endif
542 if (nfsvers > MAX_NFSPROT || mountvers > MAX_NFSPROT) { 486 if (nfsvers > MAX_NFSPROT || mountvers > MAX_NFSPROT) {
543 bb_error_msg("NFSv%d not supported!", nfsvers); 487 bb_error_msg("NFSv%d not supported!", nfsvers);
544 return 1; 488 return 1;
@@ -568,11 +512,9 @@ int nfsmount(const char *spec, const char *node, int *flags,
568 (data.flags & NFS_MOUNT_POSIX) != 0, 512 (data.flags & NFS_MOUNT_POSIX) != 0,
569 (data.flags & NFS_MOUNT_NOCTO) != 0, 513 (data.flags & NFS_MOUNT_NOCTO) != 0,
570 (data.flags & NFS_MOUNT_NOAC) != 0); 514 (data.flags & NFS_MOUNT_NOAC) != 0);
571#if NFS_MOUNT_VERSION >= 2
572 printf("tcp = %d\n", 515 printf("tcp = %d\n",
573 (data.flags & NFS_MOUNT_TCP) != 0); 516 (data.flags & NFS_MOUNT_TCP) != 0);
574#endif 517#endif
575#endif
576 518
577 data.version = nfs_mount_version; 519 data.version = nfs_mount_version;
578 520
@@ -746,14 +688,11 @@ int nfsmount(const char *spec, const char *node, int *flags,
746 memcpy(data.root.data, 688 memcpy(data.root.data,
747 (char *) status.nfsv2.fhstatus_u.fhs_fhandle, 689 (char *) status.nfsv2.fhstatus_u.fhs_fhandle,
748 NFS_FHSIZE); 690 NFS_FHSIZE);
749#if NFS_MOUNT_VERSION >= 4
750 data.root.size = NFS_FHSIZE; 691 data.root.size = NFS_FHSIZE;
751 memcpy(data.old_root.data, 692 memcpy(data.old_root.data,
752 (char *) status.nfsv2.fhstatus_u.fhs_fhandle, 693 (char *) status.nfsv2.fhstatus_u.fhs_fhandle,
753 NFS_FHSIZE); 694 NFS_FHSIZE);
754#endif
755 } else { 695 } else {
756#if NFS_MOUNT_VERSION >= 4
757 fhandle3 *my_fhandle; 696 fhandle3 *my_fhandle;
758 if (status.nfsv3.fhs_status != 0) { 697 if (status.nfsv3.fhs_status != 0) {
759 bb_error_msg("%s:%s failed, reason given by server: %s", 698 bb_error_msg("%s:%s failed, reason given by server: %s",
@@ -770,7 +709,6 @@ int nfsmount(const char *spec, const char *node, int *flags,
770 my_fhandle->fhandle3_len); 709 my_fhandle->fhandle3_len);
771 710
772 data.flags |= NFS_MOUNT_VER3; 711 data.flags |= NFS_MOUNT_VER3;
773#endif
774 } 712 }
775 713
776 /* create nfs socket for kernel */ 714 /* create nfs socket for kernel */
@@ -862,39 +800,19 @@ fail:
862#define EDQUOT ENOSPC 800#define EDQUOT ENOSPC
863#endif 801#endif
864 802
803// Convert each NFSERR_BLAH into EBLAH
804
865static const struct { 805static const struct {
866 enum nfs_stat stat; 806 int stat;
867 int errnum; 807 int errnum;
868} nfs_errtbl[] = { 808} nfs_errtbl[] = {
869 { NFS_OK, 0 }, 809 {0,0}, {1,EPERM}, {2,ENOENT}, {5,EIO}, {6,ENXIO}, {13,EACCES}, {17,EEXIST},
870 { NFSERR_PERM, EPERM }, 810 {19,ENODEV}, {20,ENOTDIR}, {21,EISDIR}, {22,EINVAL}, {27,EFBIG},
871 { NFSERR_NOENT, ENOENT }, 811 {28,ENOSPC}, {30,EROFS}, {63,ENAMETOOLONG}, {66,ENOTEMPTY}, {69,EDQUOT},
872 { NFSERR_IO, EIO }, 812 {70,ESTALE}, {71,EREMOTE}, {-1,EIO}
873 { NFSERR_NXIO, ENXIO },
874 { NFSERR_ACCES, EACCES },
875 { NFSERR_EXIST, EEXIST },
876 { NFSERR_NODEV, ENODEV },
877 { NFSERR_NOTDIR, ENOTDIR },
878 { NFSERR_ISDIR, EISDIR },
879#ifdef NFSERR_INVAL
880 { NFSERR_INVAL, EINVAL }, /* that Sun forgot */
881#endif
882 { NFSERR_FBIG, EFBIG },
883 { NFSERR_NOSPC, ENOSPC },
884 { NFSERR_ROFS, EROFS },
885 { NFSERR_NAMETOOLONG, ENAMETOOLONG },
886 { NFSERR_NOTEMPTY, ENOTEMPTY },
887 { NFSERR_DQUOT, EDQUOT },
888 { NFSERR_STALE, ESTALE },
889#ifdef EWFLUSH
890 { NFSERR_WFLUSH, EWFLUSH },
891#endif
892 /* Throw in some NFSv3 values for even more fun (HP returns these) */
893 { 71, EREMOTE },
894
895 { -1, EIO }
896}; 813};
897 814
815
898static char *nfs_strerror(int status) 816static char *nfs_strerror(int status)
899{ 817{
900 int i; 818 int i;
@@ -908,16 +826,14 @@ static char *nfs_strerror(int status)
908 return buf; 826 return buf;
909} 827}
910 828
911static bool_t 829static bool_t xdr_fhandle (XDR *xdrs, fhandle objp)
912xdr_fhandle (XDR *xdrs, fhandle objp)
913{ 830{
914 if (!xdr_opaque (xdrs, objp, FHSIZE)) 831 if (!xdr_opaque (xdrs, objp, FHSIZE))
915 return FALSE; 832 return FALSE;
916 return TRUE; 833 return TRUE;
917} 834}
918 835
919bool_t 836bool_t xdr_fhstatus (XDR *xdrs, fhstatus *objp)
920xdr_fhstatus (XDR *xdrs, fhstatus *objp)
921{ 837{
922 if (!xdr_u_int (xdrs, &objp->fhs_status)) 838 if (!xdr_u_int (xdrs, &objp->fhs_status))
923 return FALSE; 839 return FALSE;
@@ -932,24 +848,21 @@ xdr_fhstatus (XDR *xdrs, fhstatus *objp)
932 return TRUE; 848 return TRUE;
933} 849}
934 850
935bool_t 851bool_t xdr_dirpath (XDR *xdrs, dirpath *objp)
936xdr_dirpath (XDR *xdrs, dirpath *objp)
937{ 852{
938 if (!xdr_string (xdrs, objp, MNTPATHLEN)) 853 if (!xdr_string (xdrs, objp, MNTPATHLEN))
939 return FALSE; 854 return FALSE;
940 return TRUE; 855 return TRUE;
941} 856}
942 857
943bool_t 858bool_t xdr_fhandle3 (XDR *xdrs, fhandle3 *objp)
944xdr_fhandle3 (XDR *xdrs, fhandle3 *objp)
945{ 859{
946 if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (unsigned int *) &objp->fhandle3_len, FHSIZE3)) 860 if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (unsigned int *) &objp->fhandle3_len, FHSIZE3))
947 return FALSE; 861 return FALSE;
948 return TRUE; 862 return TRUE;
949} 863}
950 864
951bool_t 865bool_t xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp)
952xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp)
953{ 866{
954 if (!xdr_fhandle3 (xdrs, &objp->fhandle)) 867 if (!xdr_fhandle3 (xdrs, &objp->fhandle))
955 return FALSE; 868 return FALSE;
@@ -959,16 +872,14 @@ xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp)
959 return TRUE; 872 return TRUE;
960} 873}
961 874
962bool_t 875bool_t xdr_mountstat3 (XDR *xdrs, mountstat3 *objp)
963xdr_mountstat3 (XDR *xdrs, mountstat3 *objp)
964{ 876{
965 if (!xdr_enum (xdrs, (enum_t *) objp)) 877 if (!xdr_enum (xdrs, (enum_t *) objp))
966 return FALSE; 878 return FALSE;
967 return TRUE; 879 return TRUE;
968} 880}
969 881
970bool_t 882bool_t xdr_mountres3 (XDR *xdrs, mountres3 *objp)
971xdr_mountres3 (XDR *xdrs, mountres3 *objp)
972{ 883{
973 if (!xdr_mountstat3 (xdrs, &objp->fhs_status)) 884 if (!xdr_mountstat3 (xdrs, &objp->fhs_status))
974 return FALSE; 885 return FALSE;