summaryrefslogtreecommitdiffstats
path: root/support/export/keys.c
blob: 481480871a085972ea54337d32f1a25fb1d30599 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * keys.c		Key management for nfsd. Currently, keys
 *			are kept in a single file only, but eventually,
 *			support for a key server should be added.
 *
 * Copyright (C) 1995 Olaf Kirch <okir@monad.swb.de>
 */

#include "config.h"

#include <sys/stat.h>
#include "nfslib.h"
#include "exportfs.h"
#include "xmalloc.h"

struct keycache {
	struct keycache *	k_next;
	struct nfskeyent	k_data;
};

static struct keycache *	keycache = NULL;
static time_t			lastmod = 0;

static void	key_reload(void);


struct nfskey *
key_lookup(char *hname)
{
	struct keycache	*kc;

	key_reload();

	for (kc = keycache; kc; kc = kc->k_next) {
#if 0
		if (matchhostname(kc->k_data.k_hostname, hname))
#else
		if (!strcmp(kc->k_data.k_hostname, hname))
#endif
			return &kc->k_data.k_key;
	}

	return NULL;
}

static void
key_reload(void)
{
	struct stat	stb;
	struct keycache	*cp;
	struct nfskeyent *kp;

	if (stat(_PATH_NFSKEYS, &stb) >= 0 && stb.st_mtime == lastmod)
		return;

	while (keycache) {
		cp = keycache->k_next;
		xfree(keycache);
		keycache = cp;
	}

	setnfskeyent(_PATH_NFSKEYS);
	while ((kp = getnfskeyent()) != NULL) {
		cp = (struct keycache *) xmalloc(sizeof(*cp));
		cp->k_data = *kp;
		cp->k_next = keycache;
		keycache = cp;
	}
	endnfskeyent();

	lastmod = stb.st_mtime;
}