/* * Invoke a run-time defined function and return the resulting * output as a string. */ static char * tmpl_invoke_defined(struct tmpl_ctx *ctx, struct exec_func *func, char **errmsgp, int argc, char **argv) { FILE *const output_save = ctx->output; char *rtn = NULL; int esave; /* Create string output buffer to capture output */ if ((ctx->output = string_buf_output(ctx->mtype)) == NULL) goto fail; /* Invoke function using existing context */ if (tmpl_invoke_defined2(ctx, func, errmsgp, argc, argv) == -1) goto fail; /* Return the resulting output as a string */ rtn = string_buf_content(ctx->output, 1); fail: /* Clean up and return */ esave = errno; if (ctx->output != NULL) fclose(ctx->output); ctx->output = output_save; errno = esave; return (rtn); }
/* * Handler used by http_request_read_mime_multipart(). */ static int _http_request_read_mime_handler(void *arg, struct mime_part *part0, FILE *fp) { struct mime_multipart *const mp = arg; struct mime_part *part; FILE *sb = NULL; char buf[256]; int nr; /* Allocate new part structure */ if (mp->nalloc < mp->nparts + 1) { const u_int new_alloc = (mp->nalloc + 1) * 2; struct mime_part *new_parts; if ((new_parts = REALLOC(MIME_MEM_TYPE, mp->parts, new_alloc * sizeof(*mp->parts))) == NULL) return (-1); mp->parts = new_parts; mp->nalloc = new_alloc; } part = &mp->parts[mp->nparts++]; memset(part, 0, sizeof(*part)); /* Copy headers for this part */ if ((part->head = _http_head_copy(part0->head)) == NULL) return (-1); /* Slurp part's data into memory buffer */ if ((sb = string_buf_output(MIME_MEM_TYPE)) == NULL) return (-1); while ((nr = fread(buf, 1, sizeof(buf), fp)) != 0) { if (fwrite(buf, 1, nr, sb) != nr) { fclose(sb); return (-1); } } if (ferror(fp)) { fclose(sb); return (-1); } /* Extract data from string buffer stream */ part->dlen = string_buf_length(sb); if ((part->data = (u_char *)string_buf_content(sb, 1)) == NULL) { part->dlen = 0; fclose(sb); return (-1); } fclose(sb); /* Done */ return (0); }
/* * Invoke a single template function. */ int tmpl_execute_func(struct tmpl_ctx *ctx, FILE *output, char **errmsgp, int argc, char **argv, int flags) { struct tmpl *t; char *input; FILE *sbuf; int rtn; int i; /* Avoid reentrant execution with the same context */ if (ctx->output != NULL) { errno = EBUSY; return (-1); } /* Initialize error string */ *errmsgp = NULL; /* Sanity */ if (argc < 1) { errno = EINVAL; return (-1); } /* Create template input containing the function call */ if ((sbuf = string_buf_output(TYPED_MEM_TEMP)) == NULL) return (-1); fprintf(sbuf, "@%s(", argv[0]); for (i = 1; i < argc; i++) { char *qarg; /* Enquote and add argument */ if ((qarg = string_enquote(argv[i], TYPED_MEM_TEMP)) == NULL) { fclose(sbuf); return (-1); } fprintf(sbuf, "%s%s", i > 1 ? "," : "", qarg); FREE(TYPED_MEM_TEMP, qarg); } fprintf(sbuf, ")"); if ((input = string_buf_content(sbuf, 1)) == NULL) { fclose(sbuf); return (-1); } fclose(sbuf); /* Create a new template from the input string */ if ((sbuf = string_buf_input(input, strlen(input), 0)) == NULL) { FREE(TYPED_MEM_TEMP, input); return (-1); } t = tmpl_create(sbuf, NULL, TYPED_MEM_TEMP); fclose(sbuf); FREE(TYPED_MEM_TEMP, input); if (t == NULL) return (-1); /* Execute template */ rtn = tmpl_execute(t, ctx, output, flags); /* Clean up */ tmpl_destroy(&t); return (rtn); }