X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fmount.c;h=30946bd5b26bc1b2eb8b5c88bbb28aa225f16da9;hp=2dc0aec7ec84249460115c0997c9ab82f3d2db11;hb=0dfc8a5426381c6d65aed4d9d0e50bae3238cc8f;hpb=28e4224b9bbfc355c83e17df74c47221afacd560 diff --git a/utils/mount/mount.c b/utils/mount/mount.c index 2dc0aec..30946bd 100644 --- a/utils/mount/mount.c +++ b/utils/mount/mount.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -41,8 +42,10 @@ #include "nfsumount.h" #include "mount.h" #include "error.h" +#include "network.h" char *progname; +int nfs_mount_data_version; int nomtab; int verbose; int sloppy; @@ -128,6 +131,51 @@ static const struct opt_map opt_map[] = { { NULL, 0, 0, 0 } }; +#define MAKE_VERSION(p,q,r) (65536 * (p) + 256 * (q) + (r)) + +int linux_version_code(void) +{ + struct utsname my_utsname; + int p, q, r; + + 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; +} + +/* + * Choose the version of the nfs_mount_data structure that is appropriate + * for the kernel that is doing the mount. + * + * NFS_MOUNT_VERSION: maximum version supported by these sources + * nfs_mount_data_version: maximum version supported by the running kernel + */ +static void discover_nfs_mount_data_version(void) +{ + int kernel_version = linux_version_code(); + + if (kernel_version) { + if (kernel_version < MAKE_VERSION(2, 1, 32)) + nfs_mount_data_version = 1; + else if (kernel_version < MAKE_VERSION(2, 2, 18)) + nfs_mount_data_version = 3; + else if (kernel_version < MAKE_VERSION(2, 3, 0)) + nfs_mount_data_version = 4; + else if (kernel_version < MAKE_VERSION(2, 3, 99)) + nfs_mount_data_version = 3; + else if (kernel_version < MAKE_VERSION(2, 6, 3)) + nfs_mount_data_version = 4; + else + nfs_mount_data_version = 6; + } + if (nfs_mount_data_version > NFS_MOUNT_VERSION) + nfs_mount_data_version = NFS_MOUNT_VERSION; +} + /* Try to build a canonical options string. */ static char * fix_opts_string (int flags, const char *extra_opts) { const struct opt_map *om; @@ -303,12 +351,6 @@ static int chk_mountpoint(char *mount_point) return 0; } -extern u_short getport( - struct sockaddr_in *saddr, - u_long prog, - u_long vers, - u_int prot); - static int probe_statd() { struct sockaddr_in addr; @@ -362,6 +404,8 @@ int main(int argc, char *argv[]) progname = basename(argv[0]); + discover_nfs_mount_data_version(); + if(!strncmp(progname, "umount", strlen("umount"))) { if(argc < 2) { umount_usage();