terror.c revision ace1a5f11236a072fca1b5e0ea1416a083a9f2aa
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright (c) 1986 AT&T
* All Rights Reserved
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include "wish.h"
#include "message.h"
#include "vtdefs.h"
#include "terror.h"
#include "retcodes.h"
#include "sizes.h"
extern char *Errlist[];
extern char *What[];
extern int Vflag;
extern void exit(); /* fmli's exit not the C lib call */
static void log();
static void notify();
void
_terror(sev, what, name, file, line, child)
int sev; /* flags to see if we should log or exit */
int what; /* What we were trying to do */
char *name; /* What we were trying to do it to */
char *file; /* __FILE__ */
int line; /* __LINE__ */
bool child; /* TRUE if called by a child of fmli. abs k15 */
{
if (errno == ENOTTY)
errno = 0;
notify(what, child); /* abs k15 */
if (Vflag && (sev & TERR_LOG))
log(sev, what, name, file, line);
if (sev & TERR_EXIT)
exit(R_ERR); /* fmli's exit not the C lib call */
errno = 0;
}
static void
notify(what, child)
int what;
bool child; /* TRUE if called by a child of fmli. abs k15 */
{
register char *mymess;
register int length;
char messbuf[PATHSIZ];
extern bool Use_errno[];
char *push_win();
if ((mymess = What[what]) == nil &&
(Use_errno[what] == FALSE || Errlist[errno] == nil))
return;
if (mymess == nil)
mymess = "error";
strncpy(messbuf, mymess, PATHSIZ - 1);
length = strlen(messbuf);
if (Use_errno[what] && Errlist[errno] != nil) {
strncat(messbuf, ": ", PATHSIZ - 1 - length);
length += 2;
strncat(messbuf, Errlist[errno], PATHSIZ - 1 - length);
}
/* to ensure '\0' termination of string */
messbuf[PATHSIZ -1] = '\0';
/* if message generated by a child of fmli, print it on line
* following cursor. if generated by fmli then use message line
*/
if (child == TRUE) /* abs k15 */
{
printf("\r\n%s\r\n", messbuf); /* abs k15 */
fflush(stdout); /* abs k15 */
}
else
{
mess_temp(messbuf);
mess_flash(messbuf); /* abs f15 */
doupdate(); /* abs f15 */
}
}
#define LOGFILE 0
#define TERMINAL 1
#define MAILADM 2
/*
* FACE application ONLY .... log problems in the TERRLOG file
* and/or send mail
*/
static void
log(sev, what, name, file, line)
int sev;
int what;
char *name;
char *file;
int line;
{
char path[PATHSIZ];
register int method;
time_t t; /* EFT abs k16 */
register FILE *fp;
extern char *Oasys;
extern char *Progname;
/*
* construct path of error log file
*/
method = LOGFILE;
if (name == NULL)
name = nil;
strcat(strcpy(path, Oasys), TERRLOG);
if ((fp = fopen(path, "a")) == NULL && errno == EMFILE) {
close(4);
fp = fopen(path, "a");
}
if (fp == NULL)
if ((fp = popen("mail $LOGNAME", "w")) == NULL) {
method = TERMINAL;
fp = stderr;
}
else
method = MAILADM;
(void) time(&t);
setbuf(fp, NULL);
fprintf(fp, "%16.16s %-8s %-14s %-14s %3d %s%-*s %-24s %s\n", ctime(&t),
getenv("LOGNAME"), Progname, file, line,
(sev & TERR_EXIT) ? "(FATAL)" : nil,
(sev & TERR_EXIT) ? 17 : 24,
What[what], strerror(errno), name);
if (method == LOGFILE)
fclose(fp);
else if (method == MAILADM)
pclose(fp);
}