1 : /*
2 : * Copyright (c) 2012 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 : /*
8 : * Subclass of NaClDesc which passes write output data to the browser
9 : * using the reverse channel, to (eventually) show up as PostMessage
10 : * data.
11 : *
12 : * A NaClDescPostMessage object pretends to be a character device, so
13 : * that I/O packages that fstat to determine buffering strategy will
14 : * work correctly. The only other syscall that it implements is
15 : * write, and the data is sent through the reverse channel interface
16 : * to the browser's JavaScript environment.
17 : */
18 :
19 : #include <string.h>
20 :
21 : #include "native_client/src/trusted/service_runtime/nacl_desc_postmessage.h"
22 :
23 : #include "native_client/src/shared/platform/nacl_check.h"
24 : #include "native_client/src/shared/platform/nacl_sync.h"
25 : #include "native_client/src/shared/platform/nacl_sync_checked.h"
26 : #include "native_client/src/trusted/reverse_service/reverse_control_rpc.h"
27 : #include "native_client/src/trusted/service_runtime/include/sys/errno.h"
28 : #include "native_client/src/trusted/service_runtime/include/sys/stat.h"
29 : #include "native_client/src/trusted/service_runtime/nacl_runtime_host_interface.h"
30 : #include "native_client/src/trusted/service_runtime/sel_ldr.h"
31 :
32 :
33 : static struct NaClDescVtbl const kNaClDescPostMessageVtbl; /* fwd */
34 :
35 0 : int NaClDescPostMessageCtor(struct NaClDescPostMessage *self,
36 0 : struct NaClRuntimeHostInterface *runtime_host) {
37 0 : NaClLog(4, "Entered NaClDescPostMessageCtor\n");
38 0 : NACL_VTBL(NaClRefCount, self) = (struct NaClRefCountVtbl const *) NULL;
39 0 : if (!NaClDescCtor(&self->base)) {
40 0 : NaClLog(4, "Leaving NaClDescPostMessageCtor: failed\n");
41 0 : return 0;
42 : }
43 : self->runtime_host = (struct NaClRuntimeHostInterface *)
44 0 : NaClRefCountRef((struct NaClRefCount *) runtime_host);
45 0 : NACL_VTBL(NaClRefCount, self) =
46 : (struct NaClRefCountVtbl const *) &kNaClDescPostMessageVtbl;
47 0 : NaClLog(4, " Write vfptr = %"NACL_PRIxPTR"\n",
48 : (uintptr_t) NACL_VTBL(NaClDesc, self)->Write);
49 0 : NaClLog(4, "Leaving NaClDescPostMessageCtor: success\n");
50 0 : return 1;
51 0 : }
52 :
53 0 : static void NaClDescPostMessageDtor(struct NaClRefCount *vself) {
54 0 : struct NaClDescPostMessage *self = (struct NaClDescPostMessage *) vself;
55 :
56 0 : NaClLog(4, "Entered NaClDescPostMessageDtor\n");
57 :
58 0 : NaClRefCountUnref((struct NaClRefCount *) self->runtime_host);
59 :
60 0 : NACL_VTBL(NaClRefCount, vself) =
61 : (struct NaClRefCountVtbl const *) &kNaClDescVtbl;
62 0 : (*NACL_VTBL(NaClRefCount, vself)->Dtor)(vself);
63 0 : NaClLog(4, "Leaving NaClDescPostMessageDtor\n");
64 0 : }
65 :
66 0 : static ssize_t NaClDescPostMessageWrite(struct NaClDesc *vself,
67 0 : void const *buf,
68 0 : size_t len) {
69 0 : struct NaClDescPostMessage *self = (struct NaClDescPostMessage *) vself;
70 0 : ssize_t num_written = 0;
71 :
72 0 : NaClLog(4, "Entered NaClDescPostMessageWrite(..., %"NACL_PRIuS")\n", len);
73 0 : num_written = (*NACL_VTBL(NaClRuntimeHostInterface, self->runtime_host)->
74 : PostMessage)(self->runtime_host, buf, len);
75 0 : NaClLog(4, "Leaving NaClDescPostMessageWrite:"
76 : " num_written %"NACL_PRIuS"\n", (size_t) num_written);
77 0 : return num_written;
78 : }
79 :
80 0 : static int NaClDescPostMessageFstat(struct NaClDesc *vself,
81 0 : struct nacl_abi_stat *statbuf) {
82 0 : UNREFERENCED_PARAMETER(vself);
83 :
84 0 : memset(statbuf, 0, sizeof *statbuf);
85 0 : statbuf->nacl_abi_st_ino = NACL_FAKE_INODE_NUM;
86 0 : statbuf->nacl_abi_st_mode = (NACL_ABI_S_IFCHR | NACL_ABI_S_IWUSR);
87 0 : statbuf->nacl_abi_st_nlink = 1;
88 0 : statbuf->nacl_abi_st_uid = -1;
89 0 : statbuf->nacl_abi_st_gid = -1;
90 0 : return 0;
91 : }
92 :
93 : static struct NaClDescVtbl const kNaClDescPostMessageVtbl = {
94 : {
95 : NaClDescPostMessageDtor,
96 : },
97 : NaClDescMapNotImplemented,
98 : NACL_DESC_UNMAP_NOT_IMPLEMENTED
99 : NaClDescReadNotImplemented,
100 : NaClDescPostMessageWrite,
101 : NaClDescSeekNotImplemented,
102 : NaClDescPReadNotImplemented,
103 : NaClDescPWriteNotImplemented,
104 : NaClDescPostMessageFstat,
105 : NaClDescGetdentsNotImplemented,
106 : NaClDescExternalizeSizeNotImplemented,
107 : NaClDescExternalizeNotImplemented,
108 : NaClDescLockNotImplemented,
109 : NaClDescTryLockNotImplemented,
110 : NaClDescUnlockNotImplemented,
111 : NaClDescWaitNotImplemented,
112 : NaClDescTimedWaitAbsNotImplemented,
113 : NaClDescSignalNotImplemented,
114 : NaClDescBroadcastNotImplemented,
115 : NaClDescSendMsgNotImplemented,
116 : NaClDescRecvMsgNotImplemented,
117 : NaClDescLowLevelSendMsgNotImplemented,
118 : NaClDescLowLevelRecvMsgNotImplemented,
119 : NaClDescConnectAddrNotImplemented,
120 : NaClDescAcceptConnNotImplemented,
121 : NaClDescPostNotImplemented,
122 : NaClDescSemWaitNotImplemented,
123 : NaClDescGetValueNotImplemented,
124 : NaClDescSetMetadata,
125 : NaClDescGetMetadata,
126 : NaClDescSetFlags,
127 : NaClDescGetFlags,
128 : NaClDescIsattyNotImplemented,
129 : NACL_DESC_DEVICE_POSTMESSAGE,
130 : };
|