Ejemplo n.º 1
0
/* set channels field */
static void Channel(struct Manifest *manifest, char *value)
{
  char **tokens;
  char **names;
  int i;
  struct ChannelDesc *channel;

  /* allocate a new channel */
  channel = g_malloc0(sizeof *channel);
  channel->source = g_ptr_array_new();

  /* get tokens from channel description */
  tokens = g_strsplit(value, VALUE_DELIMITER, ChannelTokensNumber);

  /* TODO(d'b): fix "invalid numeric value ', 0'" bug here */
  ZLOGFAIL(tokens[ChannelTokensNumber] != NULL || tokens[PutSize] == NULL,
      EFAULT, "invalid channel tokens number");

  /* parse alias and name(s) */
  channel->alias = g_strdup(g_strstrip(tokens[Alias]));
  names = g_strsplit(tokens[Name], TOKEN_DELIMITER, MANIFEST_TOKENS_LIMIT);
  for(i = 0; names[i] != NULL; ++i)
    ParseName(names[i], channel->source);

  channel->type = ToInt(tokens[Type]);

  i = ToInt(tokens[Tag]);
  ZLOGFAIL(i != 0 && i != 1, EFAULT, "invalid channel mumeric token");

  channel->tag = i == 0 ? NULL : TagCtor();

  for(i = 0; i < LimitsNumber; ++i)
  {
    channel->limits[i] = ToInt(tokens[i + Gets]);
    ZLOGFAIL(channel->limits[i] < 0, EFAULT,
        "negative limits for %s", channel->alias);
  }

  /* append a new channel */
  g_ptr_array_add(manifest->channels, channel);
  g_strfreev(names);
  g_strfreev(tokens);
}
Ejemplo n.º 2
0
/* set mem_size and mem_tag field */
static void Memory(struct Manifest *manifest, char *value)
{
  char **tokens;
  int tag;

  /* parse value */
  tokens = g_strsplit(value, VALUE_DELIMITER, MemoryTokensNumber);
  ZLOGFAIL(tokens[MemoryTokensNumber] != NULL || tokens[MemoryTag] == NULL,
      EFAULT, "invalid memory token");

  manifest->mem_size = ToInt(tokens[MemorySize]);
  tag = ToInt(tokens[MemoryTag]);

  /* initialize manifest field */
  ZLOGFAIL(tag != 0 && tag != 1, EFAULT, "invalid memory etag token");

  manifest->mem_tag = tag == 0 ? NULL : TagCtor();
  g_strfreev(tokens);
}
Ejemplo n.º 3
0
/* parse given command line and initialize NaClApp object */
static void ParseCommandLine(struct NaClApp *nap, int argc, char **argv)
{
  int opt;
  char *manifest_name = NULL;

  /* set defaults */
  nap->skip_qualification = 0;
  nap->quit_after_load = 0;
  nap->handle_signals = 1;
  nap->storage_limit = ZEROVM_IO_LIMIT;

  /* construct zlog with default verbosity */
  ZLogCtor(LOG_ERROR);

  /* todo(d'b): revise switches and rename them */
  while((opt = getopt(argc, argv, "+FeQsSv:M:l:")) != -1)
  {
    switch(opt)
    {
      case 'M':
        manifest_name = optarg;
        break;
      case 's':
        nap->skip_validator = 1;
        ZLOG(LOG_ERROR, "validation disabled by -s");
        break;
      case 'F':
        nap->quit_after_load = 1;
        break;
      case 'e':
        TagEngineCtor();
        nap->user_tag = TagCtor();
        break;
      case 'S':
        /* d'b: disable signals handling */
        nap->handle_signals = 0;
        break;
      case 'l':
        /* calculate hard limit in Gb and don't allow it less then "big enough" */
        nap->storage_limit = ATOI(optarg) * ZEROVM_IO_LIMIT_UNIT;
        ZLOGFAIL(nap->storage_limit < ZEROVM_IO_LIMIT_UNIT, EFAULT,
            "invalid storage limit: %d", nap->storage_limit);
        break;
      case 'v':
        ZLogDtor();
        ZLogCtor(ATOI(optarg));
        break;
      case 'Q':
        nap->skip_qualification = 1;
        ZLOGS(LOG_ERROR, "PLATFORM QUALIFICATION DISABLED BY -Q - "
            "Native Client's sandbox will be unreliable!");
        break;
      default:
        ZLOGS(LOG_ERROR, "ERROR: unknown option: [%c]", opt);
        puts(HELP_SCREEN);
        exit(EINVAL);
        break;
    }
  }

  /* show zerovm command line */
  ZVMCommandLine(argc, argv);

  /* parse manifest file specified in cmdline */
  if(manifest_name == NULL)
  {
    puts(HELP_SCREEN);
    exit(EINVAL);
  }
  ZLOGFAIL(ManifestCtor(manifest_name), EFAULT, "Invalid manifest '%s'", manifest_name);

  /* set available nap and manifest fields */
  assert(nap->system_manifest != NULL);
  nap->system_manifest->nexe = GetValueByKey("Nexe");
  ZLOGFAIL(GetFileSize(nap->system_manifest->nexe) < 0, ENOENT, "nexe open error");
  syscallback = 0;
}