2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License, Version 1.0 only
2N/A * (the "License"). You may not use this file except in compliance
2N/A * with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * This is a non-recursive version of XDR routine used for db_index_entry
2N/A * type.
2N/A */
2N/A
2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A
2N/A#include <sys/types.h>
2N/A#include <sys/syslog.h>
2N/A#include <stdio.h>
2N/A#include <rpc/types.h>
2N/A#include <rpc/xdr.h>
2N/A#include <memory.h>
2N/A#include "db_index_entry_c.h"
2N/A#include "db_table_c.h"
2N/A
2N/Abool_t
2N/Axdr_db_index_entry(xdrs, objp)
2N/A register XDR *xdrs;
2N/A db_index_entry *objp;
2N/A{
2N/A bool_t more_data;
2N/A register db_index_entry *ep = objp;
2N/A register db_index_entry *loc;
2N/A register db_index_entry *freeptr = NULL;
2N/A
2N/A for (;;) {
2N/A if (!xdr_u_long(xdrs, &ep->hashval))
2N/A return (FALSE);
2N/A if (!xdr_pointer(xdrs, (char **)&ep->key, sizeof (item),
2N/A (xdrproc_t) xdr_item))
2N/A return (FALSE);
2N/A if (!xdr_entryp(xdrs, &ep->location))
2N/A return (FALSE);
2N/A if (!xdr_nullptr(xdrs, &ep->next_result))
2N/A return (FALSE);
2N/A
2N/A /*
2N/A * The following code replaces the call to
2N/A * xdr_pointer(
2N/A * xdrs,
2N/A * (char **)&ep->next,
2N/A * sizeof (db_index_entry),
2N/A * (xdrproc_t) xdr_db_index_entry))
2N/A *
2N/A * It's a modified version of xdr_refer.c from the rpc library:
2N/A * @(#)xdr_refer.c 1.8 92/07/20 SMI
2N/A */
2N/A
2N/A
2N/A /*
2N/A * the following assignment to more_data is only useful when
2N/A * encoding and freeing. When decoding, more_data will be
2N/A * filled by the xdr_bool() routine.
2N/A */
2N/A more_data = (ep->next != NULL);
2N/A if (! xdr_bool(xdrs, &more_data))
2N/A return (FALSE);
2N/A if (! more_data) {
2N/A ep->next = NULL;
2N/A break;
2N/A }
2N/A
2N/A loc = ep->next;
2N/A
2N/A
2N/A switch (xdrs->x_op) {
2N/A case XDR_DECODE:
2N/A if (loc == NULL) {
2N/A ep->next = loc = (db_index_entry *)
2N/A mem_alloc(sizeof (db_index_entry));
2N/A if (loc == NULL) {
2N/A syslog(LOG_ERR,
2N/A "xdr_db_index_entry: mem_alloc failed");
2N/A return (FALSE);
2N/A }
2N/A memset(loc, 0, sizeof (db_index_entry));
2N/A }
2N/A break;
2N/A case XDR_FREE:
2N/A if (freeptr != NULL) {
2N/A mem_free(freeptr, sizeof (db_index_entry));
2N/A } else
2N/A ep->next = NULL;
2N/A freeptr = loc;
2N/A break;
2N/A }
2N/A
2N/A if (loc == NULL)
2N/A break;
2N/A ep = loc;
2N/A } /* for loop */
2N/A
2N/A if ((freeptr != NULL) && (xdrs->x_op == XDR_FREE)) {
2N/A mem_free(freeptr, sizeof (db_index_entry));
2N/A }
2N/A
2N/A return (TRUE);
2N/A}
2N/A
2N/A
2N/Abool_t
2N/Axdr_db_index_entry_p(xdrs, objp)
2N/A register XDR *xdrs;
2N/A db_index_entry_p *objp;
2N/A{
2N/A
2N/A if (!xdr_pointer(xdrs, (char **)objp, sizeof (db_index_entry),
2N/A (xdrproc_t) xdr_db_index_entry))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/A
2N/A
2N/Abool_t
2N/Axdr_db_free_entry(xdrs, objp)
2N/A register XDR *xdrs;
2N/A db_free_entry *objp;
2N/A{
2N/A bool_t more_data;
2N/A register db_free_entry *ep = objp;
2N/A register db_free_entry *loc;
2N/A register db_free_entry *freeptr = NULL;
2N/A
2N/A for (;;) {
2N/A if (!xdr_entryp(xdrs, &ep->where))
2N/A return (FALSE);
2N/A
2N/A /*
2N/A * The following code replaces the call to
2N/A * xdr_pointer(
2N/A * xdrs,
2N/A * (char **)&ep->next,
2N/A * sizeof (db_free_entry),
2N/A * (xdrproc_t) xdr_db_free_entry))
2N/A *
2N/A * It's a modified version of xdr_refer.c from the rpc library:
2N/A * @(#)xdr_refer.c 1.8 92/07/20 SMI
2N/A */
2N/A
2N/A
2N/A /*
2N/A * the following assignment to more_data is only useful when
2N/A * encoding and freeing. When decoding, more_data will be
2N/A * filled by the xdr_bool() routine.
2N/A */
2N/A more_data = (ep->next != NULL);
2N/A if (! xdr_bool(xdrs, &more_data))
2N/A return (FALSE);
2N/A if (! more_data) {
2N/A ep->next = NULL;
2N/A break;
2N/A }
2N/A
2N/A loc = ep->next;
2N/A
2N/A
2N/A switch (xdrs->x_op) {
2N/A case XDR_DECODE:
2N/A if (loc == NULL) {
2N/A ep->next = loc = (db_free_entry *)
2N/A mem_alloc(sizeof (db_free_entry));
2N/A if (loc == NULL) {
2N/A syslog(LOG_ERR,
2N/A "db_free_entry: mem_alloc failed");
2N/A return (FALSE);
2N/A }
2N/A memset(loc, 0, sizeof (db_free_entry));
2N/A }
2N/A break;
2N/A case XDR_FREE:
2N/A if (freeptr != NULL) {
2N/A mem_free(freeptr, sizeof (db_free_entry));
2N/A } else
2N/A ep->next = NULL;
2N/A freeptr = loc;
2N/A break;
2N/A }
2N/A
2N/A if (loc == NULL)
2N/A break;
2N/A ep = loc;
2N/A } /* for loop */
2N/A
2N/A if ((freeptr != NULL) && (xdrs->x_op == XDR_FREE)) {
2N/A mem_free(freeptr, sizeof (db_free_entry));
2N/A }
2N/A return (TRUE);
2N/A}