Changeset 143 for trunk/src/sh_utmp.c


Ignore:
Timestamp:
Oct 31, 2007, 1:09:26 AM (17 years ago)
Author:
rainer
Message:

Bugfixes and threaded process check.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_utmp.c

    r142 r143  
    7979#include "sh_modules.h"
    8080#include "sh_utmp.h"
    81 
     81#include "sh_pthread.h"
     82
     83SH_MUTEX_EXTERN(mutex_thread_nolog);
    8284
    8385#ifdef TM_IN_SYS_TIME
     
    300302  if (sh_utmpfile == NULL)
    301303    {
     304      SH_MUTEX_LOCK(mutex_thread_nolog);
    302305      fd = (int) aud_open (FIL__, __LINE__, SL_NOPRIV,
    303306                           sh_utmppath, O_RDONLY, 0);
     307      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    304308      if (fd >= 0)
    305309        {
     
    313317        {
    314318          error = errno;
     319          SH_MUTEX_LOCK(mutex_thread_nolog);
    315320          sh_error_handle ((-1), FIL__, __LINE__, error, MSG_E_ACCESS,
    316321                           (long) sh.real.uid, sh_utmppath);
     322          SH_MUTEX_UNLOCK(mutex_thread_nolog);
    317323          SL_RET0(_("sh_utmp_setutent"));
    318324        }
     
    489495    return SH_MOD_FAILED;
    490496#ifdef HAVE_PTHREAD
    491   if (arg != NULL && arg->initval < 0)
     497  if (arg != NULL && arg->initval < 0 && sh.flag.isdaemon == S_TRUE)
    492498    {
    493499      if (0 == sh_pthread_create(sh_threaded_module_run, (void *)arg))
     
    559565  if (ShUtmpActive == BAD)
    560566    SL_RETURN( (-1), _("sh_utmp_check"));
     567  SH_MUTEX_LOCK(mutex_thread_nolog);
    561568  sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_UT_CHECK);
     569  SH_MUTEX_UNLOCK(mutex_thread_nolog);
    562570  sh_utmp_check_internal (1);
    563571
     
    579587  tmp[0] = '='; tmp[1] = '\0';
    580588  (void) sl_strlcat (tmp, c, 32);
     589  SH_MUTEX_LOCK(mutex_thread_nolog);
    581590  retval = sh_error_set_level (tmp, &ShUtmpLoginSolo);
     591  SH_MUTEX_UNLOCK(mutex_thread_nolog);
    582592  SL_RETURN(retval, _("sh_utmp_set_login_solo"));
    583593}
     
    591601  tmp[0] = '='; tmp[1] = '\0';
    592602  (void) sl_strlcat (tmp, c, 32);
     603  SH_MUTEX_LOCK(mutex_thread_nolog);
    593604  retval = sh_error_set_level (tmp, &ShUtmpLoginMulti);
     605  SH_MUTEX_UNLOCK(mutex_thread_nolog);
    594606  SL_RETURN(retval, _("sh_utmp_set_login_multi"));
    595607}
     
    603615  tmp[0] = '='; tmp[1] = '\0';
    604616  (void) sl_strlcat (tmp, c, 32);
     617  SH_MUTEX_LOCK(mutex_thread_nolog);
    605618  retval = sh_error_set_level (tmp, &ShUtmpLogout);
     619  SH_MUTEX_UNLOCK(mutex_thread_nolog);
    606620  SL_RETURN(retval, _("sh_utmp_set_logout_good"));
    607621}
     
    616630  if (val <= 0)
    617631    {
     632      SH_MUTEX_LOCK(mutex_thread_nolog);
    618633      sh_error_handle ((-1), FIL__, __LINE__, EINVAL, MSG_EINVALS,
    619634                       _("utmp timer"), c);
     635      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    620636      retval = -1;
    621637    }
     
    823839          ) {
    824840        status = sh_utmp_login_a(user->name);
     841        SH_MUTEX_LOCK(mutex_thread_nolog);
    825842        (void) sh_unix_time (user->time, ttt, TIM_MAX);
    826843        sh_error_handle( ShUtmpLoginSolo, FIL__, __LINE__, 0,
     
    843860                         status
    844861                         );
     862        SH_MUTEX_UNLOCK(mutex_thread_nolog);
    845863      } else
    846864        if (0 != sh_utmp_is_virtual(ut->ut_line, user->ut_host))
    847865          {       
    848866            status = sh_utmp_login_a(user->name);
     867            SH_MUTEX_LOCK(mutex_thread_nolog);
    849868            (void) sh_unix_time (user->time, ttt, TIM_MAX);
    850869            sh_error_handle( ShUtmpLoginMulti, FIL__, __LINE__, 0,
     
    867886                             status
    868887                             );
     888            SH_MUTEX_UNLOCK(mutex_thread_nolog);
    869889          }
    870890     
     
    882902        {
    883903          status = sh_utmp_login_r(user->name);
     904          SH_MUTEX_LOCK(mutex_thread_nolog);
    884905          (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX);
    885906          sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0,
     
    902923                           status
    903924                           );
     925          SH_MUTEX_UNLOCK(mutex_thread_nolog);
    904926          userold->next = user->next;
    905927          if (user == userlist)
     
    912934        {
    913935          (void) sl_strlcpy(terminated_line, ut->ut_line, UT_HOSTSIZE);
     936          SH_MUTEX_LOCK(mutex_thread_nolog);
    914937          (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX);
    915938          sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0,
     
    918941                           ttt, 0
    919942                           );
     943          SH_MUTEX_UNLOCK(mutex_thread_nolog);
    920944        }
    921945      SL_RET0(_("sh_utmp_addlogin"));
     
    943967      userlist         = user;
    944968
     969      SH_MUTEX_LOCK(mutex_thread_nolog);
    945970      (void) sh_unix_time (user->time, ttt, TIM_MAX);
    946 
    947 
    948971      sh_error_handle( ShUtmpLoginSolo, FIL__, __LINE__, 0,
    949972#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR)
     
    965988                       1
    966989                       );
     990      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    967991      sh_utmp_login_morechecks(ut);
    968992    }
    969993  else  /* probably a logout */
    970994    {
     995      SH_MUTEX_LOCK(mutex_thread_nolog);
    971996      (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX);
    972 
    973997      sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0,
    974998#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR)
     
    9901014                       1
    9911015                       );
     1016      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    9921017      sh_utmp_logout_morechecks(user);
    9931018      userold->next = user->next;
     
    10141039  struct SH_UTMP_S * ut;
    10151040  unsigned long this_read = 0;
     1041  int           val_retry;
    10161042
    10171043  SL_ENTER(_("sh_utmp_check_internal"));
     
    10191045  /* error if no access
    10201046   */
    1021   if (0 != retry_lstat(FIL__, __LINE__, mode_path[mode], &buf))
     1047  do {
     1048    val_retry = /*@-unrecog@*/lstat ( mode_path[mode], &buf)/*@+unrecog@*/;
     1049  } while (val_retry < 0 && errno == EINTR);
     1050
     1051  if (0 != val_retry)
    10221052    {
    10231053      error = errno;
     1054      SH_MUTEX_LOCK(mutex_thread_nolog);
    10241055      sh_error_handle((-1), FIL__, __LINE__, error, MSG_E_ACCESS,
    10251056                      (long) sh.real.uid, mode_path[mode]);
     1057      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    10261058      SL_RET0(_("sh_utmp_check_internal"));
    10271059    }
     
    10431075  if (/*@-usedef@*/buf.st_size < lastsize/*@+usedef@*/ && mode < 2)
    10441076    {
     1077      SH_MUTEX_LOCK(mutex_thread_nolog);
    10451078      sh_error_handle((-1), FIL__, __LINE__, 0, MSG_UT_ROT,
    10461079                      mode_path[mode]);
     1080      SH_MUTEX_UNLOCK(mutex_thread_nolog);
    10471081      lastread = 0;
    10481082#ifndef USE_SETUTENT
Note: See TracChangeset for help on using the changeset viewer.