xdr_ref.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* xdr_ref.c - XDR primitives for pointers */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01j,05nov01,vvv  fixed compilation warnings
  8. 01i,18apr00,ham  fixed compilation warnings.
  9. 01h,26may92,rrr  the tree shuffle
  10. 01g,04oct91,rrr  passed through the ansification filter
  11.   -changed includes to have absolute path from h/
  12.   -changed copyright notice
  13. 01f,26jun90,hjb  removed sccsid[].
  14. 01e,11may90,yao  added include file memLib.h.
  15. 01d,05apr88,gae  changed fprintf() to printErr().
  16. 01c,11nov87,jlf  added wrs copyright, title, mod history, etc.
  17.  changed name from xdr_reference.c to xdr_ref.c, to
  18.       work under sys-V.
  19. 01b,06nov87,dnw  changed conditionals on KERNEL to DONT_PRINT_ERRORS.
  20. 01a,01nov87,rdc  first VxWorks version
  21. */
  22. /*
  23.  * xdr_reference.c, Generic XDR routines impelmentation.
  24.  *
  25.  * Copyright (c) 1987 Wind River Systems, Inc.
  26.  * Copyright (C) 1984, Sun Microsystems, Inc.
  27.  *
  28.  * These are the "non-trivial" xdr primitives used to serialize and de-serialize
  29.  * "pointers".  See xdr.h for more info on the interface to xdr.
  30.  */
  31. #ifndef lint
  32. /* static char sccsid[] = "@(#)xdr_reference.c 1.1 86/09/24 Copyr 1984 Sun Micro"; */
  33. #endif
  34. #include "vxWorks.h"
  35. #include "memLib.h"
  36. #include "rpc/rpctypes.h"
  37. #include "rpc/xdr.h"
  38. #include "stdio.h"
  39. #include "stdlib.h"
  40. #include "string.h"
  41. #define LASTUNSIGNED ((u_int)0-1)
  42. /*
  43.  * XDR an indirect pointer
  44.  * xdr_reference is for recursively translating a structure that is
  45.  * referenced by a pointer inside the structure that is currently being
  46.  * translated.  pp references a pointer to storage. If *pp is null
  47.  * the  necessary storage is allocated.
  48.  * size is the sizeof the referneced structure.
  49.  * proc is the routine to handle the referenced structure.
  50.  */
  51. bool_t
  52. xdr_reference(xdrs, pp, size, proc)
  53. register XDR *xdrs;
  54. caddr_t *pp; /* the pointer to work on */
  55. u_int size; /* size of the object pointed to */
  56. xdrproc_t proc; /* xdr routine to handle the object */
  57. {
  58. register caddr_t loc = *pp;
  59. register bool_t stat;
  60. if (loc == NULL)
  61. switch (xdrs->x_op) {
  62. case XDR_FREE:
  63. return (TRUE);
  64. case XDR_DECODE:
  65. *pp = loc = (caddr_t) mem_alloc(size);
  66. if (loc == NULL) {
  67. printErr ("xdr_reference: out of memoryn");
  68. return (FALSE);
  69. }
  70. bzero ((char *)loc, (int)size);
  71. break;
  72. default: /* XDR_ENCODE */
  73.                         break;
  74. }
  75. stat = (*proc)(xdrs, loc, LASTUNSIGNED);
  76. if (xdrs->x_op == XDR_FREE) {
  77. mem_free(loc, size);
  78. *pp = NULL;
  79. }
  80. return (stat);
  81. }
  82. /*
  83.  * xdr_pointer():
  84.  *
  85.  * XDR a pointer to a possibly recursive data structure. This
  86.  * differs with xdr_reference in that it can serialize/deserialiaze
  87.  * trees correctly.
  88.  *
  89.  *  What's sent is actually a union:
  90.  *
  91.  *  union object_pointer switch (boolean b) {
  92.  *  case TRUE: object_data data;
  93.  *  case FALSE: void nothing;
  94.  *  }
  95.  *
  96.  * > objpp: Pointer to the pointer to the object.
  97.  * > obj_size: size of the object.
  98.  * > xdr_obj: routine to XDR an object.
  99.  *
  100.  */
  101. bool_t
  102. xdr_pointer(xdrs,objpp,obj_size,xdr_obj)
  103. register XDR *xdrs;
  104. char **objpp;
  105. u_int obj_size;
  106. xdrproc_t xdr_obj;
  107. {
  108. bool_t more_data;
  109. more_data = (*objpp != NULL);
  110. if (! xdr_bool(xdrs,&more_data)) {
  111. return(FALSE);
  112. }
  113. if (! more_data) {
  114. *objpp = NULL;
  115. return(TRUE);
  116. }
  117. return(xdr_reference(xdrs,objpp,obj_size,xdr_obj));
  118. }