Changeset 259 for trunk/src


Ignore:
Timestamp:
Dec 7, 2009, 8:44:43 PM (15 years ago)
Author:
katerina
Message:

Use inotify in utmp module (ticket #177).

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_modules.c

    r186 r259  
    2323    N_("UTMP"),
    2424    -1,
     25    SH_MODFL_NOTIMER,
    2526    sh_utmp_init,
    2627    sh_utmp_timer,
     
    3940    N_("MOUNTS"),
    4041    -1,
     42    0,
    4143    sh_mounts_init,
    4244    sh_mounts_timer,
     
    5557    N_("USERFILES"),
    5658    -1,
     59    0,
    5760    sh_userfiles_init,
    5861    sh_userfiles_timer,
     
    7174    N_("KERNEL"),
    7275    -1,
     76    0,
    7377    sh_kern_init,
    7478    sh_kern_timer,
     
    8791    N_("SUIDCHECK"),
    8892    -1,
     93    0,
    8994    sh_suidchk_init,
    9095    sh_suidchk_timer,
     
    103108    N_("PROCESSCHECK"),
    104109    -1,
     110    0,
    105111    sh_prochk_init,
    106112    sh_prochk_timer,
     
    119125    N_("PORTCHECK"),
    120126    -1,
     127    0,
    121128    sh_portchk_init,
    122129    sh_portchk_timer,
     
    135142    N_("LOGMON"),
    136143    -1,
     144    0,
    137145    sh_log_check_init,
    138146    sh_log_check_timer,
     
    150158    NULL,
    151159    -1,
     160    0,
    152161
    153162    NULL,
  • trunk/src/sh_pthread.c

    r170 r259  
    182182                  pthread_testcancel();
    183183                }
    184               retry_msleep(1,0);
     184              if (0 == (SH_MODFL_NOTIMER & this_module->flags))
     185                retry_msleep(1,0);
    185186            }
    186187
  • trunk/src/sh_utmp.c

    r252 r259  
    8080#include "sh_utmp.h"
    8181#include "sh_pthread.h"
     82#include "sh_inotify.h"
    8283
    8384SH_MUTEX_EXTERN(mutex_thread_nolog);
     
    186187static char   terminated_line[UT_HOSTSIZE];
    187188#endif
     189
     190static char * mode_path[] = { _PATH_WTMP, _PATH_WTMP, _PATH_UTMP };
    188191
    189192static struct SH_UTMP_S save_utmp;
     
    519522#endif
    520523
     524#if defined(HAVE_PTHREAD)
     525static sh_watches inotify_watch;
     526#endif
     527
    521528int sh_utmp_end ()
    522529{
     
    540547  set_defaults();
    541548  init_done          = 0;
     549
     550  sh_inotify_remove(&inotify_watch);
     551
    542552  SL_RETURN( (0), _("sh_utmp_end"));
    543553}
    544554
     555
    545556int sh_utmp_reconf()
    546557{
    547558  set_defaults();
     559  sh_inotify_remove(&inotify_watch);
    548560  return 0;
    549561}
     
    557569int sh_utmp_timer (time_t tcurrent)
    558570{
     571#if !defined(HAVE_PTHREAD)
     572  retry_msleep(1, 0);
     573
    559574  if ((time_t) (tcurrent - lastcheck) >= ShUtmpInterval)
    560575    {
     
    563578    }
    564579  return 0;
     580#else
     581  int errnum = 0;
     582 
     583  if (sh.flag.checkSum != SH_CHECK_INIT)
     584    sh_inotify_wait_for_change(mode_path[1], &inotify_watch,
     585                               &errnum, ShUtmpInterval);
     586
     587  lastcheck  = tcurrent;
     588  if (SH_INOTIFY_ERROR(errnum))
     589    {
     590      char ebuf[SH_ERRBUF_SIZE];
     591
     592      SH_MUTEX_LOCK(mutex_thread_nolog);
     593      sh_error_message(errnum, ebuf, sizeof(ebuf));
     594      sh_error_handle (SH_ERR_WARN, FIL__, __LINE__, errnum, MSG_E_SUBGEN,
     595                       ebuf,
     596                       _("sh_utmp_timer") );
     597      SH_MUTEX_UNLOCK(mutex_thread_nolog);   
     598    }
     599  return -1;
     600#endif
    565601}
    566602
     
    574610  SL_ENTER(_("sh_utmp_check"));
    575611  if (ShUtmpActive == BAD)
    576     SL_RETURN( (-1), _("sh_utmp_check"));
     612    {
     613#if defined(HAVE_PTHREAD)
     614      sh_inotify_remove(&inotify_watch);
     615#endif
     616      SL_RETURN( (-1), _("sh_utmp_check"));
     617    }
    577618  SH_MUTEX_LOCK(mutex_thread_nolog);
    578619  sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_UT_CHECK);
     
    746787 *    - link user.ut_record   -> log_record
    747788 */
     789
    748790#ifdef HAVE_UTTYPE 
    749791static int sh_utmp_is_virtual (char * in_utline, char * in_uthost)
    750792{
    751   if (in_utline != NULL)
    752     {
    753       if (0 == sl_strncmp(in_utline, _("ttyp"), 4))
    754         { return 0; }
    755       else if (0 == sl_strncmp(in_utline, _("ttyq"), 4))
    756         { return 0; }
    757     }
    758   if (in_uthost != NULL   &&
     793
     794  if (in_uthost != NULL   &&
     795      in_utline != NULL   &&
    759796      in_uthost[0] == ':' &&
    760797      in_uthost[1] == '0' &&
    761       in_uthost[2] == '\0')
    762     {
    763       /* return 0; */
    764       return 1;  /* actually does not seem portable, not even among linuxes */
    765     }
    766   return 1;
     798      0 == sl_strncmp(in_utline, _("pts/"), 4))
     799    {
     800      return 1;
     801    }
     802
     803  return 0;
    767804}
    768805#endif
     
    884921        SH_MUTEX_UNLOCK(mutex_thread_nolog);
    885922      } else
    886         if (0 != sh_utmp_is_virtual(ut->ut_line, (char*)user->ut_host))
     923        if (0 == sh_utmp_is_virtual(ut->ut_line, (char*)user->ut_host))
    887924          {       
    888925            status = sh_utmp_login_a((char*)user->name);
     
    923960      if (user != NULL)
    924961        {
    925           status = sh_utmp_login_r((char*)user->name);
    926           SH_MUTEX_LOCK(mutex_thread_nolog);
    927           (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX);
    928           sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0,
     962#if defined(__linux__)
     963          if (0 == sh_utmp_is_virtual(ut->ut_line, (char*)user->ut_host)) {
     964#endif
     965            status = sh_utmp_login_r((char*)user->name);
     966            SH_MUTEX_LOCK(mutex_thread_nolog);
     967            (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX);
     968            sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0,
    929969#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR)
    930                            MSG_UT_LG3X,
     970                             MSG_UT_LG3X,
    931971#elif defined(HAVE_UTHOST)
    932                            MSG_UT_LG3A,
    933 #else
    934                            MSG_UT_LG3B,
    935 #endif
    936                            user->name,
    937                            user->ut_tty,
     972                             MSG_UT_LG3A,
     973#else
     974                             MSG_UT_LG3B,
     975#endif
     976                             user->name,
     977                             user->ut_tty,
    938978#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR)
    939                            user->ut_host,
    940                            user->ut_ship,
     979                             user->ut_host,
     980                             user->ut_ship,
    941981#elif defined(HAVE_UTHOST)
    942                            user->ut_host,
    943 #endif
    944                            ttt,
    945                            status
    946                            );
    947           SH_MUTEX_UNLOCK(mutex_thread_nolog);
    948           userold->next = user->next;
    949           if (user == userlist)
    950             userlist = user->next;
    951           sh_utmp_logout_morechecks((struct log_user *)user);
    952           SH_FREE((struct log_user *)user);
    953           user = NULL;
     982                             user->ut_host,
     983#endif
     984                             ttt,
     985                             status
     986                             );
     987            SH_MUTEX_UNLOCK(mutex_thread_nolog);
     988            userold->next = user->next;
     989            if (user == userlist)
     990              userlist = user->next;
     991            sh_utmp_logout_morechecks((struct log_user *)user);
     992            SH_FREE((struct log_user *)user);
     993            user = NULL;
     994#if defined(__linux__)
     995          }
     996#endif
    954997        }
    955998      else
     
    10531096static unsigned long lastread = 0;
    10541097
    1055 static char * mode_path[] = { _PATH_WTMP, _PATH_WTMP, _PATH_UTMP };
    1056 
    10571098static void sh_utmp_check_internal (int mode)
    10581099{
Note: See TracChangeset for help on using the changeset viewer.