OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [inet/] [rpc/] [pmap_prot2.c] - Blame information for rev 1325

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/* @(#)pmap_prot2.c     2.1 88/07/29 4.0 RPCSRC */
2
/*
3
 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4
 * unrestricted use provided that this legend is included on all tape
5
 * media and as a part of the software program in whole or part.  Users
6
 * may copy or modify Sun RPC without charge, but are not authorized
7
 * to license or distribute it to anyone else except as part of a product or
8
 * program developed by the user.
9
 *
10
 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11
 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13
 *
14
 * Sun RPC is provided with no support and without any obligation on the
15
 * part of Sun Microsystems, Inc. to assist in its use, correction,
16
 * modification or enhancement.
17
 *
18
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20
 * OR ANY PART THEREOF.
21
 *
22
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23
 * or profits or other special, indirect and consequential damages, even if
24
 * Sun has been advised of the possibility of such damages.
25
 *
26
 * Sun Microsystems, Inc.
27
 * 2550 Garcia Avenue
28
 * Mountain View, California  94043
29
 */
30
#if 0
31
static char sccsid[] = "@(#)pmap_prot2.c 1.3 87/08/11 Copyr 1984 Sun Micro";
32
#endif
33
 
34
/*
35
 * pmap_prot2.c
36
 * Protocol for the local binder service, or pmap.
37
 *
38
 * Copyright (C) 1984, Sun Microsystems, Inc.
39
 */
40
 
41
#include <rpc/types.h>
42
#include <rpc/xdr.h>
43
#include <rpc/pmap_prot.h>
44
 
45
 
46
/*
47
 * What is going on with linked lists? (!)
48
 * First recall the link list declaration from pmap_prot.h:
49
 *
50
 * struct pmaplist {
51
 *      struct pmap pml_map;
52
 *      struct pmaplist *pml_map;
53
 * };
54
 *
55
 * Compare that declaration with a corresponding xdr declaration that
56
 * is (a) pointer-less, and (b) recursive:
57
 *
58
 * typedef union switch (bool_t) {
59
 *
60
 *      case TRUE: struct {
61
 *              struct pmap;
62
 *              pmaplist_t foo;
63
 *      };
64
 *
65
 *      case FALSE: struct {};
66
 * } pmaplist_t;
67
 *
68
 * Notice that the xdr declaration has no nxt pointer while
69
 * the C declaration has no bool_t variable.  The bool_t can be
70
 * interpreted as ``more data follows me''; if FALSE then nothing
71
 * follows this bool_t; if TRUE then the bool_t is followed by
72
 * an actual struct pmap, and then (recursively) by the
73
 * xdr union, pamplist_t.
74
 *
75
 * This could be implemented via the xdr_union primitive, though this
76
 * would cause a one recursive call per element in the list.  Rather than do
77
 * that we can ``unwind'' the recursion
78
 * into a while loop and do the union arms in-place.
79
 *
80
 * The head of the list is what the C programmer wishes to past around
81
 * the net, yet is the data that the pointer points to which is interesting;
82
 * this sounds like a job for xdr_reference!
83
 */
84
bool_t
85
xdr_pmaplist (xdrs, rp)
86
     XDR *xdrs;
87
     struct pmaplist **rp;
88
{
89
  /*
90
   * more_elements is pre-computed in case the direction is
91
   * XDR_ENCODE or XDR_FREE.  more_elements is overwritten by
92
   * xdr_bool when the direction is XDR_DECODE.
93
   */
94
  bool_t more_elements;
95
  int freeing = (xdrs->x_op == XDR_FREE);
96
  struct pmaplist **next = NULL;
97
 
98
  while (TRUE)
99
    {
100
      more_elements = (bool_t) (*rp != NULL);
101
      if (!xdr_bool (xdrs, &more_elements))
102
        return FALSE;
103
      if (!more_elements)
104
        return TRUE;            /* we are done */
105
      /*
106
       * the unfortunate side effect of non-recursion is that in
107
       * the case of freeing we must remember the next object
108
       * before we free the current object ...
109
       */
110
      if (freeing)
111
        next = &((*rp)->pml_next);
112
      if (!xdr_reference (xdrs, (caddr_t *) rp,
113
                          (u_int) sizeof (struct pmaplist),
114
                          (xdrproc_t) xdr_pmap))
115
          return FALSE;
116
      rp = freeing ? next : &((*rp)->pml_next);
117
    }
118
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.