Changeset 142


Ignore:
Timestamp:
Oct 30, 2007, 12:17:00 AM (17 years ago)
Author:
rainer
Message:

Login watch runs in thread.

Location:
trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/samhain.c

    r140 r142  
    704704  for (modnum = 0; modList[modnum].name != NULL; ++modnum)
    705705    {
    706       if (modList[modnum].initval == GOOD)
     706      if (modList[modnum].initval == SH_MOD_ACTIVE)
    707707        (void) modList[modnum].mod_cleanup();
    708708    }
     709#ifdef HAVE_PTHREAD
     710  sh_pthread_cancel_all();
     711#endif
    709712#endif
    710713
     
    16371640  for (modnum = 0; modList[modnum].name != NULL; ++modnum)
    16381641    {
    1639       if ( 0 != (status = modList[modnum].mod_init(&(modList[modnum]))) )
     1642      status = modList[modnum].mod_init(&(modList[modnum]));
     1643      if ( status < 0 )
    16401644        {
    16411645          if (status == (-1)) {
     
    16491653                             status);
    16501654          }
    1651           modList[modnum].initval = S_FALSE;
     1655          modList[modnum].initval = SH_MOD_FAILED;
    16521656        }
    16531657      else
     
    16551659          sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MOD_OK,
    16561660                           _(modList[modnum].name));
    1657           modList[modnum].initval = S_TRUE;
     1661          modList[modnum].initval = status;
    16581662        }
    16591663    }
     
    17441748              for (modnum = 0; modList[modnum].name != NULL; ++modnum)
    17451749                {
    1746                   if (modList[modnum].initval == GOOD)
     1750                  if (modList[modnum].initval >= SH_MOD_ACTIVE)
    17471751                    (void) modList[modnum].mod_reconf();
    17481752                }
     
    17951799              for (modnum = 0; modList[modnum].name != NULL; ++modnum)
    17961800                {
    1797                   if (0 != (status = modList[modnum].mod_init(&(modList[modnum]))))
     1801                  status = modList[modnum].mod_init(&(modList[modnum]));
     1802
     1803                  if (status < 0)
    17981804                    {
    17991805                      if (status == (-1)) {
     
    18081814                                         status);
    18091815                      }
    1810                       modList[modnum].initval = S_FALSE;
     1816                      modList[modnum].initval = SH_MOD_FAILED;
    18111817                    }
    18121818                  else
     
    18141820                      sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MOD_OK,
    18151821                                       _(modList[modnum].name));
    1816                       modList[modnum].initval = S_TRUE;
     1822                      modList[modnum].initval = status;
    18171823                    }
    18181824                }
     
    20252031      for (modnum = 0; modList[modnum].name != NULL; ++modnum)
    20262032        {
    2027           if (modList[modnum].initval == GOOD &&
     2033          if (modList[modnum].initval == SH_MOD_ACTIVE &&
    20282034              0 != modList[modnum].mod_timer(tcurrent))
    20292035            if (0 != (status = modList[modnum].mod_check()))
  • trunk/src/sh_error.c

    r140 r142  
    2020#include "config_xor.h"
    2121
    22 /* required on linux to get the correct strerror_r function
     22/* Required on linux to get the correct strerror_r function. Also
     23 * for recursive mutexes (_XOPEN_SOURCE >= 500).
    2324 */
    2425#define _XOPEN_SOURCE 600
  • trunk/src/sh_modules.c

    r140 r142  
    2121  {
    2222    N_("UTMP"),
    23     0,
     23    -1,
    2424    sh_utmp_init,
    2525    sh_utmp_timer,
     
    3737  {
    3838    N_("MOUNTS"),
    39     0,
     39    -1,
    4040    sh_mounts_init,
    4141    sh_mounts_timer,
     
    5353  {
    5454    N_("USERFILES"),
    55     0,
     55    -1,
    5656    sh_userfiles_init,
    5757    sh_userfiles_timer,
     
    6969  {
    7070    N_("KERNEL"),
    71     0,
     71    -1,
    7272    sh_kern_init,
    7373    sh_kern_timer,
     
    8585  {
    8686    N_("SUIDCHECK"),
    87     0,
     87    -1,
    8888    sh_suidchk_init,
    8989    sh_suidchk_timer,
     
    101101  {
    102102    N_("PROCESSCHECK"),
    103     0,
     103    -1,
    104104    sh_prochk_init,
    105105    sh_prochk_timer,
     
    117117  {
    118118    N_("PORTCHECK"),
    119     0,
     119    -1,
    120120    sh_portchk_init,
    121121    sh_portchk_timer,
     
    132132  {
    133133    NULL,
    134     0,
     134    -1,
    135135
    136136    NULL,
  • trunk/src/sh_pthread.c

    r141 r142  
    4040
    4141/* MODULES: init()
    42  *             -- starts thread_run() function if threaded
    43  *             -- fallback on internal_init if threading fails
    44  *             -- and returns MODULE_INACTIVE/MODULE_ACTIVE/MODULE_THREADED
    45  *
    46  *                int retval = MODULE_INACTIVE;
    47  *                if (0 != sh_pthread_create(thread_run, NULL))
    48  *                   return internal_init();
    49  *                return MODULE_THREADED;
    50  *
    51  *          thread_run()
     42 *
     43 * #ifdef HAVE_PTHREAD
     44 *  if (arg != NULL)
     45 *    {
     46 *      if (0 == sh_pthread_create(sh_threaded_module_run, (void *)arg))
     47 *        return SH_MOD_THREAD;
     48 *      else
     49 *        return SH_MOD_FAILED;
     50 *    }
     51 * #else
     52 *  return sh_utmp_init_internal();
     53 * #endif
     54 *
     55 *
     56 *          sh_threaded_module_run(module_struct)
    5257 *             -- calls internal init,
    5358 *             -- polls timer,
     
    131136/* ---- Utility functions for modules ----
    132137 */
    133 void sh_threaded_module_reconf(void *arg)
     138void sh_threaded_module_cleanup(void *arg)
    134139{
    135140  sh_mtype * this_module = (sh_mtype *) arg;
    136   this_module->mod_reconf();
     141  this_module->mod_cleanup();
    137142  return;
    138143}
    139144
    140 void sh_threaded_module_run(void *arg)
     145void * sh_threaded_module_run(void *arg)
    141146{
    142147  sh_mtype * this_module = (sh_mtype *) arg;
     
    153158      if (0 == this_module->mod_init(NULL))
    154159        {
    155           pthread_cleanup_push(sh_threaded_module_reconf, arg);
     160          pthread_cleanup_push(sh_threaded_module_cleanup, arg);
    156161
    157162          while (1)
     
    159164              if (0 != this_module->mod_timer(time(NULL)))
    160165                {
    161                   this_module->mod_check();
     166                  /* If module has been de-activated on reconfigure,
     167                   * mod_check() must return non-zero.
     168                   * The mod_cleanup() routine must then enable the
     169                   * module to be re-activated eventually.
     170                   */
     171                  if (0 != this_module->mod_check())
     172                    break;
    162173                  pthread_testcancel();
    163174                  retry_msleep(1,0);
     
    171182  pthread_cleanup_pop(1);
    172183
    173   return;
     184  return NULL;
    174185}
    175186
  • trunk/src/sh_utmp.c

    r140 r142  
    455455static struct log_user   * userlist   = NULL;
    456456static time_t  lastcheck;
     457static int     init_done = 0;
    457458
    458459/*************
     
    461462 *
    462463 *************/
    463 int sh_utmp_init (struct mod_type * arg)
    464 {
    465   static int done = 0;
    466   (void) arg;
     464
     465static int sh_utmp_init_internal ()
     466{
    467467
    468468  SL_ENTER(_("sh_utmp_init"));
     
    472472  /* do not re-initialize after a re-configuration
    473473   */
    474   if (done == 1) {
     474  if (init_done == 1) {
    475475    SL_RETURN( (0), _("sh_utmp_init"));
    476476  }
     
    480480  sh_utmp_check_internal (2); /* current logins */
    481481  sh_utmp_check_internal (0);
    482   done = 1;
     482  init_done = 1;
    483483  SL_RETURN( (0), _("sh_utmp_init"));
     484}
     485
     486int sh_utmp_init (struct mod_type * arg)
     487{
     488  if (ShUtmpActive == BAD)
     489    return SH_MOD_FAILED;
     490#ifdef HAVE_PTHREAD
     491  if (arg != NULL && arg->initval < 0)
     492    {
     493      if (0 == sh_pthread_create(sh_threaded_module_run, (void *)arg))
     494        return SH_MOD_THREAD;
     495      else
     496        return SH_MOD_FAILED;
     497    }
     498#endif
     499  return sh_utmp_init_internal();
    484500}
    485501
     
    509525  (void) sh_utmp_login_clean();
    510526#endif
     527  /* Reset the flag, such that the module
     528   * can be re-enabled.
     529   */
     530  ShUtmpActive       = S_TRUE;
     531  init_done          = 0;
    511532  SL_RETURN( (0), _("sh_utmp_end"));
    512533}
     
    536557{
    537558  SL_ENTER(_("sh_utmp_check"));
     559  if (ShUtmpActive == BAD)
     560    SL_RETURN( (-1), _("sh_utmp_check"));
    538561  sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_UT_CHECK);
    539562  sh_utmp_check_internal (1);
Note: See TracChangeset for help on using the changeset viewer.