home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / xinetd / xlog.1.0.9 / slog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-07  |  3.3 KB  |  174 lines

  1. /*
  2.  * (c) Copyright 1992 by Panagiotis Tsirigotis
  3.  * All rights reserved.  The file named COPYRIGHT specifies the terms 
  4.  * and conditions for redistribution.
  5.  */
  6.  
  7. static char RCSid[] = "$Id: slog.c,v 1.5 1993/01/08 01:37:38 panos Exp $" ;
  8.  
  9. #include <syslog.h>
  10. #include <varargs.h>
  11.  
  12. #include "xlog.h"
  13. #include "impl.h"
  14. #include "slog.h"
  15.  
  16. #define MSGBUFSIZE            2048
  17.  
  18.  
  19. PRIVATE int syslog_init() ;
  20. PRIVATE void syslog_fini() ;
  21. PRIVATE int syslog_control() ;
  22. PRIVATE int syslog_write() ;
  23. PRIVATE int syslog_parms() ;
  24.  
  25. static struct syslog_parms parms =
  26.    {
  27.       0,
  28.       LOG_PID + LOG_NOWAIT,
  29.       LOG_USER,
  30.       "XLOG",
  31.         FALSE
  32.    } ;
  33.  
  34.  
  35. struct xlog_ops __xlog_syslog_ops =
  36.     {
  37.         syslog_init,
  38.         syslog_fini,
  39.         syslog_write,
  40.         syslog_control,
  41.         syslog_parms
  42.     } ;
  43.  
  44. char *malloc() ;
  45. void closelog() ;
  46.  
  47. /*
  48.  * Expected arguments:
  49.  *        facility, level
  50.  */
  51. PRIVATE int syslog_init( xp, ap )
  52.     xlog_s *xp ;
  53.     va_list ap ;
  54. {
  55.     register struct syslog_parms *sp = &parms ;
  56.     struct syslog *slp ;
  57.  
  58.     slp = NEW( struct syslog ) ;
  59.     if ( slp == NULL )
  60.         return( XLOG_ENOMEM ) ;
  61.     
  62.     slp->facility = va_arg( ap, int ) ;
  63.     slp->default_level = va_arg( ap, int ) ;
  64.     if ( sp->n_xlogs++ == 0 )
  65.         openlog( sp->ident, sp->logopts, sp->facility ) ;
  66.     xp->data = slp ;
  67.     return( XLOG_ENOERROR ) ;
  68. }
  69.  
  70.  
  71. PRIVATE void syslog_fini( xp )
  72.     xlog_s *xp ;
  73. {
  74.     if ( --parms.n_xlogs == 0 )
  75.         closelog() ;
  76.     FREE( SYSLOG( xp ) ) ;
  77.     xp->data = NULL ;
  78. }
  79.  
  80.  
  81. PRIVATE int syslog_control( xp, cmd, ap )
  82.     xlog_s *xp ;
  83.     xlog_cmd_e cmd ;
  84.     va_list ap ;
  85. {
  86.     switch ( cmd )
  87.     {
  88.         case XLOG_LEVEL:
  89.             SYSLOG( xp )->default_level = va_arg( ap, int ) ;
  90.             break ;
  91.  
  92.         case XLOG_FACILITY:
  93.             SYSLOG( xp )->facility = va_arg( ap, int ) ;
  94.             break ;
  95.         
  96.         case XLOG_PREEXEC:
  97.             closelog() ;
  98.             break ;
  99.  
  100.         case XLOG_POSTEXEC:
  101.             if ( parms.n_xlogs )
  102.                 openlog( parms.ident, parms.logopts, parms.facility ) ;
  103.             break ;
  104.     }
  105.     return( XLOG_ENOERROR ) ;
  106. }
  107.  
  108.  
  109. PRIVATE int syslog_write( xp, buf, len, flags, ap )
  110.     xlog_s *xp ;
  111.     char buf[] ;
  112.     int len ;
  113.     int flags ;
  114.     va_list ap ;
  115. {
  116.     int level ;
  117.     int syslog_arg ;
  118.     char prefix[ MSGBUFSIZE ] ;
  119.     int prefix_size = sizeof( prefix ) ;
  120.     int prefix_len = 0 ;
  121.     int cc ;
  122.     char *percent_m_pos ;
  123.     int action_flags = ( flags | xp->flags ) ;
  124.  
  125.     if ( flags & XLOG_SET_LEVEL )
  126.         level = va_arg( ap, int ) ;
  127.     else
  128.         level = SYSLOG( xp )->default_level ;
  129.     syslog_arg = SYSLOG( xp )->facility + level ;
  130.  
  131.     if ( action_flags & XLOG_PRINT_ID )
  132.     {
  133.         cc = strx_nprint( &prefix[ prefix_len ], prefix_size, "%s: ", xp->id ) ;
  134.         prefix_len += cc ;
  135.         prefix_size -= cc ;
  136.     }
  137.  
  138.     if ( ( action_flags & XLOG_NO_ERRNO ) ||
  139.                         ( percent_m_pos = __xlog_add_errno( buf, len ) ) == NULL )
  140.         syslog( syslog_arg, "%.*s%.*s", prefix_len, prefix, len, buf ) ;
  141.     else
  142.     {
  143.         int cc_before_errno = percent_m_pos - buf ;
  144.         int cc_after_errno = len - cc_before_errno - 2 ;
  145.         char *ep ;
  146.         char errno_buf[ 100 ] ;
  147.         unsigned size = sizeof( errno_buf ) ;
  148.         
  149.         ep = __xlog_explain_errno( errno_buf, &size ) ;
  150.         syslog( syslog_arg, "%.*s%.*s%.*s%.*s",
  151.                 prefix_len, prefix,
  152.                     cc_before_errno, buf,
  153.                         (int)size, ep,
  154.                             cc_after_errno, &percent_m_pos[ 2 ] ) ;
  155.     }
  156.     return( XLOG_ENOERROR ) ;
  157. }
  158.  
  159.  
  160. PRIVATE int syslog_parms( ap )
  161.     va_list ap ;
  162. {
  163.     char *__xlog_new_string() ;
  164.     char *id = __xlog_new_string( va_arg( ap, char * ) ) ;
  165.  
  166.     if ( id == NULL )
  167.         return( XLOG_ENOMEM ) ;
  168.     parms.ident = id ;
  169.     parms.logopts = va_arg( ap, int ) ;
  170.     parms.facility = va_arg( ap, int ) ;
  171.     return( XLOG_ENOERROR ) ;
  172. }
  173.  
  174.