Пример #1
0
/*
 * 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);
}
Пример #2
0
/*
 * 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);
}
Пример #3
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);
}