diff options
Diffstat (limited to 'examples/redis-unstable/src/unix.c')
| -rw-r--r-- | examples/redis-unstable/src/unix.c | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/examples/redis-unstable/src/unix.c b/examples/redis-unstable/src/unix.c deleted file mode 100644 index e26f0d2..0000000 --- a/examples/redis-unstable/src/unix.c +++ /dev/null @@ -1,219 +0,0 @@ -/* ========================================================================== - * unix.c - unix socket connection implementation - * -------------------------------------------------------------------------- - * Copyright (C) 2022 zhenwei pi - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to permit - * persons to whom the Software is furnished to do so, subject to the - * following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * ========================================================================== - */ - -#include "server.h" -#include "connection.h" - -static ConnectionType CT_Unix; - -static const char *connUnixGetType(connection *conn) { - UNUSED(conn); - - return CONN_TYPE_UNIX; -} - -static void connUnixEventHandler(struct aeEventLoop *el, int fd, void *clientData, int mask) { - connectionTypeTcp()->ae_handler(el, fd, clientData, mask); -} - -static int connUnixAddr(connection *conn, char *ip, size_t ip_len, int *port, int remote) { - return connectionTypeTcp()->addr(conn, ip, ip_len, port, remote); -} - -static int connUnixIsLocal(connection *conn) { - UNUSED(conn); - - return 1; /* Unix socket is always local connection */ -} - -static int connUnixListen(connListener *listener) { - int fd; - mode_t *perm = (mode_t *)listener->priv; - - if (listener->bindaddr_count == 0) - return C_OK; - - /* currently listener->bindaddr_count is always 1, we still use a loop here in case Redis supports multi Unix socket in the future */ - for (int j = 0; j < listener->bindaddr_count; j++) { - char *addr = listener->bindaddr[j]; - - unlink(addr); /* don't care if this fails */ - fd = anetUnixServer(server.neterr, addr, *perm, server.tcp_backlog); - if (fd == ANET_ERR) { - serverLog(LL_WARNING, "Failed opening Unix socket: %s", server.neterr); - exit(1); - } - anetNonBlock(NULL, fd); - anetCloexec(fd); - listener->fd[listener->count++] = fd; - } - - return C_OK; -} - -static connection *connCreateUnix(struct aeEventLoop *el) { - connection *conn = zcalloc(sizeof(connection)); - conn->type = &CT_Unix; - conn->fd = -1; - conn->iovcnt = IOV_MAX; - conn->el = el; - - return conn; -} - -static connection *connCreateAcceptedUnix(struct aeEventLoop *el, int fd, void *priv) { - UNUSED(priv); - connection *conn = connCreateUnix(el); - conn->fd = fd; - conn->state = CONN_STATE_ACCEPTING; - return conn; -} - -static void connUnixAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) { - int cfd; - int max = server.max_new_conns_per_cycle; - UNUSED(el); - UNUSED(mask); - UNUSED(privdata); - - while(max--) { - cfd = anetUnixAccept(server.neterr, fd); - if (cfd == ANET_ERR) { - if (anetAcceptFailureNeedsRetry(errno)) - continue; - if (errno != EWOULDBLOCK) - serverLog(LL_WARNING, - "Accepting client connection: %s", server.neterr); - return; - } - serverLog(LL_VERBOSE,"Accepted connection to %s", server.unixsocket); - acceptCommonHandler(connCreateAcceptedUnix(el, cfd, NULL),CLIENT_UNIX_SOCKET,NULL); - } -} - -static void connUnixShutdown(connection *conn) { - connectionTypeTcp()->shutdown(conn); -} - -static void connUnixClose(connection *conn) { - connectionTypeTcp()->close(conn); -} - -static int connUnixAccept(connection *conn, ConnectionCallbackFunc accept_handler) { - return connectionTypeTcp()->accept(conn, accept_handler); -} - -static int connUnixRebindEventLoop(connection *conn, aeEventLoop *el) { - return connectionTypeTcp()->rebind_event_loop(conn, el); -} - -static int connUnixWrite(connection *conn, const void *data, size_t data_len) { - return connectionTypeTcp()->write(conn, data, data_len); -} - -static int connUnixWritev(connection *conn, const struct iovec *iov, int iovcnt) { - return connectionTypeTcp()->writev(conn, iov, iovcnt); -} - -static int connUnixRead(connection *conn, void *buf, size_t buf_len) { - return connectionTypeTcp()->read(conn, buf, buf_len); -} - -static int connUnixSetWriteHandler(connection *conn, ConnectionCallbackFunc func, int barrier) { - return connectionTypeTcp()->set_write_handler(conn, func, barrier); -} - -static int connUnixSetReadHandler(connection *conn, ConnectionCallbackFunc func) { - return connectionTypeTcp()->set_read_handler(conn, func); -} - -static const char *connUnixGetLastError(connection *conn) { - return strerror(conn->last_errno); -} - -static ssize_t connUnixSyncWrite(connection *conn, char *ptr, ssize_t size, long long timeout) { - return syncWrite(conn->fd, ptr, size, timeout); -} - -static ssize_t connUnixSyncRead(connection *conn, char *ptr, ssize_t size, long long timeout) { - return syncRead(conn->fd, ptr, size, timeout); -} - -static ssize_t connUnixSyncReadLine(connection *conn, char *ptr, ssize_t size, long long timeout) { - return syncReadLine(conn->fd, ptr, size, timeout); -} - -static ConnectionType CT_Unix = { - /* connection type */ - .get_type = connUnixGetType, - - /* connection type initialize & finalize & configure */ - .init = NULL, - .cleanup = NULL, - .configure = NULL, - - /* ae & accept & listen & error & address handler */ - .ae_handler = connUnixEventHandler, - .accept_handler = connUnixAcceptHandler, - .addr = connUnixAddr, - .is_local = connUnixIsLocal, - .listen = connUnixListen, - - /* create/shutdown/close connection */ - .conn_create = connCreateUnix, - .conn_create_accepted = connCreateAcceptedUnix, - .shutdown = connUnixShutdown, - .close = connUnixClose, - - /* connect & accept */ - .connect = NULL, - .blocking_connect = NULL, - .accept = connUnixAccept, - - /* event loop */ - .unbind_event_loop = NULL, - .rebind_event_loop = connUnixRebindEventLoop, - - /* IO */ - .write = connUnixWrite, - .writev = connUnixWritev, - .read = connUnixRead, - .set_write_handler = connUnixSetWriteHandler, - .set_read_handler = connUnixSetReadHandler, - .get_last_error = connUnixGetLastError, - .sync_write = connUnixSyncWrite, - .sync_read = connUnixSyncRead, - .sync_readline = connUnixSyncReadLine, - - /* pending data */ - .has_pending_data = NULL, - .process_pending_data = NULL, -}; - -int RedisRegisterConnectionTypeUnix(void) -{ - return connTypeRegister(&CT_Unix); -} |
