1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00
samba-mirror/source3/winbindd/idmap_hash/mapfile.c
Andrew Tridgell f455772b99 s3-winbind: another strlcpy()/fstring fix
Autobuild-User: Andrew Tridgell <tridge@samba.org>
Autobuild-Date: Fri May  6 07:50:33 CEST 2011 on sn-devel-104
2011-05-06 07:50:33 +02:00

178 lines
3.9 KiB
C

/*
* mapfile.c
*
* Copyright (C) Gerald Carter <jerry@samba.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#include "includes.h"
#include "system/filesys.h"
#include "winbindd/winbindd.h"
#include "idmap.h"
#include "idmap_hash.h"
#include <stdio.h>
XFILE *lw_map_file = NULL;
/*********************************************************************
********************************************************************/
static bool mapfile_open(void)
{
const char *mapfile_name = NULL;
/* If we have an open handle, just reset it */
if (lw_map_file) {
return (x_tseek(lw_map_file, 0, SEEK_SET) == 0);
}
mapfile_name = lp_parm_const_string(-1, "idmap_hash", "name_map", NULL);
if (!mapfile_name) {
return false;
}
lw_map_file = x_fopen(mapfile_name, O_RDONLY, 0);
if (!lw_map_file) {
DEBUG(0,("can't open idmap_hash:name_map (%s). Error %s\n",
mapfile_name, strerror(errno) ));
return false;
}
return true;
}
/*********************************************************************
********************************************************************/
static bool mapfile_read_line(fstring key, fstring value)
{
char buffer[1024];
char *p;
int len;
if (!lw_map_file)
return false;
if ((p = x_fgets(buffer, sizeof(buffer)-1, lw_map_file)) == NULL) {
return false;
}
/* Strip newlines and carriage returns */
len = strlen_m(buffer) - 1;
while ((buffer[len] == '\n') || (buffer[len] == '\r')) {
buffer[len--] = '\0';
}
if ((p = strchr_m(buffer, '=')) == NULL ) {
DEBUG(0,("idmap_hash: Bad line in name_map (%s)\n", buffer));
return false;
}
*p = '\0';
p++;
strlcpy(key, buffer, sizeof(fstring));
strlcpy(value, p, sizeof(fstring));
/* Eat whitespace */
if (!trim_char(key, ' ', ' '))
return false;
if (!trim_char(value, ' ', ' '))
return false;
return true;
}
/*********************************************************************
********************************************************************/
static bool mapfile_close(void)
{
int ret = 0;
if (lw_map_file) {
ret = x_fclose(lw_map_file);
lw_map_file = NULL;
}
return (ret == 0);
}
/*********************************************************************
********************************************************************/
NTSTATUS mapfile_lookup_key(TALLOC_CTX *ctx, const char *value, char **key)
{
fstring r_key, r_value;
NTSTATUS ret = NT_STATUS_NOT_FOUND;
if (!mapfile_open())
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
while (mapfile_read_line(r_key, r_value))
{
if (strequal(r_value, value)) {
ret = NT_STATUS_OK;
/* We're done once finishing this block */
*key = talloc_strdup(ctx, r_key);
if (!*key) {
ret = NT_STATUS_NO_MEMORY;
}
break;
}
}
mapfile_close();
return ret;
}
/*********************************************************************
********************************************************************/
NTSTATUS mapfile_lookup_value(TALLOC_CTX *ctx, const char *key, char **value)
{
fstring r_key, r_value;
NTSTATUS ret = NT_STATUS_NOT_FOUND;
if (!mapfile_open())
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
while (mapfile_read_line(r_key, r_value))
{
if (strequal(r_key, key)) {
ret = NT_STATUS_OK;
/* We're done once finishing this block */
*value = talloc_strdup(ctx, r_value);
if (!*key) {
ret = NT_STATUS_NO_MEMORY;
}
break;
}
}
mapfile_close();
return ret;
}