summaryrefslogtreecommitdiffstats
path: root/src/cmd/vbackup/mount-Linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/vbackup/mount-Linux.c')
-rw-r--r--src/cmd/vbackup/mount-Linux.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/cmd/vbackup/mount-Linux.c b/src/cmd/vbackup/mount-Linux.c
new file mode 100644
index 00000000..39b96a31
--- /dev/null
+++ b/src/cmd/vbackup/mount-Linux.c
@@ -0,0 +1,58 @@
+#include <u.h>
+#include <sys/socket.h>
+#include <sys/mount.h>
+#ifdef __Linux24__
+# define __KERNEL__
+# include <linux/nfs.h>
+# undef __KERNEL__
+#else
+# include <linux/nfs.h>
+#endif
+#include <linux/nfs2.h>
+#include <linux/nfs_mount.h>
+#include <libc.h>
+#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");
+}
+