diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-20 17:34:03 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-07-20 18:22:16 +0300 |
commit | 7f26449a38b4a491880d05ea36a10e1cfd111808 (patch) | |
tree | fdf338b02ef535ea6b0bef6edd6187f9e6097ae6 /capture.c | |
download | posixruncapture-7f26449a38b4a491880d05ea36a10e1cfd111808.tar.gz posixruncapture-7f26449a38b4a491880d05ea36a10e1cfd111808.tar.bz2 |
Initial commit
Diffstat (limited to 'capture.c')
-rw-r--r-- | capture.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/capture.c b/capture.c new file mode 100644 index 0000000..11fbc17 --- /dev/null +++ b/capture.c @@ -0,0 +1,86 @@ +#include "capture.h" +#include <stdlib.h> + +struct runcap * +capture_new(AV *av) +{ + struct runcap *rc; + I32 i, n; + char **argv; + + rc = malloc(sizeof *rc); + if (!rc) + goto nomem; + memset(rc, 0, sizeof *rc); + n = av_len(av); + if (n == -1) + return rc; + argv = calloc(n + 2, sizeof *argv); + if (!argv) + goto nomem; + for (i = 0; i <= n; i++) { + SV *sv, **psv = av_fetch(av, i, 0); + if (!psv) + croak("element %d doesn't exist", i); + sv = *psv; + if (SvTYPE(sv) == SVt_PV) { + char *s = SvPV_nolen(sv); + if ((argv[i] = strdup(s)) == NULL) + goto nomem; + } + } + argv[i] = NULL; + + rc->rc_argv = argv; + + return rc; + nomem: + return NULL; +} + +void +capture_DESTROY(struct runcap *rc) +{ +// printf("DESTROY\n"); + if (rc->rc_argv) { + size_t i; + for (i = 0; rc->rc_argv[i]; i++) { + free(rc->rc_argv[i]); + } + free(rc->rc_argv); + } + runcap_free(rc); + free(rc); +} + +char * +capture_next_line(struct runcap *rc, int fd) +{ + char *buf = NULL; + size_t sz = 0; + ssize_t n; + + if (fd != RUNCAP_STDOUT && fd != RUNCAP_STDERR) { + croak("invalid stream number: %d", fd); + } + n = runcap_getline(rc, fd, &buf, &sz); + if (n == -1) + croak("error getting line: %s", strerror(errno)); + if (n == 0) + return NULL; + return realloc(buf, n + 1); +} + +void +capture_wd() +{ + volatile int _st=0; + printf("ENTER\n"); + while (!_st) { + printf("WAIING\n"); + sleep(1); + _st = _st; + } + printf("EXIT\n"); +} + |