diff options
-rwxr-xr-x | t/t0081-line-buffer.sh | 9 | ||||
-rw-r--r-- | test-line-buffer.c | 11 | ||||
-rw-r--r-- | vcs-svn/line_buffer.c | 8 | ||||
-rw-r--r-- | vcs-svn/line_buffer.h | 1 | ||||
-rw-r--r-- | vcs-svn/line_buffer.txt | 9 |
5 files changed, 31 insertions, 7 deletions
diff --git a/t/t0081-line-buffer.sh b/t/t0081-line-buffer.sh index a8eeb20645..550fad0823 100755 --- a/t/t0081-line-buffer.sh +++ b/t/t0081-line-buffer.sh @@ -131,6 +131,15 @@ test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' ' long_read_test 65536 ' +test_expect_success 'read from file descriptor' ' + rm -f input && + echo hello >expect && + echo hello >input && + echo copy 6 | + test-line-buffer "&4" 4<input >actual && + test_cmp expect actual +' + test_expect_success 'buffer_read_string copes with null byte' ' >expect && q_to_nul <<-\EOF | test-line-buffer >actual && diff --git a/test-line-buffer.c b/test-line-buffer.c index 19bf2d4403..25b20b93fd 100644 --- a/test-line-buffer.c +++ b/test-line-buffer.c @@ -69,13 +69,18 @@ int main(int argc, char *argv[]) else if (argc == 2) filename = argv[1]; else - usage("test-line-buffer [file] < script"); + usage("test-line-buffer [file | &fd] < script"); if (buffer_init(&stdin_buf, NULL)) die_errno("open error"); if (filename) { - if (buffer_init(&file_buf, filename)) - die_errno("error opening %s", filename); + if (*filename == '&') { + if (buffer_fdinit(&file_buf, strtouint32(filename + 1))) + die_errno("error opening fd %s", filename + 1); + } else { + if (buffer_init(&file_buf, filename)) + die_errno("error opening %s", filename); + } input = &file_buf; } diff --git a/vcs-svn/line_buffer.c b/vcs-svn/line_buffer.c index 37ec56e5be..e29a81a536 100644 --- a/vcs-svn/line_buffer.c +++ b/vcs-svn/line_buffer.c @@ -17,6 +17,14 @@ int buffer_init(struct line_buffer *buf, const char *filename) return 0; } +int buffer_fdinit(struct line_buffer *buf, int fd) +{ + buf->infile = fdopen(fd, "r"); + if (!buf->infile) + return -1; + return 0; +} + int buffer_deinit(struct line_buffer *buf) { int err; diff --git a/vcs-svn/line_buffer.h b/vcs-svn/line_buffer.h index 0a59c73e8b..630d83c31a 100644 --- a/vcs-svn/line_buffer.h +++ b/vcs-svn/line_buffer.h @@ -13,6 +13,7 @@ struct line_buffer { #define LINE_BUFFER_INIT {"", STRBUF_INIT, NULL} int buffer_init(struct line_buffer *buf, const char *filename); +int buffer_fdinit(struct line_buffer *buf, int fd); int buffer_deinit(struct line_buffer *buf); char *buffer_read_line(struct line_buffer *buf); char *buffer_read_string(struct line_buffer *buf, uint32_t len); diff --git a/vcs-svn/line_buffer.txt b/vcs-svn/line_buffer.txt index f8eaa4dd8c..4e8fb719c1 100644 --- a/vcs-svn/line_buffer.txt +++ b/vcs-svn/line_buffer.txt @@ -27,10 +27,11 @@ resources. Functions --------- -`buffer_init`:: - Open the named file for input. If filename is NULL, - start reading from stdin. On failure, returns -1 (with - errno indicating the nature of the failure). +`buffer_init`, `buffer_fdinit`:: + Open the named file or file descriptor for input. + buffer_init(buf, NULL) prepares to read from stdin. + On failure, returns -1 (with errno indicating the nature + of the failure). `buffer_deinit`:: Stop reading from the current file (closing it unless |