From 9be231f2dde111d4841549140c7fd7aa2c6f3b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= 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 --- 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 #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