* 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 <sys/socket.h>
#include <sys/time.h>
#include <sys/utsname.h>
-#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "nfsmount.h"
#include <linux/nfs.h> /* For the kernels nfs stuff */
+#ifndef NFS_FHSIZE
+static const int NFS_FHSIZE = 32;
+#endif
+#ifndef NFS_PORT
+static const int NFS_PORT = 2049;
+#endif
/* Disable the nls stuff */
# undef bindtextdomain
# define _(Text) (Text)
# define N_(Text) (Text)
-#define MS_MGC_VAL 0xc0ed0000 /* Magic number indicatng "new" flags */
-#define MS_RDONLY 1 /* Mount read-only */
-#define MS_NOSUID 2 /* Ignore suid and sgid bits */
-#define MS_NODEV 4 /* Disallow access to device special files */
-#define MS_NOEXEC 8 /* Disallow program execution */
-#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
-#define MS_REMOUNT 32 /* Alter flags of a mounted FS */
-#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
-#define S_QUOTA 128 /* Quota initialized for file/directory/symlink */
-#define S_APPEND 256 /* Append-only file */
-#define S_IMMUTABLE 512 /* Immutable file */
-#define MS_NOATIME 1024 /* Do not update access times. */
-#define MS_NODIRATIME 2048 /* Do not update directory access times */
+static const int MS_MGC_VAL = 0xc0ed0000; /* Magic number indicatng "new" flags */
+static const int MS_RDONLY = 1; /* Mount read-only */
+static const int MS_NOSUID = 2; /* Ignore suid and sgid bits */
+static const int MS_NODEV = 4; /* Disallow access to device special files */
+static const int MS_NOEXEC = 8; /* Disallow program execution */
+static const int MS_SYNCHRONOUS = 16; /* Writes are synced at once */
+static const int MS_REMOUNT = 32; /* Alter flags of a mounted FS */
+static const int MS_MANDLOCK = 64; /* Allow mandatory locks on an FS */
+static const int S_QUOTA = 128; /* Quota initialized for file/directory/symlink */
+static const int S_APPEND = 256; /* Append-only file */
+static const int S_IMMUTABLE = 512; /* Immutable file */
+static const int MS_NOATIME = 1024; /* Do not update access times. */
+static const int MS_NODIRATIME = 2048; /* Do not update directory access times */
/*
* so it is easiest to ignore the kernel altogether (at compile time).
*/
-#define NFS_MOUNT_VERSION 4
+static const int NFS_MOUNT_VERSION = 4;
struct nfs2_fh {
char data[32];
/* bits in the flags field */
-#define NFS_MOUNT_SOFT 0x0001 /* 1 */
-#define NFS_MOUNT_INTR 0x0002 /* 1 */
-#define NFS_MOUNT_SECURE 0x0004 /* 1 */
-#define NFS_MOUNT_POSIX 0x0008 /* 1 */
-#define NFS_MOUNT_NOCTO 0x0010 /* 1 */
-#define NFS_MOUNT_NOAC 0x0020 /* 1 */
-#define NFS_MOUNT_TCP 0x0040 /* 2 */
-#define NFS_MOUNT_VER3 0x0080 /* 3 */
-#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */
-#define NFS_MOUNT_NONLM 0x0200 /* 3 */
+static const int NFS_MOUNT_SOFT = 0x0001; /* 1 */
+static const int NFS_MOUNT_INTR = 0x0002; /* 1 */
+static const int NFS_MOUNT_SECURE = 0x0004; /* 1 */
+static const int NFS_MOUNT_POSIX = 0x0008; /* 1 */
+static const int NFS_MOUNT_NOCTO = 0x0010; /* 1 */
+static const int NFS_MOUNT_NOAC = 0x0020; /* 1 */
+static const int NFS_MOUNT_TCP = 0x0040; /* 2 */
+static const int NFS_MOUNT_VER3 = 0x0080; /* 3 */
+static const int NFS_MOUNT_KERBEROS = 0x0100; /* 3 */
+static const int NFS_MOUNT_NONLM = 0x0200; /* 3 */
#define UTIL_LINUX_VERSION "2.10m"
#define HAVE_personality
#define HAVE_tm_gmtoff
-extern char *xstrdup (const char *s);
-extern char *xstrndup (const char *s, int n);
static char *nfs_strerror(int stat);
#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r))
#define MAX_NFSPROT ((nfs_mount_version >= 4) ? 3 : 2)
-#define EX_FAIL 32 /* mount failure */
-#define EX_BG 256 /* retry in background (internal only) */
-
-
-static int
-linux_version_code(void) {
- struct utsname my_utsname;
- int p, q, r;
+static const int EX_FAIL = 32; /* mount failure */
+static const int EX_BG = 256; /* retry in background (internal only) */
- if (uname(&my_utsname) == 0) {
- p = atoi(strtok(my_utsname.release, "."));
- q = atoi(strtok(NULL, "."));
- r = atoi(strtok(NULL, "."));
- return MAKE_VERSION(p,q,r);
- }
- return 0;
-}
/*
* nfs_mount_version according to the sources seen at compile time.
*/
-int nfs_mount_version = NFS_MOUNT_VERSION;
+static int nfs_mount_version;
/*
* Unfortunately, the kernel prints annoying console messages
if (kernel_version)
return;
- kernel_version = linux_version_code();
+ nfs_mount_version = NFS_MOUNT_VERSION; /* default */
+ kernel_version = get_kernel_revision();
if (kernel_version) {
if (kernel_version < MAKE_VERSION(2,1,32))
nfs_mount_version = 1;
msock = fsock = -1;
mclient = NULL;
if (strlen(spec) >= sizeof(hostdir)) {
- fprintf(stderr, _("mount: "
- "excessively long host:dir argument\n"));
+ error_msg("excessively long host:dir argument\n");
goto fail;
}
strcpy(hostdir, spec);
until they can be fully supported. (mack@sgi.com) */
if ((s = strchr(hostdir, ','))) {
*s = '\0';
- fprintf(stderr, _("mount: warning: "
- "multiple hostnames not supported\n"));
+ error_msg("warning: multiple hostnames not supported\n");
}
} else {
- fprintf(stderr, _("mount: "
- "directory to mount not in host:dir format\n"));
+ error_msg("directory to mount not in host:dir format\n");
goto fail;
}
#endif
{
if ((hp = gethostbyname(hostname)) == NULL) {
- fprintf(stderr, _("mount: can't get address for %s\n"),
- hostname);
+ error_msg("can't get address for %s\n", hostname);
goto fail;
} else {
if (hp->h_length > sizeof(struct in_addr)) {
- fprintf(stderr,
- _("mount: got bad hp->h_length\n"));
+ error_msg("got bad hp->h_length\n");
hp->h_length = sizeof(struct in_addr);
}
memcpy(&server_addr.sin_addr,
if (!old_opts)
old_opts = "";
if (strlen(old_opts) + strlen(s) + 10 >= sizeof(new_opts)) {
- fprintf(stderr, _("mount: "
- "excessively long option argument\n"));
+ error_msg("excessively long option argument\n");
goto fail;
}
sprintf(new_opts, "%s%saddr=%s",
data.flags |= (nolock ? NFS_MOUNT_NONLM : 0);
#endif
if (nfsvers > MAX_NFSPROT) {
- fprintf(stderr, "NFSv%d not supported!\n", nfsvers);
+ error_msg("NFSv%d not supported!\n", nfsvers);
return 0;
}
if (mountvers > MAX_NFSPROT) {
- fprintf(stderr, "NFSv%d not supported!\n", nfsvers);
+ error_msg("NFSv%d not supported!\n", nfsvers);
return 0;
}
if (nfsvers && !mountvers)
mount_server_addr.sin_addr.s_addr = inet_addr(hostname);
} else {
if ((hp = gethostbyname(mounthost)) == NULL) {
- fprintf(stderr, _("mount: can't get address for %s\n"),
- hostname);
+ error_msg("can't get address for %s\n", hostname);
goto fail;
} else {
if (hp->h_length > sizeof(struct in_addr)) {
- fprintf(stderr,
- _("mount: got bad hp->h_length?\n"));
+ error_msg("got bad hp->h_length?\n");
hp->h_length = sizeof(struct in_addr);
}
mount_server_addr.sin_family = AF_INET;
if (nfsvers == 2) {
if (status.nfsv2.fhs_status != 0) {
- fprintf(stderr,
- "mount: %s:%s failed, reason given by server: %s\n",
+ error_msg("%s:%s failed, reason given by server: %s\n",
hostname, dirname,
nfs_strerror(status.nfsv2.fhs_status));
goto fail;
#if NFS_MOUNT_VERSION >= 4
fhandle3 *fhandle;
if (status.nfsv3.fhs_status != 0) {
- fprintf(stderr,
- "mount: %s:%s failed, reason given by server: %s\n",
+ error_msg("%s:%s failed, reason given by server: %s\n",
hostname, dirname,
nfs_strerror(status.nfsv3.fhs_status));
goto fail;
* to avoid problems with multihomed hosts.
* --Swen
*/
- if (linux_version_code() <= 66314
+ if (get_kernel_revision() <= 66314
&& connect(fsock, (struct sockaddr *) &server_addr,
sizeof (server_addr)) < 0) {
perror(_("nfs connect"));