Rework option handling to save space.
[oweals/busybox.git] / util-linux / nfsmount.c
index b260a885f3faa2eb2dff475d6910701997423562..cd722acc34f2c6eb895e429edc642dca45b3f84c 100644 (file)
  * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp
  */
 
-#include "busybox.h"
-#undef FALSE
-#undef TRUE
 #include <unistd.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
 #include <netdb.h>
-#include <rpc/rpc.h>
-#include <rpc/pmap_prot.h>
-#include <rpc/pmap_clnt.h>
 #include <sys/socket.h>
-#include <sys/time.h>
+#include <time.h>
 #include <sys/utsname.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-
-#include "nfsmount.h"
+#include <stdlib.h>
+#include "busybox.h"
+#undef TRUE
+#undef FALSE
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+#include <rpc/pmap_clnt.h>
 #include <linux/nfs.h>  /* For the kernels nfs stuff */
+#include "nfsmount.h"
 
 #ifndef NFS_FHSIZE
 static const int NFS_FHSIZE = 32;
@@ -157,7 +157,7 @@ static const int NFS_MOUNT_NONLM = 0x0200;  /* 3 */
 #define HAVE_personality
 #define HAVE_tm_gmtoff
 
-static char *nfs_strerror(int stat);
+static char *nfs_strerror(int status);
 
 #define MAKE_VERSION(p,q,r)    (65536*(p) + 256*(q) + (r))
 #define MAX_NFSPROT ((nfs_mount_version >= 4) ? 3 : 2)
@@ -183,7 +183,8 @@ static int nfs_mount_version;
  *     nfs_mount_version: version this source and running kernel can handle
  */
 static void
-find_kernel_nfs_mount_version(void) {
+find_kernel_nfs_mount_version(void)
+{
        static int kernel_version = 0;
 
        if (kernel_version)
@@ -193,15 +194,17 @@ find_kernel_nfs_mount_version(void) {
 
        kernel_version = get_kernel_revision();
        if (kernel_version) {
-            if (kernel_version < MAKE_VERSION(2,1,32))
-                 nfs_mount_version = 1;
-            else if (kernel_version < MAKE_VERSION(2,3,99))
-                 nfs_mount_version = 3;
-            else
-                 nfs_mount_version = 4; /* since 2.3.99pre4 */
+               if (kernel_version < MAKE_VERSION(2,1,32))
+                       nfs_mount_version = 1;
+               else if (kernel_version < MAKE_VERSION(2,2,18) ||
+                               (kernel_version >=   MAKE_VERSION(2,3,0) &&
+                                kernel_version < MAKE_VERSION(2,3,99)))
+                       nfs_mount_version = 3;
+               else
+                       nfs_mount_version = 4; /* since 2.3.99pre4 */
        }
        if (nfs_mount_version > NFS_MOUNT_VERSION)
-            nfs_mount_version = NFS_MOUNT_VERSION;
+               nfs_mount_version = NFS_MOUNT_VERSION;
 }
 
 static struct pmap *
@@ -259,7 +262,7 @@ int nfsmount(const char *spec, const char *node, int *flags,
        char hostdir[1024];
        CLIENT *mclient;
        char *hostname;
-       char *dirname;
+       char *pathname;
        char *old_opts;
        char *mounthost=NULL;
        char new_opts[1024];
@@ -307,22 +310,22 @@ int nfsmount(const char *spec, const char *node, int *flags,
        msock = fsock = -1;
        mclient = NULL;
        if (strlen(spec) >= sizeof(hostdir)) {
-               error_msg("excessively long host:dir argument\n");
+               error_msg("excessively long host:dir argument");
                goto fail;
        }
        strcpy(hostdir, spec);
        if ((s = strchr(hostdir, ':'))) {
                hostname = hostdir;
-               dirname = s + 1;
+               pathname = s + 1;
                *s = '\0';
                /* Ignore all but first hostname in replicated mounts
                   until they can be fully supported. (mack@sgi.com) */
                if ((s = strchr(hostdir, ','))) {
                        *s = '\0';
-                       error_msg("warning: multiple hostnames not supported\n");
+                       error_msg("warning: multiple hostnames not supported");
                }
        } else {
-               error_msg("directory to mount not in host:dir format\n");
+               error_msg("directory to mount not in host:dir format");
                goto fail;
        }
 
@@ -332,11 +335,11 @@ int nfsmount(const char *spec, const char *node, int *flags,
 #endif
        {
                if ((hp = gethostbyname(hostname)) == NULL) {
-                       error_msg("can't get address for %s\n", hostname);
+                       herror_msg("%s", hostname);
                        goto fail;
                } else {
                        if (hp->h_length > sizeof(struct in_addr)) {
-                               error_msg("got bad hp->h_length\n");
+                               error_msg("got bad hp->h_length");
                                hp->h_length = sizeof(struct in_addr);
                        }
                        memcpy(&server_addr.sin_addr,
@@ -353,7 +356,7 @@ int nfsmount(const char *spec, const char *node, int *flags,
        if (!old_opts)
                old_opts = "";
        if (strlen(old_opts) + strlen(s) + 10 >= sizeof(new_opts)) {
-               error_msg("excessively long option argument\n");
+               error_msg("excessively long option argument");
                goto fail;
        }
        sprintf(new_opts, "%s%saddr=%s",
@@ -513,11 +516,11 @@ int nfsmount(const char *spec, const char *node, int *flags,
                data.flags |= (nolock ? NFS_MOUNT_NONLM : 0);
 #endif
        if (nfsvers > MAX_NFSPROT) {
-               error_msg("NFSv%d not supported!\n", nfsvers);
+               error_msg("NFSv%d not supported!", nfsvers);
                return 0;
        }
        if (mountvers > MAX_NFSPROT) {
-               error_msg("NFSv%d not supported!\n", nfsvers);
+               error_msg("NFSv%d not supported!", nfsvers);
                return 0;
        }
        if (nfsvers && !mountvers)
@@ -577,11 +580,11 @@ int nfsmount(const char *spec, const char *node, int *flags,
            mount_server_addr.sin_addr.s_addr = inet_addr(hostname);
          } else {
                  if ((hp = gethostbyname(mounthost)) == NULL) {
-                         error_msg("can't get address for %s\n", hostname);
+                         herror_msg("%s", mounthost);
                          goto fail;
                  } else {
                          if (hp->h_length > sizeof(struct in_addr)) {
-                                 error_msg("got bad hp->h_length?\n");
+                                 error_msg("got bad hp->h_length?");
                                  hp->h_length = sizeof(struct in_addr);
                          }
                          mount_server_addr.sin_family = AF_INET;
@@ -659,7 +662,7 @@ int nfsmount(const char *spec, const char *node, int *flags,
                        mclient = 0;
                        }
                        if (mclient) {
-                               /* try to mount hostname:dirname */
+                               /* try to mount hostname:pathname */
                                mclient->cl_auth = authunix_create_default();
 
                        /* make pointers in xdr_mountres3 NULL so
@@ -670,14 +673,14 @@ int nfsmount(const char *spec, const char *node, int *flags,
                        if (pm_mnt->pm_vers == 3)
                                clnt_stat = clnt_call(mclient, MOUNTPROC3_MNT,
                                                      (xdrproc_t) xdr_dirpath,
-                                                     (caddr_t) &dirname,
+                                                     (caddr_t) &pathname,
                                                      (xdrproc_t) xdr_mountres3,
                                                      (caddr_t) &status,
                                        total_timeout);
                        else
                                clnt_stat = clnt_call(mclient, MOUNTPROC_MNT,
                                                      (xdrproc_t) xdr_dirpath,
-                                                     (caddr_t) &dirname,
+                                                     (caddr_t) &pathname,
                                                      (xdrproc_t) xdr_fhstatus,
                                                      (caddr_t) &status,
                                                      total_timeout);
@@ -716,8 +719,8 @@ int nfsmount(const char *spec, const char *node, int *flags,
 
        if (nfsvers == 2) {
                if (status.nfsv2.fhs_status != 0) {
-                       error_msg("%s:%s failed, reason given by server: %s\n",
-                               hostname, dirname,
+                       error_msg("%s:%s failed, reason given by server: %s",
+                               hostname, pathname,
                                nfs_strerror(status.nfsv2.fhs_status));
                        goto fail;
                }
@@ -732,20 +735,20 @@ int nfsmount(const char *spec, const char *node, int *flags,
 #endif
        } else {
 #if NFS_MOUNT_VERSION >= 4
-               fhandle3 *fhandle;
+               fhandle3 *my_fhandle;
                if (status.nfsv3.fhs_status != 0) {
-                       error_msg("%s:%s failed, reason given by server: %s\n",
-                               hostname, dirname,
+                       error_msg("%s:%s failed, reason given by server: %s",
+                               hostname, pathname,
                                nfs_strerror(status.nfsv3.fhs_status));
                        goto fail;
                }
-               fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle;
+               my_fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle;
                memset(data.old_root.data, 0, NFS_FHSIZE);
                memset(&data.root, 0, sizeof(data.root));
-               data.root.size = fhandle->fhandle3_len;
+               data.root.size = my_fhandle->fhandle3_len;
                memcpy(data.root.data,
-                      (char *) fhandle->fhandle3_val,
-                      fhandle->fhandle3_len);
+                      (char *) my_fhandle->fhandle3_val,
+                      my_fhandle->fhandle3_len);
 
                data.flags |= NFS_MOUNT_VER3;
 #endif
@@ -870,20 +873,20 @@ static struct {
        { -1,                   EIO             }
 };
 
-static char *nfs_strerror(int stat)
+static char *nfs_strerror(int status)
 {
        int i;
        static char buf[256];
 
        for (i = 0; nfs_errtbl[i].stat != -1; i++) {
-               if (nfs_errtbl[i].stat == stat)
+               if (nfs_errtbl[i].stat == status)
                        return strerror(nfs_errtbl[i].errnum);
        }
-       sprintf(buf, _("unknown nfs status return value: %d"), stat);
+       sprintf(buf, _("unknown nfs status return value: %d"), status);
        return buf;
 }
 
-bool_t
+static bool_t
 xdr_fhandle (XDR *xdrs, fhandle objp)
 {
        //register int32_t *buf;