int redisContextConnectUnix(redisContext *c, const char *path, const struct timeval *timeout) { #ifdef FASTOREDIS #ifdef OS_WIN return REDIS_ERR; #else int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_un sa; if (redisCreateSocket(c,AF_LOCAL) < 0) return REDIS_ERR; if (redisSetBlocking(c,0) != REDIS_OK) return REDIS_ERR; sa.sun_family = AF_LOCAL; strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); if (connect(c->fd, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { if (redisContextWaitReady(c,timeout) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,1) != REDIS_OK) return REDIS_ERR; c->flags |= REDIS_CONNECTED; return REDIS_OK; #endif #else int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_un sa; if (redisCreateSocket(c,AF_LOCAL) < 0) return REDIS_ERR; if (redisSetBlocking(c,0) != REDIS_OK) return REDIS_ERR; sa.sun_family = AF_LOCAL; strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); if (connect(c->fd, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { if (redisContextWaitReady(c,timeout) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,1) != REDIS_OK) return REDIS_ERR; c->flags |= REDIS_CONNECTED; return REDIS_OK; #endif }
int redisContextPreConnectTcp( redisContext *c, const char *addr, int port, struct timeval *timeout, SOCKADDR_STORAGE* ss) { int blocking = (c->flags & REDIS_BLOCK); if (ParseStorageAddress(addr, port, ss) == FALSE) { DebugBreak(); } if (REDIS_OK != redisCreateSocket(c, ss->ss_family)) { return REDIS_ERR; } if (redisSetTcpNoDelay(c) != REDIS_OK) return REDIS_ERR; if (blocking == 0) { if (redisSetBlocking(c, 0) != REDIS_OK) return REDIS_ERR; } 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; c->flags |= REDIS_CONNECTED; return REDIS_OK; }
int redisContextConnectUnix(redisContext *c, const char *path, const struct timeval *timeout) { int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_un sa; long timeout_msec = -1; if (redisCreateSocket(c,AF_LOCAL) < 0) return REDIS_ERR; if (redisSetBlocking(c,0) != REDIS_OK) return REDIS_ERR; c->connection_type = REDIS_CONN_UNIX; if (c->unix_sock.path != path) c->unix_sock.path = strdup(path); if (timeout) { if (c->timeout != timeout) { if (c->timeout == NULL) c->timeout = malloc(sizeof(struct timeval)); memcpy(c->timeout, timeout, sizeof(struct timeval)); } } else { if (c->timeout) free(c->timeout); c->timeout = NULL; } if (redisContextTimeoutMsec(c,&timeout_msec) != REDIS_OK) return REDIS_ERR; sa.sun_family = AF_LOCAL; strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); if (connect(c->fd, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { if (redisContextWaitReady(c,timeout_msec) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,1) != REDIS_OK) return REDIS_ERR; c->flags |= REDIS_CONNECTED; return REDIS_OK; }
int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct timeval *timeout) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_in sa; if ((s = redisCreateSocket(c,AF_INET)) < 0) return REDIS_ERR; if (redisSetBlocking(c,s,0) != REDIS_OK) 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)); close(s); return REDIS_ERR; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { if (redisContextWaitReady(c,s,timeout) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,s,1) != REDIS_OK) return REDIS_ERR; if (redisSetTcpNoDelay(c,s) != REDIS_OK) return REDIS_ERR; #ifdef ALCHEMY_DATABASE DXDB_setSA(sa); #endif 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 }
int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct timeval *timeout) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_in sa; #ifdef HIREDIS_WIN int ssa = sizeof(sa); char buf[255]; snprintf(buf, 255, "%s:%d", addr, port); #endif if ((s = redisCreateSocket(c,AF_INET)) < 0) return REDIS_ERR; if (redisSetBlocking(c,s,0) != REDIS_OK) return REDIS_ERR; sa.sin_family = AF_INET; sa.sin_port = htons(port); #ifdef HIREDIS_WIN if (WSAStringToAddress(buf, AF_INET, NULL, (LPSOCKADDR)&sa, &ssa) == 0) { #else if (inet_pton(AF_INET, addr, &sa.sin_addr) == 0) { #endif struct hostent *he; he = gethostbyname(addr); if (he == NULL) { char buf[128]; snprintf(buf,sizeof(buf),"Can't resolve: %s", addr); __redisSetError(c,REDIS_ERR_OTHER,buf); close(s); return REDIS_ERR; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } #ifdef HIREDIS_WIN else { int wserr = WSAGetLastError(); switch (wserr) { case WSAEFAULT: printf("The specified Address buffer is too small. Pass in a larger buffer."); break; case WSAEINVAL: printf("Unable to translate the string into a sockaddr."); break; case WSANOTINITIALISED: printf("ws2.dll has not been initialized. The application must first call WSAStartup before calling any Windows Sockets functions."); break; case WSA_NOT_ENOUGH_MEMORY: printf("There was insufficient memory to perform the operation."); break; default: break; } } #endif if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { SETERRNO; if (errno == EINPROGRESS && !blocking) { /* This is ok. */ } else { if (redisContextWaitReady(c,s,timeout) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,s,1) != REDIS_OK) return REDIS_ERR; if (redisSetTcpNoDelay(c,s) != REDIS_OK) return REDIS_ERR; c->fd = s; c->flags |= REDIS_CONNECTED; return REDIS_OK; } #ifndef HIREDIS_WIN int redisContextConnectUnix(redisContext *c, const char *path, struct timeval *timeout) { int s; int blocking = (c->flags & REDIS_BLOCK); struct sockaddr_un sa; if ((s = redisCreateSocket(c,AF_LOCAL)) < 0) return REDIS_ERR; if (redisSetBlocking(c,s,0) != 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 { if (redisContextWaitReady(c,s,timeout) != REDIS_OK) return REDIS_ERR; } } /* Reset socket to be blocking after connect(2). */ if (blocking && redisSetBlocking(c,s,1) != REDIS_OK) return REDIS_ERR; c->fd = s; c->flags |= REDIS_CONNECTED; return REDIS_OK; }