xdr_ref.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * xdr_reference.c, Generic XDR routines implementation.
  3. *
  4. * Copyright (c) 2010, Oracle America, Inc.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are
  8. * met:
  9. *
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above
  13. * copyright notice, this list of conditions and the following
  14. * disclaimer in the documentation and/or other materials
  15. * provided with the distribution.
  16. * * Neither the name of the "Oracle America, Inc." nor the names of its
  17. * contributors may be used to endorse or promote products derived
  18. * from this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24. * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  25. * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  27. * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  29. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  31. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. *
  33. * These are the "non-trivial" xdr primitives used to serialize and
  34. * de-serialize "pointers". See xdr.h for more info on the interface to xdr.
  35. */
  36. #include <stdio.h>
  37. #include <string.h>
  38. #include <rpc/types.h>
  39. #include <rpc/xdr.h>
  40. #include <libintl.h>
  41. #include <wchar.h>
  42. #include <libio/iolibio.h>
  43. #include <shlib-compat.h>
  44. #define LASTUNSIGNED ((u_int)0-1)
  45. /*
  46. * XDR an indirect pointer
  47. * xdr_reference is for recursively translating a structure that is
  48. * referenced by a pointer inside the structure that is currently being
  49. * translated. pp references a pointer to storage. If *pp is null
  50. * the necessary storage is allocated.
  51. * size is the size of the referneced structure.
  52. * proc is the routine to handle the referenced structure.
  53. */
  54. bool_t
  55. xdr_reference (XDR *xdrs,
  56. /* the pointer to work on */
  57. caddr_t *pp,
  58. /* size of the object pointed to */
  59. u_int size,
  60. /* xdr routine to handle the object */
  61. xdrproc_t proc)
  62. {
  63. caddr_t loc = *pp;
  64. bool_t stat;
  65. if (loc == NULL)
  66. switch (xdrs->x_op)
  67. {
  68. case XDR_FREE:
  69. return TRUE;
  70. case XDR_DECODE:
  71. *pp = loc = (caddr_t) calloc (1, size);
  72. if (loc == NULL)
  73. {
  74. (void) __fxprintf (NULL, "%s: %s", __func__, _("out of memory\n"));
  75. return FALSE;
  76. }
  77. break;
  78. default:
  79. break;
  80. }
  81. stat = (*proc) (xdrs, loc, LASTUNSIGNED);
  82. if (xdrs->x_op == XDR_FREE)
  83. {
  84. mem_free (loc, size);
  85. *pp = NULL;
  86. }
  87. return stat;
  88. }
  89. libc_hidden_nolink_sunrpc (xdr_reference, GLIBC_2_0)
  90. /*
  91. * xdr_pointer():
  92. *
  93. * XDR a pointer to a possibly recursive data structure. This
  94. * differs with xdr_reference in that it can serialize/deserialize
  95. * trees correctly.
  96. *
  97. * What's sent is actually a union:
  98. *
  99. * union object_pointer switch (boolean b) {
  100. * case TRUE: object_data data;
  101. * case FALSE: void nothing;
  102. * }
  103. *
  104. * > objpp: Pointer to the pointer to the object.
  105. * > obj_size: size of the object.
  106. * > xdr_obj: routine to XDR an object.
  107. *
  108. */
  109. bool_t
  110. xdr_pointer (XDR *xdrs, char **objpp, u_int obj_size, xdrproc_t xdr_obj)
  111. {
  112. bool_t more_data;
  113. more_data = (*objpp != NULL);
  114. if (!xdr_bool (xdrs, &more_data))
  115. {
  116. return FALSE;
  117. }
  118. if (!more_data)
  119. {
  120. *objpp = NULL;
  121. return TRUE;
  122. }
  123. return xdr_reference (xdrs, objpp, obj_size, xdr_obj);
  124. }
  125. #ifdef EXPORT_RPC_SYMBOLS
  126. libc_hidden_def (xdr_pointer)
  127. #else
  128. libc_hidden_nolink_sunrpc (xdr_pointer, GLIBC_2_0)
  129. #endif