Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*	$NetBSD: save_file.c,v 1.1.1.1 2012/03/23 21:20:10 christos Exp $	*/

#include "ipf.h"
#include "ipmon.h"

static void *file_parse __P((char **));
static void file_destroy __P((void *));
static int file_send __P((void *, ipmon_msg_t *));
static void file_print __P((void *));
static int file_match __P((void *, void *));
static void *file_dup __P((void *));

typedef struct file_opts_s {
	FILE	*fp;
	int	raw;
	char	*path;
	int	ref;
} file_opts_t;

ipmon_saver_t filesaver = {
	"file",
	file_destroy,
	file_dup,
	file_match,
	file_parse,
	file_print,
	file_send
};


static void *
file_parse(strings)
	char **strings;
{
	file_opts_t *ctx;

	ctx = calloc(1, sizeof(*ctx));
	if (ctx == NULL)
		return NULL;

	if (strings[0] != NULL && strings[0][0] != '\0') {
		ctx->ref = 1;
		if (!strncmp(strings[0], "raw://", 6)) {
			ctx->raw = 1;
			ctx->path = strdup(strings[0] + 6);
			ctx->fp = fopen(ctx->path, "ab");
		} else if (!strncmp(strings[0], "file://", 7)) {
			ctx->path = strdup(strings[0] + 7);
			ctx->fp = fopen(ctx->path, "a");
		} else {
			free(ctx);
			ctx = NULL;
		}
	} else {
		free(ctx);
		ctx = NULL;
	}

	return ctx;
}


static int
file_match(ctx1, ctx2)
	void *ctx1, *ctx2;
{
	file_opts_t *f1 = ctx1, *f2 = ctx2;

	if (f1->raw != f2->raw)
		return 1;
	if (strcmp(f1->path, f2->path))
		return 1;
	return 0;
}


static void *
file_dup(ctx)
	void *ctx;
{
	file_opts_t *f = ctx;

	f->ref++;
	return f;
}


static void
file_print(ctx)
	void *ctx;
{
	file_opts_t *file = ctx;

	if (file->raw)
		printf("raw://");
	else
		printf("file://");
	printf("%s", file->path);
}


static void
file_destroy(ctx)
	void *ctx;
{
	file_opts_t *file = ctx;

	file->ref--;
	if (file->ref > 0)
		return;

	if (file->path != NULL)
		free(file->path);
	free(file);
}


static int
file_send(ctx, msg)
	void *ctx;
	ipmon_msg_t *msg;
{
	file_opts_t *file = ctx;

	if (file->raw) {
		fwrite(msg->imm_data, msg->imm_dsize, 1, file->fp);
	} else {
		fprintf(file->fp, "%s", msg->imm_msg);
	}
	return 0;
}