2004-11-23 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

* log.c: (vzlog) Take a single va_list argument and use va_copy
	  as necessary for multiple traversals.
	  (zlog) Pass only one va_list to vzlog.
	  (zlog_*,plog_*) Use a macro for boilerplate code; pass only one
	  va_list to vzlog.
	  (zlog_set_file) Remove unused 2nd argument (flags).
	  (zlog_save_cwd,zlog_get_cwd,zlog_free_cwd) Remove unused functions.
	* log.h: Remove ZLOG_*_INDEX defines (no longer used).
	  Remove unused 2nd argument from zlog_set_file prototype.
	  Fix prototype for zlog_rotate.
	* command.c: (config_log_file) Remove unused 2nd arg to zlog_set_file.
	* vty.c: (vty_out) Fix stdarg usage to perform multiple traversals
	  properly.
	  (vty_log) Must use va_copy for multiple traversals of va_list arg.
This commit is contained in:
ajs 2004-11-23 17:35:08 +00:00
parent 8686fc746c
commit d246bd9658
5 changed files with 95 additions and 197 deletions

View File

@ -1,3 +1,20 @@
2004-11-23 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* log.c: (vzlog) Take a single va_list argument and use va_copy
as necessary for multiple traversals.
(zlog) Pass only one va_list to vzlog.
(zlog_*,plog_*) Use a macro for boilerplate code; pass only one
va_list to vzlog.
(zlog_set_file) Remove unused 2nd argument (flags).
(zlog_save_cwd,zlog_get_cwd,zlog_free_cwd) Remove unused functions.
* log.h: Remove ZLOG_*_INDEX defines (no longer used).
Remove unused 2nd argument from zlog_set_file prototype.
Fix prototype for zlog_rotate.
* command.c: (config_log_file) Remove unused 2nd arg to zlog_set_file.
* vty.c: (vty_out) Fix stdarg usage to perform multiple traversals
properly.
(vty_log) Must use va_copy for multiple traversals of va_list arg.
2004-11-19 David Young <dyoung@pobox.com> 2004-11-19 David Young <dyoung@pobox.com>
* log.c: (safe_strerror) New function: safe wrapper for strerror. * log.c: (safe_strerror) New function: safe wrapper for strerror.

View File

@ -3017,7 +3017,7 @@ DEFUN (config_log_file,
else else
fullpath = argv[0]; fullpath = argv[0];
ret = zlog_set_file (NULL, ZLOG_FILE, fullpath); ret = zlog_set_file (NULL, fullpath);
if (p) if (p)
XFREE (MTYPE_TMP, p); XFREE (MTYPE_TMP, p);

237
lib/log.c
View File

@ -81,8 +81,8 @@ time_print (FILE *fp)
} }
/* va_list version of zlog. */ /* va_list version of zlog. */
void static void
vzlog (struct zlog *zl, int priority, const char *format, va_list *args) vzlog (struct zlog *zl, int priority, const char *format, va_list args)
{ {
/* If zlog is not specified, use default one. */ /* If zlog is not specified, use default one. */
if (zl == NULL) if (zl == NULL)
@ -93,7 +93,7 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list *args)
{ {
time_print (stderr); time_print (stderr);
fprintf (stderr, "%s: ", "unknown"); fprintf (stderr, "%s: ", "unknown");
vfprintf (stderr, format, args[ZLOG_NOLOG_INDEX]); vfprintf (stderr, format, args);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
fflush (stderr); fflush (stderr);
@ -107,16 +107,24 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list *args)
/* Syslog output */ /* Syslog output */
if (zl->flags & ZLOG_SYSLOG) if (zl->flags & ZLOG_SYSLOG)
vsyslog (priority|zlog_default->facility, format, args[ZLOG_SYSLOG_INDEX]); {
va_list ac;
va_copy(ac, args);
vsyslog (priority|zlog_default->facility, format, ac);
va_end(ac);
}
/* File output. */ /* File output. */
if (zl->flags & ZLOG_FILE) if (zl->flags & ZLOG_FILE)
{ {
va_list ac;
time_print (zl->fp); time_print (zl->fp);
if (zl->record_priority) if (zl->record_priority)
fprintf (zl->fp, "%s: ", zlog_priority[priority]); fprintf (zl->fp, "%s: ", zlog_priority[priority]);
fprintf (zl->fp, "%s: ", zlog_proto_names[zl->protocol]); fprintf (zl->fp, "%s: ", zlog_proto_names[zl->protocol]);
vfprintf (zl->fp, format, args[ZLOG_FILE_INDEX]); va_copy(ac, args);
vfprintf (zl->fp, format, ac);
va_end(ac);
fprintf (zl->fp, "\n"); fprintf (zl->fp, "\n");
fflush (zl->fp); fflush (zl->fp);
} }
@ -124,11 +132,14 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list *args)
/* stdout output. */ /* stdout output. */
if (zl->flags & ZLOG_STDOUT) if (zl->flags & ZLOG_STDOUT)
{ {
va_list ac;
time_print (stdout); time_print (stdout);
if (zl->record_priority) if (zl->record_priority)
fprintf (stdout, "%s: ", zlog_priority[priority]); fprintf (stdout, "%s: ", zlog_priority[priority]);
fprintf (stdout, "%s: ", zlog_proto_names[zl->protocol]); fprintf (stdout, "%s: ", zlog_proto_names[zl->protocol]);
vfprintf (stdout, format, args[ZLOG_STDOUT_INDEX]); va_copy(ac, args);
vfprintf (stdout, format, ac);
va_end(ac);
fprintf (stdout, "\n"); fprintf (stdout, "\n");
fflush (stdout); fflush (stdout);
} }
@ -136,183 +147,75 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list *args)
/* stderr output. */ /* stderr output. */
if (zl->flags & ZLOG_STDERR) if (zl->flags & ZLOG_STDERR)
{ {
va_list ac;
time_print (stderr); time_print (stderr);
if (zl->record_priority) if (zl->record_priority)
fprintf (stderr, "%s: ", zlog_priority[priority]); fprintf (stderr, "%s: ", zlog_priority[priority]);
fprintf (stderr, "%s: ", zlog_proto_names[zl->protocol]); fprintf (stderr, "%s: ", zlog_proto_names[zl->protocol]);
vfprintf (stderr, format, args[ZLOG_STDERR_INDEX]); va_copy(ac, args);
vfprintf (stderr, format, ac);
va_end(ac);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
fflush (stderr); fflush (stderr);
} }
/* Terminal monitor. */ /* Terminal monitor. */
vty_log (zlog_proto_names[zl->protocol], format, args[ZLOG_NOLOG_INDEX]); vty_log (zlog_proto_names[zl->protocol], format, args);
} }
void void
zlog (struct zlog *zl, int priority, const char *format, ...) zlog (struct zlog *zl, int priority, const char *format, ...)
{ {
va_list args[ZLOG_MAX_INDEX]; va_list args;
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
va_start(args, format);
vzlog (zl, priority, format, args); vzlog (zl, priority, format, args);
va_end (args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
} }
void #define ZLOG_FUNC(FUNCNAME,PRIORITY) \
zlog_err (const char *format, ...) void \
{ FUNCNAME(const char *format, ...) \
va_list args[ZLOG_MAX_INDEX]; { \
int index; va_list args; \
va_start(args, format); \
for (index = 0; index < ZLOG_MAX_INDEX; index++) vzlog (NULL, PRIORITY, format, args); \
va_start(args[index], format); va_end(args); \
vzlog (NULL, LOG_ERR, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
} }
void ZLOG_FUNC(zlog_err, LOG_ERR)
zlog_warn (const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++) ZLOG_FUNC(zlog_warn, LOG_WARNING)
va_start(args[index], format);
vzlog (NULL, LOG_WARNING, format, args); ZLOG_FUNC(zlog_info, LOG_INFO)
for (index = 0; index < ZLOG_MAX_INDEX; index++) ZLOG_FUNC(zlog_notice, LOG_NOTICE)
va_end (args[index]);
ZLOG_FUNC(zlog_debug, LOG_DEBUG)
#undef ZLOG_FUNC
#define PLOG_FUNC(FUNCNAME,PRIORITY) \
void \
FUNCNAME(struct zlog *zl, const char *format, ...) \
{ \
va_list args; \
va_start(args, format); \
vzlog (zl, PRIORITY, format, args); \
va_end(args); \
} }
void PLOG_FUNC(plog_err, LOG_ERR)
zlog_info (const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++) PLOG_FUNC(plog_warn, LOG_WARNING)
va_start(args[index], format);
vzlog (NULL, LOG_INFO, format, args); PLOG_FUNC(plog_info, LOG_INFO)
for (index = 0; index < ZLOG_MAX_INDEX; index++) PLOG_FUNC(plog_notice, LOG_NOTICE)
va_end (args[index]);
}
void PLOG_FUNC(plog_debug, LOG_DEBUG)
zlog_notice (const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++) #undef PLOG_FUNC
va_start(args[index], format);
vzlog (NULL, LOG_NOTICE, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
zlog_debug (const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (NULL, LOG_DEBUG, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
plog_err (struct zlog *zl, const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (zl, LOG_ERR, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
plog_warn (struct zlog *zl, const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (zl, LOG_WARNING, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
plog_info (struct zlog *zl, const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (zl, LOG_INFO, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
plog_notice (struct zlog *zl, const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (zl, LOG_NOTICE, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
void
plog_debug (struct zlog *zl, const char *format, ...)
{
va_list args[ZLOG_MAX_INDEX];
int index;
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_start(args[index], format);
vzlog (zl, LOG_DEBUG, format, args);
for (index = 0; index < ZLOG_MAX_INDEX; index++)
va_end (args[index]);
}
/* Open log stream */ /* Open log stream */
@ -366,7 +269,7 @@ zlog_reset_flag (struct zlog *zl, int flags)
} }
int int
zlog_set_file (struct zlog *zl, int flags, const char *filename) zlog_set_file (struct zlog *zl, const char *filename)
{ {
FILE *fp; FILE *fp;
mode_t oldumask; mode_t oldumask;
@ -447,32 +350,6 @@ zlog_rotate (struct zlog *zl)
return 1; return 1;
} }
static char *zlog_cwd = NULL;
void
zlog_save_cwd ()
{
char *cwd;
cwd = getcwd (NULL, MAXPATHLEN);
zlog_cwd = XMALLOC (MTYPE_TMP, strlen (cwd) + 1);
strcpy (zlog_cwd, cwd);
}
char *
zlog_get_cwd ()
{
return zlog_cwd;
}
void
zlog_free_cwd ()
{
if (zlog_cwd)
XFREE (MTYPE_TMP, zlog_cwd);
}
/* Message lookup function. */ /* Message lookup function. */
const char * const char *
lookup (struct message *mes, int key) lookup (struct message *mes, int key)

View File

@ -30,13 +30,6 @@
#define ZLOG_STDOUT 0x04 #define ZLOG_STDOUT 0x04
#define ZLOG_STDERR 0x08 #define ZLOG_STDERR 0x08
#define ZLOG_NOLOG_INDEX 0
#define ZLOG_FILE_INDEX 1
#define ZLOG_SYSLOG_INDEX 2
#define ZLOG_STDOUT_INDEX 3
#define ZLOG_STDERR_INDEX 4
#define ZLOG_MAX_INDEX 5
typedef enum typedef enum
{ {
ZLOG_NONE, ZLOG_NONE,
@ -112,11 +105,11 @@ void zlog_set_flag (struct zlog *zl, int flags);
void zlog_reset_flag (struct zlog *zl, int flags); void zlog_reset_flag (struct zlog *zl, int flags);
/* Set zlog filename. */ /* Set zlog filename. */
int zlog_set_file (struct zlog *zl, int flags, const char *filename); int zlog_set_file (struct zlog *zl, const char *filename);
int zlog_reset_file (struct zlog *zl); int zlog_reset_file (struct zlog *zl);
/* Rotate log. */ /* Rotate log. */
int zlog_rotate (); int zlog_rotate (struct zlog *);
/* For hackey massage lookup and check */ /* For hackey massage lookup and check */
#define LOOKUP(x, y) mes_lookup(x, x ## _max, y) #define LOOKUP(x, y) mes_lookup(x, x ## _max, y)

View File

@ -95,21 +95,27 @@ vty_out (struct vty *vty, const char *format, ...)
int size = 1024; int size = 1024;
char buf[1024]; char buf[1024];
char *p = NULL; char *p = NULL;
va_start (args, format);
if (vty_shell (vty)) if (vty_shell (vty))
vprintf (format, args); {
va_start (args, format);
vprintf (format, args);
va_end (args);
}
else else
{ {
/* Try to write to initial buffer. */ /* Try to write to initial buffer. */
va_start (args, format);
len = vsnprintf (buf, sizeof buf, format, args); len = vsnprintf (buf, sizeof buf, format, args);
va_end (args);
/* Initial buffer is not enough. */ /* Initial buffer is not enough. */
if (len < 0 || len >= size) if (len < 0 || len >= size)
{ {
while (1) while (1)
{ {
va_list ac;
if (len > -1) if (len > -1)
size = len + 1; size = len + 1;
else else
@ -119,7 +125,9 @@ vty_out (struct vty *vty, const char *format, ...)
if (! p) if (! p)
return -1; return -1;
va_start (args, format);
len = vsnprintf (p, size, format, args); len = vsnprintf (p, size, format, args);
va_end (args);
if (len > -1 && len < size) if (len > -1 && len < size)
break; break;
@ -138,12 +146,10 @@ vty_out (struct vty *vty, const char *format, ...)
XFREE (MTYPE_VTY_OUT_BUF, p); XFREE (MTYPE_VTY_OUT_BUF, p);
} }
va_end (args);
return len; return len;
} }
int static int
vty_log_out (struct vty *vty, const char *proto_str, const char *format, vty_log_out (struct vty *vty, const char *proto_str, const char *format,
va_list va) va_list va)
{ {
@ -2277,7 +2283,12 @@ vty_log (const char *proto_str, const char *format, va_list va)
for (i = 0; i < vector_max (vtyvec); i++) for (i = 0; i < vector_max (vtyvec); i++)
if ((vty = vector_slot (vtyvec, i)) != NULL) if ((vty = vector_slot (vtyvec, i)) != NULL)
if (vty->monitor) if (vty->monitor)
vty_log_out (vty, proto_str, format, va); {
va_list ac;
va_copy(ac, va);
vty_log_out (vty, proto_str, format, ac);
va_end(ac);
}
} }
int int