Files
nfs-util/nfs-utils-2.5.2/support/nfsidmap/nfsidmap_common.c
2023-10-14 08:57:12 +00:00

119 lines
2.8 KiB
C

/*
* 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;
}