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..4a2be496430241c7282a5c839628d6830a80b90a |
--- /dev/null |
+++ b/src/trusted/desc/nacl_desc_file_info.c |
@@ -0,0 +1,73 @@ |
+/* |
+ * 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; |
+ error = (*NACL_VTBL(NaClDesc, desc)-> |
Mark Seaborn
2014/05/15 00:36:10
Nit: Combine with "int error"
jvoung (off chromium)
2014/05/16 18:02:05
Done.
|
+ 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 = NaClDescIoDescFromHandleAllocCtor( |
Mark Seaborn
2014/05/15 00:36:10
Nit: use " *" spacing
jvoung (off chromium)
2014/05/16 18:02:05
Done.
|
+ (NaClHandle)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; |
+} |