/*
* 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);
}