/*
 *
 *   Copyright (c) International Business Machines  Corp., 2002
 *
 *   This program 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 program 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, write to the Free Software
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/* 01/02/2003	Port to LTP	avenkat@us.ibm.com*/
/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */

/*
 * NAME
 *	mallopt
 *
 * CALLS
 *	malloc(3x), mallopt(3x), mallinfo(3x).
 *
 * ALGORITHM
 *	Set options, malloc memory, and check resource ussage.
 *
 * RESTRICTIONS
 */

#ifdef CONFIG_COLDFIRE
#define __MALLOC_STANDARD__
#endif
#include <errno.h>
/*
 * NOTE: struct mallinfo is only exported via malloc.h (not stdlib.h), even
 * though it's an obsolete header for malloc(3).
 *
 * Inconsistencies rock.
 */
#include <malloc.h>
#include <stdio.h>

#include "test.h"
#include "safe_macros.h"

#define FAILED 0
#define PASSED 1

int local_flag = PASSED;

char *TCID = "mallopt01";
int block_number;
FILE *temp;
int TST_TOTAL = 1;
extern int tst_COUNT;		/* Test Case counter for tst_routines */

void printinfo();

#if !defined(UCLINUX)
struct mallinfo info;

int main(int argc, char *argv[])
{
	char *buf;

	tst_tmpdir();

	buf = SAFE_MALLOC(NULL, 20480);

	/*
	 * Check space usage.
	 */

	info = mallinfo();
	if (info.uordblks < 20480) {
		printinfo();
		tst_resm(TFAIL, "mallinfo failed: uordblks < 20K");
	}
	if (info.smblks != 0) {
		printinfo();
		tst_resm(TFAIL, "mallinfo failed: smblks != 0");
	}
	free(buf);

	/*
	 * Test mallopt's M_MXFAST and M_NLBLKS cmds.
	 */
	mallopt(M_MXFAST, 2048);
	mallopt(M_NLBLKS, 50);
	buf = SAFE_MALLOC(NULL, 1024);

	free(buf);

	unlink("core");
	tst_rmdir();
	tst_exit();
}

void printinfo(void)
{

	fprintf(stderr, "mallinfo structure:\n");
	fprintf(stderr, "mallinfo.arena = %d\n", info.arena);
	fprintf(stderr, "mallinfo.ordblks = %d\n", info.ordblks);
	fprintf(stderr, "mallinfo.smblks = %d\n", info.smblks);
	fprintf(stderr, "mallinfo.hblkhd = %d\n", info.hblkhd);
	fprintf(stderr, "mallinfo.hblks = %d\n", info.hblks);
	fprintf(stderr, "mallinfo.usmblks = %d\n", info.usmblks);
	fprintf(stderr, "mallinfo.fsmblks = %d\n", info.fsmblks);
	fprintf(stderr, "mallinfo.uordblks = %d\n", info.uordblks);
	fprintf(stderr, "mallinfo.fordblks = %d\n", info.fordblks);
	fprintf(stderr, "mallinfo.keepcost = %d\n", info.keepcost);
}

#else
int main(void)
{
	tst_brkm(TCONF, NULL, "test is not available on uClinux");
}
#endif /* if !defined(UCLINUX) */
