1 : /*
2 : * Copyright (c) 2009 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 : * NaCl Service Runtime. I/O Descriptor / Handle abstraction.
9 : */
10 :
11 : #include <stdlib.h>
12 : #include <string.h>
13 : #include <errno.h>
14 :
15 : #include "native_client/src/include/portability.h"
16 :
17 : #include "native_client/src/trusted/desc/nacl_desc_base.h"
18 : #include "native_client/src/trusted/desc/nacl_desc_sync_socket.h"
19 : #include "native_client/src/trusted/desc/nacl_desc_imc.h"
20 :
21 : #include "native_client/src/shared/platform/nacl_log.h"
22 : #include "native_client/src/shared/platform/nacl_sync.h"
23 : #include "native_client/src/shared/platform/nacl_sync_checked.h"
24 :
25 : #if NACL_WINDOWS
26 : # include "native_client/src/shared/platform/win/xlate_system_error.h"
27 : #endif
28 :
29 : #include "native_client/src/trusted/service_runtime/include/sys/errno.h"
30 : #include "native_client/src/trusted/service_runtime/include/sys/stat.h"
31 :
32 : /*
33 : * This file contains the implementation of the NaClDescSyncSocket
34 : * subclass of NaClDesc.
35 : *
36 : * NaClDescSyncSocket is the subclass that wraps base::SyncSocket descriptors.
37 : */
38 :
39 : static struct NaClDescVtbl const kNaClDescSyncSocketVtbl; /* fwd */
40 :
41 : int NaClDescSyncSocketCtor(struct NaClDescSyncSocket *self,
42 0 : NaClHandle h) {
43 : int retval;
44 0 : retval = NaClDescCtor(&self->base);
45 0 : if (!retval) {
46 0 : return 0;
47 : }
48 :
49 0 : self->h = h;
50 0 : self->base.base.vtbl =
51 : (struct NaClRefCountVtbl const *) &kNaClDescSyncSocketVtbl;
52 :
53 0 : return retval;
54 : }
55 :
56 0 : static void NaClDescSyncSocketDtor(struct NaClRefCount *vself) {
57 0 : struct NaClDescSyncSocket *self = ((struct NaClDescSyncSocket *) vself);
58 :
59 0 : (void) NaClClose(self->h);
60 0 : self->h = NACL_INVALID_HANDLE;
61 0 : vself->vtbl = (struct NaClRefCountVtbl const *) &kNaClDescVtbl;
62 0 : (*vself->vtbl->Dtor)(vself);
63 0 : }
64 :
65 : static int NaClDescSyncSocketFstat(struct NaClDesc *vself,
66 0 : struct nacl_abi_stat *statbuf) {
67 : UNREFERENCED_PARAMETER(vself);
68 :
69 0 : memset(statbuf, 0, sizeof *statbuf);
70 0 : statbuf->nacl_abi_st_mode = NACL_ABI_S_IFDSOCK;
71 0 : return 0;
72 : }
73 :
74 : static ssize_t NaClDescSyncSocketRead(struct NaClDesc *vself,
75 : void *buf,
76 0 : size_t len) {
77 0 : struct NaClDescSyncSocket *self = (struct NaClDescSyncSocket *) vself;
78 :
79 0 : return NaClDescReadFromHandle(self->h, buf, len);
80 : }
81 :
82 : static ssize_t NaClDescSyncSocketWrite(struct NaClDesc *vself,
83 : void const *buf,
84 0 : size_t len) {
85 0 : struct NaClDescSyncSocket *self = (struct NaClDescSyncSocket *) vself;
86 :
87 0 : return NaClDescWriteToHandle(self->h, buf, len);
88 : }
89 :
90 :
91 : static int NaClDescSyncSocketExternalizeSize(struct NaClDesc *vself,
92 : size_t *nbytes,
93 0 : size_t *nhandles) {
94 : UNREFERENCED_PARAMETER(vself);
95 0 : NaClLog(4, "Entered NaClDescSyncSocketExternalizeSize\n");
96 0 : *nbytes = 0;
97 0 : *nhandles = 1;
98 :
99 0 : return 0;
100 : }
101 :
102 : static int NaClDescSyncSocketExternalize(struct NaClDesc *vself,
103 0 : struct NaClDescXferState *xfer) {
104 0 : struct NaClDescSyncSocket *self = ((struct NaClDescSyncSocket *) vself);
105 :
106 0 : NaClLog(4, "Entered NaClDescSyncSocketExternalize\n");
107 0 : *xfer->next_handle++ = self->h;
108 0 : return 0;
109 : }
110 :
111 :
112 : static struct NaClDescVtbl const kNaClDescSyncSocketVtbl = {
113 : {
114 : NaClDescSyncSocketDtor,
115 : },
116 : NaClDescMapNotImplemented,
117 : NaClDescUnmapUnsafeNotImplemented,
118 : NaClDescUnmapNotImplemented,
119 : NaClDescSyncSocketRead,
120 : NaClDescSyncSocketWrite,
121 : NaClDescSeekNotImplemented,
122 : NaClDescIoctlNotImplemented,
123 : NaClDescSyncSocketFstat,
124 : NaClDescGetdentsNotImplemented,
125 : NACL_DESC_SYNC_SOCKET,
126 : NaClDescSyncSocketExternalizeSize,
127 : NaClDescSyncSocketExternalize,
128 : NaClDescLockNotImplemented,
129 : NaClDescTryLockNotImplemented,
130 : NaClDescUnlockNotImplemented,
131 : NaClDescWaitNotImplemented,
132 : NaClDescTimedWaitAbsNotImplemented,
133 : NaClDescSignalNotImplemented,
134 : NaClDescBroadcastNotImplemented,
135 : NaClDescSendMsgNotImplemented,
136 : NaClDescRecvMsgNotImplemented,
137 : NaClDescConnectAddrNotImplemented,
138 : NaClDescAcceptConnNotImplemented,
139 : NaClDescPostNotImplemented,
140 : NaClDescSemWaitNotImplemented,
141 : NaClDescGetValueNotImplemented,
142 : };
143 :
144 :
145 : int NaClDescSyncSocketInternalize(
146 : struct NaClDesc **out_desc,
147 : struct NaClDescXferState *xfer,
148 0 : struct NaClDescQuotaInterface *quota_interface) {
149 : int rv;
150 : struct NaClDescSyncSocket *ndssp;
151 :
152 : UNREFERENCED_PARAMETER(quota_interface);
153 0 : NaClLog(4, "Entered NaClDescSyncSocketInternalize\n");
154 0 : rv = -NACL_ABI_EIO;
155 0 : ndssp = NULL;
156 :
157 0 : if (xfer->next_handle == xfer->handle_buffer_end) {
158 0 : NaClLog(LOG_ERROR,
159 : ("NaClSyncSocketInternalize: no descriptor"
160 : " left in xfer state\n"));
161 0 : rv = -NACL_ABI_EIO;
162 0 : goto cleanup;
163 : }
164 0 : ndssp = malloc(sizeof *ndssp);
165 0 : if (NULL == ndssp) {
166 0 : NaClLog(LOG_ERROR,
167 : "NaClSyncSocketInternalize: no memory\n");
168 0 : rv = -NACL_ABI_ENOMEM;
169 0 : goto cleanup;
170 : }
171 0 : if (!NaClDescSyncSocketCtor(ndssp, *xfer->next_handle)) {
172 0 : NaClLog(LOG_ERROR,
173 : "NaClSyncSocketInternalize: descriptor ctor error\n");
174 0 : rv = -NACL_ABI_EIO;
175 0 : goto cleanup;
176 : }
177 0 : *xfer->next_handle++ = NACL_INVALID_HANDLE;
178 0 : *out_desc = (struct NaClDesc *) ndssp;
179 0 : rv = 0;
180 :
181 0 : cleanup:
182 0 : if (rv < 0) {
183 0 : free(ndssp);
184 : }
185 0 : return rv;
186 : }
|