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; c->flags |= REDIS_CONNECTED; return REDIS_OK; }
int redisContextConnectTcp(redisContext *c, const char *addr, int port) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_in sa; if ((s = redisCreateSocket(c,AF_INET)) == REDIS_ERR) return REDIS_ERR; if (!blocking && redisSetNonBlock(c,s) == REDIS_ERR) return REDIS_ERR; sa.sin_family = AF_INET; sa.sin_port = htons(port); if (inet_aton(addr, &sa.sin_addr) == 0) { struct hostent *he; he = gethostbyname(addr); if (he == NULL) { __redisSetError(c,REDIS_ERR_OTHER, sdscatprintf(sdsempty(),"Can't resolve: %s",addr)); closesocket(c->fd); WSACleanup(); return REDIS_ERR; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (WSAGetLastError() == WSAEINPROGRESS && !blocking) { /* This is ok. */ } else { __redisSetError(c,REDIS_ERR_IO,NULL); closesocket(c->fd); WSACleanup(); return REDIS_ERR; } } if (redisSetTcpNoDelay(c,s) != REDIS_OK) { closesocket(c->fd); WSACleanup(); return REDIS_ERR; } c->fd = s; c->flags |= REDIS_CONNECTED; return REDIS_OK; }
int redisContextConnectTcp(redisContext *c, const char *addr, int port) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_in sa; if ((s = redisCreateSocket(c,AF_INET)) == REDIS_ERR) return REDIS_ERR; if (!blocking && redisSetNonBlock(c,s) == REDIS_ERR) return REDIS_ERR; sa.sin_family = AF_INET; sa.sin_port = htons(port); #ifdef _WIN32 unsigned long inAddress; inAddress = inet_addr(addr); if (inAddress == INADDR_NONE || inAddress == INADDR_ANY) { struct hostent *he; he = gethostbyname(addr); if (he == NULL) { __redisSetError(c,REDIS_ERR_OTHER, sdscatprintf(sdsempty(),"can't resolve: %s\n", addr)); closesocket(s); return REDIS_ERR;; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } else { sa.sin_addr.s_addr = inAddress; } #else if (inet_aton(addr, &sa.sin_addr) == 0) { struct hostent *he; he = gethostbyname(addr); if (he == NULL) { __redisSetError(c,REDIS_ERR_OTHER, sdscatprintf(sdsempty(),"Can't resolve: %s",addr)); close(s); return REDIS_ERR; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } #endif #ifdef _WIN32 if (connect((SOCKET)s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { errno = WSAGetLastError(); if ((errno == WSAEINVAL) || (errno == WSAEWOULDBLOCK)) errno = EINPROGRESS; #else if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { #endif if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { __redisSetError(c,REDIS_ERR_IO,NULL); #ifdef _WIN32 closesocket(s); #else close(s); #endif return REDIS_ERR; } } if (redisSetTcpNoDelay(c,s) != REDIS_OK) { #ifdef _WIN32 closesocket(s); #else close(s); #endif return REDIS_ERR; } c->fd = s; c->flags |= REDIS_CONNECTED; return REDIS_OK; } int redisContextConnectUnix(redisContext *c, const char *path) { #ifdef _WIN32 (void) path; __redisSetError(c,REDIS_ERR_IO,NULL); return REDIS_ERR; #else 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; c->flags |= REDIS_CONNECTED; return REDIS_OK; #endif }