1b819cea2SGordon Ross /*
2b819cea2SGordon Ross * CDDL HEADER START
3b819cea2SGordon Ross *
4b819cea2SGordon Ross * The contents of this file are subject to the terms of the
5b819cea2SGordon Ross * Common Development and Distribution License (the "License").
6b819cea2SGordon Ross * You may not use this file except in compliance with the License.
7b819cea2SGordon Ross *
8b819cea2SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9b819cea2SGordon Ross * or http://www.opensolaris.org/os/licensing.
10b819cea2SGordon Ross * See the License for the specific language governing permissions
11b819cea2SGordon Ross * and limitations under the License.
12b819cea2SGordon Ross *
13b819cea2SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each
14b819cea2SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15b819cea2SGordon Ross * If applicable, add the following below this CDDL HEADER, with the
16b819cea2SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
17b819cea2SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
18b819cea2SGordon Ross *
19b819cea2SGordon Ross * CDDL HEADER END
20b819cea2SGordon Ross */
21b819cea2SGordon Ross /*
22b819cea2SGordon Ross * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23a73d9d5eSGordon Ross * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
24*f920d1d1SGordon Ross * Copyright 2023 RackTop Systems, Inc.
25b819cea2SGordon Ross */
26b819cea2SGordon Ross
27b819cea2SGordon Ross /*
28b819cea2SGordon Ross * SMB server interface to idmap
29b819cea2SGordon Ross * (smb_idmap_get..., smb_idmap_batch_...)
30b819cea2SGordon Ross *
31a73d9d5eSGordon Ross * There are three implementations of this interface.
32a73d9d5eSGordon Ross * This is the "fake kernel" version of these routines. See also:
33a73d9d5eSGordon Ross * $SRC/lib/smbsrv/libsmb/common/smb_idmap.c
34a73d9d5eSGordon Ross * $SRC/uts/common/fs/smbsrv/smb_idmap.c
35b819cea2SGordon Ross *
36b819cea2SGordon Ross * There are enough differences (relative to the code size)
37b819cea2SGordon Ross * that it's more trouble than it's worth to merge them.
38b819cea2SGordon Ross *
39b819cea2SGordon Ross * This one differs from the others in that it:
40b819cea2SGordon Ross * calls idmap interfaces (libidmap)
41b819cea2SGordon Ross * uses kmem_... interfaces (libfakekernel)
42b819cea2SGordon Ross * uses cmn_err instead of syslog, etc.
43a73d9d5eSGordon Ross * The code in this variant looks a lot like the one in libsmb.
44b819cea2SGordon Ross */
45b819cea2SGordon Ross
46b819cea2SGordon Ross #include <sys/param.h>
47b819cea2SGordon Ross #include <sys/types.h>
48b819cea2SGordon Ross
49b819cea2SGordon Ross #include <smbsrv/smb_kproto.h>
50b819cea2SGordon Ross #include <smbsrv/smb_idmap.h>
51b819cea2SGordon Ross
52b819cea2SGordon Ross static int smb_idmap_batch_binsid(smb_idmap_batch_t *sib);
53b819cea2SGordon Ross
54b819cea2SGordon Ross /*
55b819cea2SGordon Ross * Report an idmap error.
56b819cea2SGordon Ross */
57b819cea2SGordon Ross void
smb_idmap_check(const char * s,idmap_stat stat)58b819cea2SGordon Ross smb_idmap_check(const char *s, idmap_stat stat)
59b819cea2SGordon Ross {
60b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
61b819cea2SGordon Ross if (s == NULL)
62b819cea2SGordon Ross s = "smb_idmap_check";
63b819cea2SGordon Ross
64b819cea2SGordon Ross cmn_err(CE_NOTE, "%s: %d", s, (int)stat);
65b819cea2SGordon Ross }
66b819cea2SGordon Ross }
67b819cea2SGordon Ross
68b819cea2SGordon Ross /*
69b819cea2SGordon Ross * smb_idmap_getsid
70b819cea2SGordon Ross *
71b819cea2SGordon Ross * Tries to get a mapping for the given uid/gid
72b819cea2SGordon Ross * Allocates ->sim_domsid
73b819cea2SGordon Ross */
74b819cea2SGordon Ross idmap_stat
smb_idmap_getsid(uid_t id,int idtype,smb_sid_t ** sid)75b819cea2SGordon Ross smb_idmap_getsid(uid_t id, int idtype, smb_sid_t **sid)
76b819cea2SGordon Ross {
77b819cea2SGordon Ross smb_idmap_batch_t sib;
78b819cea2SGordon Ross idmap_stat stat;
79b819cea2SGordon Ross
80b819cea2SGordon Ross stat = smb_idmap_batch_create(&sib, 1, SMB_IDMAP_ID2SID);
81b819cea2SGordon Ross if (stat != IDMAP_SUCCESS)
82b819cea2SGordon Ross return (stat);
83b819cea2SGordon Ross
84b819cea2SGordon Ross stat = smb_idmap_batch_getsid(sib.sib_idmaph, &sib.sib_maps[0],
85b819cea2SGordon Ross id, idtype);
86b819cea2SGordon Ross
87b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
88b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
89b819cea2SGordon Ross return (stat);
90b819cea2SGordon Ross }
91b819cea2SGordon Ross
92*f920d1d1SGordon Ross /* Leave error reporting to the caller. */
93*f920d1d1SGordon Ross stat = smb_idmap_batch_getmappings(&sib, NULL);
94b819cea2SGordon Ross
95b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
96b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
97b819cea2SGordon Ross return (stat);
98b819cea2SGordon Ross }
99b819cea2SGordon Ross
100b819cea2SGordon Ross *sid = smb_sid_dup(sib.sib_maps[0].sim_sid);
101b819cea2SGordon Ross
102b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
103b819cea2SGordon Ross
104b819cea2SGordon Ross return (IDMAP_SUCCESS);
105b819cea2SGordon Ross }
106b819cea2SGordon Ross
107b819cea2SGordon Ross /*
108b819cea2SGordon Ross * smb_idmap_getid
109b819cea2SGordon Ross *
110b819cea2SGordon Ross * Tries to get a mapping for the given SID
111b819cea2SGordon Ross */
112b819cea2SGordon Ross idmap_stat
smb_idmap_getid(smb_sid_t * sid,uid_t * id,int * id_type)113b819cea2SGordon Ross smb_idmap_getid(smb_sid_t *sid, uid_t *id, int *id_type)
114b819cea2SGordon Ross {
115b819cea2SGordon Ross smb_idmap_batch_t sib;
116b819cea2SGordon Ross smb_idmap_t *sim;
117b819cea2SGordon Ross idmap_stat stat;
118b819cea2SGordon Ross
119b819cea2SGordon Ross stat = smb_idmap_batch_create(&sib, 1, SMB_IDMAP_SID2ID);
120b819cea2SGordon Ross if (stat != IDMAP_SUCCESS)
121b819cea2SGordon Ross return (stat);
122b819cea2SGordon Ross
123b819cea2SGordon Ross sim = &sib.sib_maps[0];
124b819cea2SGordon Ross sim->sim_id = id;
125b819cea2SGordon Ross stat = smb_idmap_batch_getid(sib.sib_idmaph, sim, sid, *id_type);
126b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
127b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
128b819cea2SGordon Ross return (stat);
129b819cea2SGordon Ross }
130b819cea2SGordon Ross
131*f920d1d1SGordon Ross /* Leave error reporting to the caller. */
132*f920d1d1SGordon Ross stat = smb_idmap_batch_getmappings(&sib, NULL);
133b819cea2SGordon Ross
134b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
135b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
136b819cea2SGordon Ross return (stat);
137b819cea2SGordon Ross }
138b819cea2SGordon Ross
139b819cea2SGordon Ross *id_type = sim->sim_idtype;
140b819cea2SGordon Ross smb_idmap_batch_destroy(&sib);
141b819cea2SGordon Ross
142b819cea2SGordon Ross return (IDMAP_SUCCESS);
143b819cea2SGordon Ross }
144b819cea2SGordon Ross
145b819cea2SGordon Ross /*
146b819cea2SGordon Ross * smb_idmap_batch_create
147b819cea2SGordon Ross *
148b819cea2SGordon Ross * Creates and initializes the context for batch ID mapping.
149b819cea2SGordon Ross */
150b819cea2SGordon Ross idmap_stat
smb_idmap_batch_create(smb_idmap_batch_t * sib,uint16_t nmap,int flags)151b819cea2SGordon Ross smb_idmap_batch_create(smb_idmap_batch_t *sib, uint16_t nmap, int flags)
152b819cea2SGordon Ross {
153b819cea2SGordon Ross idmap_stat stat;
154b819cea2SGordon Ross
155a73d9d5eSGordon Ross ASSERT(sib != NULL);
156b819cea2SGordon Ross
157b819cea2SGordon Ross bzero(sib, sizeof (smb_idmap_batch_t));
158b819cea2SGordon Ross stat = idmap_get_create(&sib->sib_idmaph);
159b819cea2SGordon Ross
160b819cea2SGordon Ross if (stat != IDMAP_SUCCESS) {
161b819cea2SGordon Ross smb_idmap_check("idmap_get_create", stat);
162b819cea2SGordon Ross return (stat);
163b819cea2SGordon Ross }
164b819cea2SGordon Ross
165b819cea2SGordon Ross sib->sib_flags = flags;
166b819cea2SGordon Ross sib->sib_nmap = nmap;
167b819cea2SGordon Ross sib->sib_size = nmap * sizeof (smb_idmap_t);
168b819cea2SGordon Ross sib->sib_maps = kmem_zalloc(sib->sib_size, KM_SLEEP);
169b819cea2SGordon Ross
170b819cea2SGordon Ross return (IDMAP_SUCCESS);
171b819cea2SGordon Ross }
172b819cea2SGordon Ross
173b819cea2SGordon Ross /*
174b819cea2SGordon Ross * smb_idmap_batch_destroy
175b819cea2SGordon Ross *
176b819cea2SGordon Ross * Frees the batch ID mapping context.
177b819cea2SGordon Ross */
178b819cea2SGordon Ross void
smb_idmap_batch_destroy(smb_idmap_batch_t * sib)179b819cea2SGordon Ross smb_idmap_batch_destroy(smb_idmap_batch_t *sib)
180b819cea2SGordon Ross {
181a73d9d5eSGordon Ross char *domsid;
182b819cea2SGordon Ross int i;
183b819cea2SGordon Ross
184a73d9d5eSGordon Ross ASSERT(sib != NULL);
185a73d9d5eSGordon Ross ASSERT(sib->sib_maps != NULL);
186b819cea2SGordon Ross
187b819cea2SGordon Ross if (sib->sib_idmaph) {
188b819cea2SGordon Ross idmap_get_destroy(sib->sib_idmaph);
189b819cea2SGordon Ross sib->sib_idmaph = NULL;
190b819cea2SGordon Ross }
191b819cea2SGordon Ross
192b819cea2SGordon Ross if (sib->sib_flags & SMB_IDMAP_ID2SID) {
193b819cea2SGordon Ross /*
194b819cea2SGordon Ross * SIDs are allocated only when mapping
195b819cea2SGordon Ross * UID/GID to SIDs
196b819cea2SGordon Ross */
197b819cea2SGordon Ross for (i = 0; i < sib->sib_nmap; i++) {
198b819cea2SGordon Ross smb_sid_free(sib->sib_maps[i].sim_sid);
199b819cea2SGordon Ross /* from strdup() in libidmap */
200b819cea2SGordon Ross free(sib->sib_maps[i].sim_domsid);
201b819cea2SGordon Ross }
202a73d9d5eSGordon Ross } else if (sib->sib_flags & SMB_IDMAP_SID2ID) {
203a73d9d5eSGordon Ross /*
204a73d9d5eSGordon Ross * SID prefixes are allocated only when mapping
205a73d9d5eSGordon Ross * SIDs to UID/GID
206a73d9d5eSGordon Ross */
207a73d9d5eSGordon Ross for (i = 0; i < sib->sib_nmap; i++) {
208a73d9d5eSGordon Ross domsid = sib->sib_maps[i].sim_domsid;
209a73d9d5eSGordon Ross if (domsid)
210a73d9d5eSGordon Ross smb_mem_free(domsid);
211a73d9d5eSGordon Ross }
212b819cea2SGordon Ross }
213b819cea2SGordon Ross
214b819cea2SGordon Ross if (sib->sib_size && sib->sib_maps) {
215b819cea2SGordon Ross kmem_free(sib->sib_maps, sib->sib_size);
216b819cea2SGordon Ross sib->sib_maps = NULL;
217b819cea2SGordon Ross }
218b819cea2SGordon Ross }
219b819cea2SGordon Ross
220b819cea2SGordon Ross /*
221b819cea2SGordon Ross * smb_idmap_batch_getid
222b819cea2SGordon Ross *
223b819cea2SGordon Ross * Queue a request to map the given SID to a UID or GID.
224b819cea2SGordon Ross *
225b819cea2SGordon Ross * sim->sim_id should point to variable that's supposed to
226b819cea2SGordon Ross * hold the returned UID/GID. This needs to be setup by caller
227b819cea2SGordon Ross * of this function.
228b819cea2SGordon Ross * If requested ID type is known, it's passed as 'idtype',
229b819cea2SGordon Ross * if it's unknown it'll be returned in sim->sim_idtype.
230b819cea2SGordon Ross */
231b819cea2SGordon Ross idmap_stat
smb_idmap_batch_getid(idmap_get_handle_t * idmaph,smb_idmap_t * sim,smb_sid_t * sid,int idtype)232b819cea2SGordon Ross smb_idmap_batch_getid(idmap_get_handle_t *idmaph, smb_idmap_t *sim,
233b819cea2SGordon Ross smb_sid_t *sid, int idtype)
234b819cea2SGordon Ross {
235b819cea2SGordon Ross char sidstr[SMB_SID_STRSZ];
236b819cea2SGordon Ross idmap_stat stat;
237b819cea2SGordon Ross int flag = 0;
238b819cea2SGordon Ross
239a73d9d5eSGordon Ross ASSERT(idmaph != NULL);
240a73d9d5eSGordon Ross ASSERT(sim != NULL);
241a73d9d5eSGordon Ross ASSERT(sid != NULL);
242b819cea2SGordon Ross
243b819cea2SGordon Ross smb_sid_tostr(sid, sidstr);
244b819cea2SGordon Ross if (smb_sid_splitstr(sidstr, &sim->sim_rid) != 0)
245b819cea2SGordon Ross return (IDMAP_ERR_SID);
246a73d9d5eSGordon Ross /* Note: Free sim_domsid in smb_idmap_batch_destroy */
247a73d9d5eSGordon Ross sim->sim_domsid = smb_mem_strdup(sidstr);
248b819cea2SGordon Ross sim->sim_idtype = idtype;
249b819cea2SGordon Ross
250b819cea2SGordon Ross switch (idtype) {
251b819cea2SGordon Ross case SMB_IDMAP_USER:
252b819cea2SGordon Ross stat = idmap_get_uidbysid(idmaph, sim->sim_domsid,
253b819cea2SGordon Ross sim->sim_rid, flag, sim->sim_id, &sim->sim_stat);
254b819cea2SGordon Ross smb_idmap_check("idmap_get_uidbysid", stat);
255b819cea2SGordon Ross break;
256b819cea2SGordon Ross
257b819cea2SGordon Ross case SMB_IDMAP_GROUP:
258b819cea2SGordon Ross stat = idmap_get_gidbysid(idmaph, sim->sim_domsid,
259b819cea2SGordon Ross sim->sim_rid, flag, sim->sim_id, &sim->sim_stat);
260b819cea2SGordon Ross smb_idmap_check("idmap_get_gidbysid", stat);
261b819cea2SGordon Ross break;
262b819cea2SGordon Ross
263b819cea2SGordon Ross case SMB_IDMAP_UNKNOWN:
264b819cea2SGordon Ross stat = idmap_get_pidbysid(idmaph, sim->sim_domsid,
265b819cea2SGordon Ross sim->sim_rid, flag, sim->sim_id, &sim->sim_idtype,
266b819cea2SGordon Ross &sim->sim_stat);
267b819cea2SGordon Ross smb_idmap_check("idmap_get_pidbysid", stat);
268b819cea2SGordon Ross break;
269b819cea2SGordon Ross
270b819cea2SGordon Ross default:
271b819cea2SGordon Ross stat = IDMAP_ERR_ARG;
272b819cea2SGordon Ross break;
273b819cea2SGordon Ross }
274b819cea2SGordon Ross
275b819cea2SGordon Ross return (stat);
276b819cea2SGordon Ross }
277b819cea2SGordon Ross
278b819cea2SGordon Ross /*
279b819cea2SGordon Ross * smb_idmap_batch_getsid
280b819cea2SGordon Ross *
281b819cea2SGordon Ross * Queue a request to map the given UID/GID to a SID.
282b819cea2SGordon Ross *
283b819cea2SGordon Ross * sim->sim_domsid and sim->sim_rid will contain the mapping
284b819cea2SGordon Ross * result upon successful process of the batched request.
285a73d9d5eSGordon Ross * Stash the type for error reporting (caller saves the ID).
286a73d9d5eSGordon Ross *
287b819cea2SGordon Ross * NB: sim_domsid allocated by strdup, here or in libidmap
288b819cea2SGordon Ross */
289b819cea2SGordon Ross idmap_stat
smb_idmap_batch_getsid(idmap_get_handle_t * idmaph,smb_idmap_t * sim,uid_t id,int idtype)290b819cea2SGordon Ross smb_idmap_batch_getsid(idmap_get_handle_t *idmaph, smb_idmap_t *sim,
291b819cea2SGordon Ross uid_t id, int idtype)
292b819cea2SGordon Ross {
293b819cea2SGordon Ross idmap_stat stat;
294b819cea2SGordon Ross int flag = 0;
295b819cea2SGordon Ross
296b819cea2SGordon Ross if (!idmaph || !sim)
297b819cea2SGordon Ross return (IDMAP_ERR_ARG);
298b819cea2SGordon Ross
299a73d9d5eSGordon Ross sim->sim_idtype = idtype;
300b819cea2SGordon Ross switch (idtype) {
301b819cea2SGordon Ross case SMB_IDMAP_USER:
302b819cea2SGordon Ross stat = idmap_get_sidbyuid(idmaph, id, flag,
303b819cea2SGordon Ross &sim->sim_domsid, &sim->sim_rid, &sim->sim_stat);
304b819cea2SGordon Ross smb_idmap_check("idmap_get_sidbyuid", stat);
305b819cea2SGordon Ross break;
306b819cea2SGordon Ross
307b819cea2SGordon Ross case SMB_IDMAP_GROUP:
308b819cea2SGordon Ross stat = idmap_get_sidbygid(idmaph, id, flag,
309b819cea2SGordon Ross &sim->sim_domsid, &sim->sim_rid, &sim->sim_stat);
310b819cea2SGordon Ross smb_idmap_check("idmap_get_sidbygid", stat);
311b819cea2SGordon Ross break;
312b819cea2SGordon Ross
313b819cea2SGordon Ross case SMB_IDMAP_OWNERAT:
314b819cea2SGordon Ross /* Current Owner S-1-5-32-766 */
315b819cea2SGordon Ross sim->sim_domsid = strdup(NT_BUILTIN_DOMAIN_SIDSTR);
316b819cea2SGordon Ross sim->sim_rid = SECURITY_CURRENT_OWNER_RID;
317b819cea2SGordon Ross sim->sim_stat = IDMAP_SUCCESS;
318b819cea2SGordon Ross stat = IDMAP_SUCCESS;
319b819cea2SGordon Ross break;
320b819cea2SGordon Ross
321b819cea2SGordon Ross case SMB_IDMAP_GROUPAT:
322b819cea2SGordon Ross /* Current Group S-1-5-32-767 */
323b819cea2SGordon Ross sim->sim_domsid = strdup(NT_BUILTIN_DOMAIN_SIDSTR);
324b819cea2SGordon Ross sim->sim_rid = SECURITY_CURRENT_GROUP_RID;
325b819cea2SGordon Ross sim->sim_stat = IDMAP_SUCCESS;
326b819cea2SGordon Ross stat = IDMAP_SUCCESS;
327b819cea2SGordon Ross break;
328b819cea2SGordon Ross
329b819cea2SGordon Ross case SMB_IDMAP_EVERYONE:
330b819cea2SGordon Ross /* Everyone S-1-1-0 */
331b819cea2SGordon Ross sim->sim_domsid = strdup(NT_WORLD_AUTH_SIDSTR);
332b819cea2SGordon Ross sim->sim_rid = 0;
333b819cea2SGordon Ross sim->sim_stat = IDMAP_SUCCESS;
334b819cea2SGordon Ross stat = IDMAP_SUCCESS;
335b819cea2SGordon Ross break;
336b819cea2SGordon Ross
337b819cea2SGordon Ross default:
338a73d9d5eSGordon Ross ASSERT(0);
339b819cea2SGordon Ross return (IDMAP_ERR_ARG);
340b819cea2SGordon Ross }
341b819cea2SGordon Ross
342b819cea2SGordon Ross return (stat);
343b819cea2SGordon Ross }
344b819cea2SGordon Ross
345b819cea2SGordon Ross /*
346b819cea2SGordon Ross * smb_idmap_batch_getmappings
347b819cea2SGordon Ross *
348b819cea2SGordon Ross * trigger ID mapping service to get the mappings for queued
349b819cea2SGordon Ross * requests.
350b819cea2SGordon Ross *
351b819cea2SGordon Ross * Checks the result of all the queued requests.
352b819cea2SGordon Ross */
353b819cea2SGordon Ross idmap_stat
smb_idmap_batch_getmappings(smb_idmap_batch_t * sib,smb_idmap_batch_errcb_t errcb)354*f920d1d1SGordon Ross smb_idmap_batch_getmappings(smb_idmap_batch_t *sib,
355*f920d1d1SGordon Ross smb_idmap_batch_errcb_t errcb)
356b819cea2SGordon Ross {
357b819cea2SGordon Ross idmap_stat stat = IDMAP_SUCCESS;
358b819cea2SGordon Ross smb_idmap_t *sim;
359b819cea2SGordon Ross int i;
360b819cea2SGordon Ross
361b819cea2SGordon Ross if ((stat = idmap_get_mappings(sib->sib_idmaph)) != IDMAP_SUCCESS) {
362b819cea2SGordon Ross smb_idmap_check("idmap_get_mappings", stat);
363b819cea2SGordon Ross return (stat);
364b819cea2SGordon Ross }
365b819cea2SGordon Ross
366b819cea2SGordon Ross /*
367b819cea2SGordon Ross * Check the status for all the queued requests
368b819cea2SGordon Ross */
369b819cea2SGordon Ross for (i = 0, sim = sib->sib_maps; i < sib->sib_nmap; i++, sim++) {
370b819cea2SGordon Ross if (sim->sim_stat != IDMAP_SUCCESS) {
371*f920d1d1SGordon Ross sib->sib_nerr++;
372*f920d1d1SGordon Ross if (errcb != NULL)
373*f920d1d1SGordon Ross errcb(sib, sim);
374a73d9d5eSGordon Ross if ((sib->sib_flags & SMB_IDMAP_SKIP_ERRS) == 0) {
375a73d9d5eSGordon Ross return (sim->sim_stat);
376b819cea2SGordon Ross }
377b819cea2SGordon Ross }
378b819cea2SGordon Ross }
379b819cea2SGordon Ross
380b819cea2SGordon Ross if (smb_idmap_batch_binsid(sib) != 0)
381b819cea2SGordon Ross stat = IDMAP_ERR_OTHER;
382b819cea2SGordon Ross
383b819cea2SGordon Ross return (stat);
384b819cea2SGordon Ross }
385b819cea2SGordon Ross
386b819cea2SGordon Ross /*
387b819cea2SGordon Ross * smb_idmap_batch_binsid
388b819cea2SGordon Ross *
389b819cea2SGordon Ross * Convert sidrids to binary sids
390b819cea2SGordon Ross *
391b819cea2SGordon Ross * Returns 0 if successful and non-zero upon failure.
392b819cea2SGordon Ross */
393b819cea2SGordon Ross static int
smb_idmap_batch_binsid(smb_idmap_batch_t * sib)394b819cea2SGordon Ross smb_idmap_batch_binsid(smb_idmap_batch_t *sib)
395b819cea2SGordon Ross {
396b819cea2SGordon Ross smb_sid_t *sid;
397b819cea2SGordon Ross smb_idmap_t *sim;
398b819cea2SGordon Ross int i;
399b819cea2SGordon Ross
400b819cea2SGordon Ross if (sib->sib_flags & SMB_IDMAP_SID2ID)
401b819cea2SGordon Ross /* This operation is not required */
402b819cea2SGordon Ross return (0);
403b819cea2SGordon Ross
404b819cea2SGordon Ross sim = sib->sib_maps;
405b819cea2SGordon Ross for (i = 0; i < sib->sib_nmap; sim++, i++) {
406a73d9d5eSGordon Ross ASSERT(sim->sim_domsid != NULL);
407b819cea2SGordon Ross if (sim->sim_domsid == NULL)
408b819cea2SGordon Ross return (-1);
409b819cea2SGordon Ross
410b819cea2SGordon Ross sid = smb_sid_fromstr(sim->sim_domsid);
411b819cea2SGordon Ross if (sid == NULL)
412b819cea2SGordon Ross return (-1);
413b819cea2SGordon Ross
414b819cea2SGordon Ross sim->sim_sid = smb_sid_splice(sid, sim->sim_rid);
415b819cea2SGordon Ross smb_sid_free(sid);
416b819cea2SGordon Ross }
417b819cea2SGordon Ross
418b819cea2SGordon Ross return (0);
419b819cea2SGordon Ross }
420