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
"src/parser.h" did not exist on "4d3f9aa1b7acddbb5fc2495a08d96537f51ff80d"
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 @@
#include <errno.h>
#include "hiredis.h"
#include "
a
net.h"
#include "net.h"
#include "sds.h"
#include "util.h"
...
...
@@ -614,7 +614,7 @@ int redisFormatCommandArgv(char **target, int argc, const char **argv, const siz
return
totlen
;
}
static
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
str
)
{
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
str
)
{
c
->
err
=
type
;
if
(
str
)
{
c
->
errstr
=
sdsnew
(
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
()
{
redisContext
*
c
=
calloc
(
sizeof
(
redisContext
),
1
);
c
->
err
=
0
;
...
...
hiredis.h
View file @
b8b29665
...
...
@@ -40,9 +40,9 @@
* should use the "errno" variable to find out what is wrong.
* For other values, the "errstr" field will hold a description. */
#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_PROTOCOL 4
/* protocol error */
#define REDIS_ERR_OTHER 2
/* something else */
/* Connection type can be blocking or non-blocking and is set in the
* 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>
* All rights reserved.
...
...
@@ -29,7 +29,6 @@
*/
#include "fmacros.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
...
...
@@ -43,100 +42,54 @@
#include <stdarg.h>
#include <stdio.h>
#include "anet.h"
static
void
anetSetError
(
char
*
err
,
const
char
*
fmt
,
...)
{
va_list
ap
;
#include "hiredis.h"
#include "sds.h"
if
(
!
err
)
return
;
va_start
(
ap
,
fmt
);
vsnprintf
(
err
,
ANET_ERR_LEN
,
fmt
,
ap
);
va_end
(
ap
);
}
/* Forward declaration */
void
__redisSetError
(
redisContext
*
c
,
int
type
,
const
char
*
err
);
int
anetNonBlock
(
char
*
err
,
int
fd
)
{
static
int
redisSetNonBlock
(
redisContext
*
c
,
int
fd
)
{
int
flags
;
/* Set the socket nonblocking.
* Note that fcntl(2) for F_GETFL and F_SETFL can't be
* interrupted by a signal. */
if
((
flags
=
fcntl
(
fd
,
F_GETFL
))
==
-
1
)
{
anetSetError
(
err
,
"fcntl(F_GETFL): %s"
,
strerror
(
errno
));
return
ANET_ERR
;
__redisSetError
(
c
,
REDIS_ERR_IO
,
sdscatprintf
(
sdsempty
(),
"fcntl(F_GETFL): %s"
,
strerror
(
errno
)));
return
REDIS_ERR
;
}
if
(
fcntl
(
fd
,
F_SETFL
,
flags
|
O_NONBLOCK
)
==
-
1
)
{
anetSetError
(
err
,
"fcntl(F_SETFL,O_NONBLOCK): %s"
,
strerror
(
errno
));
return
ANET_ERR
;
__redisSetError
(
c
,
REDIS_ERR_IO
,
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
;
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
{
anetSetError
(
err
,
"setsockopt(TCP_NODELAY): %s"
,
strerror
(
errno
));
return
ANET_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
;
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
{
__redisSetError
(
c
,
REDIS_ERR_IO
,
sdscatprintf
(
sdsempty
(),
"setsockopt(TCP_NODELAY): %s"
,
strerror
(
errno
)));
return
REDIS_ERR
;
}
return
ANET
_OK
;
return
REDIS
_OK
;
}
int
anetTcpKeepAlive
(
char
*
err
,
int
fd
)
{
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
redisContextConnect
(
redisContext
*
c
,
const
char
*
addr
,
int
port
)
{
int
s
,
on
=
1
;
int
blocking
=
(
c
->
flags
&
REDIS_BLOCK
);
struct
sockaddr_in
sa
;
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"creating socket: %s"
,
strerror
(
errno
));
return
ANET_ERR
;
__redisSetError
(
c
,
REDIS_ERR_IO
,
NULL
);
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_port
=
htons
(
port
);
...
...
@@ -145,126 +98,30 @@ static int anetTcpGenericConnect(char *err, const char *addr, int port, int flag
he
=
gethostbyname
(
addr
);
if
(
he
==
NULL
)
{
anetSetError
(
err
,
"can't resolve: %s"
,
addr
);
__redisSetError
(
c
,
REDIS_ERR_OTHER
,
sdscatprintf
(
sdsempty
(),
"can't resolve: %s"
,
addr
));
close
(
s
);
return
ANET
_ERR
;
return
REDIS
_ERR
;
}
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
* (unless error or EOF condition is encountered) */
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
)
{
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
;
}
if
(
!
blocking
)
if
(
redisSetNonBlock
(
c
,
s
)
!=
REDIS_OK
)
return
REDIS_ERR
;
/* Like write(2) but make sure 'count' is read before to return
* (unless error is encountered) */
int
anetWrite
(
int
fd
,
char
*
buf
,
int
count
)
{
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
;
}
if
(
connect
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
if
(
errno
==
EINPROGRESS
&&
!
blocking
)
return
s
;
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
)
{
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
));
__redisSetError
(
c
,
REDIS_ERR_IO
,
NULL
);
close
(
s
);
return
ANET
_ERR
;
return
REDIS
_ERR
;
}
return
s
;
}
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
)
{
int
fd
;
struct
sockaddr_in
sa
;
unsigned
int
saLen
;
if
(
redisSetTcpNoDelay
(
c
,
s
)
!=
REDIS_OK
)
return
REDIS_ERR
;
while
(
1
)
{
saLen
=
sizeof
(
sa
);
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
;
c
->
fd
=
s
;
return
REDIS_OK
;
}
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>
* All rights reserved.
...
...
@@ -28,22 +28,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef
A
NET_H
#define
A
NET_H
#ifndef
__
NET_H
#define
__
NET_H
#define ANET_OK 0
#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
);
int
redisContextConnect
(
redisContext
*
c
,
const
char
*
addr
,
int
port
);
#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