Esempio n. 1
0
/* V_LENS -> V_TREE -> V_STRING -> V_STRING */
static struct value *lens_put(struct info *info, struct value *l,
                              struct value *tree, struct value *str) {
    assert(l->tag == V_LENS);
    assert(tree->tag == V_TREE);
    assert(str->tag == V_STRING);

    struct memstream ms;
    struct value *v;
    struct lns_error *err;

    init_memstream(&ms);
    lns_put(ms.stream, l->lens, tree->origin->children,
            str->string->str, &err);
    close_memstream(&ms);

    if (err == NULL && ! HAS_ERR(info)) {
        v = make_value(V_STRING, ref(info));
        v->string = make_string(ms.buf);
    } else {
        v = make_exn_lns_error(info, err, str->string->str);
        free_lns_error(err);
        FREE(ms.buf);
    }
    return v;
}
Esempio n. 2
0
static void exn_print_tree(struct value *exn, struct tree *tree) {
    struct memstream ms;

    init_memstream(&ms);
    dump_tree(ms.stream, tree);
    close_memstream(&ms);
    exn_printf_line(exn, "%s", ms.buf);
    FREE(ms.buf);
}
Esempio n. 3
0
static int run_one_test(struct test *test) {
    int r;
    struct augeas *aug = NULL;
    struct memstream ms;
    int result = 0;

    MEMZERO(&ms, 1);

    aug = aug_init("/dev/null", lensdir, AUG_NO_STDINC|AUG_NO_MODL_AUTOLOAD);
    fail(aug == NULL, "aug_init");
    fail(aug_error(aug) != AUG_NOERROR, "aug_init: errcode was %d",
         aug_error(aug));

    printf("%-30s ... ", test->name);

    r = load_module(aug, test);
    if (r < 0)
        goto error;

    r = init_memstream(&ms);
    fail(r < 0, "init_memstream");

    r = aug_srun(aug, ms.stream, test->cmd);
    fail(r != test->result, "return value: expected %d, actual %d",
         test->result, r);
    fail(aug_error(aug) != test->errcode, "errcode: expected %s, actual %s",
         errtokens[test->errcode], errtokens[aug_error(aug)]);

    r = close_memstream(&ms);
    fail(r < 0, "close_memstream");
    fail(ms.buf == NULL, "close_memstream left buf NULL");

    if (test->out != NULL) {
        fail(STRNEQ(ms.buf, test->out), "output: expected '%s', actual '%s'",
             test->out, ms.buf);
    } else if (test->out_present) {
        fail(strlen(ms.buf) == 0,
             "output: expected some output");
    } else {
        fail(strlen(ms.buf) > 0,
             "output: expected nothing, actual '%s'", ms.buf);
    }
    printf("PASS\n");

 done:
    free(ms.buf);
    aug_close(aug);
    return result;
 error:
    result = -1;
    goto done;
}
Esempio n. 4
0
int readnext_filereader(filereader_t * frd, /*out*/struct memstream_ro_t * buffer)
{
   int err;

   if (frd->ioerror) {
      // never logged twice
      return frd->ioerror;
   }

   off_t unreadsize = frd->filesize - frd->fileoffset;

   if (0 == unreadsize) {
      // ENODATA is not logged
      return ENODATA;
   }

   if (! frd->nrfreebuffer) {
      err = ENOBUFS;
      goto ONERR;
   }

   uint8_t * bufferaddr = frd->page[frd->nextindex].addr;
   size_t    buffersize = frd->page[frd->nextindex].size;
   if (castPoff_size(unreadsize) < buffersize) {
      buffersize = (size_t) unreadsize;
   }

   if (! frd->unreadsize) {
      err = readall_iochannel(frd->file, buffersize, bufferaddr, -1);
      if (err) {
         frd->ioerror = err;
         goto ONERR;
      }
      frd->unreadsize = buffersize;
   }

   frd->unreadsize -= buffersize;
   frd->nextindex = ! frd->nextindex;
   -- frd->nrfreebuffer;
   frd->fileoffset += (off_t) buffersize;

   // set out param
   init_memstream(buffer, bufferaddr, bufferaddr + buffersize);

   return 0;
ONERR:
   TRACEEXIT_ERRLOG(err);
   return err;
}