socket.cc revision d6121a37c579731b89348e618a823c53b938449a
1c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati/****************************************************************************** 2c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * 3c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * Copyright (C) 2014 Google, Inc. 4c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * 5c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * Licensed under the Apache License, Version 2.0 (the "License"); 6c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * you may not use this file except in compliance with the License. 7c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * You may obtain a copy of the License at: 8c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * 9c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * http://www.apache.org/licenses/LICENSE-2.0 10c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * 11c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * Unless required by applicable law or agreed to in writing, software 12c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * distributed under the License is distributed on an "AS IS" BASIS, 13c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * See the License for the specific language governing permissions and 15c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * limitations under the License. 16c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati * 17c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati ******************************************************************************/ 18c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 19c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#define LOG_TAG "bt_osi_socket" 20c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 2149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "osi/include/socket.h" 2249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 2398bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati#include <asm/ioctls.h> 24c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <assert.h> 25c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <errno.h> 26c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <netinet/in.h> 27c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <string.h> 2898bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati#include <sys/ioctl.h> 29c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <sys/socket.h> 30c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati#include <unistd.h> 31c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 320f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/allocator.h" 3344802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 3449a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "osi/include/osi.h" 350f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/reactor.h" 36c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 37d2199cbb8f361772819402b56e6fa46587a31c56Pavlin Radoslavov// The IPv4 loopback address: 127.0.0.1 38d2199cbb8f361772819402b56e6fa46587a31c56Pavlin Radoslavovstatic const in_addr_t LOCALHOST_ = 0x7f000001; 39d2199cbb8f361772819402b56e6fa46587a31c56Pavlin Radoslavov 40c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatistruct socket_t { 41fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati int fd; 42fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati reactor_object_t *reactor_object; 43c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_cb read_ready; 44c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_cb write_ready; 45fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati void *context; // Not owned, do not free. 46c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati}; 47c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 48c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatistatic void internal_read_ready(void *context); 49c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatistatic void internal_write_ready(void *context); 50c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 51c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatisocket_t *socket_new(void) { 52384f8a948e9837475c4f504a626205334522df2aZach Johnson socket_t *ret = (socket_t *)osi_calloc(sizeof(socket_t)); 53c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 54fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati ret->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 55fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (ret->fd == INVALID_FD) { 56db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to create socket: %s", __func__, strerror(errno)); 57c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati goto error; 58c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati } 59c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 60c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati int enable = 1; 61fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (setsockopt(ret->fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) == -1) { 62db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to set SO_REUSEADDR: %s", __func__, strerror(errno)); 63c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati goto error; 64c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati } 65c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 66c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return ret; 67c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 68c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatierror:; 69c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati if (ret) 70fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati close(ret->fd); 71384f8a948e9837475c4f504a626205334522df2aZach Johnson osi_free(ret); 72c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return NULL; 73c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 74c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 75ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavatisocket_t *socket_new_from_fd(int fd) { 76ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati assert(fd != INVALID_FD); 77ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 78384f8a948e9837475c4f504a626205334522df2aZach Johnson socket_t *ret = (socket_t *)osi_calloc(sizeof(socket_t)); 79ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 80ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati ret->fd = fd; 81ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati return ret; 82ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati} 83ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 84c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavativoid socket_free(socket_t *socket) { 85c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati if (!socket) 86c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return; 87c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 88c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_unregister(socket); 89fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati close(socket->fd); 90384f8a948e9837475c4f504a626205334522df2aZach Johnson osi_free(socket); 91c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 92c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 93c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatibool socket_listen(const socket_t *socket, port_t port) { 94c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 95c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 96c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati struct sockaddr_in addr; 97c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati addr.sin_family = AF_INET; 98d2199cbb8f361772819402b56e6fa46587a31c56Pavlin Radoslavov addr.sin_addr.s_addr = htonl(LOCALHOST_); 99c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati addr.sin_port = htons(port); 100fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (bind(socket->fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { 101db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to bind socket to port %u: %s", __func__, port, strerror(errno)); 102c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return false; 103c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati } 104c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 105fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (listen(socket->fd, 10) == -1) { 106db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to listen on port %u: %s", __func__, port, strerror(errno)); 107c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return false; 108c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati } 109c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 110c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return true; 111c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 112c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 113c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatisocket_t *socket_accept(const socket_t *socket) { 114c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 115c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 116d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov int fd; 117d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov OSI_NO_INTR(fd = accept(socket->fd, NULL, NULL)); 118fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (fd == INVALID_FD) { 119db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to accept socket: %s", __func__, strerror(errno)); 120c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return NULL; 121c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati } 122c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 123384f8a948e9837475c4f504a626205334522df2aZach Johnson socket_t *ret = (socket_t *)osi_calloc(sizeof(socket_t)); 124c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 125fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati ret->fd = fd; 126c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati return ret; 127c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 128c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 129c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatissize_t socket_read(const socket_t *socket, void *buf, size_t count) { 130c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 131c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(buf != NULL); 132c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 133d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov ssize_t ret; 134d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov OSI_NO_INTR(ret = recv(socket->fd, buf, count, MSG_DONTWAIT)); 135d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov 136d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov return ret; 137c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 138c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 139c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatissize_t socket_write(const socket_t *socket, const void *buf, size_t count) { 140c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 141c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(buf != NULL); 142c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 143d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov ssize_t ret; 144d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov OSI_NO_INTR(ret = send(socket->fd, buf, count, MSG_DONTWAIT)); 145d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov 146d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov return ret; 147c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 148c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 149ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavatissize_t socket_write_and_transfer_fd(const socket_t *socket, const void *buf, size_t count, int fd) { 150ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati assert(socket != NULL); 151ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati assert(buf != NULL); 152ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 153ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati if (fd == INVALID_FD) 154ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati return socket_write(socket, buf, count); 155ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 156ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati struct msghdr msg; 157ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati struct iovec iov; 158ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati char control_buf[CMSG_SPACE(sizeof(int))]; 159ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 160ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati iov.iov_base = (void *)buf; 161ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati iov.iov_len = count; 162ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 163ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_iov = &iov; 164ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_iovlen = 1; 165ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_control = control_buf; 166ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_controllen = sizeof(control_buf); 167ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_name = NULL; 168ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati msg.msg_namelen = 0; 169ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 170ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati struct cmsghdr *header = CMSG_FIRSTHDR(&msg); 171ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati header->cmsg_level = SOL_SOCKET; 172ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati header->cmsg_type = SCM_RIGHTS; 173ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati header->cmsg_len = CMSG_LEN(sizeof(int)); 174ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati *(int *)CMSG_DATA(header) = fd; 175ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 176d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov ssize_t ret; 177d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov OSI_NO_INTR(ret = sendmsg(socket->fd, &msg, MSG_DONTWAIT)); 178d6121a37c579731b89348e618a823c53b938449aPavlin Radoslavov 179ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati close(fd); 180ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati return ret; 181ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati} 182ad3067b83e4d309b4027a4e9b44b0a614f267da8Sharvil Nanavati 18398bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavatissize_t socket_bytes_available(const socket_t *socket) { 18498bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati assert(socket != NULL); 18598bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati 18698bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati int size = 0; 18798bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati if (ioctl(socket->fd, FIONREAD, &size) == -1) 18898bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati return -1; 18998bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati return size; 19098bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati} 19198bf85fea392258ba22a252eeeed1153dc3eb16fSharvil Nanavati 192fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavativoid socket_register(socket_t *socket, reactor_t *reactor, void *context, socket_cb read_cb, socket_cb write_cb) { 193c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 194c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 195c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati // Make sure the socket isn't currently registered. 196c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_unregister(socket); 197c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 198c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket->read_ready = read_cb; 199c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket->write_ready = write_cb; 200c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket->context = context; 201c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 202fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati void (*read_fn)(void *) = (read_cb != NULL) ? internal_read_ready : NULL; 203fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati void (*write_fn)(void *) = (write_cb != NULL) ? internal_write_ready : NULL; 204fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati 205fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati socket->reactor_object = reactor_register(reactor, socket->fd, socket, read_fn, write_fn); 206c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 207c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 208c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavativoid socket_unregister(socket_t *socket) { 209c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(socket != NULL); 210c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 211fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati if (socket->reactor_object) 212fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati reactor_unregister(socket->reactor_object); 213fbf89085bf308a98b00da77d1538539f6dd58604Sharvil Nanavati socket->reactor_object = NULL; 214c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 215c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 216c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatistatic void internal_read_ready(void *context) { 217c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(context != NULL); 218c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 219c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_t *socket = (void *)context; 220c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket->read_ready(socket, socket->context); 221c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 222c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 223c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavatistatic void internal_write_ready(void *context) { 224c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati assert(context != NULL); 225c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati 226c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket_t *socket = (void *)context; 227c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati socket->write_ready(socket, socket->context); 228c2031c4fbab9ed2d2e51a0b287a3fab805932ca4Sharvil Nanavati} 229