1 : /*
2 : * Copyright (c) 2014 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.
5 : */
6 :
7 : #include "native_client/src/trusted/desc/nacl_desc_file_info.h"
8 :
9 : #include "native_client/src/include/portability.h"
10 : #include "native_client/src/public/desc_metadata_types.h"
11 : #include "native_client/src/public/nacl_file_info.h"
12 : #include "native_client/src/shared/platform/nacl_log.h"
13 : #include "native_client/src/trusted/desc/nacl_desc_base.h"
14 : #include "native_client/src/trusted/desc/nacl_desc_io.h"
15 : #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h"
16 :
17 :
18 2 : int NaClDescSetFileToken(struct NaClDesc *desc,
19 2 : struct NaClFileToken const *token) {
20 2 : int error = (*NACL_VTBL(NaClDesc, desc)->
21 : SetMetadata)(desc,
22 : NACL_DESC_METADATA_FILE_TOKEN_TYPE,
23 : sizeof *token, (uint8_t const *) token);
24 2 : if (0 != error) {
25 0 : NaClLog(4, "NaClDescSetFileToken: failed, errno %d\n", -error);
26 0 : return 0;
27 : }
28 2 : return 1;
29 2 : }
30 :
31 270 : int NaClDescGetFileToken(struct NaClDesc *desc,
32 270 : struct NaClFileToken *out_token) {
33 270 : int32_t metadata_type;
34 270 : uint32_t metadata_bytes;
35 :
36 270 : metadata_bytes = (uint32_t) sizeof *out_token;
37 270 : metadata_type = (*NACL_VTBL(NaClDesc, desc)->
38 : GetMetadata)(desc, &metadata_bytes,
39 : (uint8_t *) out_token);
40 270 : if (NACL_DESC_METADATA_NONE_TYPE == metadata_type) {
41 268 : NaClLog(4, "NaClDescGetFileToken: no meta data, cannot map\n");
42 268 : return 0;
43 2 : } else if (NACL_DESC_METADATA_FILE_TOKEN_TYPE != metadata_type) {
44 0 : return 0;
45 2 : } else if (metadata_bytes != (uint32_t) sizeof *out_token) {
46 : /* there is supposed to be a file token, but wrong size? */
47 0 : NaClLog(LOG_WARNING,
48 : "NaClDescGetFileToken: purported file token present,"
49 : " but token size is incorrect.\n");
50 0 : return 0;
51 : }
52 2 : NaClLog(4,
53 : "NaClDescGetFileToken: got token 0x%"NACL_PRIx64":%"NACL_PRIx64"\n",
54 : out_token->hi, out_token->lo);
55 2 : return 1;
56 270 : }
57 :
58 4 : struct NaClDesc *NaClDescIoFromFileInfo(struct NaClFileInfo info,
59 4 : int mode) {
60 4 : struct NaClDesc *desc = NaClDescIoDescFromDescAllocCtor(
61 : info.desc, mode);
62 4 : if (NULL == desc) {
63 0 : return NULL;
64 : }
65 4 : if (NaClFileTokenIsValid(&info.file_token)) {
66 2 : if (!NaClDescSetFileToken(desc, &info.file_token)) {
67 0 : NaClDescSafeUnref(desc);
68 0 : return NULL;
69 : }
70 2 : }
71 4 : return desc;
72 4 : }
|