diff options
-rw-r--r-- | hiredis.c | 4 | ||||
-rw-r--r-- | net.c | 29 | ||||
-rw-r--r-- | net.h | 3 |
3 files changed, 32 insertions, 4 deletions
@@ -655,7 +655,7 @@ redisContext *redisConnect(const char *ip, int port) { redisContext *c = redisContextInit(); c->flags |= REDIS_BLOCK; c->flags |= REDIS_CONNECTED; - redisContextConnect(c,ip,port); + redisContextConnectTcp(c,ip,port); return c; } @@ -663,7 +663,7 @@ redisContext *redisConnectNonBlock(const char *ip, int port) { redisContext *c = redisContextInit(); c->flags &= ~REDIS_BLOCK; c->flags |= REDIS_CONNECTED; - redisContextConnect(c,ip,port); + redisContextConnectTcp(c,ip,port); return c; } @@ -31,6 +31,7 @@ #include "fmacros.h" #include <sys/types.h> #include <sys/socket.h> +#include <sys/un.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <arpa/inet.h> @@ -95,7 +96,7 @@ static int redisSetTcpNoDelay(redisContext *c, int fd) { return REDIS_OK; } -int redisContextConnect(redisContext *c, const char *addr, int port) { +int redisContextConnectTcp(redisContext *c, const char *addr, int port) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_in sa; @@ -138,3 +139,29 @@ int redisContextConnect(redisContext *c, const char *addr, int port) { c->fd = s; return REDIS_OK; } + +int redisContextConnectUnix(redisContext *c, const char *path) { + int s; + int blocking = (c->flags & REDIS_BLOCK); + struct sockaddr_un sa; + + if ((s = redisCreateSocket(c,AF_LOCAL)) == REDIS_ERR) + return REDIS_ERR; + if (!blocking && redisSetNonBlock(c,s) != REDIS_OK) + return REDIS_ERR; + + sa.sun_family = AF_LOCAL; + strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); + if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { + if (errno == EINPROGRESS && !blocking) { + /* This is ok. */ + } else { + __redisSetError(c,REDIS_ERR_IO,NULL); + close(s); + return REDIS_ERR; + } + } + + c->fd = s; + return REDIS_OK; +} @@ -31,6 +31,7 @@ #ifndef __NET_H #define __NET_H -int redisContextConnect(redisContext *c, const char *addr, int port); +int redisContextConnectTcp(redisContext *c, const char *addr, int port); +int redisContextConnectUnix(redisContext *c, const char *path); #endif |