xref: /titanic_54/usr/src/lib/libidmap/common/utils.c (revision c5c4113dfcabb1eed3d4bdf7609de5170027a794)
1*c5c4113dSnw141292 /*
2*c5c4113dSnw141292  * CDDL HEADER START
3*c5c4113dSnw141292  *
4*c5c4113dSnw141292  * The contents of this file are subject to the terms of the
5*c5c4113dSnw141292  * Common Development and Distribution License (the "License").
6*c5c4113dSnw141292  * You may not use this file except in compliance with the License.
7*c5c4113dSnw141292  *
8*c5c4113dSnw141292  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*c5c4113dSnw141292  * or http://www.opensolaris.org/os/licensing.
10*c5c4113dSnw141292  * See the License for the specific language governing permissions
11*c5c4113dSnw141292  * and limitations under the License.
12*c5c4113dSnw141292  *
13*c5c4113dSnw141292  * When distributing Covered Code, include this CDDL HEADER in each
14*c5c4113dSnw141292  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*c5c4113dSnw141292  * If applicable, add the following below this CDDL HEADER, with the
16*c5c4113dSnw141292  * fields enclosed by brackets "[]" replaced with your own identifying
17*c5c4113dSnw141292  * information: Portions Copyright [yyyy] [name of copyright owner]
18*c5c4113dSnw141292  *
19*c5c4113dSnw141292  * CDDL HEADER END
20*c5c4113dSnw141292  */
21*c5c4113dSnw141292 /*
22*c5c4113dSnw141292  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*c5c4113dSnw141292  * Use is subject to license terms.
24*c5c4113dSnw141292  */
25*c5c4113dSnw141292 
26*c5c4113dSnw141292 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*c5c4113dSnw141292 
28*c5c4113dSnw141292 /*
29*c5c4113dSnw141292  * Utility routines
30*c5c4113dSnw141292  */
31*c5c4113dSnw141292 
32*c5c4113dSnw141292 #include <stdio.h>
33*c5c4113dSnw141292 #include <stdlib.h>
34*c5c4113dSnw141292 #include <errno.h>
35*c5c4113dSnw141292 #include <libintl.h>
36*c5c4113dSnw141292 #include "idmap_impl.h"
37*c5c4113dSnw141292 
38*c5c4113dSnw141292 #define	_UDT_SIZE_INCR	1
39*c5c4113dSnw141292 
40*c5c4113dSnw141292 #define	_GET_IDS_SIZE_INCR	1
41*c5c4113dSnw141292 
42*c5c4113dSnw141292 static struct timeval TIMEOUT = { 25, 0 };
43*c5c4113dSnw141292 
44*c5c4113dSnw141292 extern int __idmap_verbose;
45*c5c4113dSnw141292 
46*c5c4113dSnw141292 idmap_retcode
47*c5c4113dSnw141292 _udt_extend_batch(idmap_udt_handle_t *udthandle, int opnum) {
48*c5c4113dSnw141292 	idmap_update_op	*tmplist;
49*c5c4113dSnw141292 	size_t		nsize;
50*c5c4113dSnw141292 
51*c5c4113dSnw141292 	if (udthandle->next >= udthandle->batch.idmap_update_batch_len) {
52*c5c4113dSnw141292 		nsize = (udthandle->batch.idmap_update_batch_len +
53*c5c4113dSnw141292 				_UDT_SIZE_INCR) * sizeof (*tmplist);
54*c5c4113dSnw141292 		tmplist = realloc(
55*c5c4113dSnw141292 			udthandle->batch.idmap_update_batch_val, nsize);
56*c5c4113dSnw141292 		if (tmplist == NULL)
57*c5c4113dSnw141292 			return (IDMAP_ERR_MEMORY);
58*c5c4113dSnw141292 		(void) memset((uchar_t *)tmplist +
59*c5c4113dSnw141292 			(udthandle->batch.idmap_update_batch_len *
60*c5c4113dSnw141292 			sizeof (*tmplist)), 0,
61*c5c4113dSnw141292 			_UDT_SIZE_INCR * sizeof (*tmplist));
62*c5c4113dSnw141292 		udthandle->batch.idmap_update_batch_val = tmplist;
63*c5c4113dSnw141292 		udthandle->batch.idmap_update_batch_len += _UDT_SIZE_INCR;
64*c5c4113dSnw141292 	}
65*c5c4113dSnw141292 	udthandle->batch.idmap_update_batch_val[udthandle->next].opnum =
66*c5c4113dSnw141292 		opnum;
67*c5c4113dSnw141292 	return (IDMAP_SUCCESS);
68*c5c4113dSnw141292 }
69*c5c4113dSnw141292 
70*c5c4113dSnw141292 idmap_retcode
71*c5c4113dSnw141292 _get_ids_extend_batch(idmap_get_handle_t *gh) {
72*c5c4113dSnw141292 	idmap_mapping	*t1;
73*c5c4113dSnw141292 	idmap_get_res_t	*t2;
74*c5c4113dSnw141292 	size_t		nsize, len;
75*c5c4113dSnw141292 
76*c5c4113dSnw141292 	len = gh->batch.idmap_mapping_batch_len;
77*c5c4113dSnw141292 	if (gh->next >= len) {
78*c5c4113dSnw141292 		/* extend the request array */
79*c5c4113dSnw141292 		nsize = (len + _GET_IDS_SIZE_INCR) * sizeof (*t1);
80*c5c4113dSnw141292 		t1 = realloc(gh->batch.idmap_mapping_batch_val, nsize);
81*c5c4113dSnw141292 		if (t1 == NULL)
82*c5c4113dSnw141292 			return (IDMAP_ERR_MEMORY);
83*c5c4113dSnw141292 		(void) memset((uchar_t *)t1 + (len * sizeof (*t1)), 0,
84*c5c4113dSnw141292 			_GET_IDS_SIZE_INCR * sizeof (*t1));
85*c5c4113dSnw141292 		gh->batch.idmap_mapping_batch_val = t1;
86*c5c4113dSnw141292 
87*c5c4113dSnw141292 		/* extend the return list */
88*c5c4113dSnw141292 		nsize = (len + _GET_IDS_SIZE_INCR) * sizeof (*t2);
89*c5c4113dSnw141292 		t2 = realloc(gh->retlist, nsize);
90*c5c4113dSnw141292 		if (t2 == NULL)
91*c5c4113dSnw141292 			return (IDMAP_ERR_MEMORY);
92*c5c4113dSnw141292 		(void) memset((uchar_t *)t2 + (len * sizeof (*t2)), 0,
93*c5c4113dSnw141292 			_GET_IDS_SIZE_INCR * sizeof (*t2));
94*c5c4113dSnw141292 		gh->retlist = t2;
95*c5c4113dSnw141292 
96*c5c4113dSnw141292 		gh->batch.idmap_mapping_batch_len += _GET_IDS_SIZE_INCR;
97*c5c4113dSnw141292 	}
98*c5c4113dSnw141292 	return (IDMAP_SUCCESS);
99*c5c4113dSnw141292 }
100*c5c4113dSnw141292 
101*c5c4113dSnw141292 idmap_stat
102*c5c4113dSnw141292 _iter_get_next_list(int type, idmap_iter_t *iter,
103*c5c4113dSnw141292 		void *arg, uchar_t **list, size_t valsize,
104*c5c4113dSnw141292 		xdrproc_t xdr_arg_proc, xdrproc_t xdr_res_proc) {
105*c5c4113dSnw141292 
106*c5c4113dSnw141292 	CLIENT		*clnt;
107*c5c4113dSnw141292 	enum clnt_stat	clntstat;
108*c5c4113dSnw141292 	const char	*me = "_iter_get_next_list";
109*c5c4113dSnw141292 
110*c5c4113dSnw141292 	if (__idmap_verbose)
111*c5c4113dSnw141292 		(void) fprintf(stdout, "%s\n", me);
112*c5c4113dSnw141292 
113*c5c4113dSnw141292 	iter->next = 0;
114*c5c4113dSnw141292 	iter->retlist = NULL;
115*c5c4113dSnw141292 	_IDMAP_GET_CLIENT_HANDLE(iter->ih, clnt);
116*c5c4113dSnw141292 
117*c5c4113dSnw141292 	/* init the result */
118*c5c4113dSnw141292 	if (*list) {
119*c5c4113dSnw141292 		xdr_free(xdr_res_proc, (caddr_t)*list);
120*c5c4113dSnw141292 	} else {
121*c5c4113dSnw141292 		if ((*list = malloc(valsize)) == NULL) {
122*c5c4113dSnw141292 			(void) fprintf(stderr, gettext("Out of memory\n"));
123*c5c4113dSnw141292 			errno = ENOMEM;
124*c5c4113dSnw141292 			return (IDMAP_ERR_MEMORY);
125*c5c4113dSnw141292 		}
126*c5c4113dSnw141292 	}
127*c5c4113dSnw141292 	(void) memset(*list, 0, valsize);
128*c5c4113dSnw141292 
129*c5c4113dSnw141292 	clntstat = clnt_call(clnt, type,
130*c5c4113dSnw141292 		xdr_arg_proc, (caddr_t)arg,
131*c5c4113dSnw141292 		xdr_res_proc, (caddr_t)*list,
132*c5c4113dSnw141292 		TIMEOUT);
133*c5c4113dSnw141292 	if (clntstat != RPC_SUCCESS) {
134*c5c4113dSnw141292 		free(*list);
135*c5c4113dSnw141292 		if (__idmap_verbose)
136*c5c4113dSnw141292 			clnt_perror(clnt, me);
137*c5c4113dSnw141292 		return (IDMAP_ERR_RPC);
138*c5c4113dSnw141292 	}
139*c5c4113dSnw141292 	iter->retlist = *list;
140*c5c4113dSnw141292 	return (IDMAP_SUCCESS);
141*c5c4113dSnw141292 }
142