[BACK]Return to xdr_reference.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / rpc

Annotation of src/lib/libc/rpc/xdr_reference.c, Revision 1.16

1.16    ! abs         1: /*     $NetBSD: xdr_reference.c,v 1.15 2008/04/25 17:44:44 christos Exp $      */
1.3       cgd         2:
1.1       cgd         3: /*
                      4:  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
                      5:  * unrestricted use provided that this legend is included on all tape
                      6:  * media and as a part of the software program in whole or part.  Users
                      7:  * may copy or modify Sun RPC without charge, but are not authorized
                      8:  * to license or distribute it to anyone else except as part of a product or
                      9:  * program developed by the user.
                     10:  *
                     11:  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
                     12:  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
                     13:  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
                     14:  *
                     15:  * Sun RPC is provided with no support and without any obligation on the
                     16:  * part of Sun Microsystems, Inc. to assist in its use, correction,
                     17:  * modification or enhancement.
                     18:  *
                     19:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
                     20:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
                     21:  * OR ANY PART THEREOF.
                     22:  *
                     23:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
                     24:  * or profits or other special, indirect and consequential damages, even if
                     25:  * Sun has been advised of the possibility of such damages.
                     26:  *
                     27:  * Sun Microsystems, Inc.
                     28:  * 2550 Garcia Avenue
                     29:  * Mountain View, California  94043
                     30:  */
                     31:
1.6       christos   32: #include <sys/cdefs.h>
1.1       cgd        33: #if defined(LIBC_SCCS) && !defined(lint)
1.6       christos   34: #if 0
                     35: static char *sccsid = "@(#)xdr_reference.c 1.11 87/08/11 SMI";
                     36: static char *sccsid = "@(#)xdr_reference.c     2.1 88/07/29 4.0 RPCSRC";
                     37: #else
1.16    ! abs        38: __RCSID("$NetBSD: xdr_reference.c,v 1.15 2008/04/25 17:44:44 christos Exp $");
1.6       christos   39: #endif
1.1       cgd        40: #endif
                     41:
                     42: /*
1.14      wiz        43:  * xdr_reference.c, Generic XDR routines implementation.
1.1       cgd        44:  *
                     45:  * Copyright (C) 1987, Sun Microsystems, Inc.
                     46:  *
                     47:  * These are the "non-trivial" xdr primitives used to serialize and de-serialize
                     48:  * "pointers".  See xdr.h for more info on the interface to xdr.
                     49:  */
                     50:
1.7       jtc        51: #include "namespace.h"
1.11      lukem      52:
                     53: #include <err.h>
1.1       cgd        54: #include <stdio.h>
1.2       cgd        55: #include <stdlib.h>
1.4       jtc        56: #include <string.h>
1.11      lukem      57:
1.1       cgd        58: #include <rpc/types.h>
                     59: #include <rpc/xdr.h>
1.7       jtc        60:
                     61: #ifdef __weak_alias
1.13      mycroft    62: __weak_alias(xdr_pointer,_xdr_pointer)
                     63: __weak_alias(xdr_reference,_xdr_reference)
1.7       jtc        64: #endif
1.1       cgd        65:
                     66: /*
                     67:  * XDR an indirect pointer
                     68:  * xdr_reference is for recursively translating a structure that is
                     69:  * referenced by a pointer inside the structure that is currently being
                     70:  * translated.  pp references a pointer to storage. If *pp is null
                     71:  * the  necessary storage is allocated.
                     72:  * size is the sizeof the referneced structure.
                     73:  * proc is the routine to handle the referenced structure.
                     74:  */
                     75: bool_t
1.16    ! abs        76: xdr_reference(XDR *xdrs, caddr_t *pp, u_int size, xdrproc_t proc)
1.1       cgd        77: {
1.11      lukem      78:        caddr_t loc = *pp;
                     79:        bool_t stat;
1.1       cgd        80:
                     81:        if (loc == NULL)
                     82:                switch (xdrs->x_op) {
                     83:                case XDR_FREE:
                     84:                        return (TRUE);
                     85:
                     86:                case XDR_DECODE:
1.15      christos   87:                        *pp = loc = mem_alloc(size);
1.1       cgd        88:                        if (loc == NULL) {
1.11      lukem      89:                                warnx("xdr_reference: out of memory");
1.1       cgd        90:                                return (FALSE);
                     91:                        }
1.12      christos   92:                        memset(loc, 0, size);
1.1       cgd        93:                        break;
1.6       christos   94:
                     95:                case XDR_ENCODE:
                     96:                        break;
                     97:                }
1.1       cgd        98:
1.5       jtc        99:        stat = (*proc)(xdrs, loc);
1.1       cgd       100:
                    101:        if (xdrs->x_op == XDR_FREE) {
                    102:                mem_free(loc, size);
                    103:                *pp = NULL;
                    104:        }
                    105:        return (stat);
                    106: }
                    107:
                    108:
                    109: /*
                    110:  * xdr_pointer():
                    111:  *
                    112:  * XDR a pointer to a possibly recursive data structure. This
                    113:  * differs with xdr_reference in that it can serialize/deserialiaze
                    114:  * trees correctly.
                    115:  *
                    116:  *  What's sent is actually a union:
                    117:  *
                    118:  *  union object_pointer switch (boolean b) {
                    119:  *  case TRUE: object_data data;
                    120:  *  case FALSE: void nothing;
                    121:  *  }
                    122:  *
                    123:  * > objpp: Pointer to the pointer to the object.
                    124:  * > obj_size: size of the object.
                    125:  * > xdr_obj: routine to XDR an object.
                    126:  *
                    127:  */
                    128: bool_t
1.16    ! abs       129: xdr_pointer(XDR *xdrs, char **objpp, u_int obj_size, xdrproc_t xdr_obj)
1.1       cgd       130: {
1.10      lukem     131:
1.1       cgd       132:        bool_t more_data;
                    133:
                    134:        more_data = (*objpp != NULL);
                    135:        if (! xdr_bool(xdrs,&more_data)) {
                    136:                return (FALSE);
                    137:        }
                    138:        if (! more_data) {
                    139:                *objpp = NULL;
                    140:                return (TRUE);
                    141:        }
1.10      lukem     142:        return (xdr_reference(xdrs,objpp,obj_size,xdr_obj));
1.1       cgd       143: }

CVSweb <webmaster@jp.NetBSD.org>