Index: src/trusted/service_runtime/nacl_resource.c |
=================================================================== |
--- src/trusted/service_runtime/nacl_resource.c (revision 0) |
+++ src/trusted/service_runtime/nacl_resource.c (revision 0) |
@@ -0,0 +1,182 @@ |
+/* |
+ * Copyright (c) 2011 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 <string.h> |
+ |
+#include "native_client/src/trusted/service_runtime/nacl_resource.h" |
+ |
+#include "native_client/src/include/nacl_base.h" |
+#include "native_client/src/include/nacl_macros.h" |
+#include "native_client/src/shared/platform/nacl_check.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" |
+#include "native_client/src/trusted/service_runtime/nacl_desc_postmessage.h" |
+#include "native_client/src/trusted/service_runtime/sel_ldr.h" |
+ |
+struct NaClDesc *NaClResourceOpen(struct NaClResource *self, |
+ char const *resource_locator, |
+ int nacl_flags, |
+ int mode) { |
+ size_t ix; |
+ size_t default_ix = ~(size_t) 0; /* greater than self->num_schemes */ |
+ size_t prefix_len; |
+ int allow_debug = 0; |
+ |
+ NaClLog(4, "NaClResourceOpen(*,\"%s\",0x%x,0x%x)\n", |
+ resource_locator, nacl_flags, mode); |
+ prefix_len = strlen(NACL_RESOURCE_DEBUG_WARNING); |
+ if (strncmp(resource_locator, NACL_RESOURCE_DEBUG_WARNING, |
+ prefix_len) == 0) { |
+ allow_debug = 1; |
+ resource_locator += prefix_len; |
+ } |
+ |
+ for (ix = 0; ix < self->num_schemes; ++ix) { |
+ if (self->schemes[ix].default_scheme) { |
+ default_ix = ix; |
+ } |
+ prefix_len = strlen(self->schemes[ix].scheme_prefix); |
+ NaClLog(4, " prefix \"%s\"\n", self->schemes[ix].scheme_prefix); |
+ if (0 == strncmp(self->schemes[ix].scheme_prefix, resource_locator, |
+ prefix_len)) { |
+ char const *rest = resource_locator + prefix_len; |
+ NaClLog(4, " prefix match at %"NACL_PRIuS", rest \"%s\".\n", ix, rest); |
+ return (*self->schemes[ix].Open)(self, rest, |
+ nacl_flags, mode, allow_debug); |
+ } |
+ } |
+ if (default_ix < self->num_schemes) { |
+ NaClLog(4, " trying default scheme %"NACL_PRIuS".\n", default_ix); |
+ return (*self->schemes[default_ix].Open)(self, resource_locator, |
+ nacl_flags, mode, allow_debug); |
+ } |
+ return NULL; |
+} |
+ |
+int NaClResourceCtor(struct NaClResource *self, |
+ struct NaClResourceSchemes const *scheme_tbl, |
+ size_t num_schemes) { |
+ self->schemes = scheme_tbl; |
+ self->num_schemes = num_schemes; |
+ return 1; |
+} |
+ |
+/* -------------------------------------------------------------------------- |
+ * |
+ * Subclass of NaClResource |
+ * |
+ * -------------------------------------------------------------------------- |
+ */ |
+ |
+int NaClResourceNaClAppCtor(struct NaClResourceNaClApp *self, |
+ struct NaClResourceSchemes const *scheme_tbl, |
+ size_t num_schemes, |
+ struct NaClApp *nap) { |
+ NaClLog(4, |
+ ("NaClResourceNaClAppCtor, scheme_tbl 0x%"NACL_PRIxPTR"," |
+ " size %"NACL_PRIuS".\n"), |
+ (uintptr_t) scheme_tbl, num_schemes); |
+ if (!NaClResourceCtor(&self->base, scheme_tbl, num_schemes)) { |
+ return 0; |
+ } |
+ self->nap = nap; |
+ return 1; |
+} |
+ |
+static struct NaClDesc *NaClResourceNaClAppFileOpen( |
+ struct NaClResource *vself, |
+ char const *resource_locator, |
+ int nacl_flags, |
+ int mode, |
+ int allow_debug) { |
+ struct NaClResourceNaClApp *self = (struct NaClResourceNaClApp *) vself; |
+ struct NaClHostDesc *hd = NULL; |
+ struct NaClDescIoDesc *did = NULL; |
+ struct NaClDesc *rv = NULL; |
+ |
+ /* |
+ * Functionality-wise, we're startup phase-independent; we can |
+ * always try to open a file; however, initialization requires that |
+ * file opens occur only early, in NACl_RESOURCE_PHASE_START. |
+ */ |
+ UNREFERENCED_PARAMETER(allow_debug); |
+ if (self->nap->resource_phase != NACL_RESOURCE_PHASE_START) { |
+ return NULL; |
+ } |
+ hd = malloc(sizeof *hd); |
+ did = malloc(sizeof *did); |
+ if (NULL == hd || NULL == did) { |
+ goto done; |
+ } |
+ if (!NaClHostDescOpen(hd, resource_locator, nacl_flags, mode)) { |
+ goto done; |
+ } |
+ if (!NaClDescIoDescCtor(did, hd)) { |
+ (void) NaClHostDescClose(hd); |
+ goto done; |
+ } |
+ hd = NULL; /* ownership passed into did */ |
+ rv = (struct NaClDesc *) did; /* success */ |
+ did = NULL; |
+ done: |
+ free(hd); |
+ free(did); |
+ return rv; |
+} |
+ |
+/* |
+ * We don't bother to make it a singleton postmessage device. Thread |
+ * safety is handled when the device object gets the lock to use the |
+ * reverse channel. |
+ */ |
+static struct NaClDesc *NaClResourceNaClAppDevOpen( |
+ struct NaClResource *vself, |
+ char const *resource_locator, |
+ int nacl_flags, |
+ int mode, |
+ int allow_debug) { |
+ struct NaClResourceNaClApp *self = (struct NaClResourceNaClApp *) vself; |
+ struct NaClDescPostMessage *ndpm = NULL; |
+ |
+ if (self->nap->resource_phase != NACL_RESOURCE_PHASE_REV_CHAN |
+ || !allow_debug) { |
+ return NULL; |
+ } |
+ |
+ if (0 == strcmp(resource_locator, NACL_RESOURCE_DEV_POSTMESSAGE_LOCATOR)) { |
+ /* disallow O_RDONLY or O_RDWR */ |
+ if ((NACL_ABI_O_ACCMODE & nacl_flags) != NACL_ABI_O_WRONLY) { |
+ return NULL; |
+ } |
+ /* allow O_CREAT, O_APPEND, and O_TRUNC */ |
+ UNREFERENCED_PARAMETER(mode); /* ignored; O_CREAT doesn't create. */ |
+ |
+ ndpm = malloc(sizeof *ndpm); |
+ CHECK(NULL != ndpm); |
+ CHECK(NaClDescPostMessageCtor(ndpm, self->nap)); |
+ } |
+ return (struct NaClDesc *) ndpm; |
+} |
+ |
+int NaClResourceNaClAppInit(struct NaClResourceNaClApp *rp, |
+ struct NaClApp *nap) { |
+ static struct NaClResourceSchemes const schemes[] = { |
+ { |
+ NACL_RESOURCE_FILE_PREFIX, |
+ 1, /* default scheme */ |
+ NaClResourceNaClAppFileOpen, |
+ }, { |
+ NACL_RESOURCE_DEV_PREFIX, |
+ 0, /* not default scheme */ |
+ NaClResourceNaClAppDevOpen, |
+ }, |
+ }; |
+ |
+ NaClLog(4, "NaClResourceNaClAppInit -- Ctor with default schemes\n"); |
+ return NaClResourceNaClAppCtor(rp, schemes, NACL_ARRAY_SIZE(schemes), nap); |
+} |
Property changes on: src/trusted/service_runtime/nacl_resource.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |