summaryrefslogtreecommitdiffabout
path: root/getc.c
authorSergey Poznyakoff <gray@gnu.org.ua>2017-07-18 14:50:34 (GMT)
committer Sergey Poznyakoff <gray@gnu.org.ua>2017-07-18 14:50:34 (GMT)
commit24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8 (patch) (side-by-side diff)
treefbd53229d5f87f9a99cbd64a89ac4fb1d06bd7ad /getc.c
parent3488a182f66e35b091f441b9201ad43ad6d0f1ac (diff)
downloadruncap-24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8.tar.gz
runcap-24b9e009c9c2eef1b6d1accb3ac7ccc53c44c0a8.tar.bz2
Add missing API calls, provide testsuite
Diffstat (limited to 'getc.c') (more/less context) (ignore whitespace changes)
-rw-r--r--getc.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/getc.c b/getc.c
new file mode 100644
index 0000000..3c203d9
--- a/dev/null
+++ b/getc.c
@@ -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;
+}
+

Return to:

Send suggestions and report system problems to the System administrator.