Annotation of 43BSD/contrib/sunrpc/xdr_stdio.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
        !             3:  * unrestricted use provided that this legend is included on all tape
        !             4:  * media and as a part of the software program in whole or part.  Users
        !             5:  * may copy or modify Sun RPC without charge, but are not authorized
        !             6:  * to license or distribute it to anyone else except as part of a product or
        !             7:  * program developed by the user.
        !             8:  * 
        !             9:  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
        !            10:  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
        !            11:  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
        !            12:  * 
        !            13:  * Sun RPC is provided with no support and without any obligation on the
        !            14:  * part of Sun Microsystems, Inc. to assist in its use, correction,
        !            15:  * modification or enhancement.
        !            16:  * 
        !            17:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
        !            18:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
        !            19:  * OR ANY PART THEREOF.
        !            20:  * 
        !            21:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
        !            22:  * or profits or other special, indirect and consequential damages, even if
        !            23:  * Sun has been advised of the possibility of such damages.
        !            24:  * 
        !            25:  * Sun Microsystems, Inc.
        !            26:  * 2550 Garcia Avenue
        !            27:  * Mountain View, California  94043
        !            28:  */
        !            29: #ifndef lint
        !            30: static char sccsid[] = "@(#)xdr_stdio.c 1.4 85/03/14 Copyr 1984 Sun Micro";
        !            31: #endif
        !            32: 
        !            33: /*
        !            34:  * xdr_stdio.c, XDR implementation on standard i/o file.
        !            35:  *
        !            36:  * Copyright (C) 1984, Sun Microsystems, Inc.
        !            37:  *
        !            38:  * This set of routines implements a XDR on a stdio stream.
        !            39:  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
        !            40:  * from the stream.
        !            41:  */
        !            42: 
        !            43: #include "types.h"
        !            44: #include <stdio.h>
        !            45: #include "xdr.h"
        !            46: 
        !            47: static bool_t  xdrstdio_getlong();
        !            48: static bool_t  xdrstdio_putlong();
        !            49: static bool_t  xdrstdio_getbytes();
        !            50: static bool_t  xdrstdio_putbytes();
        !            51: static u_int   xdrstdio_getpos();
        !            52: static bool_t  xdrstdio_setpos();
        !            53: static long *  xdrstdio_inline();
        !            54: static void    xdrstdio_destroy();
        !            55: 
        !            56: /*
        !            57:  * Ops vector for stdio type XDR
        !            58:  */
        !            59: static struct xdr_ops  xdrstdio_ops = {
        !            60:        xdrstdio_getlong,       /* deseraialize a long int */
        !            61:        xdrstdio_putlong,       /* seraialize a long int */
        !            62:        xdrstdio_getbytes,      /* deserialize counted bytes */
        !            63:        xdrstdio_putbytes,      /* serialize counted bytes */
        !            64:        xdrstdio_getpos,        /* get offset in the stream */
        !            65:        xdrstdio_setpos,        /* set offset in the stream */
        !            66:        xdrstdio_inline,        /* prime stream for inline macros */
        !            67:        xdrstdio_destroy        /* destroy stream */
        !            68: };
        !            69: 
        !            70: /*
        !            71:  * Initialize a stdio xdr stream.
        !            72:  * Sets the xdr stream handle xdrs for use on the stream file.
        !            73:  * Operation flag is set to op.
        !            74:  */
        !            75: void
        !            76: xdrstdio_create(xdrs, file, op)
        !            77:        register XDR *xdrs;
        !            78:        FILE *file;
        !            79:        enum xdr_op op;
        !            80: {
        !            81: 
        !            82:        xdrs->x_op = op;
        !            83:        xdrs->x_ops = &xdrstdio_ops;
        !            84:        xdrs->x_private = (caddr_t)file;
        !            85:        xdrs->x_handy = 0;
        !            86:        xdrs->x_base = 0;
        !            87: }
        !            88: 
        !            89: /*
        !            90:  * Destroy a stdio xdr stream.
        !            91:  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
        !            92:  */
        !            93: static void
        !            94: xdrstdio_destroy(xdrs)
        !            95:        register XDR *xdrs;
        !            96: {
        !            97:        (void)fflush((FILE *)xdrs->x_private);
        !            98:        /* xx should we close the file ?? */
        !            99: };
        !           100: 
        !           101: static bool_t
        !           102: xdrstdio_getlong(xdrs, lp)
        !           103:        XDR *xdrs;
        !           104:        register long *lp;
        !           105: {
        !           106: 
        !           107:        if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
        !           108:                return (FALSE);
        !           109: #ifndef mc68000
        !           110:        *lp = ntohl(*lp);
        !           111: #endif
        !           112:        return (TRUE);
        !           113: }
        !           114: 
        !           115: static bool_t
        !           116: xdrstdio_putlong(xdrs, lp)
        !           117:        XDR *xdrs;
        !           118:        long *lp;
        !           119: {
        !           120: 
        !           121: #ifndef mc68000
        !           122:        long mycopy = htonl(*lp);
        !           123:        lp = &mycopy;
        !           124: #endif
        !           125:        if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
        !           126:                return (FALSE);
        !           127:        return (TRUE);
        !           128: }
        !           129: 
        !           130: static bool_t
        !           131: xdrstdio_getbytes(xdrs, addr, len)
        !           132:        XDR *xdrs;
        !           133:        caddr_t addr;
        !           134:        u_int len;
        !           135: {
        !           136: 
        !           137:        if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
        !           138:                return (FALSE);
        !           139:        return (TRUE);
        !           140: }
        !           141: 
        !           142: static bool_t
        !           143: xdrstdio_putbytes(xdrs, addr, len)
        !           144:        XDR *xdrs;
        !           145:        caddr_t addr;
        !           146:        u_int len;
        !           147: {
        !           148: 
        !           149:        if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
        !           150:                return (FALSE);
        !           151:        return (TRUE);
        !           152: }
        !           153: 
        !           154: static u_int
        !           155: xdrstdio_getpos(xdrs)
        !           156:        XDR *xdrs;
        !           157: {
        !           158: 
        !           159:        return ((u_int) ftell((FILE *)xdrs->x_private));
        !           160: }
        !           161: 
        !           162: static bool_t
        !           163: xdrstdio_setpos(xdrs, pos) 
        !           164:        XDR *xdrs;
        !           165:        u_int pos;
        !           166: { 
        !           167: 
        !           168:        return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
        !           169:                FALSE : TRUE);
        !           170: }
        !           171: 
        !           172: static long *
        !           173: xdrstdio_inline(xdrs, len)
        !           174:        XDR *xdrs;
        !           175:        u_int len;
        !           176: {
        !           177: 
        !           178:        /*
        !           179:         * Must do some work to implement this: must insure
        !           180:         * enough data in the underlying stdio buffer,
        !           181:         * that the buffer is aligned so that we can indirect through a
        !           182:         * long *, and stuff this pointer in xdrs->x_buf.  Doing
        !           183:         * a fread or fwrite to a scratch buffer would defeat
        !           184:         * most of the gains to be had here and require storage
        !           185:         * management on this buffer, so we don't do this.
        !           186:         */
        !           187:        return (NULL);
        !           188: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.