/*
 * libdpkg - Debian packaging suite library routines
 * error.c - error message reporting
 *
 * Copyright © 2011 Guillem Jover <guillem@debian.org>
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <config.h>
#include <compat.h>

#include <errno.h>
#include <stdlib.h>

#include <dpkg/dpkg.h>
#include <dpkg/varbuf.h>
#include <dpkg/error.h>

static void DPKG_ATTR_VPRINTF(3)
dpkg_error_set(struct dpkg_error *err, int type, const char *fmt, va_list args)
{
	struct varbuf str = VARBUF_INIT;

	if (err == NULL)
		return;

	err->type = type;

	varbuf_vprintf(&str, fmt, args);
	err->str = str.buf;
}

int
dpkg_put_warn(struct dpkg_error *err, const char *fmt, ...)
{
	va_list args;

	va_start(args, fmt);
	dpkg_error_set(err, DPKG_MSG_WARN, fmt, args);
	va_end(args);

	return -1;
}

int
dpkg_put_error(struct dpkg_error *err, const char *fmt, ...)
{
	va_list args;

	va_start(args, fmt);
	dpkg_error_set(err, DPKG_MSG_ERROR, fmt, args);
	va_end(args);

	return -1;
}

int
dpkg_put_errno(struct dpkg_error *err, const char *fmt, ...)
{
	va_list args;
	char *new_fmt;
	int errno_saved = errno;

	va_start(args, fmt);
	m_asprintf(&new_fmt, "%s (%s)", fmt, strerror(errno_saved));
	va_end(args);

	dpkg_error_set(err, DPKG_MSG_ERROR, new_fmt, args);

	free(new_fmt);

	return -1;
}

void
dpkg_error_destroy(struct dpkg_error *err)
{
	err->type = DPKG_MSG_NONE;
	free(err->str);
	err->str = NULL;
}
