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 : #include "native_client/src/trusted/desc/nacl_desc_custom.h"
8 :
9 : #include "native_client/src/shared/platform/nacl_check.h"
10 :
11 :
12 : struct NaClDescCustom {
13 : struct NaClDesc base NACL_IS_REFCOUNT_SUBCLASS;
14 : void *handle;
15 : struct NaClDescCustomFuncs funcs;
16 : };
17 :
18 : static const struct NaClDescVtbl kNaClDescCustomVtbl;
19 :
20 :
21 : struct NaClDesc *NaClDescMakeCustomDesc(
22 9 : void *handle, const struct NaClDescCustomFuncs *funcs) {
23 9 : struct NaClDescCustom *desc = malloc(sizeof *desc);
24 9 : if (NULL == desc) {
25 0 : return NULL;
26 : }
27 9 : if (!NaClDescCtor(&desc->base)) {
28 0 : free(desc);
29 0 : return NULL;
30 : }
31 : /* For simplicity, all the callbacks are currently required. */
32 36 : DCHECK(funcs->Destroy != NULL);
33 36 : DCHECK(funcs->SendMsg != NULL);
34 36 : DCHECK(funcs->RecvMsg != NULL);
35 9 : desc->handle = handle;
36 9 : desc->funcs = *funcs;
37 9 : desc->base.base.vtbl = (const struct NaClRefCountVtbl *) &kNaClDescCustomVtbl;
38 9 : return &desc->base;
39 9 : }
40 :
41 5 : static void NaClDescCustomDtor(struct NaClRefCount *vself) {
42 5 : struct NaClDescCustom *self = (struct NaClDescCustom *) vself;
43 :
44 5 : (*self->funcs.Destroy)(self->handle);
45 5 : vself->vtbl = (const struct NaClRefCountVtbl *) &kNaClDescVtbl;
46 5 : (*vself->vtbl->Dtor)(vself);
47 5 : }
48 :
49 5 : static ssize_t NaClDescCustomSendMsg(struct NaClDesc *vself,
50 5 : const struct NaClImcTypedMsgHdr *msg,
51 5 : int flags) {
52 5 : struct NaClDescCustom *self = (struct NaClDescCustom *) vself;
53 :
54 5 : return (*self->funcs.SendMsg)(self->handle, msg, flags);
55 : }
56 :
57 : static ssize_t NaClDescCustomRecvMsg(
58 3 : struct NaClDesc *vself,
59 3 : struct NaClImcTypedMsgHdr *msg,
60 3 : int flags,
61 3 : struct NaClDescQuotaInterface *quota_interface) {
62 3 : struct NaClDescCustom *self = (struct NaClDescCustom *) vself;
63 6 : UNREFERENCED_PARAMETER(quota_interface);
64 :
65 3 : return (*self->funcs.RecvMsg)(self->handle, msg, flags);
66 : }
67 :
68 : static const struct NaClDescVtbl kNaClDescCustomVtbl = {
69 : {
70 : NaClDescCustomDtor, /* diff */
71 : },
72 : NaClDescMapNotImplemented,
73 : NACL_DESC_UNMAP_NOT_IMPLEMENTED
74 : NaClDescReadNotImplemented,
75 : NaClDescWriteNotImplemented,
76 : NaClDescSeekNotImplemented,
77 : NaClDescPReadNotImplemented,
78 : NaClDescPWriteNotImplemented,
79 : NaClDescFstatNotImplemented,
80 : NaClDescGetdentsNotImplemented,
81 : NaClDescExternalizeSizeNotImplemented,
82 : NaClDescExternalizeNotImplemented,
83 : NaClDescLockNotImplemented,
84 : NaClDescTryLockNotImplemented,
85 : NaClDescUnlockNotImplemented,
86 : NaClDescWaitNotImplemented,
87 : NaClDescTimedWaitAbsNotImplemented,
88 : NaClDescSignalNotImplemented,
89 : NaClDescBroadcastNotImplemented,
90 : NaClDescCustomSendMsg, /* diff */
91 : NaClDescCustomRecvMsg, /* diff */
92 : NaClDescLowLevelSendMsgNotImplemented,
93 : NaClDescLowLevelRecvMsgNotImplemented,
94 : NaClDescConnectAddrNotImplemented,
95 : NaClDescAcceptConnNotImplemented,
96 : NaClDescPostNotImplemented,
97 : NaClDescSemWaitNotImplemented,
98 : NaClDescGetValueNotImplemented,
99 : NaClDescSetMetadata,
100 : NaClDescGetMetadata,
101 : NaClDescSetFlags,
102 : NaClDescGetFlags,
103 : NaClDescIsattyNotImplemented,
104 : NACL_DESC_CUSTOM, /* diff */
105 : };
|