00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00044 #ifdef WIN32
00045
00046 #if !defined(lint) && defined(SCCSIDS)
00047 static char sccsid[] = "@(#)xdr.c 1.35 87/08/12";
00048 #endif
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #include <stdio.h>
00061 #include <stdlib.h>
00062 #include <string.h>
00063
00064 #include <Winsock2.h>
00065 #include "xdr.h"
00066
00067
00068
00069
00070 #define XDR_FALSE ((long) 0)
00071 #define XDR_TRUE ((long) 1)
00072 #define LASTUNSIGNED ((u_int) 0-1)
00073
00074
00075
00076
00077 static char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
00078
00079
00080
00081
00082
00083 void
00084 xdr_free(xdrproc_t proc, char *objp)
00085 {
00086 XDR x;
00087
00088 x.x_op = XDR_FREE;
00089 (*proc)(&x, objp);
00090 }
00091
00092
00093
00094
00095 bool_t
00096 xdr_void()
00097
00098
00099 {
00100
00101 return (TRUE);
00102 }
00103
00104
00105
00106
00107 bool_t
00108 xdr_int(XDR *xdrs, int *ip)
00109 {
00110
00111 #ifdef lint
00112 (void) (xdr_short(xdrs, (short *)ip));
00113 return (xdr_long(xdrs, (long *)ip));
00114 #else
00115 if (sizeof (int) == sizeof (long)) {
00116 return (xdr_long(xdrs, (long *)ip));
00117 } else {
00118 return (xdr_short(xdrs, (short *)ip));
00119 }
00120 #endif
00121 }
00122
00123
00124
00125
00126
00127 bool_t
00128 xdr_long(register XDR *xdrs, long *lp)
00129 {
00130
00131 if (xdrs->x_op == XDR_ENCODE)
00132 return (XDR_PUTLONG(xdrs, lp));
00133
00134 if (xdrs->x_op == XDR_DECODE)
00135 return (XDR_GETLONG(xdrs, lp));
00136
00137 if (xdrs->x_op == XDR_FREE)
00138 return (TRUE);
00139
00140 return (FALSE);
00141 }
00142
00143
00144
00145
00146
00147 bool_t
00148 xdr_u_long(register XDR *xdrs, u_long *ulp)
00149 {
00150
00151 if (xdrs->x_op == XDR_DECODE)
00152 return (XDR_GETLONG(xdrs, (long *)ulp));
00153 if (xdrs->x_op == XDR_ENCODE)
00154 return (XDR_PUTLONG(xdrs, (long *)ulp));
00155 if (xdrs->x_op == XDR_FREE)
00156 return (TRUE);
00157 return (FALSE);
00158 }
00159
00160
00161
00162
00163 bool_t
00164 xdr_short(register XDR *xdrs, short *sp)
00165 {
00166 long l;
00167
00168 switch (xdrs->x_op) {
00169
00170 case XDR_ENCODE:
00171 l = (long) *sp;
00172 return (XDR_PUTLONG(xdrs, &l));
00173
00174 case XDR_DECODE:
00175 if (!XDR_GETLONG(xdrs, &l)) {
00176 return (FALSE);
00177 }
00178 *sp = (short) l;
00179 return (TRUE);
00180
00181 case XDR_FREE:
00182 return (TRUE);
00183 }
00184 return (FALSE);
00185 }
00186
00187
00188
00189
00190 bool_t
00191 xdr_u_short(register XDR *xdrs, u_short *usp)
00192 {
00193 long l;
00194
00195 switch (xdrs->x_op) {
00196
00197 case XDR_ENCODE:
00198 l = (long) *usp;
00199 return (XDR_PUTLONG(xdrs, &l));
00200
00201 case XDR_DECODE:
00202 if (!XDR_GETLONG(xdrs, &l)) {
00203 return (FALSE);
00204 }
00205 *usp = (u_short) l;
00206 return (TRUE);
00207
00208 case XDR_FREE:
00209 return (TRUE);
00210 }
00211 return (FALSE);
00212 }
00213
00214
00215
00216
00217 bool_t
00218 xdr_u_int(XDR *xdrs, u_int *up)
00219 {
00220
00221 #ifdef lint
00222 (void) (xdr_short(xdrs, (short *)up));
00223 return (xdr_u_long(xdrs, (u_long *)up));
00224 #else
00225 if (sizeof (u_int) == sizeof (u_long)) {
00226 return (xdr_u_long(xdrs, (u_long *)up));
00227 } else {
00228 return (xdr_short(xdrs, (short *)up));
00229 }
00230 #endif
00231 }
00232
00233
00234
00235
00236
00237
00238 bool_t
00239 xdr_opaque(register XDR *xdrs, caddr_t cp, register u_int cnt)
00240 {
00241 register u_int rndup;
00242 static byte crud[BYTES_PER_XDR_UNIT];
00243
00244
00245
00246
00247 if (cnt == 0)
00248 return (TRUE);
00249
00250
00251
00252
00253 rndup = cnt % BYTES_PER_XDR_UNIT;
00254 if (rndup > 0)
00255 rndup = BYTES_PER_XDR_UNIT - rndup;
00256
00257 if (xdrs->x_op == XDR_DECODE) {
00258 if (!XDR_GETBYTES(xdrs, cp, cnt)) {
00259 return (FALSE);
00260 }
00261 if (rndup == 0)
00262 return (TRUE);
00263 return (XDR_GETBYTES(xdrs, crud, rndup));
00264 }
00265
00266 if (xdrs->x_op == XDR_ENCODE) {
00267 if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
00268 return (FALSE);
00269 }
00270 if (rndup == 0)
00271 return (TRUE);
00272 return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
00273 }
00274
00275 if (xdrs->x_op == XDR_FREE) {
00276 return (TRUE);
00277 }
00278
00279 return (FALSE);
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 bool_t
00291 xdr_string(register XDR *xdrs, char **cpp, u_int maxsize)
00292 {
00293 register char *sp = *cpp;
00294 u_int size;
00295 u_int nodesize;
00296
00297
00298
00299
00300 switch (xdrs->x_op) {
00301 case XDR_FREE:
00302 if (sp == NULL) {
00303 return(TRUE);
00304 }
00305
00306 case XDR_ENCODE:
00307 size = strlen(sp);
00308 break;
00309 }
00310 if (! xdr_u_int(xdrs, &size)) {
00311 return (FALSE);
00312 }
00313 if (size > maxsize) {
00314 return (FALSE);
00315 }
00316 nodesize = size + 1;
00317
00318
00319
00320
00321 switch (xdrs->x_op) {
00322
00323 case XDR_DECODE:
00324 if (nodesize == 0) {
00325 return (TRUE);
00326 }
00327 if (sp == NULL)
00328 *cpp = sp = (char *)mem_alloc(nodesize);
00329 if (sp == NULL) {
00330 (void) fprintf(stderr, "xdr_string: out of memory\n");
00331 return (FALSE);
00332 }
00333 sp[size] = 0;
00334
00335
00336 case XDR_ENCODE:
00337 return (xdr_opaque(xdrs, sp, size));
00338
00339 case XDR_FREE:
00340 mem_free(sp, nodesize);
00341 *cpp = NULL;
00342 return (TRUE);
00343 }
00344 return (FALSE);
00345 }
00346
00347 bool_t
00348 xdr_float(register XDR *xdrs, register float *fp)
00349 {
00350 switch (xdrs->x_op) {
00351 case XDR_ENCODE:
00352 return (XDR_PUTLONG(xdrs, (long *)fp));
00353 case XDR_DECODE:
00354 return (XDR_GETLONG(xdrs, (long *)fp));
00355 case XDR_FREE:
00356 return (TRUE);
00357 }
00358 return (FALSE);
00359 }
00360
00361 bool_t
00362 xdr_double(register XDR *xdrs, double *dp)
00363 {
00364 register long *lp;
00365
00366 switch (xdrs->x_op) {
00367 case XDR_ENCODE:
00368 lp = (long *)dp;
00369 return (XDR_PUTLONG(xdrs, lp+1) && XDR_PUTLONG(xdrs, lp));
00370 case XDR_DECODE:
00371 lp = (long *)dp;
00372 return (XDR_GETLONG(xdrs, lp+1) && XDR_GETLONG(xdrs, lp));
00373 case XDR_FREE:
00374 return (TRUE);
00375 }
00376 return (FALSE);
00377 }
00378
00379
00380
00381
00382 void xdrmem_destroy(void *);
00383 bool_t xdrmem_getlong(void *xdrs, long *lp);
00384 bool_t xdrmem_putlong(void *xdrs, long *lp);
00385 bool_t xdrmem_getbytes(void *xdrs, void *addr, register int len);
00386 bool_t xdrmem_putbytes(void *xdrs, void *addr, register int len);
00387 u_int xdrmem_getpos(void *xdrs);
00388 bool_t xdrmem_setpos(void *xdrs, int pos);
00389 long * xdrmem_inline(void *xdrs, int len);
00390
00391 static XDR::xdr_ops xdrmem_ops = {
00392 &xdrmem_getlong,
00393 &xdrmem_putlong,
00394 &xdrmem_getbytes,
00395 &xdrmem_putbytes,
00396 &xdrmem_getpos,
00397 &xdrmem_setpos,
00398 &xdrmem_inline,
00399 &xdrmem_destroy
00400 };
00401
00402
00403
00404
00405
00406 void
00407 xdrmem_create(register XDR *xdrs, caddr_t addr, u_int size, enum xdr_op op)
00408 {
00409
00410 xdrs->x_op = op;
00411 xdrs->x_ops = &xdrmem_ops;
00412 xdrs->x_private = xdrs->x_base = addr;
00413 xdrs->x_handy = size;
00414 }
00415
00416 static void
00417 xdrmem_destroy(void *xdrs)
00418 {
00419 }
00420
00421 static bool_t
00422 xdrmem_getlong(void *xdrsv, long *lp)
00423 {
00424 register XDR *xdrs = (XDR *)xdrsv;
00425 if ((xdrs->x_handy -= sizeof(long)) < 0)
00426 return (FALSE);
00427 *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
00428 xdrs->x_private += sizeof(long);
00429 return (TRUE);
00430 }
00431
00432 static bool_t
00433 xdrmem_putlong(void *xdrsv, long *lp)
00434 {
00435
00436 register XDR *xdrs = (XDR *)xdrsv;
00437 if ((xdrs->x_handy -= sizeof(long)) < 0)
00438 return (FALSE);
00439 *(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
00440 xdrs->x_private += sizeof(long);
00441 return (TRUE);
00442 }
00443
00444 static bool_t
00445 xdrmem_getbytes(void *xdrsv, void *addr, register int len)
00446 {
00447 register XDR *xdrs = (XDR *)xdrsv;
00448 if ((xdrs->x_handy -= len) < 0)
00449 return (FALSE);
00450 memcpy(addr, xdrs->x_private, len);
00451 xdrs->x_private += len;
00452 return (TRUE);
00453 }
00454
00455 static bool_t
00456 xdrmem_putbytes(void *xdrsv, void *addr, register int len)
00457 {
00458 register XDR *xdrs = (XDR *)xdrsv;
00459 if ((xdrs->x_handy -= len) < 0)
00460 return (FALSE);
00461 memcpy(xdrs->x_private, addr, len);
00462 xdrs->x_private += len;
00463 return (TRUE);
00464 }
00465
00466 static u_int
00467 xdrmem_getpos(void *xdrsv)
00468 {
00469 register XDR *xdrs = (XDR *)xdrsv;
00470 return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
00471 }
00472
00473 static bool_t
00474 xdrmem_setpos(void *xdrsv, int pos)
00475 {
00476 register XDR *xdrs = (XDR *)xdrsv;
00477 register caddr_t newaddr = xdrs->x_base + pos;
00478 register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
00479
00480 if ((long)newaddr > (long)lastaddr)
00481 return (FALSE);
00482 xdrs->x_private = newaddr;
00483 xdrs->x_handy = (int)lastaddr - (int)newaddr;
00484 return (TRUE);
00485 }
00486
00487 static long *
00488 xdrmem_inline(void *xdrsv, int len)
00489 {
00490 long *buf = 0;
00491 register XDR *xdrs = (XDR *)xdrsv;
00492 if (xdrs->x_handy >= len) {
00493 xdrs->x_handy -= len;
00494 buf = (long *) xdrs->x_private;
00495 xdrs->x_private += len;
00496 }
00497 return (buf);
00498 }
00499
00500 #endif