4 * Copyright (C) Gerald Carter <jerry@samba.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 #include "system/filesys.h"
23 #include "winbindd/winbindd.h"
25 #include "idmap_hash.h"
27 #include "lib/util/xfile.h"
29 XFILE *lw_map_file = NULL;
31 /*********************************************************************
32 ********************************************************************/
34 static bool mapfile_open(void)
36 const char *mapfile_name = NULL;
38 /* If we have an open handle, just reset it */
41 return (x_tseek(lw_map_file, 0, SEEK_SET) == 0);
44 mapfile_name = lp_parm_const_string(-1, "idmap_hash", "name_map", NULL);
49 lw_map_file = x_fopen(mapfile_name, O_RDONLY, 0);
51 DEBUG(0,("can't open idmap_hash:name_map (%s). Error %s\n",
52 mapfile_name, strerror(errno) ));
59 /*********************************************************************
60 ********************************************************************/
62 static bool mapfile_read_line(fstring key, fstring value)
71 p = x_fgets(buffer, sizeof(buffer)-1, lw_map_file);
76 /* Strip newlines and carriage returns */
78 len = strlen_m(buffer);
84 while ((buffer[len] == '\n') || (buffer[len] == '\r')) {
89 if ((p = strchr_m(buffer, '=')) == NULL ) {
90 DEBUG(0,("idmap_hash: Bad line in name_map (%s)\n", buffer));
97 strlcpy(key, buffer, sizeof(fstring));
98 strlcpy(value, p, sizeof(fstring));
102 if (!trim_char(key, ' ', ' '))
105 if (!trim_char(value, ' ', ' '))
111 /*********************************************************************
112 ********************************************************************/
114 static bool mapfile_close(void)
118 ret = x_fclose(lw_map_file);
126 /*********************************************************************
127 ********************************************************************/
129 NTSTATUS mapfile_lookup_key(TALLOC_CTX *ctx, const char *value, char **key)
131 fstring r_key, r_value;
132 NTSTATUS ret = NT_STATUS_NOT_FOUND;
135 return NT_STATUS_OBJECT_PATH_NOT_FOUND;
137 while (mapfile_read_line(r_key, r_value))
139 if (strequal(r_value, value)) {
142 /* We're done once finishing this block */
143 *key = talloc_strdup(ctx, r_key);
145 ret = NT_STATUS_NO_MEMORY;
156 /*********************************************************************
157 ********************************************************************/
159 NTSTATUS mapfile_lookup_value(TALLOC_CTX *ctx, const char *key, char **value)
161 fstring r_key, r_value;
162 NTSTATUS ret = NT_STATUS_NOT_FOUND;
165 return NT_STATUS_OBJECT_PATH_NOT_FOUND;
167 while (mapfile_read_line(r_key, r_value))
169 if (strequal(r_key, key)) {
172 /* We're done once finishing this block */
173 *value = talloc_strdup(ctx, r_value);
175 ret = NT_STATUS_NO_MEMORY;