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
redis
Commits
b4b62c34
Commit
b4b62c34
authored
Aug 25, 2010
by
Pieter Noordhuis
Browse files
Use fstat to detect if stdin was redirected
parent
f791d66e
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/redis-cli.c
View file @
b4b62c34
...
...
@@ -37,6 +37,7 @@
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <sys/stat.h>
#include "anet.h"
#include "sds.h"
...
...
@@ -55,7 +56,6 @@ static struct config {
int
hostport
;
long
repeat
;
int
dbnum
;
int
argn_from_stdin
;
int
interactive
;
int
shutdown
;
int
monitor_mode
;
...
...
@@ -334,7 +334,11 @@ static int parseOptions(int argc, char **argv) {
"by default when redis-cli is executed without a command to execute.
\n
"
);
}
else
if
(
!
strcmp
(
argv
[
i
],
"-c"
))
{
config
.
argn_from_stdin
=
1
;
fprintf
(
stderr
,
"Reading last argument from standard input using -c is deprecated.
\n
"
"When standard input is connected to a pipe or regular file, it is
\n
"
"automatically used as last argument.
\n
"
);
}
else
if
(
!
strcmp
(
argv
[
i
],
"-v"
))
{
printf
(
"redis-cli shipped with Redis verison %s
\n
"
,
REDIS_VERSION
);
exit
(
0
);
...
...
@@ -364,7 +368,7 @@ static sds readArgFromStdin(void) {
static
void
usage
()
{
fprintf
(
stderr
,
"usage: redis-cli [-iv] [-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] cmd arg1 arg2 arg3 ... argN
\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli
-c
[-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] cmd arg1 arg2 ... arg(N-1)
\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli [-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] cmd arg1 arg2 ... arg(N-1)
\n
"
);
fprintf
(
stderr
,
"
\n
If a pipe from standard input is detected this data is used as last argument.
\n\n
"
);
fprintf
(
stderr
,
"example: cat /etc/passwd | redis-cli set my_passwd
\n
"
);
fprintf
(
stderr
,
"example: redis-cli get my_passwd
\n
"
);
...
...
@@ -429,15 +433,28 @@ static void repl() {
exit
(
0
);
}
static
int
noninteractive
(
int
argc
,
char
**
argv
)
{
int
retval
=
0
;
struct
stat
s
;
fstat
(
fileno
(
stdin
),
&
s
);
if
(
S_ISFIFO
(
s
.
st_mode
)
||
S_ISREG
(
s
.
st_mode
))
{
/* pipe, regular file */
argv
=
zrealloc
(
argv
,
(
argc
+
1
)
*
sizeof
(
char
*
));
argv
[
argc
]
=
readArgFromStdin
();
retval
=
cliSendCommand
(
argc
+
1
,
argv
,
config
.
repeat
);
}
else
{
/* stdin is probably a tty, can be tested with S_ISCHR(s.st_mode) */
retval
=
cliSendCommand
(
argc
,
argv
,
config
.
repeat
);
}
return
retval
;
}
int
main
(
int
argc
,
char
**
argv
)
{
int
firstarg
;
char
**
argvcopy
;
config
.
hostip
=
"127.0.0.1"
;
config
.
hostport
=
6379
;
config
.
repeat
=
1
;
config
.
dbnum
=
0
;
config
.
argn_from_stdin
=
0
;
config
.
interactive
=
0
;
config
.
shutdown
=
0
;
config
.
monitor_mode
=
0
;
...
...
@@ -468,12 +485,6 @@ int main(int argc, char **argv) {
/* Start interactive mode when no command is provided */
if
(
argc
==
0
)
repl
();
argvcopy
=
convertToSds
(
argc
+
1
,
argv
);
if
(
config
.
argn_from_stdin
)
{
sds
lastarg
=
readArgFromStdin
();
argvcopy
[
argc
]
=
lastarg
;
argc
++
;
}
return
cliSendCommand
(
argc
,
argvcopy
,
config
.
repeat
);
/* Otherwise, we have some arguments to execute */
return
noninteractive
(
argc
,
convertToSds
(
argc
,
argv
));
}
tests/integration/redis-cli.tcl
View file @
b4b62c34
...
...
@@ -45,8 +45,26 @@ start_server {tags {"cli"}} {
}
# Helpers to run tests where stdout is not a tty
proc run_cli
{
args
}
{
set fd
[
open
[
format
"|src/redis-cli -p %d -n 9
$args
"
[
srv port
]]
"r"
]
proc write_tmpfile
{
contents
}
{
set tmp
[
tmpfile
"cli"
]
set tmpfd
[
open $tmp
"w"
]
puts -nonewline $tmpfd $contents
close $tmpfd
set _ $tmp
}
proc _run_cli
{
opts args
}
{
set cmd
[
format
"src/redis-cli -p %d -n 9
$args
"
[
srv port
]]
foreach
{
key value
}
$opts
{
if
{
$key
eq
"pipe"
}
{
set cmd
"sh -c
\"
$value
|
$cmd
\"
"
}
if
{
$key
eq
"path"
}
{
set cmd
"
$cmd
<
$value
"
}
}
set fd
[
open
"|
$cmd
"
"r"
]
fconfigure $fd -buffering none
fconfigure $fd -translation binary
set resp
[
read $fd 1048576
]
...
...
@@ -54,6 +72,18 @@ start_server {tags {"cli"}} {
set _ $resp
}
proc run_cli
{
args
}
{
_run_cli
{}
{*}
$args
}
proc run_cli_with_input_pipe
{
cmd args
}
{
_run_cli
[
list pipe $cmd
]
{*}
$args
}
proc run_cli_with_input_file
{
path args
}
{
_run_cli
[
list path $path
]
{*}
$args
}
proc test_nontty_cli
{
name code
}
{
test
"Non-interactive non-TTY CLI:
$name
"
$code
}
...
...
@@ -132,6 +162,17 @@ start_server {tags {"cli"}} {
assert_equal
"1.
\"
foo
\"\n
2.
\"
bar
\"\n
"
[
run_cli lrange list 0 -1
]
}
test_tty_cli
"Read last argument from pipe"
{
assert_equal
"OK
\n
"
[
run_cli_with_input_pipe
"echo foo"
set key
]
assert_equal
"foo
\n
"
[
r get key
]
}
test_tty_cli
"Read last argument from file"
{
set tmpfile
[
write_tmpfile
"from file"
]
assert_equal
"OK
\n
"
[
run_cli_with_input_file $tmpfile set key
]
assert_equal
"from file"
[
r get key
]
}
test_nontty_cli
"Status reply"
{
assert_equal
"OK"
[
run_cli set key bar
]
assert_equal
"bar"
[
r get key
]
...
...
@@ -153,4 +194,15 @@ start_server {tags {"cli"}} {
r rpush list bar
assert_equal
"foo
\n
bar"
[
run_cli lrange list 0 -1
]
}
test_nontty_cli
"Read last argument from pipe"
{
assert_equal
"OK"
[
run_cli_with_input_pipe
"echo foo"
set key
]
assert_equal
"foo
\n
"
[
r get key
]
}
test_nontty_cli
"Read last argument from file"
{
set tmpfile
[
write_tmpfile
"from file"
]
assert_equal
"OK"
[
run_cli_with_input_file $tmpfile set key
]
assert_equal
"from file"
[
r get key
]
}
}
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