/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 *	Copyright(c) 1988 AT&T
 *	  All Rights Reserved
 *
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
#include "mcs.h"

static const char *msg[] = {
/* MALLOC_ERROR */
"%s: malloc memory allocation failure.\n",
/* USAGE_ERROR */
"%s: multiple -n only allowed for -d option.\n",
/* ELFVER_ERROR */
"%s: elf_version() failed - libelf.a out of date.\n",
/* OPEN_ERROR */
"%s: %s: cannot open file.\n",
/* LIBELF_ERROR */
"%s: libelf error.\n",
/* OPEN_TEMP_ERROR */
"%s: %s: cannot open temporary file\n",
/* WRITE_ERROR */
"%s: %s: write system failure: %s: file not manipulated.\n",
/* GETARHDR_ERROR */
"%s: %s: malformed archive at %ld\n",
/* FILE_TYPE_ERROR */
"%s: %s: invalid file type\n",
/* NOT_MANIPULATED_ERROR */
"%s: %s: file not manipulated\n",
/* WRN_MANIPULATED_ERROR */
"%s: WARNING: %s: Cannot manipulate file.\n",
/* NO_SECT_TABLE_ERROR */
"%s: %s: no section header table.\n",
/* READ_ERROR */
"%s: %s: trouble reading file\n",
/* READ_MANI_ERROR */
"%s: %s: read system failure: %s: file not manipulated.\n",
/* WRITE_MANI_ERROR */
"%s: %s: write system failure: %s: file not manipulated.\n",
/* LSEEK_MANI_ERROR */
"%s: %s: lseek system failure: %s: file not manipulated.\n",
/* SYM_TAB_AR_ERROR */
"%s: WARNING: %s: symbol table deleted from archive \n",
/* EXEC_AR_ERROR */
"execute  `ar -ts %s` to restore symbol table.\n",
/* READ_SYS_ERROR */
"%s: %s: read system failure\n",
/* OPEN_WRITE_ERROR */
"%s: %s: can't open file for writing\n",
/* ACT_PRINT_ERROR */
"%s: %s: Cannot print contents of a NOBITS section (%s)\n",
/* ACT_DELETE1_ERROR */
"%s: %s: Warning: Cannot delete section (%s)\n\t\tfrom a segment.\n",
/* ACT_DELETE2_ERROR */
"%s: %s: Warning: Cannot delete section (%s)\n"
"\t\tbecause its relocation section (%s) is in a segment\n",
/* ACT_APPEND1_ERROR */
"%s: %s: Cannot append to a NOBITS section (%s)\n",
/* ACT_APPEND2_ERROR */
"%s: %s: Warning: Cannot append to section (%s)\n\t\tin a segment\n",
/* ACT_COMPRESS1_ERROR */
"%s: %s: Cannot compress a NOBITS section (%s)\n",
/* ACT_COMPRESS2_ERROR */
"%s: %s: Warning: Cannot compress a section (%s)\n\t\tin a segment\n",
/* ACCESS_ERROR */
"%s: %s: access error.\n",
/* WRITE_MANI_ERROR2 */
"%s: /ftruncate/lseek/write system failure: %s: file may be destroyed.\n"
};

void
error_message(int args, ...)
{
	int mes = args;
	char *message = gettext((char *)msg[mes]);
	int flag;
	char *sys_mes;
	va_list ap;
	va_start(ap, args);

	flag = va_arg(ap, int);
	sys_mes = va_arg(ap, char *);

	switch (mes) {
	case MALLOC_ERROR:
	case USAGE_ERROR:
	case ELFVER_ERROR:
	case EXEC_AR_ERROR:
	case LIBELF_ERROR:
		/* LINTED */
		(void) fprintf(stderr, message, va_arg(ap, char *));
		break;
	case OPEN_ERROR:
	case ACCESS_ERROR:
	case OPEN_TEMP_ERROR:
	case FILE_TYPE_ERROR:
	case NOT_MANIPULATED_ERROR:
	case WRN_MANIPULATED_ERROR:
	case NO_SECT_TABLE_ERROR:
	case READ_ERROR:
	case SYM_TAB_AR_ERROR:
	case READ_SYS_ERROR:
	case OPEN_WRITE_ERROR:
		/* LINTED */
		(void) fprintf(stderr, message, va_arg(ap, char *),
		    va_arg(ap, char *));
		break;
	case WRITE_ERROR:
	case READ_MANI_ERROR:
	case WRITE_MANI_ERROR:
	case LSEEK_MANI_ERROR:
	case ACT_PRINT_ERROR:
	case ACT_DELETE1_ERROR:
	case ACT_APPEND1_ERROR:
	case ACT_APPEND2_ERROR:
	case ACT_COMPRESS1_ERROR:
	case ACT_COMPRESS2_ERROR: {
		char *a = va_arg(ap, char *);
		char *b = va_arg(ap, char *);
		char *c = va_arg(ap, char *);
		/* LINTED */
		(void) fprintf(stderr, message, a, b, c);
		break;
	}
	case ACT_DELETE2_ERROR: {
		char *a = va_arg(ap, char *);
		char *b = va_arg(ap, char *);
		char *c = va_arg(ap, char *);
		char *d = va_arg(ap, char *);
		/* LINTED */
		(void) fprintf(stderr, message, a, b, c, d);
		break;
	}
	case GETARHDR_ERROR: {
		char *a = va_arg(ap, char *);
		char *b = va_arg(ap, char *);
		long c = va_arg(ap, long);
		/* LINTED */
		(void) fprintf(stderr, message, a, b, c);
		break;
	}
	default:
		(void) fprintf(stderr, "internal error: error_message(%d)\n",
		    mes);
		mcs_exit(100);
	}

	if (flag != PLAIN_ERROR)
		(void) fprintf(stderr, "\t%s\n", sys_mes);
	va_end(ap);
}