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