1 /* Blue Sky: File Systems in the Cloud
3 * Copyright (C) 2010 The Regents of the University of California
4 * Written by Michael Vrable <mvrable@cs.ucsd.edu>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the University nor the names of its contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 /* Common RPC code shared between the BlueSky server and test client code. */
33 #include "mount_prot.h"
34 #include "nfs3_prot.h"
37 #include <rpc/pmap_clnt.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
43 #include <netinet/ip.h>
47 /* Routines for XDR-encoding to a growable string. */
48 static bool_t xdr_string_putlong(XDR *xdrs, const long *lp)
50 GString *str = (GString *)xdrs->x_private;
51 uint32_t data = htonl(*lp);
52 g_string_set_size(str, str->len + 4);
53 memcpy(str->str + str->len - 4, &data, 4);
57 static bool_t xdr_string_putbytes(XDR *xdrs, const char *addr, u_int len)
59 GString *str = (GString *)xdrs->x_private;
60 g_string_set_size(str, str->len + len);
61 memcpy(str->str + str->len - len, addr, len);
65 static u_int xdr_string_getpos(const XDR *xdrs)
67 GString *str = (GString *)xdrs->x_private;
71 static bool_t xdr_string_putint32(XDR *xdrs, const int32_t *ip)
73 GString *str = (GString *)xdrs->x_private;
74 uint32_t data = htonl(*ip);
75 g_string_set_size(str, str->len + 4);
76 memcpy(str->str + str->len - 4, &data, 4);
80 static int32_t *xdr_string_inline(XDR *xdrs, u_int len)
82 GString *str = (GString *)xdrs->x_private;
83 g_string_set_size(str, str->len + len);
84 return (int32_t *)(str->str + str->len - len);
87 static void xdr_string_destroy(XDR *xdrs)
91 static struct xdr_ops xdr_string_ops = {
92 .x_putlong = xdr_string_putlong,
93 .x_putbytes = xdr_string_putbytes,
94 .x_getpostn = xdr_string_getpos,
95 .x_putint32 = xdr_string_putint32,
96 .x_inline = xdr_string_inline,
97 .x_destroy = xdr_string_destroy,
100 void xdr_string_create(XDR *xdrs, GString *string, enum xdr_op op)
103 xdrs->x_ops = &xdr_string_ops;
104 xdrs->x_private = (char *)string;