Changeset 192 for trunk/src/slib.c


Ignore:
Timestamp:
Nov 12, 2008, 12:37:00 AM (16 years ago)
Author:
katerina
Message:

Fixes for cygwin, and improved error diagnostics (tickets #126, #127, #128).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/slib.c

    r190 r192  
    17001700  struct stat   lbuf;
    17011701  struct stat   buf;
     1702  int           errval = 0;
    17021703  int           lstat_return;
    17031704  int           stat_return;
     
    17501751  else
    17511752    lstat_return = retry_lstat(FIL__, __LINE__, filename, &lbuf);
     1753  errval = errno;
    17521754#ifdef USE_SUID
    17531755  if (priv == SL_YESPRIV)
     
    17591761      lstat_return = ENOENT;
    17601762      if ( (mode == SL_OPEN_FOR_READ && lstat_return == ENOENT) ||
    1761            (errno != ENOENT))
     1763           (errval != ENOENT))
    17621764        {
    17631765          TPT(( 0, FIL__, __LINE__, _("msg=<lstat: %s> errno=<%d>\n"),
    1764             filename, errno));
    1765           SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
     1766            filename, errval));
     1767          errno = errval;
     1768          SL_IRETURN(SL_ESTAT, _("sl_open_file"));
    17661769        }
    17671770    }
     
    17701773       ( S_ISDIR(lbuf.st_mode) || (S_IWOTH & lbuf.st_mode) )
    17711774      )
    1772     SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
    1773 
     1775    {
     1776      int retval = S_ISDIR(lbuf.st_mode) ? SL_EISDIR : SL_EBADOTH;
     1777      errno = 0;
     1778      SL_IRETURN(retval, _("sl_open_file"));
     1779    }
    17741780   
    17751781  /* O_NOATIME has an effect for read(). But write() ?.
     
    17801786      fd = aud_open_noatime (FIL__, __LINE__, priv, filename,
    17811787                             O_RDONLY|O_NONBLOCK, 0, &o_noatime);
     1788      errval = errno;
    17821789      if (fd >= 0) {
    17831790        sflags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
     
    17921799        fd = aud_open (FIL__, __LINE__, priv, filename,
    17931800                       O_WRONLY,                   open_mode);
     1801      errval = errno;
    17941802      break;
    17951803    case SL_OPEN_SAFE_RDWR:
    17961804      if (lstat_return == ENOENT)
    1797         fd = aud_open (FIL__, __LINE__, priv, filename,
    1798                        O_RDWR|O_CREAT|O_EXCL,      open_mode);
     1805        {
     1806          fd = aud_open (FIL__, __LINE__, priv, filename,
     1807                         O_RDWR|O_CREAT|O_EXCL,      open_mode);
     1808          errval = errno;
     1809        }
    17991810      else
    1800         SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
     1811        {
     1812          errno = errval;
     1813          SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
     1814        }
    18011815      break;
    18021816    case SL_OPEN_FOR_RDWR:
    18031817      if (lstat_return == ENOENT)
    1804         fd = aud_open (FIL__, __LINE__, priv, filename,
    1805                       O_RDWR|O_CREAT|O_EXCL,      open_mode);
     1818        fd = aud_open (FIL__, __LINE__, priv, filename,
     1819                        O_RDWR|O_CREAT|O_EXCL,      open_mode);
    18061820      else
    18071821        fd = aud_open (FIL__, __LINE__, priv, filename,
    18081822                       O_RDWR,                     open_mode);
     1823      errval = errno;
    18091824      break;
    18101825    case SL_OPEN_FOR_WTRUNC:
     
    18151830        fd = aud_open (FIL__, __LINE__, priv, filename,
    18161831                       O_WRONLY|O_TRUNC,           open_mode);
     1832      errval = errno;
    18171833      break;
    18181834    case SL_OPEN_FOR_RWTRUNC:
     
    18231839        fd = aud_open (FIL__, __LINE__, priv, filename,
    18241840                       O_RDWR|O_TRUNC,             open_mode);
     1841      errval = errno;
    18251842      break;
    18261843    default:
     1844      errno = 0;
    18271845      SL_IRETURN(SL_EINTERNAL, _("sl_open_file"));
    18281846    }
     
    18311849    {
    18321850      TPT(( 0, FIL__, __LINE__, _("msg=<Error opening: %s> errno=<%d>\n"),
    1833             filename, errno));
     1851            filename, errval));
     1852      errno = errval;
    18341853      SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
    18351854    }
     
    18401859#endif
    18411860  stat_return = retry_fstat(FIL__, __LINE__, fd, &buf);
     1861  errval = errno;
    18421862#ifdef USE_SUID
    18431863  if (priv == SL_YESPRIV)
     
    18481868    {
    18491869      close (fd);
    1850       SL_IRETURN(SL_EBADFILE, _("sl_open_file"));
    1851     }
     1870      errno = errval;
     1871      SL_IRETURN(SL_EFSTAT, _("sl_open_file"));
     1872    }
     1873
     1874  errno = 0;
    18521875
    18531876  if (lstat_return != ENOENT && buf.st_ino != lbuf.st_ino)
     
    22212244  /* int sflags; */
    22222245  int retval;
     2246  int error;
    22232247
    22242248  int    byteread = 0;
     
    22802304              else
    22812305                {
     2306                  error = errno;
    22822307                  if (is_nonblocking == SL_FALSE)
    22832308                      retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    22842309                  TPT(( 0, FIL__, __LINE__, _("msg=<read error>")));
     2310                  errno = error;
    22852311                  return (SL_EREAD);
    22862312                }
     
    22992325              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    23002326          TPT(( 0, FIL__, __LINE__, _("msg=<timeout>")));
     2327          errno = 0;
    23012328          return (SL_TIMEOUT);
    23022329        }
    23032330      else
    23042331        {
     2332          error = errno;
    23052333          if (is_nonblocking == SL_FALSE)
    23062334              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    23072335          TPT(( 0, FIL__, __LINE__, _("msg=<timeout>")));
     2336          errno = error;
    23082337          return (SL_EREAD);
    23092338        }
     
    23142343              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    23152344          TPT(( 0, FIL__, __LINE__, _("msg=<terminated>")));
     2345          errno = 0;
    23162346          return (SL_EREAD);
    23172347        }
     
    23252355              retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags);
    23262356          TPT(( 0, FIL__, __LINE__, _("msg=<timeout>")));
     2357          errno = 0;
    23272358          return (SL_TIMEOUT);
    23282359        }
     
    25442575char * sl_error_string(int errorcode)
    25452576{
     2577
    25462578  switch (errorcode)
    25472579    {
     
    25792611    case SL_EBADOTH:
    25802612      return _("World writeable.");
     2613    case SL_EISDIR:
     2614      return _("Is a directory.");
    25812615    case SL_EBADFILE:
    25822616      return _("File access error.");
     
    25882622    case SL_ESTAT:
    25892623      return _("stat() failed.");
     2624    case SL_EFSTAT:
     2625      return _("fstat() failed.");
    25902626    default:
    25912627      return _("Unknown error.");
Note: See TracChangeset for help on using the changeset viewer.