Changeset 131 for trunk/src/slib.c


Ignore:
Timestamp:
Oct 22, 2007, 11:19:15 PM (17 years ago)
Author:
rainer
Message:

Use thread-safe libc functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/slib.c

    r76 r131  
    14251425int sl_policy_get_real(char * user)
    14261426{
    1427   struct passwd * tempres;
    1428 
    14291427  SL_ENTER(_("sl_policy_get_real"));
    14301428  SL_REQUIRE(uids_are_stored == SL_FALSE, _("uids_are_stored == SL_FALSE"));
     
    14331431  if (euid == 0 || ruid == 0)
    14341432    {
    1435       tempres = sh_getpwnam(user);
     1433#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)
     1434      struct passwd    pwd;
     1435      char             buffer[SH_PWBUF_SIZE];
     1436      struct passwd *  tempres;
     1437      sh_getpwnam_r(user, &pwd, buffer, sizeof(buffer), &tempres);
     1438#else
     1439      struct passwd * tempres = sh_getpwnam(user);
     1440#endif
    14361441
    14371442      SL_REQUIRE (NULL != tempres, _("tempres != NULL"));
     
    14711476  if (euid != ruid || egid != rgid)
    14721477    {
    1473       tempres = sh_getpwnam(user);
     1478#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)
     1479      struct passwd    pwd;
     1480      char             buffer[SH_PWBUF_SIZE];
     1481      struct passwd *  tempres;
     1482      sh_getpwnam_r(user, &pwd, buffer, sizeof(buffer), &tempres);
     1483#else
     1484      struct passwd * tempres = sh_getpwnam(user);
     1485#endif
    14741486
    14751487      SL_REQUIRE (NULL != tempres, _("tempres != NULL"));
    14761488
    1477 #if 0
    1478       rgid = tempres->pw_gid;
    1479       ruid = tempres->pw_uid;
    1480       SL_REQUIRE(sl_unset_suid() == SL_ENONE,
    1481                  _("sl_unset_suid() == SL_ENONE"));
    1482 #endif
    14831489      SL_REQUIRE (sl_drop_privileges() == SL_ENONE,
    14841490                  _("sl_drop_privileges() == SL_ENONE"));
     
    21152121  SL_IRETURN(SL_ENONE, _("sl_read_timeout_prep"));
    21162122}
    2117  
    2118 
    2119 int sl_read_timeout (SL_TICKET ticket, void * buf_in, size_t count,
    2120                      int timeout)
    2121 {
     2123
     2124
     2125int sl_read_timeout_fd (int fd, void * buf_in, size_t count,
     2126                        int timeout, int is_nonblocking)
     2127{
     2128  int sflags;
    21222129  fd_set readfds;
    21232130  struct timeval tv;
     
    21352142  extern volatile int sig_termfast;
    21362143 
    2137   if (buf_in == NULL || SL_ISERROR(fd = get_the_fd(ticket)))
    2138     {
    2139       if (buf_in == NULL)
    2140         {
    2141           TPT(( 0, FIL__, __LINE__, _("msg=<null buffer>")));
    2142           return (SL_ENULL);
    2143         }
    2144       if (SL_ISERROR(fd = get_the_fd(ticket)))
    2145         {
    2146           TPT(( 0, FIL__, __LINE__, _("msg=<ticket error> errno=<%d>"), fd));
    2147           return (fd);
    2148         }
     2144  if (is_nonblocking == SL_FALSE)
     2145    {
     2146      /* set to non-blocking mode
     2147       */
     2148      sflags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
     2149      retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags | O_NONBLOCK);
    21492150    }
    21502151
     
    21902191              else
    21912192                {
     2193                  if (is_nonblocking == SL_FALSE)
     2194                      retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    21922195                  return (SL_EREAD);
    21932196                }
     
    22032206      else if (retval == 0)
    22042207        {
     2208          if (is_nonblocking == SL_FALSE)
     2209              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22052210          return (SL_TIMEOUT);
    22062211        }
    22072212      else
    22082213        {
     2214          if (is_nonblocking == SL_FALSE)
     2215              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22092216          return (SL_EREAD);
    22102217        }
     
    22122219      if (sig_termfast == 1)
    22132220        {
     2221          if (is_nonblocking == SL_FALSE)
     2222              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22142223          return (SL_EREAD);
    22152224        }
     
    22202229      if (tdiff > timeout)
    22212230        {
     2231          if (is_nonblocking == SL_FALSE)
     2232              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22222233          return (SL_TIMEOUT);
    22232234        }
    22242235    }
    22252236
     2237  if (is_nonblocking == SL_FALSE)
     2238    retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22262239  return ((int) bytes);
     2240}
     2241
     2242int sl_read_timeout (SL_TICKET ticket, void * buf_in, size_t count,
     2243                     int timeout, int is_nonblocking)
     2244{
     2245  int    fd;
     2246 
     2247  if (buf_in == NULL || SL_ISERROR(fd = get_the_fd(ticket)))
     2248    {
     2249      if (buf_in == NULL)
     2250        {
     2251          TPT(( 0, FIL__, __LINE__, _("msg=<null buffer>")));
     2252          return (SL_ENULL);
     2253        }
     2254      if (SL_ISERROR(fd = get_the_fd(ticket)))
     2255        {
     2256          TPT(( 0, FIL__, __LINE__, _("msg=<ticket error> errno=<%d>"), fd));
     2257          return (fd);
     2258        }
     2259    }
     2260
     2261  return sl_read_timeout_fd (fd, buf_in, count, timeout, is_nonblocking);
    22272262}
    22282263
Note: See TracChangeset for help on using the changeset viewer.