diff options
Diffstat (limited to 'main/nfs-utils/0004-nfsexport-talk-to-kernel-using-file-descriptors-inst.patch')
-rw-r--r-- | main/nfs-utils/0004-nfsexport-talk-to-kernel-using-file-descriptors-inst.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/main/nfs-utils/0004-nfsexport-talk-to-kernel-using-file-descriptors-inst.patch b/main/nfs-utils/0004-nfsexport-talk-to-kernel-using-file-descriptors-inst.patch new file mode 100644 index 0000000000..8cd1e3b474 --- /dev/null +++ b/main/nfs-utils/0004-nfsexport-talk-to-kernel-using-file-descriptors-inst.patch @@ -0,0 +1,135 @@ +From 9be231f2dde111d4841549140c7fd7aa2c6f3b9e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> +Date: Thu, 2 Oct 2014 16:17:30 +0300 +Subject: [PATCH v2 4/5] nfsexport: talk to kernel using file descriptors + instead of FILE +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Timo Teräs <timo.teras@iki.fi> +--- + support/nfs/nfsexport.c | 77 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 44 insertions(+), 33 deletions(-) + +diff --git a/support/nfs/nfsexport.c b/support/nfs/nfsexport.c +index f129fd2..afd7c90 100644 +--- a/support/nfs/nfsexport.c ++++ b/support/nfs/nfsexport.c +@@ -18,6 +18,7 @@ + #include <fcntl.h> + + #include "nfslib.h" ++#include "misc.h" + + /* if /proc/net/rpc/... exists, then + * write to it, as that interface is more stable. +@@ -32,62 +33,72 @@ + static int + exp_unexp(struct nfsctl_export *exp, int export) + { +- FILE *f; ++ char buf[RPC_CHAN_BUF_SIZE], *bp; + struct stat stb; + __u32 fsid; + char fsidstr[8]; + __u16 dev; + __u32 inode; +- int err; ++ int err = 0, f, blen; + ++ f = open("/proc/net/rpc/nfsd.export/channel", O_WRONLY); ++ if (f < 0) return -1; + +- f = fopen("/proc/net/rpc/nfsd.export/channel", "w"); +- if (f == NULL) return -1; +- qword_print(f, exp->ex_client); +- qword_print(f, exp->ex_path); ++ bp = buf; blen = sizeof(buf); ++ qword_add(&bp, &blen, exp->ex_client); ++ qword_add(&bp, &blen, exp->ex_path); + if (export) { +- qword_printint(f, 0x7fffffff); +- qword_printint(f, exp->ex_flags); +- qword_printint(f, exp->ex_anon_uid); +- qword_printint(f, exp->ex_anon_gid); +- qword_printint(f, exp->ex_dev); ++ qword_addint(&bp, &blen, 0x7fffffff); ++ qword_addint(&bp, &blen, exp->ex_flags); ++ qword_addint(&bp, &blen, exp->ex_anon_uid); ++ qword_addint(&bp, &blen, exp->ex_anon_gid); ++ qword_addint(&bp, &blen, exp->ex_dev); + } else +- qword_printint(f, 1); +- +- err = qword_eol(f); +- fclose(f); ++ qword_addint(&bp, &blen, 1); ++ qword_addeol(&bp, &blen); ++ if (blen <= 0 || write(f, buf, bp - buf) != bp - buf) ++ err = -1; ++ close(f); + + if (stat(exp->ex_path, &stb) != 0) + return -1; +- f = fopen("/proc/net/rpc/nfsd.fh/channel", "w"); +- if (f==NULL) return -1; ++ ++ f = open("/proc/net/rpc/nfsd.fh/channel", O_WRONLY); ++ if (f < 0) return -1; + if (exp->ex_flags & NFSEXP_FSID) { +- qword_print(f,exp->ex_client); +- qword_printint(f,1); ++ bp = buf; blen = sizeof(buf); ++ qword_add(&bp, &blen, exp->ex_client); ++ qword_addint(&bp, &blen, 1); + fsid = exp->ex_dev; +- qword_printhex(f, (char*)&fsid, 4); ++ qword_addhex(&bp, &blen, (char*)&fsid, 4); + if (export) { +- qword_printint(f, 0x7fffffff); +- qword_print(f, exp->ex_path); ++ qword_addint(&bp, &blen, 0x7fffffff); ++ qword_add(&bp, &blen, exp->ex_path); + } else +- qword_printint(f, 1); +- +- err = qword_eol(f) || err; ++ qword_addint(&bp, &blen, 1); ++ qword_addeol(&bp, &blen); ++ if (blen <= 0 || write(f, buf, bp - buf) != bp - buf) ++ err = -1; + } +- qword_print(f,exp->ex_client); +- qword_printint(f,0); ++ ++ bp = buf; blen = sizeof(buf); ++ qword_add(&bp, &blen, exp->ex_client); ++ qword_addint(&bp, &blen, 0); + dev = htons(major(stb.st_dev)); memcpy(fsidstr, &dev, 2); + dev = htons(minor(stb.st_dev)); memcpy(fsidstr+2, &dev, 2); + inode = stb.st_ino; memcpy(fsidstr+4, &inode, 4); + +- qword_printhex(f, fsidstr, 8); ++ qword_addhex(&bp, &blen, fsidstr, 8); + if (export) { +- qword_printint(f, 0x7fffffff); +- qword_print(f, exp->ex_path); ++ qword_addint(&bp, &blen, 0x7fffffff); ++ qword_add(&bp, &blen, exp->ex_path); + } else +- qword_printint(f, 1); +- err = qword_eol(f) || err; +- fclose(f); ++ qword_addint(&bp, &blen, 1); ++ qword_addeol(&bp, &blen); ++ if (blen <= 0 || write(f, buf, bp - buf) != bp - buf) ++ err = -1; ++ close(f); ++ + return err; + } + +-- +2.1.2 + |