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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #include <strings.h>
28 #include <rpc/rpc.h>
29
30 #include "rpcsvc/nfs4_prot.h"
31
32 int nfs4_skip_bytes;
33
34 /*
35 * The waiting() function returns the value passed in, until something
36 * external modifies it. In this case, the D script tst.call.d will
37 * modify the value of *a, and thus break the while loop in dotest().
38 *
39 * This serves the purpose of not making the RPC calls until tst.call.d
40 * is active. Thus, the probes in tst.call.d can fire as a result of
41 * the RPC call in dotest().
42 */
43
44 int
waiting(volatile int * a)45 waiting(volatile int *a)
46 {
47 return (*a);
48 }
49
50 int
dotest(void)51 dotest(void)
52 {
53 CLIENT *client;
54 AUTH *auth;
55 COMPOUND4args args;
56 COMPOUND4res res;
57 enum clnt_stat status;
58 struct timeval timeout;
59 nfs_argop4 arg[1];
60 char *tag = "dtrace test";
61 volatile int a = 0;
62
63 while (waiting(&a) == 0)
64 continue;
65
66 timeout.tv_sec = 30;
67 timeout.tv_usec = 0;
68
69 client = clnt_create("localhost", NFS4_PROGRAM, NFS_V4, "tcp");
70 if (client == NULL) {
71 clnt_pcreateerror("test");
72 return (1);
73 }
74 auth = authsys_create_default();
75 client->cl_auth = auth;
76 args.minorversion = 0;
77 args.tag.utf8string_len = strlen(tag);
78 args.tag.utf8string_val = tag;
79 args.argarray.argarray_len = sizeof (arg) / sizeof (nfs_argop4);
80 args.argarray.argarray_val = arg;
81
82 arg[0].argop = OP_PUTROOTFH;
83 /* no need to manipulate nfs_argop4_u */
84
85 bzero(&res, sizeof (res));
86
87 status = clnt_call(client, NFSPROC4_COMPOUND,
88 xdr_COMPOUND4args, (caddr_t)&args,
89 xdr_COMPOUND4res, (caddr_t)&res,
90 timeout);
91 if (status != RPC_SUCCESS) {
92 clnt_perror(client, "test");
93 return (2);
94 }
95
96 return (0);
97 }
98
99 /*ARGSUSED*/
100 int
main(int argc,char ** argv)101 main(int argc, char **argv)
102 {
103 char shareline[BUFSIZ], unshareline[BUFSIZ];
104 int rc;
105
106 (void) snprintf(shareline, sizeof (shareline),
107 "mkdir /tmp/nfsv4test.%d ; share /tmp/nfsv4test.%d", getpid(),
108 getpid());
109 (void) snprintf(unshareline, sizeof (unshareline),
110 "unshare /tmp/nfsv4test.%d ; rmdir /tmp/nfsv4test.%d", getpid(),
111 getpid());
112
113 (void) system(shareline);
114 rc = dotest();
115 (void) system(unshareline);
116
117 return (rc);
118 }
119