2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
8 * Test for simple rpc based access to name services.
15 #include <sys/fcntl.h>
19 #include "native_client/src/public/imc_syscalls.h"
20 #include "native_client/src/public/name_service.h"
21 #include "native_client/src/shared/srpc/nacl_srpc.h"
29 NaClSrpcChannel ns_channel;
31 void StringBufferCtor(struct StringBuffer *sb) {
34 sb->buffer = malloc(sb->nbytes);
35 if (NULL == sb->buffer) {
36 perror("StringBufferInit::malloc");
42 void StringBufferDiscardOutput(struct StringBuffer *sb) {
47 void StringBufferDtor(struct StringBuffer *sb) {
54 void StringBufferPrintf(struct StringBuffer *sb,
56 __attribute__((format(printf, 2, 3)));
58 void StringBufferPrintf(struct StringBuffer *sb,
59 char const *fmt, ...) {
67 vfprintf(stderr, fmt, ap);
71 space = sb->nbytes - sb->insert;
72 insert_pt = sb->buffer + sb->insert;
74 written = vsnprintf(insert_pt, space, fmt, ap);
76 if (written < space) {
77 sb->insert += written;
80 /* insufficient space -- grow the buffer */
81 new_buffer = realloc(sb->buffer, 2 * sb->nbytes);
82 if (NULL == new_buffer) {
84 fprintf(stderr, "StringBufferPrintf: no memory\n");
88 sb->buffer = new_buffer;
93 int EnumerateNames(struct StringBuffer *sb, NaClSrpcChannel *nschan) {
95 uint32_t nbytes = sizeof buffer;
99 if (NACL_SRPC_RESULT_OK != NaClSrpcInvokeBySignature(nschan,
100 NACL_NAME_SERVICE_LIST,
104 StringBufferPrintf(sb, "nbytes = %zu\n", (size_t) nbytes);
105 if (nbytes == sizeof buffer) {
106 fprintf(stderr, "Insufficent space for namespace enumeration\n");
109 for (p = buffer; p - buffer < nbytes; p += name_len) {
110 name_len = strlen(p) + 1;
111 StringBufferPrintf(sb, "%s\n", p);
117 * Return name service output
119 void NameServiceDump(NaClSrpcRpc *rpc,
120 NaClSrpcArg **in_args,
121 NaClSrpcArg **out_args,
122 NaClSrpcClosure *done) {
123 struct StringBuffer sb;
124 StringBufferCtor(&sb);
126 if (EnumerateNames(&sb, &ns_channel)) {
127 out_args[0]->arrays.str = strdup(sb.buffer);
128 rpc->result = NACL_SRPC_RESULT_OK;
130 rpc->result = NACL_SRPC_RESULT_APP_ERROR;
133 StringBufferDtor(&sb);
137 void ManifestTest(NaClSrpcRpc *rpc,
138 NaClSrpcArg **in_args,
139 NaClSrpcArg **out_args,
140 NaClSrpcClosure *done) {
141 struct StringBuffer sb;
145 uint32_t nbytes = sizeof buffer;
149 /* just get the descriptor for now */
150 StringBufferCtor(&sb);
151 if (NACL_SRPC_RESULT_OK !=
152 NaClSrpcInvokeBySignature(&ns_channel, NACL_NAME_SERVICE_LOOKUP,
153 "ManifestNameService", O_RDWR,
154 &status, &manifest)) {
155 fprintf(stderr, "nameservice lookup RPC failed\n");
157 StringBufferPrintf(&sb, "Got manifest descriptor %d\n", manifest);
158 if (-1 == manifest) {
159 fprintf(stderr, "nameservice lookup failed: status %d\n", status);
161 /* connect to manifest name server */
163 struct NaClSrpcChannel manifest_channel;
165 manifest_conn = imc_connect(manifest);
166 StringBufferPrintf(&sb, "got manifest connection %d\n", manifest_conn);
167 if (-1 == manifest_conn) {
168 StringBufferPrintf(&sb, "could not connect\n");
172 if (!NaClSrpcClientCtor(&manifest_channel, manifest_conn)) {
173 StringBufferPrintf(&sb, "could not build srpc client\n");
176 if (NACL_SRPC_RESULT_OK !=
177 NaClSrpcInvokeBySignature(&manifest_channel, NACL_NAME_SERVICE_LIST,
179 StringBufferPrintf(&sb, "manifest list failed\n");
182 StringBufferDiscardOutput(&sb);
183 StringBufferPrintf(&sb, "Manifest Contents:\n");
184 for (p = buffer; p - buffer < nbytes; p += name_len + 1) {
185 name_len = strlen(p);
186 StringBufferPrintf(&sb, "%.*s\n", (int) name_len, p);
190 out_args[0]->arrays.str = strdup(sb.buffer);
191 rpc->result = NACL_SRPC_RESULT_OK;
193 StringBufferDtor(&sb);
196 const struct NaClSrpcHandlerDesc srpc_methods[] = {
197 /* Export the methods as taking no arguments and returning a string. */
198 { "namedump::s", NameServiceDump },
199 { "manifest_test::s", ManifestTest },
205 int connected_socket;
207 if (!NaClSrpcModuleInit()) {
211 nacl_nameservice(&ns);
214 connected_socket = imc_connect(ns);
215 assert(-1 != connected_socket);
216 if (!NaClSrpcClientCtor(&ns_channel, connected_socket)) {
217 fprintf(stderr, "Srpc client channel ctor failed\n");
222 if (!NaClSrpcAcceptClientConnection(srpc_methods)) {
225 NaClSrpcModuleFini();