File: nfsidmap_common.c

package info (click to toggle)
nfs-utils 1%3A2.8.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 7,276 kB
  • sloc: ansic: 52,182; sh: 5,371; python: 2,151; makefile: 971
file content (134 lines) | stat: -rw-r--r-- 3,123 bytes parent folder | download
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 *  nfsidmap_common.c
 *
 *  nfs idmapping library, primarily for nfs4 client/server kernel idmapping
 *  and for userland nfs4 idmapping by acl libraries.
 *
 *  Code common to libnfsidmap and some of its bundled plugins
 *
 *  If you make use of these functions you must initialise your own
 *  copy of the config file data using: conf_init_file(nfsidmap_conf_path)
 *  failure to do so will appear as if the config was empty
 */

#include "config.h"

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include "nfsidmap.h"
#include "nfsidmap_private.h"
#include "nfsidmap_plugin.h"
#include "conffile.h"

#pragma GCC visibility push(hidden)

static char * toupper_str(char *s)
{
        size_t i;
        for (i=0; i < strlen(s); i++)
                s[i] = toupper(s[i]);
        return s;
}

static struct conf_list *local_realms = NULL;

void free_local_realms(void)
{
	if (local_realms) {
		conf_free_list(local_realms);
		local_realms = NULL;
	}
}

/* Get list of "local equivalent" realms.  Meaning the list of realms
 * where john@REALM.A is considered the same user as john@REALM.B
 * If not specified, default to upper-case of local domain name */
struct conf_list *get_local_realms(void)
{
	if (local_realms) return local_realms;

	local_realms = conf_get_list("General", "Local-Realms");
	if (local_realms == NULL) {
		struct conf_list_node *node;

		local_realms = malloc(sizeof *local_realms);
		if (local_realms == NULL)
			return NULL;
		local_realms->cnt = 0;
		TAILQ_INIT(&local_realms->fields);

		node = calloc(1, sizeof *node);
		if (node == NULL)
			return NULL;

		node->field = calloc(1, NFS4_MAX_DOMAIN_LEN);
		if (node->field == NULL) {
			free(node);
			return NULL;
		}

		nfs4_get_default_domain(NULL, node->field, NFS4_MAX_DOMAIN_LEN);
		toupper_str(node->field);

		TAILQ_INSERT_TAIL(&local_realms->fields, node, link);
		local_realms->cnt++;
	}
	return local_realms;
}

static int no_strip = -1;
static int reformat_group = 0;

int get_nostrip(void)
{
	if (no_strip != -1) return no_strip;

	char * nostrip = conf_get_str_with_def("General", "No-Strip", "none");
	if (strcasecmp(nostrip, "both") == 0)
		no_strip = IDTYPE_USER|IDTYPE_GROUP;
	else if (strcasecmp(nostrip, "group") == 0)
		no_strip = IDTYPE_GROUP;
	else if (strcasecmp(nostrip, "user") == 0)
		no_strip = IDTYPE_USER;
	else
		no_strip = 0;

	if (no_strip & IDTYPE_GROUP) {
		char * reformatgroup = conf_get_str_with_def("General", "Reformat-Group", "false");
		if ((strcasecmp(reformatgroup, "true") == 0) ||
		    (strcasecmp(reformatgroup, "on") == 0) ||
		    (strcasecmp(reformatgroup, "yes") == 0))
			reformat_group = 1;
		else
			reformat_group = 0;
	}

	return no_strip;
}

int get_reformat_group(void)
{
	if (no_strip != -1) return reformat_group;

	return reformat_group;
}

size_t get_pwnam_buflen(void)
{
	long buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
	if (buflen == -1)
		buflen = 16384;
	return (size_t)buflen;
}

size_t get_grnam_buflen(void)
{
	long buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
	if (buflen == -1)
		buflen = 16384;
	return (size_t)buflen;
}