/* set timeout. by design timeout must be specified in manifest */ static void SetTimeout(struct SystemManifest *policy) { struct rlimit rl; assert(policy != NULL); GET_INT_BY_KEY(policy->timeout, MFT_TIMEOUT); ZLOGFAIL(policy->timeout < 1, EFAULT, "invalid or absent timeout"); rl.rlim_cur = policy->timeout; rl.rlim_max = -1; setrlimit(RLIMIT_CPU, &rl); ZLOGFAIL(setrlimit(RLIMIT_CPU, &rl) != 0, errno, "cannot set timeout"); }
/* construct system_manifest object and initialize it from manifest */ void SystemManifestCtor(struct NaClApp *nap) { struct SystemManifest *policy; /* check for design errors */ assert(nap != NULL); assert(nap->system_manifest != NULL); policy = nap->system_manifest; policy->syscallback = 0; /* get zerovm settings from manifest */ policy->version = GetValueByKey("Version"); policy->nexe_etag = GetValueByKey("NexeEtag"); /* check mandatory manifest keys */ ZLOGFAIL(nap->system_manifest->version == NULL, EFAULT, "the manifest version is not provided"); ZLOGFAIL(STRCMP(nap->system_manifest->version, MANIFEST_VERSION), EFAULT, "manifest version not supported"); SetTimeout(policy); /* user data (environment, command line) */ policy->envp = NULL; SetCustomAttributes(policy); /* prepare command line arguments for nexe */ policy->cmd_line = NULL; policy->cmd_line_size = 0; SetCommandLine(policy); /* get node name and id */ SetNodeName(nap); /* construct and initialize all channels */ ChannelsCtor(nap); /* * allocate "whole memory chunk" if specified. should be the last allocation * in raw because after chunk allocated there will be no free user memory * note: will set "heap_ptr" */ GET_INT_BY_KEY(nap->heap_end, "MemMax"); PreallocateUserMemory(nap); /* zerovm return code */ nap->system_manifest->ret_code = OK_CODE; }