log.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:9k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* Logging of zebra
  2.  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include "log.h"
  23. #include "memory.h"
  24. #include "command.h"
  25. struct zlog *zlog_default = NULL;
  26. const char *zlog_proto_names[] = 
  27. {
  28.   "NONE",
  29.   "DEFAULT",
  30.   "ZEBRA",
  31.   "RIP",
  32.   "BGP",
  33.   "OSPF",
  34.   "RIPNG",
  35.   "OSPF6",
  36.   "MASC",
  37.   NULL,
  38. };
  39. const char *zlog_priority[] =
  40. {
  41.   "emergencies",
  42.   "alerts",
  43.   "critical",
  44.   "errors",
  45.   "warnings",
  46.   "notifications",
  47.   "informational",
  48.   "debugging",
  49.   NULL,
  50. };
  51.   
  52. /* For time string format. */
  53. #define TIME_BUF 27
  54. /* Utility routine for current time printing. */
  55. static void
  56. time_print (FILE *fp)
  57. {
  58.   int ret;
  59.   char buf [TIME_BUF];
  60.   time_t clock;
  61.   struct tm *tm;
  62.   
  63.   time (&clock);
  64.   tm = localtime (&clock);
  65.   ret = strftime (buf, TIME_BUF, "%Y/%m/%d %H:%M:%S", tm);
  66.   if (ret == 0) {
  67.     zlog_warn ("strftime error");
  68.   }
  69.   fprintf (fp, "%s ", buf);
  70. }
  71. /* va_list version of zlog. */
  72. void
  73. vzlog (struct zlog *zl, int priority, const char *format, va_list *args)
  74. {
  75.   /* If zlog is not specified, use default one. */
  76.   if (zl == NULL)
  77.     zl = zlog_default;
  78.   /* When zlog_default is also NULL, use stderr for logging. */
  79.   if (zl == NULL)
  80.     {
  81.       time_print (stderr);
  82.       fprintf (stderr, "%s: ", "unknown");
  83.       vfprintf (stderr, format, args[ZLOG_NOLOG_INDEX]);
  84.       fprintf (stderr, "n");
  85.       fflush (stderr);
  86.       /* In this case we return at here. */
  87.       return;
  88.     }
  89.   /* only log this information if it has not been masked out */
  90.   if ( priority > zl->maskpri )
  91.     return ;
  92.   /* Syslog output */
  93.   if (zl->flags & ZLOG_SYSLOG)
  94.     vsyslog (priority|zlog_default->facility, format, args[ZLOG_SYSLOG_INDEX]);
  95.   /* File output. */
  96.   if (zl->flags & ZLOG_FILE)
  97.     {
  98.       time_print (zl->fp);
  99.       if (zl->record_priority) fprintf (zl->fp, "%s: ", zlog_priority[priority]);
  100.       fprintf (zl->fp, "%s: ", zlog_proto_names[zl->protocol]);
  101.       vfprintf (zl->fp, format, args[ZLOG_FILE_INDEX]);
  102.       fprintf (zl->fp, "n");
  103.       fflush (zl->fp);
  104.     }
  105.   /* stdout output. */
  106.   if (zl->flags & ZLOG_STDOUT)
  107.     {
  108.       time_print (stdout);
  109.       if (zl->record_priority) fprintf (stdout, "%s: ", zlog_priority[priority]);
  110.       fprintf (stdout, "%s: ", zlog_proto_names[zl->protocol]);
  111.       vfprintf (stdout, format, args[ZLOG_STDOUT_INDEX]);
  112.       fprintf (stdout, "n");
  113.       fflush (stdout);
  114.     }
  115.   /* stderr output. */
  116.   if (zl->flags & ZLOG_STDERR)
  117.     {
  118.       time_print (stderr);
  119.       if (zl->record_priority) fprintf (stderr, "%s: ", zlog_priority[priority]);
  120.       fprintf (stderr, "%s: ", zlog_proto_names[zl->protocol]);
  121.       vfprintf (stderr, format, args[ZLOG_STDERR_INDEX]);
  122.       fprintf (stderr, "n");
  123.       fflush (stderr);
  124.     }
  125.   /* Terminal monitor. */
  126.   vty_log (zlog_proto_names[zl->protocol], format, args[ZLOG_NOLOG_INDEX]);
  127. }
  128. void
  129. zlog (struct zlog *zl, int priority, const char *format, ...)
  130. {
  131.   va_list args[ZLOG_MAX_INDEX];
  132.   int index;
  133.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  134.     va_start(args[index], format);
  135.   vzlog (zl, priority, format, args);
  136.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  137.     va_end (args[index]);
  138. }
  139. void
  140. zlog_err (const char *format, ...)
  141. {
  142.   va_list args[ZLOG_MAX_INDEX];
  143.   int index;
  144.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  145.     va_start(args[index], format);
  146.   vzlog (NULL, LOG_ERR, format, args);
  147.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  148.     va_end (args[index]);
  149. }
  150. void
  151. zlog_warn (const char *format, ...)
  152. {
  153.   va_list args[ZLOG_MAX_INDEX];
  154.   int index;
  155.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  156.     va_start(args[index], format);
  157.   vzlog (NULL, LOG_WARNING, format, args);
  158.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  159.     va_end (args[index]);
  160. }
  161. void
  162. zlog_info (const char *format, ...)
  163. {
  164.   va_list args[ZLOG_MAX_INDEX];
  165.   int index;
  166.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  167.     va_start(args[index], format);
  168.   vzlog (NULL, LOG_INFO, format, args);
  169.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  170.     va_end (args[index]);
  171. }
  172. void
  173. zlog_notice (const char *format, ...)
  174. {
  175.   va_list args[ZLOG_MAX_INDEX];
  176.   int index;
  177.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  178.     va_start(args[index], format);
  179.   vzlog (NULL, LOG_NOTICE, format, args);
  180.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  181.     va_end (args[index]);
  182. }
  183. void
  184. zlog_debug (const char *format, ...)
  185. {
  186.   va_list args[ZLOG_MAX_INDEX];
  187.   int index;
  188.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  189.     va_start(args[index], format);
  190.   vzlog (NULL, LOG_DEBUG, format, args);
  191.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  192.     va_end (args[index]);
  193. }
  194. void
  195. plog_err (struct zlog *zl, const char *format, ...)
  196. {
  197.   va_list args[ZLOG_MAX_INDEX];
  198.   int index;
  199.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  200.     va_start(args[index], format);
  201.   vzlog (zl, LOG_ERR, format, args);
  202.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  203.     va_end (args[index]);
  204. }
  205. void
  206. plog_warn (struct zlog *zl, const char *format, ...)
  207. {
  208.   va_list args[ZLOG_MAX_INDEX];
  209.   int index;
  210.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  211.     va_start(args[index], format);
  212.   vzlog (zl, LOG_WARNING, format, args);
  213.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  214.     va_end (args[index]);
  215. }
  216. void
  217. plog_info (struct zlog *zl, const char *format, ...)
  218. {
  219.   va_list args[ZLOG_MAX_INDEX];
  220.   int index;
  221.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  222.     va_start(args[index], format);
  223.   vzlog (zl, LOG_INFO, format, args);
  224.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  225.     va_end (args[index]);
  226. }
  227. void
  228. plog_notice (struct zlog *zl, const char *format, ...)
  229. {
  230.   va_list args[ZLOG_MAX_INDEX];
  231.   int index;
  232.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  233.     va_start(args[index], format);
  234.   vzlog (zl, LOG_NOTICE, format, args);
  235.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  236.     va_end (args[index]);
  237. }
  238. void
  239. plog_debug (struct zlog *zl, const char *format, ...)
  240. {
  241.   va_list args[ZLOG_MAX_INDEX];
  242.   int index;
  243.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  244.     va_start(args[index], format);
  245.   vzlog (zl, LOG_DEBUG, format, args);
  246.   for (index = 0; index < ZLOG_MAX_INDEX; index++)
  247.     va_end (args[index]);
  248. }
  249. /* Open log stream */
  250. struct zlog *
  251. openzlog (const char *progname, int flags, zlog_proto_t protocol,
  252.   int syslog_flags, int syslog_facility)
  253. {
  254.   struct zlog *zl;
  255.   zl = XMALLOC(MTYPE_ZLOG, sizeof (struct zlog));
  256.   memset (zl, 0, sizeof (struct zlog));
  257.   zl->ident = progname;
  258.   zl->flags = flags;
  259.   zl->protocol = protocol;
  260.   zl->facility = syslog_facility;
  261.   zl->maskpri = LOG_DEBUG;
  262.   zl->record_priority = 0;
  263.   openlog (progname, syslog_flags, zl->facility);
  264.   
  265.   return zl;
  266. }
  267. void
  268. closezlog (struct zlog *zl)
  269. {
  270.   closelog();
  271.   fclose (zl->fp);
  272.   XFREE (MTYPE_ZLOG, zl);
  273. }
  274. /* Called from command.c. */
  275. void
  276. zlog_set_flag (struct zlog *zl, int flags)
  277. {
  278.   if (zl == NULL)
  279.     zl = zlog_default;
  280.   zl->flags |= flags;
  281. }
  282. void
  283. zlog_reset_flag (struct zlog *zl, int flags)
  284. {
  285.   if (zl == NULL)
  286.     zl = zlog_default;
  287.   zl->flags &= ~flags;
  288. }
  289. int
  290. zlog_set_file (struct zlog *zl, int flags, char *filename)
  291. {
  292.   FILE *fp;
  293.   /* There is opend file.  */
  294.   zlog_reset_file (zl);
  295.   /* Set default zl. */
  296.   if (zl == NULL)
  297.     zl = zlog_default;
  298.   /* Open file. */
  299.   fp = fopen (filename, "a");
  300.   if (fp == NULL)
  301.     return 0;
  302.   /* Set flags. */
  303.   zl->filename = strdup (filename);
  304.   zl->flags |= ZLOG_FILE;
  305.   zl->fp = fp;
  306.   return 1;
  307. }
  308. /* Reset opend file. */
  309. int
  310. zlog_reset_file (struct zlog *zl)
  311. {
  312.   if (zl == NULL)
  313.     zl = zlog_default;
  314.   zl->flags &= ~ZLOG_FILE;
  315.   if (zl->fp)
  316.     fclose (zl->fp);
  317.   zl->fp = NULL;
  318.   if (zl->filename)
  319.     free (zl->filename);
  320.   zl->filename = NULL;
  321.   return 1;
  322. }
  323. /* Reopen log file. */
  324. int
  325. zlog_rotate (struct zlog *zl)
  326. {
  327.   FILE *fp;
  328.   if (zl == NULL)
  329.     zl = zlog_default;
  330.   if (zl->fp)
  331.     fclose (zl->fp);
  332.   zl->fp = NULL;
  333.   if (zl->filename)
  334.     {
  335.       fp = fopen (zl->filename, "a");
  336.       if (fp == NULL)
  337. return -1;
  338.       zl->fp = fp;
  339.     }
  340.   return 1;
  341. }
  342. static char *zlog_cwd = NULL;
  343. void
  344. zlog_save_cwd ()
  345. {
  346.   char *cwd;
  347.   cwd = getcwd (NULL, MAXPATHLEN);
  348.   zlog_cwd = XMALLOC (MTYPE_TMP, strlen (cwd) + 1);
  349.   strcpy (zlog_cwd, cwd);
  350. }
  351. char *
  352. zlog_get_cwd ()
  353. {
  354.   return zlog_cwd;
  355. }
  356. void
  357. zlog_free_cwd ()
  358. {
  359.   if (zlog_cwd)
  360.     XFREE (MTYPE_TMP, zlog_cwd);
  361. }
  362. /* Message lookup function. */
  363. char *
  364. lookup (struct message *mes, int key)
  365. {
  366.   struct message *pnt;
  367.   for (pnt = mes; pnt->key != 0; pnt++) 
  368.     if (pnt->key == key) 
  369.       return pnt->str;
  370.   return "";
  371. }
  372. /* Very old hacky version of message lookup function.  Still partly
  373.    used in bgpd and ospfd. */
  374. char *
  375. mes_lookup (struct message *meslist, int max, int index)
  376. {
  377.   if (index < 0 || index >= max) 
  378.     {
  379.       zlog_err ("message index out of bound: %d", max);
  380.       return NULL;
  381.     }
  382.   return meslist[index].str;
  383. }