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
b8b29665
Commit
b8b29665
authored
Nov 02, 2010
by
Pieter Noordhuis
Browse files
Strip net.c down to the bare minimum
parent
dd8a34de
Changes
4
Hide whitespace changes
Inline
Side-by-side
hiredis.c
View file @
b8b29665
...
@@ -34,7 +34,7 @@
...
@@ -34,7 +34,7 @@
#include <errno.h>
#include <errno.h>
#include "hiredis.h"
#include "hiredis.h"
#include "
a
net.h"
#include "net.h"
#include "sds.h"
#include "sds.h"
#include "util.h"
#include "util.h"
...
@@ -614,7 +614,7 @@ int redisFormatCommandArgv(char **target, int argc, const char **argv, const siz
...
@@ -614,7 +614,7 @@ int redisFormatCommandArgv(char **target, int argc, const char **argv, const siz
return
totlen
;
return
totlen
;
}
}
static
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
str
)
{
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
str
)
{
c
->
err
=
type
;
c
->
err
=
type
;
if
(
str
)
{
if
(
str
)
{
c
->
errstr
=
sdsnew
(
str
);
c
->
errstr
=
sdsnew
(
str
);
...
@@ -625,25 +625,6 @@ static void __redisSetError(redisContext *c, int type, const char *str) {
...
@@ -625,25 +625,6 @@ static void __redisSetError(redisContext *c, int type, const char *str) {
}
}
}
}
static
int
redisContextConnect
(
redisContext
*
c
,
const
char
*
ip
,
int
port
)
{
char
err
[
ANET_ERR_LEN
];
if
(
c
->
flags
&
REDIS_BLOCK
)
{
c
->
fd
=
anetTcpConnect
(
err
,(
char
*
)
ip
,
port
);
}
else
{
c
->
fd
=
anetTcpNonBlockConnect
(
err
,(
char
*
)
ip
,
port
);
}
if
(
c
->
fd
==
ANET_ERR
)
{
__redisSetError
(
c
,
REDIS_ERR_CONN
,
err
);
return
REDIS_ERR
;
}
if
(
anetTcpNoDelay
(
err
,
c
->
fd
)
==
ANET_ERR
)
{
__redisSetError
(
c
,
REDIS_ERR_CONN
,
err
);
return
REDIS_ERR
;
}
return
REDIS_OK
;
}
static
redisContext
*
redisContextInit
()
{
static
redisContext
*
redisContextInit
()
{
redisContext
*
c
=
calloc
(
sizeof
(
redisContext
),
1
);
redisContext
*
c
=
calloc
(
sizeof
(
redisContext
),
1
);
c
->
err
=
0
;
c
->
err
=
0
;
...
...
hiredis.h
View file @
b8b29665
...
@@ -40,9 +40,9 @@
...
@@ -40,9 +40,9 @@
* should use the "errno" variable to find out what is wrong.
* should use the "errno" variable to find out what is wrong.
* For other values, the "errstr" field will hold a description. */
* For other values, the "errstr" field will hold a description. */
#define REDIS_ERR_IO 1
/* error in read or write */
#define REDIS_ERR_IO 1
/* error in read or write */
#define REDIS_ERR_CONN 2
/* error connecting */
#define REDIS_ERR_EOF 3
/* eof */
#define REDIS_ERR_EOF 3
/* eof */
#define REDIS_ERR_PROTOCOL 4
/* protocol error */
#define REDIS_ERR_PROTOCOL 4
/* protocol error */
#define REDIS_ERR_OTHER 2
/* something else */
/* Connection type can be blocking or non-blocking and is set in the
/* Connection type can be blocking or non-blocking and is set in the
* least significant bit of the flags field in redisContext. */
* least significant bit of the flags field in redisContext. */
...
...
net.c
View file @
b8b29665
/*
anet.c -- Basic TCP socket stuff made a bit less b
oring
/*
Extracted from anet.c to work properly with Hiredis error rep
or
t
ing
.
*
*
* Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
* Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
* All rights reserved.
* All rights reserved.
...
@@ -29,7 +29,6 @@
...
@@ -29,7 +29,6 @@
*/
*/
#include "fmacros.h"
#include "fmacros.h"
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in.h>
...
@@ -43,100 +42,54 @@
...
@@ -43,100 +42,54 @@
#include <stdarg.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdio.h>
#include "anet.h"
#include "hiredis.h"
#include "sds.h"
static
void
anetSetError
(
char
*
err
,
const
char
*
fmt
,
...)
{
va_list
ap
;
if
(
!
err
)
return
;
/* Forward declaration */
va_start
(
ap
,
fmt
);
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
err
);
vsnprintf
(
err
,
ANET_ERR_LEN
,
fmt
,
ap
);
va_end
(
ap
);
}
int
anetNonBlock
(
char
*
err
,
int
fd
)
static
int
redisSetNonBlock
(
redisContext
*
c
,
int
fd
)
{
{
int
flags
;
int
flags
;
/* Set the socket nonblocking.
/* Set the socket nonblocking.
* Note that fcntl(2) for F_GETFL and F_SETFL can't be
* Note that fcntl(2) for F_GETFL and F_SETFL can't be
* interrupted by a signal. */
* interrupted by a signal. */
if
((
flags
=
fcntl
(
fd
,
F_GETFL
))
==
-
1
)
{
if
((
flags
=
fcntl
(
fd
,
F_GETFL
))
==
-
1
)
{
anetSetError
(
err
,
"fcntl(F_GETFL): %s"
,
strerror
(
errno
));
__redisSetError
(
c
,
REDIS_ERR_IO
,
return
ANET_ERR
;
sdscatprintf
(
sdsempty
(),
"fcntl(F_GETFL): %s"
,
strerror
(
errno
)));
return
REDIS_ERR
;
}
}
if
(
fcntl
(
fd
,
F_SETFL
,
flags
|
O_NONBLOCK
)
==
-
1
)
{
if
(
fcntl
(
fd
,
F_SETFL
,
flags
|
O_NONBLOCK
)
==
-
1
)
{
anetSetError
(
err
,
"fcntl(F_SETFL,O_NONBLOCK): %s"
,
strerror
(
errno
));
__redisSetError
(
c
,
REDIS_ERR_IO
,
return
ANET_ERR
;
sdscatprintf
(
sdsempty
(),
"fcntl(F_SETFL,O_NONBLOCK): %s"
,
strerror
(
errno
)));
return
REDIS_ERR
;
}
}
return
ANET
_OK
;
return
REDIS
_OK
;
}
}
int
anetTcpNoDelay
(
char
*
err
,
int
fd
)
static
int
redisSetTcpNoDelay
(
redisContext
*
c
,
int
fd
)
{
{
int
yes
=
1
;
int
yes
=
1
;
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
{
{
__redisSetError
(
c
,
REDIS_ERR_IO
,
anetSetError
(
err
,
"setsockopt(TCP_NODELAY): %s"
,
strerror
(
errno
));
sdscatprintf
(
sdsempty
(),
"setsockopt(TCP_NODELAY): %s"
,
strerror
(
errno
)));
return
ANET_ERR
;
return
REDIS_ERR
;
}
return
ANET_OK
;
}
int
anetSetSendBuffer
(
char
*
err
,
int
fd
,
int
buffsize
)
{
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_SNDBUF
,
&
buffsize
,
sizeof
(
buffsize
))
==
-
1
)
{
anetSetError
(
err
,
"setsockopt(SO_SNDBUF): %s"
,
strerror
(
errno
));
return
ANET_ERR
;
}
}
return
ANET
_OK
;
return
REDIS
_OK
;
}
}
int
anetTcpKeepAlive
(
char
*
err
,
int
fd
)
int
redisContextConnect
(
redisContext
*
c
,
const
char
*
addr
,
int
port
)
{
{
int
yes
=
1
;
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_KEEPALIVE
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
{
anetSetError
(
err
,
"setsockopt(SO_KEEPALIVE): %s"
,
strerror
(
errno
));
return
ANET_ERR
;
}
return
ANET_OK
;
}
int
anetResolve
(
char
*
err
,
char
*
host
,
char
*
ipbuf
)
{
struct
sockaddr_in
sa
;
sa
.
sin_family
=
AF_INET
;
if
(
inet_aton
(
host
,
&
sa
.
sin_addr
)
==
0
)
{
struct
hostent
*
he
;
he
=
gethostbyname
(
host
);
if
(
he
==
NULL
)
{
anetSetError
(
err
,
"can't resolve: %s"
,
host
);
return
ANET_ERR
;
}
memcpy
(
&
sa
.
sin_addr
,
he
->
h_addr
,
sizeof
(
struct
in_addr
));
}
strcpy
(
ipbuf
,
inet_ntoa
(
sa
.
sin_addr
));
return
ANET_OK
;
}
#define ANET_CONNECT_NONE 0
#define ANET_CONNECT_NONBLOCK 1
static
int
anetTcpGenericConnect
(
char
*
err
,
const
char
*
addr
,
int
port
,
int
flags
)
{
int
s
,
on
=
1
;
int
s
,
on
=
1
;
int
blocking
=
(
c
->
flags
&
REDIS_BLOCK
);
struct
sockaddr_in
sa
;
struct
sockaddr_in
sa
;
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"creating socket: %s"
,
strerror
(
errno
));
__redisSetError
(
c
,
REDIS_ERR_IO
,
NULL
);
return
ANET_ERR
;
return
REDIS_ERR
;
}
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
__redisSetError
(
c
,
REDIS_ERR_IO
,
NULL
);
return
REDIS_ERR
;
}
}
/* Make sure connection-intensive things like the redis benckmark
* will be able to close/open sockets a zillion of times */
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
));
sa
.
sin_family
=
AF_INET
;
sa
.
sin_family
=
AF_INET
;
sa
.
sin_port
=
htons
(
port
);
sa
.
sin_port
=
htons
(
port
);
...
@@ -145,126 +98,30 @@ static int anetTcpGenericConnect(char *err, const char *addr, int port, int flag
...
@@ -145,126 +98,30 @@ static int anetTcpGenericConnect(char *err, const char *addr, int port, int flag
he
=
gethostbyname
(
addr
);
he
=
gethostbyname
(
addr
);
if
(
he
==
NULL
)
{
if
(
he
==
NULL
)
{
anetSetError
(
err
,
"can't resolve: %s"
,
addr
);
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
sdscatprintf
(
sdsempty
(),
"can't resolve: %s"
,
addr
));
close
(
s
);
close
(
s
);
return
ANET
_ERR
;
return
REDIS
_ERR
;
}
}
memcpy
(
&
sa
.
sin_addr
,
he
->
h_addr
,
sizeof
(
struct
in_addr
));
memcpy
(
&
sa
.
sin_addr
,
he
->
h_addr
,
sizeof
(
struct
in_addr
));
}
}
if
(
flags
&
ANET_CONNECT_NONBLOCK
)
{
if
(
anetNonBlock
(
err
,
s
)
!=
ANET_OK
)
return
ANET_ERR
;
}
if
(
connect
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
if
(
errno
==
EINPROGRESS
&&
flags
&
ANET_CONNECT_NONBLOCK
)
return
s
;
anetSetError
(
err
,
"connect: %s"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
return
s
;
}
int
anetTcpConnect
(
char
*
err
,
const
char
*
addr
,
int
port
)
{
return
anetTcpGenericConnect
(
err
,
addr
,
port
,
ANET_CONNECT_NONE
);
}
int
anetTcpNonBlockConnect
(
char
*
err
,
char
*
addr
,
int
port
)
{
return
anetTcpGenericConnect
(
err
,
addr
,
port
,
ANET_CONNECT_NONBLOCK
);
}
/* Like read(2) but make sure 'count' is read before to return
if
(
!
blocking
)
* (unless error or EOF condition is encountered) */
if
(
redisSetNonBlock
(
c
,
s
)
!=
REDIS_OK
)
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
)
return
REDIS_ERR
;
{
int
nread
,
totlen
=
0
;
while
(
totlen
!=
count
)
{
nread
=
read
(
fd
,
buf
,
count
-
totlen
);
if
(
nread
==
0
)
return
totlen
;
if
(
nread
==
-
1
)
return
-
1
;
totlen
+=
nread
;
buf
+=
nread
;
}
return
totlen
;
}
/* Like write(2) but make sure 'count' is read before to return
if
(
connect
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
* (unless error is encountered) */
if
(
errno
==
EINPROGRESS
&&
!
blocking
)
int
anetWrite
(
int
fd
,
char
*
buf
,
int
count
)
return
s
;
{
int
nwritten
,
totlen
=
0
;
while
(
totlen
!=
count
)
{
nwritten
=
write
(
fd
,
buf
,
count
-
totlen
);
if
(
nwritten
==
0
)
return
totlen
;
if
(
nwritten
==
-
1
)
return
-
1
;
totlen
+=
nwritten
;
buf
+=
nwritten
;
}
return
totlen
;
}
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
)
__redisSetError
(
c
,
REDIS_ERR_IO
,
NULL
);
{
int
s
,
on
=
1
;
struct
sockaddr_in
sa
;
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"socket: %s"
,
strerror
(
errno
));
return
ANET_ERR
;
}
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
anetSetError
(
err
,
"setsockopt(SO_REUSEADDR): %s"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
memset
(
&
sa
,
0
,
sizeof
(
sa
));
sa
.
sin_family
=
AF_INET
;
sa
.
sin_port
=
htons
(
port
);
sa
.
sin_addr
.
s_addr
=
htonl
(
INADDR_ANY
);
if
(
bindaddr
)
{
if
(
inet_aton
(
bindaddr
,
&
sa
.
sin_addr
)
==
0
)
{
anetSetError
(
err
,
"inet_aton: Invalid bind address"
);
close
(
s
);
return
ANET_ERR
;
}
}
if
(
bind
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
anetSetError
(
err
,
"bind: %s"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
if
(
listen
(
s
,
511
)
==
-
1
)
{
/* the magic 511 constant is from nginx */
anetSetError
(
err
,
"listen: %s"
,
strerror
(
errno
));
close
(
s
);
close
(
s
);
return
ANET
_ERR
;
return
REDIS
_ERR
;
}
}
return
s
;
}
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
)
if
(
redisSetTcpNoDelay
(
c
,
s
)
!=
REDIS_OK
)
{
return
REDIS_ERR
;
int
fd
;
struct
sockaddr_in
sa
;
unsigned
int
saLen
;
while
(
1
)
{
c
->
fd
=
s
;
saLen
=
sizeof
(
sa
);
return
REDIS_OK
;
fd
=
accept
(
serversock
,
(
struct
sockaddr
*
)
&
sa
,
&
saLen
);
if
(
fd
==
-
1
)
{
if
(
errno
==
EINTR
)
continue
;
else
{
anetSetError
(
err
,
"accept: %s"
,
strerror
(
errno
));
return
ANET_ERR
;
}
}
break
;
}
if
(
ip
)
strcpy
(
ip
,
inet_ntoa
(
sa
.
sin_addr
));
if
(
port
)
*
port
=
ntohs
(
sa
.
sin_port
);
return
fd
;
}
}
net.h
View file @
b8b29665
/*
anet.c -- Basic TCP socket stuff made a bit less b
oring
/*
Extracted from anet.c to work properly with Hiredis error rep
or
t
ing
.
*
*
* Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
* Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
* All rights reserved.
* All rights reserved.
...
@@ -28,22 +28,9 @@
...
@@ -28,22 +28,9 @@
* POSSIBILITY OF SUCH DAMAGE.
* POSSIBILITY OF SUCH DAMAGE.
*/
*/
#ifndef
A
NET_H
#ifndef
__
NET_H
#define
A
NET_H
#define
__
NET_H
#define ANET_OK 0
int
redisContextConnect
(
redisContext
*
c
,
const
char
*
addr
,
int
port
);
#define ANET_ERR -1
#define ANET_ERR_LEN 256
int
anetTcpConnect
(
char
*
err
,
const
char
*
addr
,
int
port
);
int
anetTcpNonBlockConnect
(
char
*
err
,
char
*
addr
,
int
port
);
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
);
int
anetResolve
(
char
*
err
,
char
*
host
,
char
*
ipbuf
);
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
);
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
);
int
anetWrite
(
int
fd
,
char
*
buf
,
int
count
);
int
anetNonBlock
(
char
*
err
,
int
fd
);
int
anetTcpNoDelay
(
char
*
err
,
int
fd
);
int
anetTcpKeepAlive
(
char
*
err
,
int
fd
);
#endif
#endif
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