#include #include #include #include #if LINUX_VERSION_CODE < 0x020600 # define __KERNEL__ # include # undef __KERNEL__ #else # include #endif #include #include #include #include "mountnfs.h" void mountnfs(int proto, struct sockaddr_in *sa, uchar *handle, int nhandle, char *mtpt) { int mflag, fd; struct nfs_mount_data nfs; fd = socket(AF_INET, proto, proto==SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP); if(fd < 0) sysfatal("socket: %r"); memset(&nfs, 0, sizeof nfs); nfs.version = NFS_MOUNT_VERSION; nfs.fd = fd; nfs.flags = NFS_MOUNT_SOFT| NFS_MOUNT_INTR| NFS_MOUNT_NOAC| NFS_MOUNT_NOCTO| NFS_MOUNT_VER3| NFS_MOUNT_NONLM; if(proto==SOCK_STREAM) nfs.flags |= NFS_MOUNT_TCP; nfs.rsize = 8192; nfs.wsize = 8192; nfs.timeo = 120; nfs.retrans = 2; nfs.acregmin = 60; nfs.acregmax = 600; nfs.acdirmin = 60; nfs.acdirmax = 600; nfs.addr = *sa; strcpy(nfs.hostname, "backup"); nfs.namlen = 1024; nfs.bsize = 8192; memcpy(nfs.root.data, handle, nhandle); nfs.root.size = nhandle; mflag = MS_NOATIME|MS_NODEV|MS_NODIRATIME| MS_NOEXEC|MS_NOSUID|MS_RDONLY; if(mount("backup:/", mtpt, "nfs", mflag, &nfs) < 0) sysfatal("mount: %r"); }