Ejemplo n.º 1
0
int main(void) {
  int ns;
  int connected_socket;

  if (!NaClSrpcModuleInit()) {
    return 1;
  }
  ns = -1;
  nacl_nameservice(&ns);
  assert(-1 != ns);

  connected_socket = imc_connect(ns);
  assert(-1 != connected_socket);
  if (!NaClSrpcClientCtor(&ns_channel, connected_socket)) {
    fprintf(stderr, "Srpc client channel ctor failed\n");
    return 1;
  }
  close(ns);

  if (!NaClSrpcAcceptClientConnection(srpc_methods)) {
    return 1;
  }
  NaClSrpcModuleFini();
  return 0;
}
Ejemplo n.º 2
0
static int get_manifest_channel_locked(struct NaClSrpcChannel **result) {
  int status;
  int manifest;
  int manifest_conn;
  if (manifest_channel_initialized) {
    *result = &manifest_channel;
    return 0;
  }
  *result = NULL;

  status = irt_nameservice_lookup("ManifestNameService", O_RDWR, &manifest);
  if (NACL_NAME_SERVICE_SUCCESS != status) {
    print_error("ManifestNameService lookup failed\n");
    return EIO;
  }

  if (-1 == manifest) {
    print_error("Manifest descriptor is invalid\n");
    return EIO;
  }
  manifest_conn = imc_connect(manifest);
  close(manifest);
  if (-1 == manifest_conn) {
    print_error("Can't connect to manifest service\n");
    return EIO;
  }
  if (!NaClSrpcClientCtor(&manifest_channel, manifest_conn)) {
    print_error("Can't create manifest srpc channel\n");
    return EIO;
  }
  *result = &manifest_channel;
  manifest_channel_initialized = 1;
  return 0;
}
Ejemplo n.º 3
0
unsigned long get_good_seed(void) {
  int               ns;
  int               connected_socket;
  NaClSrpcChannel   ns_channel;
  NaClSrpcError     rpc_result;
  int               status;
  int               rng;
  unsigned long     seed;

  ns = -1;
  if (-1 == nacl_nameservice(&ns)) {
    fprintf(stderr, "nacl_nameservice failed\n");
    abort();
  }
  connected_socket = imc_connect(ns);
  assert(-1 != connected_socket);
  if (!NaClSrpcClientCtor(&ns_channel, connected_socket)) {
    fprintf(stderr, "SRPC client channel ctor failed\n");
    abort();
  }
  (void) close(ns);

  rpc_result = NaClSrpcInvokeBySignature(&ns_channel,
                                         NACL_NAME_SERVICE_LOOKUP,
                                         "SecureRandom", O_RDONLY,
                                         &status, &rng);
  assert(NACL_SRPC_RESULT_OK == rpc_result);
  assert(NACL_NAME_SERVICE_SUCCESS == status);
  assert(sizeof seed == read(rng, &seed, sizeof seed));
  close(rng);
  NaClSrpcDtor(&ns_channel);

  return seed;
}
Ejemplo n.º 4
0
void test_imc_connect_with_no_acceptor(void) {
  int bound_pair[2];
  int rc;
  rc = imc_makeboundsock(bound_pair);
  assert(rc == 0);

  printf("Test imc_connect() when BoundSocket has been dropped...\n");
  checked_close(bound_pair[0]);

  rc = imc_connect(bound_pair[1]);
  assert(rc == -1);
  assert(errno == EIO);
  checked_close(bound_pair[1]);
}
Ejemplo n.º 5
0
void ManifestTest(NaClSrpcRpc *rpc,
                  NaClSrpcArg **in_args,
                  NaClSrpcArg **out_args,
                  NaClSrpcClosure *done) {
  struct StringBuffer     sb;
  NaClSrpcError           rpc_result;
  int                     status;
  int                     manifest;
  int                     manifest_conn;
  struct NaClSrpcChannel  manifest_channel;

  /* just get the descriptor for now */
  StringBufferCtor(&sb);
  if (NACL_SRPC_RESULT_OK !=
      (rpc_result =
       NaClSrpcInvokeBySignature(&ns_channel, NACL_NAME_SERVICE_LOOKUP,
                                 "ManifestNameService", O_RDWR,
                                 &status, &manifest))) {
    StringBufferPrintf(&sb, "nameservice lookup RPC failed (%d)\n", rpc_result);
    goto done;
  }
  StringBufferPrintf(&sb, "Got manifest descriptor %d\n", manifest);
  if (-1 == manifest) {
    fprintf(stderr, "nameservice lookup failed, status %d\n", status);
    goto done;
  }
  /* connect to manifest name server */

  manifest_conn = imc_connect(manifest);
  StringBufferPrintf(&sb, "got manifest connection %d\n", manifest_conn);
  if (-1 == manifest_conn) {
    StringBufferPrintf(&sb, "could not connect\n");
    goto done;
  }
  close(manifest);
  if (!NaClSrpcClientCtor(&manifest_channel, manifest_conn)) {
    StringBufferPrintf(&sb, "could not build srpc client\n");
    goto done;
  }
  StringBufferDiscardOutput(&sb);
  StringBufferPrintf(&sb, "ManifestTest: basic connectivity ok\n");

 done:
  out_args[0]->arrays.str = strdup(sb.buffer);
  rpc->result = NACL_SRPC_RESULT_OK;
  done->Run(done);
  StringBufferDtor(&sb);
}
Ejemplo n.º 6
0
void connect_and_accept(int boundsock_fd, int sockaddr_fd,
                        int *result_fd1, int *result_fd2) {
  struct accept_thread_args args = { -1, -1 };
  pthread_t tid;

  /* TODO(mseaborn): Use of a thread here is necessary on Windows, but
     not on Linux or Mac OS X.  See
     http://code.google.com/p/nativeclient/issues/detail?id=692 */
  args.boundsock_fd = boundsock_fd;
  pthread_create(&tid, NULL, accept_thread, &args);

  *result_fd1 = imc_connect(sockaddr_fd);
  assert(*result_fd1 >= 0);

  pthread_join(tid, NULL);
  *result_fd2 = args.result_fd;
  assert(*result_fd2 >= 0);
}
Ejemplo n.º 7
0
int main(void) {
  int ns;
  NaClSrpcChannel channel;
  int connected_socket;
  int status;
  int rng;

  if (!NaClSrpcModuleInit()) {
    fprintf(stderr, "srpc module init failed\n");
    return 1;
  }
  printf("Hello world\n");
  ns = -1;
  nacl_nameservice(&ns);
  printf("ns = %d\n", ns);
  assert(-1 != ns);

  connected_socket = imc_connect(ns);
  assert(-1 != connected_socket);
  if (!NaClSrpcClientCtor(&channel, connected_socket)) {
    fprintf(stderr, "Srpc client channel ctor failed\n");
    return 1;
  }
  printf("NaClSrpcClientCtor succeeded\n");
  if (!EnumerateNames(&channel)) {
    fprintf(stderr, "Could not enumerate names\n");
    return 1;
  }
  printf("EnumerateNames succeeded\n");
  if (NACL_SRPC_RESULT_OK !=
      NaClSrpcInvokeBySignature(&channel, NACL_NAME_SERVICE_LOOKUP,
                                "SecureRandom", O_RDONLY, &status, &rng)) {
    fprintf(stderr, "nameservice lookup failed, status %d\n", status);
    return 1;
  }
  printf("rpc status %d\n", status);
  assert(NACL_NAME_SERVICE_SUCCESS == status);
  printf("rng descriptor %d\n", rng);

  dump_output(rng, RNG_OUTPUT_BYTES);

  return 0;
}
Ejemplo n.º 8
0
int main(int ac, char **av) {
  int                         opt;
  char const                  *message = NULL;
  char const                  *message2 = NULL;
  int                         server = 0;
  int                         client_desc = -1;
  int                         channel;
  int                         sockaddrd;  /* socket address descriptor */
  int                         subchannel;
  int                         rv;
  char                        data_buffer[4096];
  int                         desc_buffer[NACL_ABI_IMC_USER_DESC_MAX];
  size_t                      i;
  unsigned long               loop_iter = 1;
  unsigned int                sleep_seconds = 0;

  while (EOF != (opt = getopt(ac, av, "c:l:m:M:sS:t:v"))) {
    switch (opt) {
      case 'c':
        client_desc = strtol(optarg, (char **) 0, 0);
        /* descriptor holds a connection capability for the server */
        break;
      case 'l':
        loop_iter = strtoul(optarg, (char **) 0, 0);
        break;
      case 'm':
        message = optarg;
        break;
      case 'M':
        message2 = optarg;
        break;
      case 's':
        server = 1;
        break;
      case 'S':
        sleep_seconds = strtoul(optarg, (char **) 0, 0);
        break;
      default:
        fprintf(stderr,
                ("Usage: sel_ldr [sel_ldr_args] -- "  /* no newline */
                 "nrd_xfer_test2.nexe [-c server-addr-desc] [-s]\n"
                 "    [-l loop_count] [-S server-sleep-sec]\n"
                 "\n"
                 "Typically, server is run using a command such as\n"
                 "\n"
                 "    sel_ldr -X -1 -D 1 -f nrd_xfer_test2.nexe -- -s\n"
                 "\n"
                 "so the socket address is printed to standard output,\n"
                 "and then the client is run with a command such as\n"
                 "\n"
                 "    sel_ldr -X -1 -a 6:<addr-from-server> " /* no \n */
                 "-- nrd_xfer_test_nacl.nexe -c 6\n"
                 "\n"
                 "to have descriptor 6 be used to represent the socket\n"
                 "address for connecting to the server\n"));
        return 1;
    }
  }

  for (i = 0; i < sizeof desc_buffer / sizeof desc_buffer[0]; ++i) {
    desc_buffer[i] = -1;
  }

  if (server) {
    message = (NULL != message) ? message
        : "\"Hello world!\", from server\n";
    message2 = (NULL != message2) ? message2
        : "SERVER MSG2";
  } else {
    message = (NULL != message) ? message
        : "Client connect request\n";
    message2 = (NULL != message2) ? message2
        :"\"Goodbye cruel world!\", from client\n";
  }

  if (server) {
    int       pair[2];
    pthread_t thr;
    int       err;

    printf("Accepting a client connection...\n");
    channel = imc_accept(3);
    printf("...got channel descriptor %d\n", channel);
    do {

      rv = recv_imc_msg(channel, data_buffer, sizeof data_buffer, NULL);
      printf("Receive returned %d\n", rv);

      if (-1 == rv) {
        fprintf(stderr, "imc_recvmsg failed\n");
        return 1;
      }
      printf("Data bytes: %.*s\n", rv, data_buffer);

      /* send a reply */
      if (-1 == imc_makeboundsock(pair)) {
        fprintf(stderr, "imc_socketpair failed, errno %d\n", errno);
        return 2;
      }
      /*
       * send pair[1], the addr, to peer as reply.
       */
      send_imc_msg(channel, "sockaddr", pair[1]);
      err = pthread_create(&thr, NULL, worker_thread, (void *) pair[0]);
      if (0 != err) {
        fprintf(stderr, "pthread_create failed, returned %d\n", err);
        return 4;
      }

      pthread_detach(thr);

      if (-1 == close(pair[1])) {
        fprintf(stderr, "close of socketpair half failed\n");
      }

      if (0 != sleep_seconds) {
        printf("sleeping for %d seconds...\n", sleep_seconds);
        sleep(sleep_seconds);
      }
    } while (--loop_iter > 0);

    if (-1 == close(channel)) {
      fprintf(stderr, "close of channel %d failed\n", channel);
    }
  } else {
    if (-1 == client_desc) {
      fprintf(stderr,
              "Client needs server socket address to which to connect\n");
      return 100;
    }

    channel = imc_connect(client_desc);

    printf("Connect returned %d\n", channel);

    if (-1 == channel) {
      fprintf(stderr, "Client could not connect, errno %d\n", errno);
      return 101;
    }

    do {
      send_imc_msg(channel, message, -1);
      rv = recv_imc_msg(channel, data_buffer, sizeof data_buffer, &sockaddrd);

      printf("start RPC reply returned socket addr desc %d\n", sockaddrd);
      if (-1 == sockaddrd) {
        fprintf(stderr, "connect failed, errno %d\n", errno);
        return 106;
      }

      subchannel = imc_connect(sockaddrd);

      if (-1 == subchannel) {
        printf("Connect for client-specific socket failed: errno %d\n", errno);
        return 107;
      }

      if (-1 == close(sockaddrd)) {
        fprintf(stderr, "close of %d sockaddr failed, errno %d\n",
                sockaddrd, errno);
      }

      send_imc_msg(subchannel, message2, -1);
      if (-1 == (rv = recv_imc_msg(subchannel, data_buffer, sizeof data_buffer,
                                   NULL))) {
        fprintf(stderr, "receive from worker thread failed, errno %d\n",
                errno);
        return 108;
      }
      /* let's not trust server to NUL terminate */
      data_buffer[sizeof data_buffer - 1] = '\0';
      printf("reply: %s\n", data_buffer);

      if (-1 == close(subchannel)) {
        fprintf(stderr, "close of subchannel %d failed\n", subchannel);
      }
    } while (--loop_iter > 0);

    if (-1 == close(channel)) {
      fprintf(stderr, "close of %d (channel) failed\n", channel);
    }
  }
  return 0;
}
Ejemplo n.º 9
0
void NaClPluginLowLevelInitializationCompleteInternal(void) {
    int                     nameservice_conn_desc;
    int                     kernel_service_conn_cap_desc = -1;
    int                     kernel_service_desc;
    struct NaClSrpcChannel  srpc_channel;
    int                     status;

    NaClLog(4, "Entered NaClPluginLowLevelInitializationComplete\n");

    if (-1 != gNaClNameServiceConnCapDesc) {
        NaClLog(LOG_ERROR,
                "Double call to NaClPluginLowLevelInitializationComplete?\n");
        return;
    }
    /*
     * The existence of the bootstrap nameservice is independent of
     * whether NaCl is running as a standalone application or running as
     * a untrusted Pepper plugin, browser extension environment.
     */
    if (-1 == nacl_nameservice(&gNaClNameServiceConnCapDesc)) {
        NaClLog(LOG_FATAL,
                "NaClPluginLowLevelInitializationComplete: no name service?!?\n");
    }

    nameservice_conn_desc = imc_connect(gNaClNameServiceConnCapDesc);
    if (-1 == nameservice_conn_desc) {
        NaClLog(LOG_FATAL,
                "Could not connect to bootstrap name service\n");
    }
    if (!NaClSrpcClientCtor(&srpc_channel, nameservice_conn_desc)) {
        (void) close(nameservice_conn_desc);
        NaClLog(LOG_FATAL, "SRPC channel ctor to name service failed\n");
    }
    if (NACL_SRPC_RESULT_OK != NaClSrpcInvokeBySignature(
                &srpc_channel,
                NACL_NAME_SERVICE_LOOKUP,
                "KernelService",
                O_RDWR,
                &status,
                &kernel_service_conn_cap_desc)) {
        NaClSrpcDtor(&srpc_channel);
        NaClLog(LOG_FATAL, "Name service lookup RPC for KernelService failed\n");
    }
    NaClSrpcDtor(&srpc_channel);
    if (-1 == kernel_service_conn_cap_desc) {
        NaClLog(LOG_FATAL, "Name service lookup for KernelService failed, %d\n",
                status);
    }
    if (-1 == (kernel_service_desc = imc_connect(kernel_service_conn_cap_desc))) {
        (void) close(kernel_service_conn_cap_desc);
        NaClLog(LOG_FATAL, "Connect to KernelService failed\n");
    }
    (void) close(kernel_service_conn_cap_desc);
    if (!NaClSrpcClientCtor(&srpc_channel, kernel_service_desc)) {
        (void) close(kernel_service_desc);
        NaClLog(LOG_FATAL, "SRPC channel ctor to KernelService failed\n");
    }
    if (NACL_SRPC_RESULT_OK != NaClSrpcInvokeBySignature(
                &srpc_channel,
                NACL_KERNEL_SERVICE_INITIALIZATION_COMPLETE)) {
        NaClLog(LOG_FATAL, "KernelService init_done RPC failed!\n");
    }
    NaClSrpcDtor(&srpc_channel);
}