From: "David Härdeman" <david@hardeman.nu>
To: linux-nfs@vger.kernel.org
Cc: SteveD@redhat.com
Subject: [PATCH 14/19] nfs-utils: gssd - simplify client scanning
Date: Tue, 09 Dec 2014 06:41:50 +0100 [thread overview]
Message-ID: <20141209054150.24756.2636.stgit@zeus.muc.hardeman.nu> (raw)
In-Reply-To: <20141209053828.24756.89941.stgit@zeus.muc.hardeman.nu>
Simplify the code responsible for the client dir scanning. This
is also in preparation for the inotify patches.
Signed-off-by: David Härdeman <david@hardeman.nu>
---
utils/gssd/gssd.c | 171 +++++++++++++++++++++++++----------------------------
1 file changed, 80 insertions(+), 91 deletions(-)
diff --git a/utils/gssd/gssd.c b/utils/gssd/gssd.c
index 9e48840..91e3e05 100644
--- a/utils/gssd/gssd.c
+++ b/utils/gssd/gssd.c
@@ -240,7 +240,7 @@ get_servername(const char *name, const struct sockaddr *sa, const char *addr)
/* XXX buffer problems: */
static int
-read_service_info(char *info_file_name, char **servicename, char **servername,
+read_service_info(int fd, char **servicename, char **servername,
int *prog, int *vers, char **protocol,
struct sockaddr *addr) {
#define INFOBUFLEN 256
@@ -254,20 +254,13 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
char protoname[16];
char port[128];
char *p;
- int fd = -1;
int numfields;
*servicename = *servername = *protocol = NULL;
- if ((fd = open(info_file_name, O_RDONLY)) == -1) {
- printerr(0, "ERROR: can't open %s: %s\n", info_file_name,
- strerror(errno));
- goto fail;
- }
if ((nbytes = read(fd, buf, INFOBUFLEN)) == -1)
goto fail;
- close(fd);
- fd = -1;
+
buf[nbytes] = '\0';
numfields = sscanf(buf,"RPC server: %127s\n"
@@ -313,7 +306,6 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
return 0;
fail:
printerr(0, "ERROR: failed to read service info\n");
- if (fd != -1) close(fd);
free(*servername);
free(*servicename);
free(*protocol);
@@ -322,7 +314,7 @@ fail:
}
static void
-destroy_client(struct clnt_info *clp)
+gssd_destroy_client(struct clnt_info *clp)
{
if (clp->krb5_fd >= 0) {
close(clp->krb5_fd);
@@ -344,26 +336,6 @@ destroy_client(struct clnt_info *clp)
free(clp);
}
-static struct clnt_info *
-insert_new_clnt(struct topdir *tdi)
-{
- struct clnt_info *clp;
-
- clp = calloc(1, sizeof(struct clnt_info));
- if (!clp) {
- printerr(0, "ERROR: can't malloc clnt_info: %s\n",
- strerror(errno));
- return NULL;
- }
-
- clp->krb5_fd = -1;
- clp->gssd_fd = -1;
- clp->dir_fd = -1;
-
- TAILQ_INSERT_HEAD(&tdi->clnt_list, clp, list);
- return clp;
-}
-
static void gssd_scan(void);
static void
@@ -400,33 +372,86 @@ gssd_clnt_krb5_cb(int UNUSED(fd), short which, void *data)
handle_krb5_upcall(clp);
}
+static struct clnt_info *
+gssd_get_clnt(struct topdir *tdi, const char *name)
+{
+ struct clnt_info *clp;
+
+ TAILQ_FOREACH(clp, &tdi->clnt_list, list)
+ if (!strcmp(clp->name, name))
+ return clp;
+
+ clp = calloc(1, sizeof(struct clnt_info));
+ if (!clp) {
+ printerr(0, "ERROR: can't malloc clnt_info: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+
+ if (asprintf(&clp->relpath, "%s/%s", tdi->name, name) < 0) {
+ clp->relpath = NULL;
+ goto out;
+ }
+
+ clp->name = clp->relpath + strlen(tdi->name) + 1;
+ clp->krb5_fd = -1;
+ clp->gssd_fd = -1;
+ clp->dir_fd = -1;
+
+ if ((clp->dir_fd = open(clp->relpath, O_RDONLY)) == -1) {
+ if (errno != ENOENT)
+ printerr(0, "ERROR: can't open %s: %s\n",
+ clp->relpath, strerror(errno));
+ goto out;
+ }
+
+ fcntl(clp->dir_fd, F_SETSIG, DNOTIFY_SIGNAL);
+ fcntl(clp->dir_fd, F_NOTIFY, DN_CREATE | DN_DELETE | DN_MULTISHOT);
+
+ TAILQ_INSERT_HEAD(&tdi->clnt_list, clp, list);
+ return clp;
+
+out:
+ free(clp->relpath);
+ free(clp);
+ return NULL;
+}
+
static int
-process_clnt_dir_files(struct clnt_info * clp)
+gssd_scan_clnt(struct topdir *tdi, const char *name)
{
- char name[strlen(clp->relpath) + strlen("/krb5") + 1];
- char gname[strlen(clp->relpath) + strlen("/gssd") + 1];
+ struct clnt_info *clp;
+ int clntfd;
bool gssd_was_closed;
bool krb5_was_closed;
+ clp = gssd_get_clnt(tdi, name);
+ if (!clp)
+ return -1;
+
gssd_was_closed = clp->gssd_fd < 0 ? true : false;
krb5_was_closed = clp->krb5_fd < 0 ? true : false;
- sprintf(gname, "%s/gssd", clp->relpath);
- sprintf(name, "%s/krb5", clp->relpath);
+ clntfd = openat(pipefs_fd, clp->relpath, O_RDONLY);
+ if (clntfd < 0) {
+ printerr(0, "ERROR: can't openat %s: %s\n",
+ clp->relpath, strerror(errno));
+ return -1;
+ }
if (clp->gssd_fd == -1)
- clp->gssd_fd = openat(pipefs_fd, gname, O_RDWR);
+ clp->gssd_fd = openat(clntfd, "gssd", O_RDWR);
if (clp->gssd_fd == -1) {
if (clp->krb5_fd == -1)
- clp->krb5_fd = openat(pipefs_fd, name, O_RDWR);
+ clp->krb5_fd = openat(clntfd, "krb5", O_RDWR);
/* If we opened a gss-specific pipe, let's try opening
* the new upcall pipe again. If we succeed, close
* gss-specific pipe(s).
*/
if (clp->krb5_fd != -1) {
- clp->gssd_fd = openat(pipefs_fd, gname, O_RDWR);
+ clp->gssd_fd = openat(clntfd, "gssd", O_RDWR);
if (clp->gssd_fd != -1) {
close(clp->krb5_fd);
clp->krb5_fd = -1;
@@ -448,58 +473,29 @@ process_clnt_dir_files(struct clnt_info * clp)
if ((clp->krb5_fd == -1) && (clp->gssd_fd == -1))
/* not fatal, files might appear later */
- return 0;
+ goto out;
if (clp->prog == 0) {
- char info_file_name[strlen(clp->relpath) + strlen("/info") + 1];
+ int infofd;
- sprintf(info_file_name, "%s/info", clp->relpath);
- read_service_info(info_file_name, &clp->servicename,
- &clp->servername, &clp->prog, &clp->vers,
- &clp->protocol, (struct sockaddr *) &clp->addr);
+ infofd = openat(clntfd, "info", O_RDONLY);
+ if (infofd < 0) {
+ printerr(0, "ERROR: can't open %s/info: %s\n",
+ clp->relpath, strerror(errno));
+ } else {
+ read_service_info(infofd, &clp->servicename,
+ &clp->servername, &clp->prog, &clp->vers,
+ &clp->protocol, (struct sockaddr *) &clp->addr);
+ close(infofd);
+ }
}
+out:
+ close(clntfd);
clp->scanned = true;
return 0;
}
-static void
-process_clnt_dir(struct topdir *tdi, const char *name)
-{
- struct clnt_info *clp;
-
- clp = insert_new_clnt(tdi);
- if (!clp)
- goto out;
-
- clp->relpath = malloc(strlen(tdi->name) + strlen("/") + strlen(name) + 1);
- if (!clp->relpath)
- goto out;
-
- sprintf(clp->relpath, "%s/%s", tdi->name, name);
- clp->name = clp->relpath + strlen(tdi->name) + 1;
-
- if ((clp->dir_fd = open(clp->relpath, O_RDONLY)) == -1) {
- if (errno != ENOENT)
- printerr(0, "ERROR: can't open %s: %s\n",
- clp->relpath, strerror(errno));
- goto out;
- }
-
- fcntl(clp->dir_fd, F_SETSIG, DNOTIFY_SIGNAL);
- fcntl(clp->dir_fd, F_NOTIFY, DN_CREATE | DN_DELETE | DN_MULTISHOT);
-
- if (process_clnt_dir_files(clp))
- goto out;
-
- return;
-
-out:
- if (clp) {
- TAILQ_REMOVE(&tdi->clnt_list, clp, list);
- destroy_client(clp);
- }
-}
static struct topdir *
gssd_get_topdir(const char *name)
@@ -572,14 +568,7 @@ gssd_scan_topdir(const char *name)
if (strncmp(d->d_name, "clnt", strlen("clnt")))
continue;
- TAILQ_FOREACH(clp, &tdi->clnt_list, list)
- if (!strcmp(clp->name, d->d_name))
- break;
-
- if (clp)
- process_clnt_dir_files(clp);
- else
- process_clnt_dir(tdi, d->d_name);
+ gssd_scan_clnt(tdi, d->d_name);
}
closedir(dir);
@@ -593,7 +582,7 @@ gssd_scan_topdir(const char *name)
printerr(2, "destroying client %s\n", clp->relpath);
saveprev = clp->list.tqe_prev;
TAILQ_REMOVE(&tdi->clnt_list, clp, list);
- destroy_client(clp);
+ gssd_destroy_client(clp);
clp = saveprev;
}
}
next prev parent reply other threads:[~2014-12-09 5:42 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-09 5:40 [PATCH 00/19] gssd improvements David Härdeman
2014-12-09 5:40 ` [PATCH 01/19] nfs-utils: cleanup daemonization code David Härdeman
2014-12-09 5:40 ` [PATCH 02/19] nfs-utils: gssd - merge gssd_main_loop.c and gssd.c David Härdeman
2014-12-09 5:40 ` [PATCH 03/19] nfs-utils: gssd - simplify some option handling David Härdeman
2014-12-09 5:41 ` [PATCH 04/19] nfs-utils: gssd - remove arbitrary GSSD_MAX_CCACHE_SEARCH limitation David Härdeman
2014-12-09 5:41 ` [PATCH 05/19] nfs-utils: gssd - simplify topdirs path David Härdeman
2014-12-09 5:41 ` [PATCH 06/19] nfs-utils: gssd - move over pipfs scanning code David Härdeman
2014-12-09 5:41 ` [PATCH 07/19] nfs-utils: gssd - simplify client dir " David Härdeman
2014-12-09 5:41 ` [PATCH 08/19] nfs-utils: gssd - use libevent David Härdeman
2014-12-09 5:41 ` [PATCH 09/19] nfs-utils: gssd - remove "close me" code David Härdeman
2014-12-09 5:41 ` [PATCH 10/19] nfs-utils: gssd - make the client lists per-topdir David Härdeman
2014-12-09 5:41 ` [PATCH 11/19] nfs-utils: gssd - keep the rpc_pipefs dir open David Härdeman
2014-12-09 5:41 ` [PATCH 12/19] nfs-utils: gssd - use more relative paths David Härdeman
2014-12-09 5:41 ` [PATCH 13/19] nfs-utils: gssd - simplify topdir scanning David Härdeman
2014-12-09 5:41 ` David Härdeman [this message]
2014-12-09 5:41 ` [PATCH 15/19] nfs-utils: gssd - cleanup read_service_info David Härdeman
2014-12-09 5:42 ` [PATCH 16/19] nfs-utils: gssd - change dnotify to inotify David Härdeman
2014-12-09 5:42 ` [PATCH 17/19] nfs-utils: gssd - further shorten some pathnames David Härdeman
2014-12-09 5:42 ` [PATCH 18/19] nfs-utils: gssd - improve inotify David Härdeman
2014-12-09 5:42 ` [PATCH 19/19] nfs-utils: gssd - simplify handle_gssd_upcall David Härdeman
2014-12-09 13:09 ` [PATCH 00/19] gssd improvements Jeff Layton
2014-12-09 13:52 ` David Härdeman
2014-12-09 14:58 ` Jeff Layton
2014-12-09 15:07 ` Simo Sorce
2014-12-09 19:55 ` David Härdeman
2014-12-10 11:52 ` Jeff Layton
2014-12-10 14:08 ` David Härdeman
2014-12-10 14:17 ` Jeff Layton
2014-12-10 14:31 ` David Härdeman
2014-12-10 14:34 ` Jeff Layton
2014-12-10 16:03 ` David Howells
2014-12-10 19:03 ` Jeff Layton
2014-12-10 20:55 ` David Härdeman
2014-12-10 23:44 ` Ian Kent
2014-12-10 23:21 ` Benjamin Coddington
2014-12-11 0:12 ` Ian Kent
2014-12-11 1:54 ` Benjamin Coddington
2014-12-11 3:21 ` Ian Kent
2014-12-11 11:45 ` Jeff Layton
2014-12-11 12:55 ` Ian Kent
2014-12-11 13:46 ` Jeff Layton
2014-12-11 22:31 ` Ian Kent
2014-12-11 19:32 ` J. Bruce Fields
2014-12-11 19:50 ` Jeff Layton
2014-12-11 19:55 ` J. Bruce Fields
2014-12-11 20:11 ` Jeff Layton
2014-12-11 20:38 ` J. Bruce Fields
2014-12-11 22:20 ` Ian Kent
2014-12-09 16:39 ` Steve Dickson
2014-12-09 20:22 ` David Härdeman
2014-12-09 21:13 ` Steve Dickson
2014-12-10 14:20 ` David Härdeman
2014-12-10 20:35 ` J. Bruce Fields
2014-12-10 20:49 ` David Härdeman
2014-12-10 21:07 ` J. Bruce Fields
2015-01-28 21:29 ` 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=20141209054150.24756.2636.stgit@zeus.muc.hardeman.nu \
--to=david@hardeman.nu \
--cc=SteveD@redhat.com \
--cc=linux-nfs@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox