Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
7bc9f541
Commit
7bc9f541
authored
Jul 20, 2011
by
Pieter Noordhuis
Browse files
Merge pull request #47 from geoffgarside/addrinfo
Use getaddrinfo
parents
6bde9749
c4ed06d9
Changes
1
Show whitespace changes
Inline
Side-by-side
net.c
View file @
7bc9f541
...
@@ -62,16 +62,24 @@ static void __redisSetErrorFromErrno(redisContext *c, int type, const char *pref
...
@@ -62,16 +62,24 @@ static void __redisSetErrorFromErrno(redisContext *c, int type, const char *pref
__redisSetError
(
c
,
type
,
buf
);
__redisSetError
(
c
,
type
,
buf
);
}
}
static
int
redisSetReuseAddr
(
redisContext
*
c
,
int
fd
)
{
int
on
=
1
;
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
__redisSetErrorFromErrno
(
c
,
REDIS_ERR_IO
,
NULL
);
close
(
fd
);
return
REDIS_ERR
;
}
return
REDIS_OK
;
}
static
int
redisCreateSocket
(
redisContext
*
c
,
int
type
)
{
static
int
redisCreateSocket
(
redisContext
*
c
,
int
type
)
{
int
s
,
on
=
1
;
int
s
;
if
((
s
=
socket
(
type
,
SOCK_STREAM
,
0
))
==
-
1
)
{
if
((
s
=
socket
(
type
,
SOCK_STREAM
,
0
))
==
-
1
)
{
__redisSetErrorFromErrno
(
c
,
REDIS_ERR_IO
,
NULL
);
__redisSetErrorFromErrno
(
c
,
REDIS_ERR_IO
,
NULL
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
if
(
type
==
AF_INET
)
{
if
(
type
==
AF_INET
)
{
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
if
(
redisSetReuseAddr
(
c
,
s
)
==
REDIS_ERR
)
{
__redisSetErrorFromErrno
(
c
,
REDIS_ERR_IO
,
NULL
);
close
(
s
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
}
}
...
@@ -185,50 +193,59 @@ int redisContextSetTimeout(redisContext *c, struct timeval tv) {
...
@@ -185,50 +193,59 @@ int redisContextSetTimeout(redisContext *c, struct timeval tv) {
}
}
int
redisContextConnectTcp
(
redisContext
*
c
,
const
char
*
addr
,
int
port
,
struct
timeval
*
timeout
)
{
int
redisContextConnectTcp
(
redisContext
*
c
,
const
char
*
addr
,
int
port
,
struct
timeval
*
timeout
)
{
int
s
;
int
s
,
rv
;
char
_port
[
6
];
/* strlen("65535"); */
struct
addrinfo
hints
,
*
servinfo
,
*
p
;
int
blocking
=
(
c
->
flags
&
REDIS_BLOCK
);
int
blocking
=
(
c
->
flags
&
REDIS_BLOCK
);
struct
sockaddr_in
sa
;
if
((
s
=
redisCreateSocket
(
c
,
AF_INET
))
<
0
)
snprintf
(
_port
,
6
,
"%d"
,
port
);
return
REDIS_ERR
;
memset
(
&
hints
,
0
,
sizeof
(
hints
))
;
if
(
redisSetBlocking
(
c
,
s
,
0
)
!=
REDIS_OK
)
hints
.
ai_family
=
AF_INET
;
return
REDIS_ERR
;
hints
.
ai_socktype
=
SOCK_STREAM
;
sa
.
sin_family
=
AF_INET
;
if
((
rv
=
getaddrinfo
(
addr
,
_port
,
&
hints
,
&
servinfo
))
!=
0
)
{
sa
.
sin_port
=
htons
(
port
);
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
gai_strerror
(
rv
));
if
(
inet_aton
(
addr
,
&
sa
.
sin_addr
)
==
0
)
{
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
;
return
REDIS_ERR
;
}
}
memcpy
(
&
sa
.
sin_addr
,
he
->
h_addr
,
sizeof
(
struct
in_addr
));
for
(
p
=
servinfo
;
p
!=
NULL
;
p
=
p
->
ai_next
)
{
}
if
((
s
=
socket
(
p
->
ai_family
,
p
->
ai_socktype
,
p
->
ai_protocol
))
==
-
1
)
continue
;
if
(
connect
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
if
(
redisSetBlocking
(
c
,
s
,
0
)
!=
REDIS_OK
)
if
(
errno
==
EINPROGRESS
&&
!
blocking
)
{
goto
error
;
if
(
connect
(
s
,
p
->
ai_addr
,
p
->
ai_addrlen
)
==
-
1
)
{
if
(
errno
==
EHOSTUNREACH
)
{
close
(
s
);
continue
;
}
else
if
(
errno
==
EINPROGRESS
&&
!
blocking
)
{
/* This is ok. */
/* This is ok. */
}
else
{
}
else
{
if
(
redisContextWaitReady
(
c
,
s
,
timeout
)
!=
REDIS_OK
)
if
(
redisContextWaitReady
(
c
,
s
,
timeout
)
!=
REDIS_OK
)
return
REDIS_ERR
;
goto
error
;
}
}
}
}
/* Reset socket to be blocking after connect(2). */
if
(
blocking
&&
redisSetBlocking
(
c
,
s
,
1
)
!=
REDIS_OK
)
if
(
blocking
&&
redisSetBlocking
(
c
,
s
,
1
)
!=
REDIS_OK
)
return
REDIS_ERR
;
goto
error
;
if
(
redisSetTcpNoDelay
(
c
,
s
)
!=
REDIS_OK
)
if
(
redisSetTcpNoDelay
(
c
,
s
)
!=
REDIS_OK
)
return
REDIS_ERR
;
goto
error
;
c
->
fd
=
s
;
c
->
fd
=
s
;
c
->
flags
|=
REDIS_CONNECTED
;
c
->
flags
|=
REDIS_CONNECTED
;
return
REDIS_OK
;
rv
=
REDIS_OK
;
goto
end
;
}
if
(
p
==
NULL
)
{
char
buf
[
128
];
snprintf
(
buf
,
sizeof
(
buf
),
"Can't create socket: %s"
,
strerror
(
errno
));
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
buf
);
goto
error
;
}
error:
rv
=
REDIS_ERR
;
end:
freeaddrinfo
(
servinfo
);
return
rv
;
// Need to return REDIS_OK if alright
}
}
int
redisContextConnectUnix
(
redisContext
*
c
,
const
char
*
path
,
struct
timeval
*
timeout
)
{
int
redisContextConnectUnix
(
redisContext
*
c
,
const
char
*
path
,
struct
timeval
*
timeout
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment