idmap-hash: Adapt mapfile_read_line to README.Coding
[samba.git] / source3 / winbindd / idmap_hash / mapfile.c
1 /*
2  *  mapfile.c
3  *
4  *  Copyright (C) Gerald Carter  <jerry@samba.org>
5  *
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.
10  *
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.
15  *
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/>.
18  *
19  */
20
21 #include "includes.h"
22 #include "system/filesys.h"
23 #include "winbindd/winbindd.h"
24 #include "idmap.h"
25 #include "idmap_hash.h"
26 #include <stdio.h>
27
28 XFILE *lw_map_file = NULL;
29
30 /*********************************************************************
31  ********************************************************************/
32
33 static bool mapfile_open(void)
34 {
35         const char *mapfile_name = NULL;
36
37         /* If we have an open handle, just reset it */
38
39         if (lw_map_file) {
40                 return (x_tseek(lw_map_file, 0, SEEK_SET) == 0);
41         }
42
43         mapfile_name = lp_parm_const_string(-1, "idmap_hash", "name_map", NULL);
44         if (!mapfile_name) {
45                 return false;
46         }
47
48         lw_map_file = x_fopen(mapfile_name, O_RDONLY, 0);
49         if (!lw_map_file) {
50                 DEBUG(0,("can't open idmap_hash:name_map (%s). Error %s\n",
51                          mapfile_name, strerror(errno) ));
52                 return false;
53         }
54
55         return true;
56 }
57
58 /*********************************************************************
59  ********************************************************************/
60
61 static bool mapfile_read_line(fstring key, fstring value)
62 {
63         char buffer[1024];
64         char *p;
65         int len;
66
67         if (!lw_map_file)
68                 return false;
69
70         p = x_fgets(buffer, sizeof(buffer)-1, lw_map_file);
71         if (p == NULL) {
72                 return false;
73         }
74
75         /* Strip newlines and carriage returns */
76
77         len = strlen_m(buffer) - 1;
78         while ((buffer[len] == '\n') || (buffer[len] == '\r')) {
79                 buffer[len--] = '\0';
80         }
81
82
83         if ((p = strchr_m(buffer, '=')) == NULL ) {
84                 DEBUG(0,("idmap_hash: Bad line in name_map (%s)\n", buffer));
85                 return false;
86         }
87
88         *p = '\0';
89         p++;
90
91         strlcpy(key, buffer, sizeof(fstring));
92         strlcpy(value, p, sizeof(fstring));
93
94         /* Eat whitespace */
95
96         if (!trim_char(key, ' ', ' '))
97                 return false;
98
99         if (!trim_char(value, ' ', ' '))
100                 return false;
101
102         return true;
103 }
104
105 /*********************************************************************
106  ********************************************************************/
107
108 static bool mapfile_close(void)
109 {
110         int ret = 0;
111         if (lw_map_file) {
112                 ret = x_fclose(lw_map_file);
113                 lw_map_file = NULL;
114         }
115
116         return (ret == 0);
117 }
118
119
120 /*********************************************************************
121  ********************************************************************/
122
123 NTSTATUS mapfile_lookup_key(TALLOC_CTX *ctx, const char *value, char **key)
124 {
125         fstring r_key, r_value;
126         NTSTATUS ret = NT_STATUS_NOT_FOUND;
127
128         if (!mapfile_open())
129                 return NT_STATUS_OBJECT_PATH_NOT_FOUND;
130
131         while (mapfile_read_line(r_key, r_value))
132         {
133                 if (strequal(r_value, value)) {
134                         ret = NT_STATUS_OK;
135
136                         /* We're done once finishing this block */
137                         *key = talloc_strdup(ctx, r_key);
138                         if (!*key) {
139                                 ret = NT_STATUS_NO_MEMORY;
140                         }
141                         break;
142                 }
143         }
144
145         mapfile_close();
146
147         return ret;
148 }
149
150 /*********************************************************************
151  ********************************************************************/
152
153 NTSTATUS mapfile_lookup_value(TALLOC_CTX *ctx, const char *key, char **value)
154 {
155         fstring r_key, r_value;
156         NTSTATUS ret = NT_STATUS_NOT_FOUND;
157
158         if (!mapfile_open())
159                 return NT_STATUS_OBJECT_PATH_NOT_FOUND;
160
161         while (mapfile_read_line(r_key, r_value))
162         {
163                 if (strequal(r_key, key)) {
164                         ret = NT_STATUS_OK;
165
166                         /* We're done once finishing this block */
167                         *value = talloc_strdup(ctx, r_value);
168                         if (!*key) {
169                                 ret = NT_STATUS_NO_MEMORY;
170                         }
171                         break;
172                 }
173         }
174
175         mapfile_close();
176
177         return ret;
178 }