1 /* 2 * Copyright (c) 2009, Sun Microsystems, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * - Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * - Redistributions in binary form must reproduce the above copyright notice, 10 * this list of conditions and the following disclaimer in the documentation 11 * and/or other materials provided with the distribution. 12 * - Neither the name of Sun Microsystems, Inc. nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 /* 29 * xdr_sizeof.c 30 * 31 * Copyright 1990 Sun Microsystems, Inc. 32 * 33 * General purpose routine to see how much space something will use 34 * when serialized using XDR. 35 */ 36 37 //#include <sys/cdefs.h> 38 39 #include <wintirpc.h> 40 #include "namespace.h" 41 #include <rpc/types.h> 42 #include <rpc/xdr.h> 43 #include <sys/types.h> 44 #include <stdlib.h> 45 #include "un-namespace.h" 46 47 /* ARGSUSED */ 48 static bool_t 49 x_putlong(XDR *xdrs, const long *longp) 50 { 51 xdrs->x_handy += BYTES_PER_XDR_UNIT; 52 return (TRUE); 53 } 54 55 /* ARGSUSED */ 56 static bool_t 57 x_putbytes(XDR *xdrs, const char *bp, u_int len) 58 { 59 xdrs->x_handy += len; 60 return (TRUE); 61 } 62 63 static u_int 64 x_getpostn(XDR *xdrs) 65 { 66 return (xdrs->x_handy); 67 } 68 69 /* ARGSUSED */ 70 static bool_t 71 x_setpostn(XDR *xdrs, u_int pos) 72 { 73 /* This is not allowed */ 74 return (FALSE); 75 } 76 77 static int32_t * 78 x_inline(XDR *xdrs, u_int len) 79 { 80 if (len == 0) { 81 return (NULL); 82 } 83 if (xdrs->x_op != XDR_ENCODE) { 84 return (NULL); 85 } 86 if (len < PtrToUlong(xdrs->x_base)) { 87 /* x_private was already allocated */ 88 xdrs->x_handy += len; 89 return ((int32_t *) xdrs->x_private); 90 } else { 91 /* Free the earlier space and allocate new area */ 92 if (xdrs->x_private) 93 free(xdrs->x_private); 94 if ((xdrs->x_private = (caddr_t) malloc(len)) == NULL) { 95 xdrs->x_base = 0; 96 return (NULL); 97 } 98 xdrs->x_base = UIntToPtr(len); 99 //xdrs->x_base = len; // XXX Is this right??? 100 xdrs->x_handy += len; 101 return ((int32_t *) xdrs->x_private); 102 } 103 } 104 105 static int 106 harmless() 107 { 108 /* Always return FALSE/NULL, as the case may be */ 109 return (0); 110 } 111 112 static void 113 x_destroy(XDR *xdrs) 114 { 115 xdrs->x_handy = 0; 116 xdrs->x_base = 0; 117 if (xdrs->x_private) { 118 free(xdrs->x_private); 119 xdrs->x_private = NULL; 120 } 121 return; 122 } 123 124 unsigned long 125 xdr_sizeof(func, data) 126 xdrproc_t func; 127 void *data; 128 { 129 XDR x; 130 struct xdr_ops ops; 131 bool_t stat; 132 /* to stop ANSI-C compiler from complaining */ 133 typedef bool_t (* dummyfunc1)(XDR *, long *); 134 typedef bool_t (* dummyfunc2)(XDR *, caddr_t, u_int); 135 136 ops.x_putlong = x_putlong; 137 ops.x_putbytes = x_putbytes; 138 ops.x_inline = x_inline; 139 ops.x_getpostn = x_getpostn; 140 ops.x_setpostn = x_setpostn; 141 ops.x_destroy = x_destroy; 142 143 /* the other harmless ones */ 144 ops.x_getlong = (dummyfunc1) harmless; 145 ops.x_getbytes = (dummyfunc2) harmless; 146 147 x.x_op = XDR_ENCODE; 148 x.x_ops = &ops; 149 x.x_handy = 0; 150 x.x_private = (caddr_t) NULL; 151 x.x_base = (caddr_t) 0; 152 153 stat = func(&x, data); 154 if (x.x_private) 155 free(x.x_private); 156 return (stat == TRUE ? (unsigned) x.x_handy: 0); 157 } 158