| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 The Native Client Authors. All rights reserved. | 2 * Copyright 2010 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can | 3 * Use of this source code is governed by a BSD-style license that can |
| 4 * be found in the LICENSE file. | 4 * be found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 /* | 7 /* |
| 8 * NaCl Service Runtime. I/O Descriptor / Handle abstraction. | 8 * NaCl Service Runtime. I/O Descriptor / Handle abstraction. |
| 9 * Connection capabilities. | 9 * Connection capabilities. |
| 10 */ | 10 */ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 int NaClDescConnCapFdExternalize(struct NaClDesc *vself, | 70 int NaClDescConnCapFdExternalize(struct NaClDesc *vself, |
| 71 struct NaClDescXferState *xfer) { | 71 struct NaClDescXferState *xfer) { |
| 72 struct NaClDescConnCapFd *self; | 72 struct NaClDescConnCapFd *self; |
| 73 | 73 |
| 74 self = (struct NaClDescConnCapFd *) vself; | 74 self = (struct NaClDescConnCapFd *) vself; |
| 75 *xfer->next_handle++ = self->connect_fd; | 75 *xfer->next_handle++ = self->connect_fd; |
| 76 | 76 |
| 77 return 0; | 77 return 0; |
| 78 } | 78 } |
| 79 | 79 |
| 80 int NaClDescConnCapFdConnectAddr(struct NaClDesc *vself, | 80 int NaClDescConnCapFdConnectAddr(struct NaClDesc *vself, |
| 81 struct NaClDescEffector *effp) { | 81 struct NaClDesc **result) { |
| 82 struct NaClDescConnCapFd *self = (struct NaClDescConnCapFd *) vself; | 82 struct NaClDescConnCapFd *self = (struct NaClDescConnCapFd *) vself; |
| 83 NaClHandle sock_pair[2]; | 83 NaClHandle sock_pair[2]; |
| 84 struct NaClDescImcDesc *connected_socket; | 84 struct NaClDescImcDesc *connected_socket; |
| 85 int retval; | |
| 86 char control_buf[CMSG_SPACE(sizeof(int))]; | 85 char control_buf[CMSG_SPACE(sizeof(int))]; |
| 87 struct iovec iovec; | 86 struct iovec iovec; |
| 88 struct msghdr connect_msg; | 87 struct msghdr connect_msg; |
| 89 struct cmsghdr *cmsg; | 88 struct cmsghdr *cmsg; |
| 90 int sent; | 89 int sent; |
| 91 | 90 |
| 92 if (NaClSocketPair(sock_pair) != 0) { | 91 if (NaClSocketPair(sock_pair) != 0) { |
| 93 return -NACL_ABI_EMFILE; | 92 return -NACL_ABI_EMFILE; |
| 94 } | 93 } |
| 95 | 94 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 118 } | 117 } |
| 119 | 118 |
| 120 connected_socket = malloc(sizeof(*connected_socket)); | 119 connected_socket = malloc(sizeof(*connected_socket)); |
| 121 if (connected_socket == NULL || | 120 if (connected_socket == NULL || |
| 122 !NaClDescImcDescCtor(connected_socket, sock_pair[1])) { | 121 !NaClDescImcDescCtor(connected_socket, sock_pair[1])) { |
| 123 NaClClose(sock_pair[1]); | 122 NaClClose(sock_pair[1]); |
| 124 free(connected_socket); | 123 free(connected_socket); |
| 125 return -NACL_ABI_ENOMEM; | 124 return -NACL_ABI_ENOMEM; |
| 126 } | 125 } |
| 127 | 126 |
| 128 retval = (*effp->vtbl->ReturnCreatedDesc)( | 127 *result = (struct NaClDesc *) connected_socket; |
| 129 effp, (struct NaClDesc *) connected_socket); | 128 return 0; |
| 130 if (retval < 0) { | |
| 131 /* connected_socket is fully constructed, so we cannot simply free | |
| 132 it at this point. */ | |
| 133 NaClDescUnref((struct NaClDesc *) connected_socket); | |
| 134 } | |
| 135 return retval; | |
| 136 } | 129 } |
| 137 | 130 |
| 138 int NaClDescConnCapFdAcceptConn(struct NaClDesc *vself, | 131 int NaClDescConnCapFdAcceptConn(struct NaClDesc *vself, |
| 139 struct NaClDescEffector *effp) { | 132 struct NaClDesc **result) { |
| 140 UNREFERENCED_PARAMETER(vself); | 133 UNREFERENCED_PARAMETER(vself); |
| 141 UNREFERENCED_PARAMETER(effp); | 134 UNREFERENCED_PARAMETER(result); |
| 142 | 135 |
| 143 NaClLog(LOG_ERROR, "NaClDescConnCapFdAcceptConn: not IMC\n"); | 136 NaClLog(LOG_ERROR, "NaClDescConnCapFdAcceptConn: not IMC\n"); |
| 144 return -NACL_ABI_EINVAL; | 137 return -NACL_ABI_EINVAL; |
| 145 } | 138 } |
| 146 | 139 |
| 147 struct NaClDescVtbl const kNaClDescConnCapFdVtbl = { | 140 struct NaClDescVtbl const kNaClDescConnCapFdVtbl = { |
| 148 NaClDescConnCapFdDtor, | 141 NaClDescConnCapFdDtor, |
| 149 NaClDescMapNotImplemented, | 142 NaClDescMapNotImplemented, |
| 150 NaClDescUnmapUnsafeNotImplemented, | 143 NaClDescUnmapUnsafeNotImplemented, |
| 151 NaClDescUnmapNotImplemented, | 144 NaClDescUnmapNotImplemented, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 if (!NaClDescCtor(&conn_cap->base)) { | 182 if (!NaClDescCtor(&conn_cap->base)) { |
| 190 free(conn_cap); | 183 free(conn_cap); |
| 191 return -NACL_ABI_ENOMEM; | 184 return -NACL_ABI_ENOMEM; |
| 192 } | 185 } |
| 193 conn_cap->base.vtbl = &kNaClDescConnCapFdVtbl; | 186 conn_cap->base.vtbl = &kNaClDescConnCapFdVtbl; |
| 194 conn_cap->connect_fd = *xfer->next_handle; | 187 conn_cap->connect_fd = *xfer->next_handle; |
| 195 *xfer->next_handle++ = NACL_INVALID_HANDLE; | 188 *xfer->next_handle++ = NACL_INVALID_HANDLE; |
| 196 *result = &conn_cap->base; | 189 *result = &conn_cap->base; |
| 197 return 0; | 190 return 0; |
| 198 } | 191 } |
| OLD | NEW |