OpenSolaris_b135/cmd/agents/snmp/snmplib/error.c

Compare this file to the similar file:
Show the results in this format:

/*
 * 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 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
#pragma ident	"%Z%%M%	%I%	%E% SMI"


#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>
#include <sys/types.h>
#include <time.h>
#include <syslog.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <libgen.h>


#include "snmp_msg.h"
#include "impl.h"
#include "trace.h"
#include "error.h"


int error_size = DEFAULT_ERROR_SIZE;

char error_label[1000] = "";


static char *application_name = NULL;
static void (*application_end)() = NULL;


/*
 *	this function will exit on any error
 */

void error_init(char *name, void end())
{
	char *ptr;


	if(name == NULL)
	{
		(void)fprintf(stderr, "BUG: error_init(): name is NULL");
		exit(1);
	}

	ptr = basename(name);
	if(ptr == NULL)
	{
		(void)fprintf(stderr, "error_init(): bad application name: %s",
			name);
		exit(1);
	}

	application_name = strdup(ptr);
	if(application_name == NULL)
	{
		(void)fprintf(stderr, ERR_MSG_ALLOC);
		exit(1);
	}

	if(end == NULL)
	{
		(void)fprintf(stderr, "BUG: error_init(): end is NULL");
		exit(1);
	}

	application_end = end;

	openlog(name, LOG_CONS, LOG_DAEMON);
}


/* ARGSUSED */
void error_open(char *filename)
{
	return;
}


void error_close_stderr()
{
	return;
}

void error(char *format, ...)
{
	va_list ap;
	int32_t len;
	char static_buffer[4096];

	va_start(ap, format);

	/* remove '\n's at the end of format */
	/* LINTED */
	len = (int32_t)strlen(format);
	while((len > 0) && (format[len - 1] == '\n')) {
		format[len - 1] = '\0';
		len--;
	}

	(void) vsnprintf(static_buffer, sizeof (static_buffer), format, ap);
	va_end(ap);

	if(trace_level > 0)
		trace("%s", static_buffer);

	syslog(LOG_ERR, "%s", static_buffer);
}


void error_exit(char *format, ...)
{
	va_list ap;
	int32_t len;
	char static_buffer[4096];
	
	va_start(ap, format);

	/* remove '\n's at the end of format */
	/* LINTED */
	len = (int32_t)strlen(format);
	while((len > 0) && (format[len - 1] == '\n')) {
		format[len - 1] = '\0';
		len--;
	}

	(void) vsnprintf(static_buffer, sizeof (static_buffer), format, ap);
	va_end(ap);

	application_end();

	if(trace_level > 0)
		trace("%s", static_buffer);

	syslog(LOG_ERR, "%s", static_buffer);

	exit(1);
}


char *errno_string()
{
	static char buffer[100];

	sprintf(buffer, "[errno: %s(%d)]",
		strerror(errno), errno);

	return buffer;
}


char *h_errno_string()
{
	static char buffer[100];
	char *ptr = NULL;

	switch(h_errno)
	{
		case HOST_NOT_FOUND:
			ptr = "host not found";
			break;
		case TRY_AGAIN:
			ptr = "try again";
			break;
		case NO_RECOVERY:
			ptr = "no recovery";
			break;
		case NO_DATA:
			ptr = "no data";
			break;
		default:
			ptr = "???";
			break;
	}

	sprintf(buffer, "[h_errno: %s(%d)]",
		ptr, h_errno);

	return buffer;
}