version 1.2, 1999/10/16 20:54:54 |
version 1.3, 1999/11/10 23:36:44 |
|
|
Created: Mon Mar 20 21:13:40 1995 ylo |
Created: Mon Mar 20 21:13:40 1995 ylo |
|
|
Client-side versions of debug(), log(), etc. These print to stderr. |
Client-side versions of debug(), log(), etc. These print to stderr. |
|
This is a stripped down version of log-server.c. |
|
|
*/ |
*/ |
|
|
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "ssh.h" |
#include "ssh.h" |
|
|
static int log_debug = 0; |
static LogLevel log_level = SYSLOG_LEVEL_INFO; |
static int log_quiet = 0; |
|
|
|
void log_init(char *av0, int on_stderr, int debug, int quiet, |
/* Initialize the log. |
SyslogFacility facility) |
av0 program name (should be argv[0]) |
{ |
level logging level |
log_debug = debug; |
*/ |
log_quiet = quiet; |
|
} |
|
|
|
void log(const char *fmt, ...) |
void |
|
log_init(char *av0, LogLevel level, SyslogFacility ignored1, int ignored2) |
{ |
{ |
va_list args; |
switch (level) |
|
|
if (log_quiet) |
|
return; |
|
va_start(args, fmt); |
|
vfprintf(stderr, fmt, args); |
|
fprintf(stderr, "\r\n"); |
|
va_end(args); |
|
} |
|
|
|
void debug(const char *fmt, ...) |
|
{ |
|
va_list args; |
|
if (log_quiet || !log_debug) |
|
return; |
|
va_start(args, fmt); |
|
fprintf(stderr, "debug: "); |
|
vfprintf(stderr, fmt, args); |
|
fprintf(stderr, "\r\n"); |
|
va_end(args); |
|
} |
|
|
|
void error(const char *fmt, ...) |
|
{ |
|
va_list args; |
|
if (log_quiet) |
|
return; |
|
va_start(args, fmt); |
|
vfprintf(stderr, fmt, args); |
|
fprintf(stderr, "\r\n"); |
|
va_end(args); |
|
} |
|
|
|
struct fatal_cleanup |
|
{ |
|
struct fatal_cleanup *next; |
|
void (*proc)(void *); |
|
void *context; |
|
}; |
|
|
|
static struct fatal_cleanup *fatal_cleanups = NULL; |
|
|
|
/* Registers a cleanup function to be called by fatal() before exiting. */ |
|
|
|
void fatal_add_cleanup(void (*proc)(void *), void *context) |
|
{ |
|
struct fatal_cleanup *cu; |
|
|
|
cu = xmalloc(sizeof(*cu)); |
|
cu->proc = proc; |
|
cu->context = context; |
|
cu->next = fatal_cleanups; |
|
fatal_cleanups = cu; |
|
} |
|
|
|
/* Removes a cleanup frunction to be called at fatal(). */ |
|
|
|
void fatal_remove_cleanup(void (*proc)(void *context), void *context) |
|
{ |
|
struct fatal_cleanup **cup, *cu; |
|
|
|
for (cup = &fatal_cleanups; *cup; cup = &cu->next) |
|
{ |
{ |
cu = *cup; |
case SYSLOG_LEVEL_QUIET: |
if (cu->proc == proc && cu->context == context) |
case SYSLOG_LEVEL_ERROR: |
{ |
case SYSLOG_LEVEL_FATAL: |
*cup = cu->next; |
case SYSLOG_LEVEL_INFO: |
xfree(cu); |
case SYSLOG_LEVEL_CHAT: |
return; |
case SYSLOG_LEVEL_DEBUG: |
} |
log_level = level; |
|
break; |
|
default: |
|
/* unchanged */ |
|
break; |
} |
} |
fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx\n", |
|
(unsigned long)proc, (unsigned long)context); |
|
} |
} |
|
|
/* Function to display an error message and exit. This is in this file because |
#define MSGBUFSIZE 1024 |
this needs to restore terminal modes before exiting. See log-client.c |
|
for other related functions. */ |
|
|
|
void fatal(const char *fmt, ...) |
void |
|
do_log(LogLevel level, const char *fmt, va_list args) |
{ |
{ |
va_list args; |
char msgbuf[MSGBUFSIZE]; |
struct fatal_cleanup *cu, *next_cu; |
|
static int fatal_called = 0; |
|
|
|
if (!fatal_called) |
|
{ |
|
fatal_called = 1; |
|
|
|
/* Call cleanup functions. */ |
if (level > log_level) |
for (cu = fatal_cleanups; cu; cu = next_cu) |
return; |
{ |
if (level == SYSLOG_LEVEL_DEBUG) |
next_cu = cu->next; |
fprintf(stderr, "debug: "); |
(*cu->proc)(cu->context); |
vsnprintf(msgbuf, sizeof(msgbuf), fmt, args); |
} |
fprintf(stderr, "%s", msgbuf); |
} |
|
|
|
va_start(args, fmt); |
|
vfprintf(stderr, fmt, args); |
|
fprintf(stderr, "\r\n"); |
fprintf(stderr, "\r\n"); |
va_end(args); |
|
exit(255); |
|
} |
} |
|
|
/* fatal() is in ssh.c so that it can properly reset terminal modes. */ |
|