summaryrefslogtreecommitdiffstats
path: root/utils/gssd/gssd_main_loop.c
diff options
context:
space:
mode:
authorDavid Hardeman <david@hardeman.nu>2015-01-21 16:22:56 -0500
committerSteve Dickson <steved@redhat.com>2015-01-23 14:19:09 -0500
commit522838cae9d840d1696fcc0e7c70245027e44269 (patch)
treef6c8c3b13db5b2df301f963537e3fd941f82dc92 /utils/gssd/gssd_main_loop.c
parent7addf9dadb35e8f6a770b943e67ddc77e1bc97ba (diff)
downloadnfs-utils-522838cae9d840d1696fcc0e7c70245027e44269.tar.gz
nfs-utils-522838cae9d840d1696fcc0e7c70245027e44269.tar.xz
nfs-utils-522838cae9d840d1696fcc0e7c70245027e44269.zip
gssd - merge gssd_main_loop.c and gssd.c
Having all the main loop code in one file is important in preparation for later patches which add inotify and libevent. Signed-off-by: David Hardeman <david@hardeman.nu> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/gssd/gssd_main_loop.c')
-rw-r--r--utils/gssd/gssd_main_loop.c262
1 files changed, 0 insertions, 262 deletions
diff --git a/utils/gssd/gssd_main_loop.c b/utils/gssd/gssd_main_loop.c
deleted file mode 100644
index 9787883..0000000
--- a/utils/gssd/gssd_main_loop.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- Copyright (c) 2004 The Regents of the University of Michigan.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/poll.h>
-#include <netinet/in.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <memory.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <unistd.h>
-#include <dirent.h>
-
-#include "gssd.h"
-#include "err_util.h"
-#include "nfslib.h"
-
-extern struct pollfd *pollarray;
-extern unsigned long pollsize;
-
-#define POLL_MILLISECS 500
-
-static volatile int dir_changed = 1;
-
-static void dir_notify_handler(__attribute__((unused))int sig)
-{
- dir_changed = 1;
-}
-
-static void
-scan_poll_results(int ret)
-{
- int i;
- struct clnt_info *clp;
-
- for (clp = clnt_list.tqh_first; clp != NULL; clp = clp->list.tqe_next)
- {
- i = clp->gssd_poll_index;
- if (i >= 0 && pollarray[i].revents) {
- if (pollarray[i].revents & POLLHUP) {
- clp->gssd_close_me = 1;
- dir_changed = 1;
- }
- if (pollarray[i].revents & POLLIN)
- handle_gssd_upcall(clp);
- pollarray[clp->gssd_poll_index].revents = 0;
- ret--;
- if (!ret)
- break;
- }
- i = clp->krb5_poll_index;
- if (i >= 0 && pollarray[i].revents) {
- if (pollarray[i].revents & POLLHUP) {
- clp->krb5_close_me = 1;
- dir_changed = 1;
- }
- if (pollarray[i].revents & POLLIN)
- handle_krb5_upcall(clp);
- pollarray[clp->krb5_poll_index].revents = 0;
- ret--;
- if (!ret)
- break;
- }
- }
-}
-
-static int
-topdirs_add_entry(struct dirent *dent)
-{
- struct topdirs_info *tdi;
-
- tdi = calloc(sizeof(struct topdirs_info), 1);
- if (tdi == NULL) {
- printerr(0, "ERROR: Couldn't allocate struct topdirs_info\n");
- return -1;
- }
- tdi->dirname = malloc(PATH_MAX);
- if (tdi->dirname == NULL) {
- printerr(0, "ERROR: Couldn't allocate directory name\n");
- free(tdi);
- return -1;
- }
- snprintf(tdi->dirname, PATH_MAX, "%s/%s", pipefs_dir, dent->d_name);
- tdi->fd = open(tdi->dirname, O_RDONLY);
- if (tdi->fd == -1) {
- printerr(0, "ERROR: failed to open %s\n", tdi->dirname);
- free(tdi);
- return -1;
- }
- fcntl(tdi->fd, F_SETSIG, DNOTIFY_SIGNAL);
- fcntl(tdi->fd, F_NOTIFY, DN_CREATE|DN_DELETE|DN_MODIFY|DN_MULTISHOT);
-
- TAILQ_INSERT_HEAD(&topdirs_list, tdi, list);
- return 0;
-}
-
-static void
-topdirs_free_list(void)
-{
- struct topdirs_info *tdi;
-
- TAILQ_FOREACH(tdi, &topdirs_list, list) {
- free(tdi->dirname);
- if (tdi->fd != -1)
- close(tdi->fd);
- TAILQ_REMOVE(&topdirs_list, tdi, list);
- free(tdi);
- }
-}
-
-static int
-topdirs_init_list(void)
-{
- DIR *pipedir;
- struct dirent *dent;
- int ret;
-
- TAILQ_INIT(&topdirs_list);
-
- pipedir = opendir(pipefs_dir);
- if (pipedir == NULL) {
- printerr(0, "ERROR: could not open rpc_pipefs directory '%s': "
- "%s\n", pipefs_dir, strerror(errno));
- return -1;
- }
- for (dent = readdir(pipedir); dent != NULL; dent = readdir(pipedir)) {
- if (dent->d_type != DT_DIR ||
- strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0) {
- continue;
- }
- ret = topdirs_add_entry(dent);
- if (ret)
- goto out_err;
- }
- if (TAILQ_EMPTY(&topdirs_list)) {
- printerr(0, "ERROR: rpc_pipefs directory '%s' is empty!\n", pipefs_dir);
- return -1;
- }
- closedir(pipedir);
- return 0;
-out_err:
- topdirs_free_list();
- return -1;
-}
-
-#ifdef HAVE_PPOLL
-static void gssd_poll(struct pollfd *fds, unsigned long nfds)
-{
- sigset_t emptyset;
- int ret;
-
- sigemptyset(&emptyset);
- ret = ppoll(fds, nfds, NULL, &emptyset);
- if (ret < 0) {
- if (errno != EINTR)
- printerr(0, "WARNING: error return from poll\n");
- } else if (ret == 0) {
- printerr(0, "WARNING: unexpected timeout\n");
- } else {
- scan_poll_results(ret);
- }
-}
-#else /* !HAVE_PPOLL */
-static void gssd_poll(struct pollfd *fds, unsigned long nfds)
-{
- int ret;
-
- /* race condition here: dir_changed could be set before we
- * enter the poll, and we'd never notice if it weren't for the
- * timeout. */
- ret = poll(fds, nfds, POLL_MILLISECS);
- if (ret < 0) {
- if (errno != EINTR)
- printerr(0, "WARNING: error return from poll\n");
- } else if (ret == 0) {
- /* timeout */
- } else { /* ret > 0 */
- scan_poll_results(ret);
- }
-}
-#endif /* !HAVE_PPOLL */
-
-void
-gssd_run()
-{
- struct sigaction dn_act = {
- .sa_handler = dir_notify_handler
- };
- sigset_t set;
-
- sigemptyset(&dn_act.sa_mask);
- sigaction(DNOTIFY_SIGNAL, &dn_act, NULL);
-
- /* just in case the signal is blocked... */
- sigemptyset(&set);
- sigaddset(&set, DNOTIFY_SIGNAL);
- sigprocmask(SIG_UNBLOCK, &set, NULL);
-
- if (topdirs_init_list() != 0) {
- /* Error msg is already printed */
- exit(1);
- }
- init_client_list();
-
- printerr(1, "beginning poll\n");
- while (1) {
- while (dir_changed) {
- dir_changed = 0;
- if (update_client_list()) {
- /* Error msg is already printed */
- exit(1);
- }
-
- daemon_ready();
- }
- gssd_poll(pollarray, pollsize);
- }
- topdirs_free_list();
-
- return;
-}