Add -p switch to "zpool get"
[zfs.git] / lib / libspl / xdr.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  *
22  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  *
25  *      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T
26  *        All Rights Reserved
27  *
28  * Portions of this source code were derived from Berkeley 4.3 BSD
29  * under license from the Regents of the University of California.
30  */
31
32 #include <rpc/xdr.h>
33
34 /*
35  * As of glibc-2.5-25 there is not support for xdr_control().  The
36  * xdrmem implementation from OpenSolaris is used here.
37  *
38  * FIXME: Not well tested it may not work as expected.
39  */
40 bool_t
41 xdr_control(XDR *xdrs, int request, void *info)
42 {
43         xdr_bytesrec_t *xptr;
44         int32_t *int32p;
45         int len;
46
47         switch (request) {
48         case XDR_GET_BYTES_AVAIL:
49                 xptr = (xdr_bytesrec_t *)info;
50                 xptr->xc_is_last_record = TRUE;
51                 xptr->xc_num_avail = xdrs->x_handy;
52                 return (TRUE);
53
54         case XDR_PEEK:
55                 /*
56                  * Return the next 4 byte unit in the XDR stream.
57                  */
58                 if (xdrs->x_handy < sizeof (int32_t))
59                         return (FALSE);
60                 int32p = (int32_t *)info;
61                 *int32p = (int32_t)ntohl((uint32_t)
62                     (*((int32_t *)(xdrs->x_private))));
63                 return (TRUE);
64
65         case XDR_SKIPBYTES:
66                 /*
67                  * Skip the next N bytes in the XDR stream.
68                  */
69                 int32p = (int32_t *)info;
70                 len = RNDUP((int)(*int32p));
71                 if ((xdrs->x_handy -= len) < 0)
72                         return (FALSE);
73                 xdrs->x_private += len;
74                 return (TRUE);
75
76         }
77         return (FALSE);
78 }