diff options
Diffstat (limited to 'src/cmd/vbackup/mount-Linux.c')
| -rw-r--r-- | src/cmd/vbackup/mount-Linux.c | 58 |
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"); +} + |
