]> git.lyx.org Git - lyx.git/blobdiff - src/support/FileInfo.C
another safety belt
[lyx.git] / src / support / FileInfo.C
index b7ac32c5ce55a69d451c3b1e08c660662125794d..27195f3d62f1a0efc841bf9d294cbb950c7bce59 100644 (file)
@@ -1,20 +1,25 @@
-// -*- C++ -*-
-/* This file is part of
- * ======================================================
- * 
- *           LyX, The Document Processor
- *        
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-1998 The LyX Team.
+/**
+ * \file FileInfo.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * ======================================================*/
+ * \author Lars Gullik Bjønnes
+ *
+ * Full author contact details are available in file CREDITS
+ */
 
 #include <config.h>
 
-#include <sys/types.h>
-#include <sys/stat.h>
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+//#include <sys/types.h>
+//#include <sys/stat.h>
+
 #include <cerrno>
 #include "FileInfo.h"
+#include "LAssert.h"
 
 #if !S_IRUSR
 # if S_IREAD
@@ -51,7 +56,7 @@
 #undef S_ISNWK
 #undef S_ISREG
 #undef S_ISSOCK
-#endif 
+#endif
 
 #if !defined(S_ISBLK) && defined(S_IFBLK)
 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
 #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
 #endif
 
-// Since major is a function on SVR4, we can't use `ifndef major'. 
-// might want to put MAJOR_IN_MKDEV for SYSV
-#ifdef MAJOR_IN_MKDEV
-#include <sys/mkdev.h>
-#define HAVE_MAJOR
+
+namespace {
+
+// builds 'rwx' string describing file access rights
+void flagRWX(mode_t i, char * str)
+{
+       str[0] = (i & S_IRUSR) ? 'r' : '-';
+       str[1] = (i & S_IWUSR) ? 'w' : '-';
+       str[2] = (i & S_IXUSR) ? 'x' : '-';
+}
+
+// updates mode string to match suid/sgid/sticky bits
+void setSticky(mode_t i, char * str)
+{
+#ifdef S_ISUID
+       if (i & S_ISUID)
+               str[3] = (str[3] == 'x') ? 's' : 'S';
 #endif
-#ifdef MAJOR_IN_SYSMACROS
-#include <sys/sysmacros.h>
-#define HAVE_MAJOR
+#ifdef S_ISGID
+       if (i & S_ISGID)
+               str[6] = (str[6] == 'x') ? 's' : 'S';
 #endif
-#ifdef major           
-#define HAVE_MAJOR
+#ifdef S_ISVTX
+       if (i & S_ISVTX)
+               str[9] = (str[9] == 'x') ? 's' : 'S';
 #endif
+}
 
-#ifndef HAVE_MAJOR
-#define major(dev)  (((dev) >> 8) & 0xff)
-#define minor(dev)  ((dev) & 0xff)
-#define makedev(maj, min)  (((maj) << 8) | (min))
+// returns a letter describing a file type (ls style)
+char typeLetter(mode_t i)
+{
+#ifdef S_ISBLK
+       if (S_ISBLK(i)) return 'b';
+#endif
+       if (S_ISCHR(i)) return 'c';
+       if (S_ISDIR(i)) return 'd';
+       if (S_ISREG(i)) return '-';
+#ifdef S_ISFIFO
+       if (S_ISFIFO(i)) return 'p';
+#endif
+#ifdef S_ISLNK
+       if (S_ISLNK(i)) return 'l';
+#endif
+#ifdef S_ISSOCK
+       if (S_ISSOCK(i)) return 's';
+#endif
+#ifdef S_ISMPC
+       if (S_ISMPC(i)) return 'm';
+#endif
+#ifdef S_ISNWK
+       if (S_ISNWK(i)) return 'n';
 #endif
-#undef HAVE_MAJOR
+       return '?';
+}
+
+
+} // namespace anon
 
 
 FileInfo::FileInfo()
@@ -111,7 +153,7 @@ FileInfo::FileInfo()
 
 
 FileInfo::FileInfo(string const & path, bool link)
-       : fname(path)
+       : fname_(path)
 {
        init();
        dostat(link);
@@ -121,274 +163,220 @@ FileInfo::FileInfo(string const & path, bool link)
 FileInfo::FileInfo(int fildes)
 {
        init();
-       status = fstat(fildes, buf);
-       if (status) err = errno;
-}
-
-
-FileInfo::~FileInfo()
-{
-       delete[] buf;
+       status_ = fstat(fildes, &buf_);
+       if (status_)
+               err_ = errno;
 }
 
 
 void FileInfo::init()
 {
-       status = 0;
-       err = NoErr;
-       buf = (struct stat*) new char[sizeof(struct stat)];
+       status_ = 0;
+       err_ = NoErr;
 }
 
 
 void FileInfo::dostat(bool link)
 {
-       if (link) {
-               status = lstat(fname.c_str(), buf);
-       } else {
-               status = stat(fname.c_str(), buf);
-       }
-       if (status) err = errno;
+       if (link)
+               status_ = ::lstat(fname_.c_str(), &buf_);
+       else
+               status_ = ::stat(fname_.c_str(), &buf_);
+       if (status_)
+               err_ = errno;
 }
 
 
-FileInfo& FileInfo::newFile(string const &path, bool link)
+FileInfo & FileInfo::newFile(string const & path, bool link)
 {
-       fname = path;
-       
-       status = 0;
-       err = NoErr;
-
+       fname_  = path;
+       status_ = 0;
+       err_    = NoErr;
        dostat(link);
-
        return *this;
 }
 
 
-FileInfo& FileInfo::newFile(int fildes)
+FileInfo & FileInfo::newFile(int fildes)
 {
-       status = 0;
-       err = NoErr;
-       status = fstat(fildes, buf);
-       if (status) err = errno;
+       status_ = 0;
+       err_    = NoErr;
+       status_ = fstat(fildes, &buf_);
+       if (status_)
+               err_ = errno;
        return *this;
 }
 
 
-char const * FileInfo::typeIndicator() const
+// should not be in FileInfo
+char FileInfo::typeIndicator() const
 {
-       if (S_ISDIR(buf->st_mode)) return ("/");
+       lyx::Assert(isOK());
+       if (S_ISDIR(buf_.st_mode))
+               return '/';
 #ifdef S_ISLNK
-       if (S_ISLNK(buf->st_mode)) return ("@");
+       if (S_ISLNK(buf_.st_mode))
+               return '@';
 #endif
 #ifdef S_ISFIFO
-       if (S_ISFIFO(buf->st_mode)) return ("|");
+       if (S_ISFIFO(buf_.st_mode))
+               return '|';
 #endif
 #ifdef S_ISSOCK
-       if (S_ISSOCK(buf->st_mode)) return ("=");
+       if (S_ISSOCK(buf_.st_mode))
+               return '=';
 #endif
-       if (S_ISREG(buf->st_mode) && (buf->st_mode & (S_IEXEC | S_IXGRP | S_IXOTH)))
-               return ("*");
-       return "";
+       if (S_ISREG(buf_.st_mode) && (buf_.st_mode & (S_IEXEC | S_IXGRP | S_IXOTH)))
+               return '*';
+       return ' ';
 }
 
 
 mode_t FileInfo::getMode() const
 {
-       return buf->st_mode;
-}
-
-long FileInfo::getBlockSize() const
-{
-#ifndef __EMX__
-       return buf->st_blksize; /* Preferred I/O block size */
-#else
-#warning May be fixed in 0.13 (SMiyata)
-       return 512; /* Assume HPFS */
-#endif
-}
-
-void FileInfo::modeString(char * szString) const
-{
-       szString[0] = typeLetter();
-       flagRWX((buf->st_mode & 0700) << 0, &szString[1]);
-       flagRWX((buf->st_mode & 0070) << 3, &szString[4]);
-       flagRWX((buf->st_mode & 0007) << 6, &szString[7]);
-       setSticky(szString);
-       szString[10] = 0;
-}
-
-
-char FileInfo::typeLetter() const
-{
-#ifdef S_ISBLK
-       if (S_ISBLK(buf->st_mode)) return 'b';
-#endif
-       if (S_ISCHR(buf->st_mode)) return 'c';
-       if (S_ISDIR(buf->st_mode)) return 'd';
-       if (S_ISREG(buf->st_mode)) return '-';
-#ifdef S_ISFIFO
-       if (S_ISFIFO(buf->st_mode)) return 'p';
-#endif
-#ifdef S_ISLNK
-       if (S_ISLNK(buf->st_mode)) return 'l';
-#endif
-#ifdef S_ISSOCK
-       if (S_ISSOCK(buf->st_mode)) return 's';
-#endif
-#ifdef S_ISMPC
-       if (S_ISMPC(buf->st_mode)) return 'm';
-#endif
-#ifdef S_ISNWK
-       if (S_ISNWK(buf->st_mode)) return 'n';
-#endif
-       return '?';
+       lyx::Assert(isOK());
+       return buf_.st_mode;
 }
 
 
-void FileInfo::flagRWX(unsigned short i, char * szString) const
+// should not be in FileInfo
+string FileInfo::modeString() const
 {
-       szString[0] = (i & S_IRUSR) ? 'r' : '-';
-       szString[1] = (i & S_IWUSR) ? 'w' : '-';
-       szString[2] = (i & S_IXUSR) ? 'x' : '-';
+       lyx::Assert(isOK());
+       char str[11];
+       str[0] = typeLetter(buf_.st_mode);
+       flagRWX((buf_.st_mode & 0700) << 0, &str[1]);
+       flagRWX((buf_.st_mode & 0070) << 3, &str[4]);
+       flagRWX((buf_.st_mode & 0007) << 6, &str[7]);
+       setSticky(buf_.st_mode, str);
+       str[10] = 0;
+       return str;
 }
 
 
-void FileInfo::setSticky(char * szString) const
-{
-#ifdef S_ISUID
-       if (buf->st_mode & S_ISUID) {
-               if (szString[3] != 'x') szString[3] = 'S';
-               else szString[3] = 's';
-       }
-#endif
-#ifdef S_ISGID
-       if (buf->st_mode & S_ISGID) {
-               if (szString[6] != 'x') szString[6] = 'S';
-               else szString[6] = 's';
-       }
-#endif
-#ifdef S_ISVTX
-       if (buf->st_mode & S_ISVTX) {
-               if (szString[9] != 'x') szString[9] = 'T';
-               else szString[9] = 't';
-       }
-#endif
-}
-
 
 time_t FileInfo::getModificationTime() const
 {
-       return buf->st_mtime;
+       lyx::Assert(isOK());
+       return buf_.st_mtime;
 }
 
 
 time_t FileInfo::getAccessTime() const
 {
-       return buf->st_atime;
+       lyx::Assert(isOK());
+       return buf_.st_atime;
 }
 
 
-time_t  FileInfo::getStatusChangeTime() const
+time_t FileInfo::getStatusChangeTime() const
 {
-       return buf->st_ctime;
+       lyx::Assert(isOK());
+       return buf_.st_ctime;
 }
 
 
 nlink_t FileInfo::getNumberOfLinks() const
 {
-       return buf->st_nlink;
+       lyx::Assert(isOK());
+       return buf_.st_nlink;
 }
 
 
-uid_t  FileInfo::getUid() const
+uid_t FileInfo::getUid() const
 {
-       return buf->st_uid;
+       lyx::Assert(isOK());
+       return buf_.st_uid;
 }
 
 
-gid_t  FileInfo::getGid() const
+gid_t FileInfo::getGid() const
 {
-       return buf->st_gid;
+       lyx::Assert(isOK());
+       return buf_.st_gid;
 }
 
 
 off_t FileInfo::getSize() const
 {
-       return buf->st_size;
+       lyx::Assert(isOK());
+       return buf_.st_size;
 }
 
 
 int FileInfo::getError() const
 {
-       return err;
+       return err_;
 }
 
 
 bool FileInfo::isOK() const
 {
-       // DEC cxx 6.0 chokes on this bizarre construct (compiler bug)
-       // return (status) ? false : true;
-       // So I replaced it with a simpler one (JMarc)
-       return status == 0;
+       return status_ == 0;
 }
 
 
 bool FileInfo::isLink() const
 {
-       return S_ISLNK(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISLNK(buf_.st_mode);
 }
 
 
 bool FileInfo::isRegular() const
 {
-       return S_ISREG(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISREG(buf_.st_mode);
 }
 
 
 bool FileInfo::isDir() const
 {
-       return S_ISDIR(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISDIR(buf_.st_mode);
 }
 
 
 bool FileInfo::isChar() const
 {
-       return S_ISCHR(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISCHR(buf_.st_mode);
 }
 
 
 bool FileInfo::isBlock() const
 {
-       return S_ISBLK(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISBLK(buf_.st_mode);
 }
 
 
 bool FileInfo::isFifo() const
 {
-       return S_ISFIFO(buf->st_mode);
+       lyx::Assert(isOK());
+       return S_ISFIFO(buf_.st_mode);
 }
 
 
 bool FileInfo::isSocket() const
 {
+       lyx::Assert(isOK());
 #ifdef S_ISSOCK
-       return S_ISSOCK(buf->st_mode);
+       return S_ISSOCK(buf_.st_mode);
 #else
        return false;
 #endif
 }
 
 
-bool FileInfo::access(int p)
+// should not be in FileInfo
+bool FileInfo::access(int p) const
 {
        // if we don't have a filename we fail
-       if (fname.empty()) return false;
-       
-       if (::access(fname.c_str(), p) == 0)
-               return true;
-       else {
-               // If we were really kind, we would also tell why
-               // the file access failed.
+       if (fname_.empty())
                return false;
-       }
+
+       // If we were really kind, we would also tell why
+       // the file access failed.
+       return ::access(fname_.c_str(), p) == 0;
 }