| Index: src/trusted/desc/nacl_desc_file_info.c
|
| diff --git a/src/trusted/desc/nacl_desc_file_info.c b/src/trusted/desc/nacl_desc_file_info.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..57e2b48a58b7ed3c0e86702cfdfae2f7a161201f
|
| --- /dev/null
|
| +++ b/src/trusted/desc/nacl_desc_file_info.c
|
| @@ -0,0 +1,72 @@
|
| +/*
|
| + * Copyright (c) 2014 The Native Client Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "native_client/src/trusted/desc/nacl_desc_file_info.h"
|
| +
|
| +#include "native_client/src/include/portability.h"
|
| +#include "native_client/src/public/desc_metadata_types.h"
|
| +#include "native_client/src/public/nacl_file_info.h"
|
| +#include "native_client/src/shared/platform/nacl_log.h"
|
| +#include "native_client/src/trusted/desc/nacl_desc_base.h"
|
| +#include "native_client/src/trusted/desc/nacl_desc_io.h"
|
| +#include "native_client/src/trusted/service_runtime/include/sys/fcntl.h"
|
| +
|
| +
|
| +int NaClDescSetFileToken(struct NaClDesc *desc,
|
| + struct NaClFileToken const *token) {
|
| + int error = (*NACL_VTBL(NaClDesc, desc)->
|
| + SetMetadata)(desc,
|
| + NACL_DESC_METADATA_FILE_TOKEN_TYPE,
|
| + sizeof *token, (uint8_t const *) token);
|
| + if (0 != error) {
|
| + NaClLog(4, "NaClDescSetFileToken: failed, errno %d\n", -error);
|
| + return 0;
|
| + }
|
| + return 1;
|
| +}
|
| +
|
| +int NaClDescGetFileToken(struct NaClDesc *desc,
|
| + struct NaClFileToken *out_token) {
|
| + int32_t metadata_type;
|
| + uint32_t metadata_bytes;
|
| +
|
| + metadata_bytes = (uint32_t) sizeof *out_token;
|
| + metadata_type = (*NACL_VTBL(NaClDesc, desc)->
|
| + GetMetadata)(desc, &metadata_bytes,
|
| + (uint8_t *) out_token);
|
| + if (NACL_DESC_METADATA_NONE_TYPE == metadata_type) {
|
| + NaClLog(4, "NaClDescGetFileToken: no meta data, cannot map\n");
|
| + return 0;
|
| + } else if (NACL_DESC_METADATA_FILE_TOKEN_TYPE != metadata_type) {
|
| + return 0;
|
| + } else if (metadata_bytes != (uint32_t) sizeof *out_token) {
|
| + /* there is supposed to be a file token, but wrong size? */
|
| + NaClLog(LOG_WARNING,
|
| + "NaClDescGetFileToken: purported file token present,"
|
| + " but token size is incorrect.\n");
|
| + return 0;
|
| + }
|
| + NaClLog(4,
|
| + "NaClDescGetFileToken: got token 0x%"NACL_PRIx64":%"NACL_PRIx64"\n",
|
| + out_token->hi, out_token->lo);
|
| + return 1;
|
| +}
|
| +
|
| +struct NaClDesc *NaClDescIoFromFileInfo(struct NaClFileInfo info,
|
| + int mode) {
|
| + struct NaClDesc *desc = NaClDescIoDescFromDescAllocCtor(
|
| + info.desc, mode);
|
| + if (NULL == desc) {
|
| + return NULL;
|
| + }
|
| + if (NaClFileTokenIsValid(&info.file_token)) {
|
| + if (!NaClDescSetFileToken(desc, &info.file_token)) {
|
| + NaClDescSafeUnref(desc);
|
| + return NULL;
|
| + }
|
| + }
|
| + return desc;
|
| +}
|
|
|