From: "Timo Teräs" <timo.teras@iki.fi>
To: Steve Dickson <SteveD@redhat.com>,
linux-nfs@vger.kernel.org, ncopa@alpinelinux.org
Cc: "Timo Teräs" <timo.teras@iki.fi>
Subject: [PATCH v2 3/5] gssd: talk to kernel using file descriptors instead of FILE
Date: Thu, 2 Oct 2014 16:41:59 +0300 [thread overview]
Message-ID: <1412257321-5855-4-git-send-email-timo.teras@iki.fi> (raw)
In-Reply-To: <1412257321-5855-1-git-send-email-timo.teras@iki.fi>
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
---
utils/gssd/gssd_proc.c | 9 +++++---
utils/gssd/svcgssd.h | 2 +-
utils/gssd/svcgssd_main_loop.c | 9 ++++----
utils/gssd/svcgssd_proc.c | 51 ++++++++++++++++++++++--------------------
4 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/utils/gssd/gssd_proc.c b/utils/gssd/gssd_proc.c
index 121feb1..1d8e6a7 100644
--- a/utils/gssd/gssd_proc.c
+++ b/utils/gssd/gssd_proc.c
@@ -78,6 +78,7 @@
#include "nfsrpc.h"
#include "nfslib.h"
#include "gss_names.h"
+#include "misc.h"
/*
* pollarray:
@@ -1250,7 +1251,7 @@ void
handle_gssd_upcall(struct clnt_info *clp)
{
uid_t uid;
- char *lbuf = NULL;
+ char lbuf[RPC_CHAN_BUF_SIZE];
int lbuflen = 0;
char *p;
char *mech = NULL;
@@ -1260,11 +1261,14 @@ handle_gssd_upcall(struct clnt_info *clp)
printerr(1, "handling gssd upcall (%s)\n", clp->dirname);
- if (readline(clp->gssd_fd, &lbuf, &lbuflen) != 1) {
+ lbuflen = read(clp->gssd_fd, lbuf, sizeof(lbuf));
+ if (lbuflen <= 0 || lbuf[lbuflen-1] != '\n') {
printerr(0, "WARNING: handle_gssd_upcall: "
"failed reading request\n");
return;
}
+ lbuf[lbuflen-1] = 0;
+
printerr(2, "%s: '%s'\n", __func__, lbuf);
/* find the mechanism name */
@@ -1362,7 +1366,6 @@ handle_gssd_upcall(struct clnt_info *clp)
}
out:
- free(lbuf);
free(mech);
free(enctypes);
free(target);
diff --git a/utils/gssd/svcgssd.h b/utils/gssd/svcgssd.h
index 9a2e2e8..02b5c7a 100644
--- a/utils/gssd/svcgssd.h
+++ b/utils/gssd/svcgssd.h
@@ -35,7 +35,7 @@
#include <sys/queue.h>
#include <gssapi/gssapi.h>
-void handle_nullreq(FILE *f);
+void handle_nullreq(int f);
void gssd_run(void);
#define GSSD_SERVICE_NAME "nfs"
diff --git a/utils/gssd/svcgssd_main_loop.c b/utils/gssd/svcgssd_main_loop.c
index 2b4111c..b5681ce 100644
--- a/utils/gssd/svcgssd_main_loop.c
+++ b/utils/gssd/svcgssd_main_loop.c
@@ -54,19 +54,18 @@ void
gssd_run()
{
int ret;
- FILE *f;
+ int f;
struct pollfd pollfd;
#define NULLRPC_FILE "/proc/net/rpc/auth.rpcsec.init/channel"
- f = fopen(NULLRPC_FILE, "rw");
-
- if (!f) {
+ f = open(NULLRPC_FILE, O_RDWR);
+ if (f < 0) {
printerr(0, "failed to open %s: %s\n",
NULLRPC_FILE, strerror(errno));
exit(1);
}
- pollfd.fd = fileno(f);
+ pollfd.fd = f;
pollfd.events = POLLIN;
while (1) {
int save_err;
diff --git a/utils/gssd/svcgssd_proc.c b/utils/gssd/svcgssd_proc.c
index 5bdb438..72ec254 100644
--- a/utils/gssd/svcgssd_proc.c
+++ b/utils/gssd/svcgssd_proc.c
@@ -73,36 +73,35 @@ struct svc_cred {
int cr_ngroups;
gid_t cr_groups[NGROUPS];
};
-static char vbuf[RPC_CHAN_BUF_SIZE];
static int
do_svc_downcall(gss_buffer_desc *out_handle, struct svc_cred *cred,
gss_OID mech, gss_buffer_desc *context_token,
int32_t endtime, char *client_name)
{
- FILE *f;
- int i;
+ char buf[RPC_CHAN_BUF_SIZE], *bp;
+ int i, f, err, blen;
char *fname = NULL;
- int err;
printerr(1, "doing downcall\n");
if ((fname = mech2file(mech)) == NULL)
goto out_err;
- f = fopen(SVCGSSD_CONTEXT_CHANNEL, "w");
- if (f == NULL) {
+
+ f = open(SVCGSSD_CONTEXT_CHANNEL, O_WRONLY);
+ if (f < 0) {
printerr(0, "WARNING: unable to open downcall channel "
"%s: %s\n",
SVCGSSD_CONTEXT_CHANNEL, strerror(errno));
goto out_err;
}
- setvbuf(f, vbuf, _IOLBF, RPC_CHAN_BUF_SIZE);
- qword_printhex(f, out_handle->value, out_handle->length);
+ bp = buf, blen = sizeof(buf);
+ qword_addhex(&bp, &blen, out_handle->value, out_handle->length);
/* XXX are types OK for the rest of this? */
/* For context cache, use the actual context endtime */
- qword_printint(f, endtime);
- qword_printint(f, cred->cr_uid);
- qword_printint(f, cred->cr_gid);
- qword_printint(f, cred->cr_ngroups);
+ qword_addint(&bp, &blen, endtime);
+ qword_addint(&bp, &blen, cred->cr_uid);
+ qword_addint(&bp, &blen, cred->cr_gid);
+ qword_addint(&bp, &blen, cred->cr_ngroups);
printerr(2, "mech: %s, hndl len: %d, ctx len %d, timeout: %d (%d from now), "
"clnt: %s, uid: %d, gid: %d, num aux grps: %d:\n",
fname, out_handle->length, context_token->length,
@@ -110,19 +109,21 @@ do_svc_downcall(gss_buffer_desc *out_handle, struct svc_cred *cred,
client_name ? client_name : "<null>",
cred->cr_uid, cred->cr_gid, cred->cr_ngroups);
for (i=0; i < cred->cr_ngroups; i++) {
- qword_printint(f, cred->cr_groups[i]);
+ qword_addint(&bp, &blen, cred->cr_groups[i]);
printerr(2, " (%4d) %d\n", i+1, cred->cr_groups[i]);
}
- qword_print(f, fname);
- qword_printhex(f, context_token->value, context_token->length);
+ qword_add(&bp, &blen, fname);
+ qword_addhex(&bp, &blen, context_token->value, context_token->length);
if (client_name)
- qword_print(f, client_name);
- err = qword_eol(f);
- if (err) {
+ qword_add(&bp, &blen, client_name);
+ qword_addeol(&bp, &blen);
+ err = 0;
+ if (blen <= 0 || write(f, buf, bp - buf) != bp - buf) {
printerr(1, "WARNING: error writing to downcall channel "
"%s: %s\n", SVCGSSD_CONTEXT_CHANNEL, strerror(errno));
+ err = -1;
}
- fclose(f);
+ close(f);
return err;
out_err:
printerr(1, "WARNING: downcall failed\n");
@@ -317,7 +318,7 @@ print_hexl(const char *description, unsigned char *cp, int length)
#endif
void
-handle_nullreq(FILE *f) {
+handle_nullreq(int f) {
/* XXX initialize to a random integer to reduce chances of unnecessary
* invalidation of existing ctx's on restarting svcgssd. */
static u_int32_t handle_seq = 0;
@@ -339,19 +340,21 @@ handle_nullreq(FILE *f) {
u_int32_t maj_stat = GSS_S_FAILURE, min_stat = 0;
u_int32_t ignore_min_stat;
struct svc_cred cred;
- static char *lbuf = NULL;
- static int lbuflen = 0;
- static char *cp;
+ char lbuf[RPC_CHAN_BUF_SIZE];
+ int lbuflen = 0;
+ char *cp;
int32_t ctx_endtime;
char *hostbased_name = NULL;
printerr(1, "handling null request\n");
- if (readline(fileno(f), &lbuf, &lbuflen) != 1) {
+ lbuflen = read(f, lbuf, sizeof(lbuf));
+ if (lbuflen <= 0 || lbuf[lbuflen-1] != '\n') {
printerr(0, "WARNING: handle_nullreq: "
"failed reading request\n");
return;
}
+ lbuf[lbuflen-1] = 0;
cp = lbuf;
--
2.1.2
next prev parent reply other threads:[~2014-10-02 13:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-02 13:41 [PATCH v2 0/5] rework access to /proc/net/rpc Timo Teräs
2014-10-02 13:41 ` [PATCH v2 1/5] Add string.h to source files that need it Timo Teräs
2014-10-02 13:41 ` [PATCH v2 2/5] mountd: talk to kernel using file descriptors instead of FILE Timo Teräs
2014-10-02 13:41 ` Timo Teräs [this message]
2014-10-02 13:42 ` [PATCH v2 4/5] nfsexport: " Timo Teräs
2014-10-02 13:42 ` [PATCH v2 5/5] nfslib: remove now unused FILE helpers Timo Teräs
2014-12-07 15:30 ` [PATCH v2 0/5] rework access to /proc/net/rpc Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1412257321-5855-4-git-send-email-timo.teras@iki.fi \
--to=timo.teras@iki.fi \
--cc=SteveD@redhat.com \
--cc=linux-nfs@vger.kernel.org \
--cc=ncopa@alpinelinux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.