Changeset 271


Ignore:
Timestamp:
Jan 8, 2010, 6:38:48 PM (15 years ago)
Author:
katerina
Message:

Allow named pipes as logfiles (ticket #189).

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/docs/Changelog

    r270 r271  
    112.6.2:
     2        * handle named pipes in log monitoring module
     3          (open in nonblocking mode, ignore read error if empty)
    24        * fix bug in the server function to probe for necessity
    35          of configuration reload for client
  • trunk/include/sh_log_check.h

    r186 r271  
    2525#define SH_LOGFILE_MOVED  (1<<0)
    2626#define SH_LOGFILE_REWIND (1<<1)
     27#define SH_LOGFILE_PIPE   (1<<2)
    2728
    2829struct sh_logfile
  • trunk/src/sh_log_check.c

    r265 r271  
    77#include <sys/types.h>
    88#include <sys/stat.h>
     9#include <fcntl.h>
     10
     11#if !defined(O_NONBLOCK)
     12#if defined(O_NDELAY)
     13#define O_NONBLOCK  O_NDELAY
     14#else
     15#define O_NONBLOCK  0
     16#endif
     17#endif
    918
    1019#ifdef USE_LOGFILE_MONITOR
     
    316325  if (0 == stat(thisfile->filename, &buf))
    317326    {
    318       thisfile->inode     = buf.st_ino;
    319       thisfile->device_id = buf.st_dev;
     327      if (S_ISREG(buf.st_mode)
     328#ifdef S_ISLNK
     329          || S_ISLNK(buf.st_mode)
     330#endif
     331          )
     332        {
     333          thisfile->inode     = buf.st_ino;
     334          thisfile->device_id = buf.st_dev;
     335         
     336          if (0 != read_pos(thisfile))
     337            {
     338              thisfile->flags &= ~SH_LOGFILE_REWIND;
     339            }
     340        }
     341      else if (S_ISFIFO(buf.st_mode))
     342        {
     343          thisfile->inode      = buf.st_ino;
     344          thisfile->device_id  = buf.st_dev;
     345          thisfile->flags     |= SH_LOGFILE_PIPE;
     346        }
     347    }
     348  else
     349    {
     350      sh_string * msg =  sh_string_new(0);
     351      sh_string_add_from_char(msg, _("Logfile is not a regular file, link, or named pipe: "));
     352      sh_string_add_from_char(msg, splits[1]);
    320353     
    321       if (0 != read_pos(thisfile))
    322         {
    323           thisfile->flags &= ~SH_LOGFILE_REWIND;
    324         }
     354      SH_MUTEX_LOCK(mutex_thread_nolog);
     355      sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, 0, MSG_E_SUBGEN,
     356                      sh_string_str(msg),
     357                      _("sh_add_watch"));
     358      SH_MUTEX_UNLOCK(mutex_thread_nolog);
     359      sh_string_destroy(&msg);
     360     
     361      SH_FREE(filename);
     362      SH_FREE(thisfile);
     363      SH_FREE(new);
     364      return -1;
    325365    }
    326366
     
    340380      sh_watched_logs = thisfile->next;
    341381
    342       save_pos(thisfile);
     382      if ((thisfile->flags & SH_LOGFILE_PIPE) == 0)
     383        {
     384          save_pos(thisfile);
     385        }
    343386
    344387      if (thisfile->fp)
     
    360403void sh_check_watches()
    361404{
    362   static size_t      count = 0;
    363405  struct sh_logrecord * logrecord;
    364406  struct sh_logfile * thisfile = sh_watched_logs;
     
    373415  while (thisfile)
    374416    {
     417      volatile size_t count = 0;
     418
    375419      SH_MUTEX_LOCK(mutex_thread_nolog);
    376420      tmp = sh_util_safe_name (thisfile->filename);
     
    529573  /* detect and handle logfile rotation
    530574   */
    531   if (logfile->inode != buf.st_ino && logfile->inode != 0)
     575  if (logfile->inode != buf.st_ino &&
     576      logfile->inode != 0 &&
     577      !S_ISFIFO(buf.st_mode))
    532578    {
    533579      /* Case 1) We have dealt with the moved file already.
     
    572618  /* open file
    573619   */
    574   logfile->fp = fopen(filename->str, "r");
     620  if (!S_ISFIFO(buf.st_mode))
     621    {
     622      logfile->fp = fopen(filename->str, "r");
     623    }
     624  else
     625    {
     626      int fd_temp = open (filename->str, O_RDONLY|O_NONBLOCK);
     627
     628      if (fd_temp >= 0)
     629        {
     630          logfile->fp = fdopen(fd_temp, "r");
     631        }
     632    }
     633
    575634  if (!logfile->fp)
    576635    {
     
    590649  sh_string_destroy(&filename);
    591650 
    592   if ((logfile->flags & SH_LOGFILE_REWIND) != 0)
    593     {
    594       rewind(logfile->fp);
    595       fgetpos(logfile->fp, &(logfile->offset));
    596       logfile->flags &= ~SH_LOGFILE_REWIND;
    597     }
    598   else
    599     {
    600       /* file too short
    601        */
    602       if (0 != fsetpos(logfile->fp, &(logfile->offset)))
     651  if ((logfile->flags & SH_LOGFILE_PIPE) == 0)
     652    {
     653      if ((logfile->flags & SH_LOGFILE_REWIND) != 0)
    603654        {
    604655          rewind(logfile->fp);
    605656          fgetpos(logfile->fp, &(logfile->offset));
     657          logfile->flags &= ~SH_LOGFILE_REWIND;
     658        }
     659      else
     660        {
     661          /* file too short
     662           */
     663          if (0 != fsetpos(logfile->fp, &(logfile->offset)))
     664            {
     665              rewind(logfile->fp);
     666              fgetpos(logfile->fp, &(logfile->offset));
     667            }
    606668        }
    607669    }
     
    631693          logfile->fp = NULL;
    632694          sh_string_destroy(&s);
    633           if (status == 0)
     695          if (status == 0 || (logfile->flags & SH_LOGFILE_PIPE) != 0)
    634696            {
    635697              return NULL;
     
    707769          logfile->fp = NULL;
    708770          sh_string_destroy(&s);
    709           if (status == 0)
     771          if (status == 0 || (logfile->flags & SH_LOGFILE_PIPE) != 0)
    710772            {
    711773              return NULL;
     
    747809      if (status != 1)
    748810        {
    749           if (ferror(logfile->fp))
     811          if (ferror(logfile->fp) && (logfile->flags & SH_LOGFILE_PIPE) == 0)
    750812            {
    751813              char * tmp;
Note: See TracChangeset for help on using the changeset viewer.