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