Add proper per-file copyright notices/licenses and top-level license.
[bluesky.git] / nfs3 / common.c
1 /* Blue Sky: File Systems in the Cloud
2  *
3  * Copyright (C) 2010  The Regents of the University of California
4  * Written by Michael Vrable <mvrable@cs.ucsd.edu>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
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.
17  *
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
28  * SUCH DAMAGE.
29  */
30
31 /* Common RPC code shared between the BlueSky server and test client code. */
32
33 #include "mount_prot.h"
34 #include "nfs3_prot.h"
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <rpc/pmap_clnt.h>
38 #include <string.h>
39 #include <signal.h>
40 #include <memory.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
43 #include <netinet/ip.h>
44
45 #include "bluesky.h"
46
47 /* Routines for XDR-encoding to a growable string. */
48 static bool_t xdr_string_putlong(XDR *xdrs, const long *lp)
49 {
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);
54     return TRUE;
55 }
56
57 static bool_t xdr_string_putbytes(XDR *xdrs, const char *addr, u_int len)
58 {
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);
62     return TRUE;
63 }
64
65 static u_int xdr_string_getpos(const XDR *xdrs)
66 {
67     GString *str = (GString *)xdrs->x_private;
68     return str->len;
69 }
70
71 static bool_t xdr_string_putint32(XDR *xdrs, const int32_t *ip)
72 {
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);
77     return TRUE;
78 }
79
80 static int32_t *xdr_string_inline(XDR *xdrs, u_int len)
81 {
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);
85 }
86
87 static void xdr_string_destroy(XDR *xdrs)
88 {
89 }
90
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,
98 };
99
100 void xdr_string_create(XDR *xdrs, GString *string, enum xdr_op op)
101 {
102     xdrs->x_op = op;
103     xdrs->x_ops = &xdr_string_ops;
104     xdrs->x_private = (char *)string;
105     xdrs->x_base = NULL;
106     xdrs->x_handy = 0;
107 }