diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-18 17:50:34 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-18 17:50:34 +0300 |
commit | 24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8 (patch) | |
tree | fbd53229d5f87f9a99cbd64a89ac4fb1d06bd7ad /getc.c | |
parent | 3488a182f66e35b091f441b9201ad43ad6d0f1ac (diff) | |
download | runcap-24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8.tar.gz runcap-24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8.tar.bz2 |
Add missing API calls, provide testsuite
Diffstat (limited to 'getc.c')
-rw-r--r-- | getc.c | 54 |
1 files changed, 54 insertions, 0 deletions
@@ -0,0 +1,54 @@ +/* runcap - run program and capture its output + Copyright (C) 2017 Sergey Poznyakoff + + Runcap is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Runcap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Runcap. If not, see <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +#include "runcap.h" + +int +runcap_getc(struct runcap *rc, int stream, char *cp) +{ + struct filecapture *fp; + + if (!cp) { + errno = EINVAL; + return -1; + } + + fp = runcap_filecapture(rc, stream); + if (!fp) + return -1; + + if (fp->fc_level == fp->fc_linestart) { + if (fp->fc_tmpfd != -1) { + ssize_t r = read(fp->fc_tmpfd, fp->fc_base, + fp->fc_size); + if (r < 0) + return -1; + else if (r == 0) + return 0; + fp->fc_level = r; + fp->fc_linestart = 0; + } else { + return 0; + } + } + *cp = fp->fc_base[fp->fc_linestart++]; + return 1; +} + |