/*
 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
 * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
 *
 * This file is part of LVM2.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU General Public License v.2.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "log.h"

#include <stdio.h>
#include <unistd.h>


static void _print_help(FILE *out, const char *prog)
{
	fprintf(out, "usage : %s [-hlbufd]\n\n", prog);
	fprintf(out, "  h : this message\n");
	fprintf(out, "  l : cause memory leak\n");
	fprintf(out, "  b : overrun memory block\n");
	fprintf(out, "  u : underrun memory block\n");
	fprintf(out, "  f : free random pointer\n");
	fprintf(out, "  d : free block twice\n");
}

struct block_list {
	struct block_list *next;
	char dummy[9];
};

static void _leak_memory(void)
{
	int i;
	struct block_list *b, *head, **l = &head, *n;

	/* allocate a list of blocks */
	for (i = 0; i < 1000; i++) {

		if (!(b = dbg_malloc(sizeof(*b)))) {
			log_fatal("Couldn't allocate memory");
			exit(1);
		}

		b->next = 0;
		*l = b;
		l = &b->next;
	}

	/* free off every other block */
	for (b = head, i = 0; b; b = n, i++) {
		n = b->next;
		if(i & 0x1)
			dbg_free(b);
	}
}

static void _bounds_overrun(void)
{
	char *b;

	/* allocate a block */
	b = dbg_malloc(534);

	/* overrun */
	b[534] = 56;

	/* free it, which should trigger the bounds error */
	dbg_free(b);
}

static void _bounds_underrun(void)
{
	char *b;

	/* allocate a block */
	b = dbg_malloc(534);

	/* underrun */
	*(b - 1) = 56;

	/* free it, which should trigger the bounds error */
	dbg_free(b);
}

static void _free_dud(void)
{
	char *b;

	/* allocate a block */
	b = dbg_malloc(534);

	/* free it, which should trigger the bounds error */
	dbg_free(b + 100);
}

static void _free_twice(void)
{
	char *b;

	/* allocate a block */
	b = dbg_malloc(534);

	/* free it, which should trigger the bounds error */
	dbg_free(b);
	dbg_free(b);
}

int main(int argc, char **argv)
{
	char opt;

	init_log(stderr);
	init_debug(_LOG_DEBUG);
	opt = getopt(argc, argv, "hlbufd");
	switch(opt) {
	case EOF:
	case 'h':
		_print_help(stdout, argv[0]);
		break;

	case 'l':
		_leak_memory();
		break;

	case 'b':
		_bounds_overrun();
		break;

	case 'u':
		_bounds_underrun();
		break;

	case 'f':
		_free_dud();
		break;

	case 'd':
		_free_twice();
		break;

	case '?':
		fprintf(stderr, "Unknown option -%c\n", opt);
		exit(1);
	}

	dump_memory();
	fin_log();
	return 0;
}
