home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / FileInfo.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  7KB  |  398 lines

  1. // -*- C++ -*-
  2. /* This file is part of
  3. * ======================================================
  4. *           LyX, The Document Processor
  5. *        
  6. *           Copyright (C) 1995 Matthias Ettrich
  7. *           Copyright (C) 1995-1998 The LyX Team.
  8. *
  9. *======================================================*/
  10.  
  11. #include <config.h>
  12.  
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <errno.h>
  16. #include "FileInfo.h"
  17.  
  18. //     $Id: FileInfo.C,v 1.1.1.1 1998/04/23 16:02:47 larsbj Exp $    
  19.  
  20. #if !defined(lint) && !defined(WITH_WARNINGS)
  21. static char vcid[] = "$Id: FileInfo.C,v 1.1.1.1 1998/04/23 16:02:47 larsbj Exp $";
  22. #endif /* lint */
  23.  
  24. #if !S_IRUSR
  25. # if S_IREAD
  26. #  define S_IRUSR S_IREAD
  27. # else
  28. #  define S_IRUSR 00400
  29. # endif
  30. #endif
  31.  
  32. #if !S_IWUSR
  33. # if S_IWRITE
  34. #  define S_IWUSR S_IWRITE
  35. # else
  36. #  define S_IWUSR 00200
  37. # endif
  38. #endif
  39.  
  40. #if !S_IXUSR
  41. # if S_IEXEC
  42. #  define S_IXUSR S_IEXEC
  43. # else
  44. #  define S_IXUSR 00100
  45. # endif
  46. #endif
  47.  
  48. #ifdef STAT_MACROS_BROKEN
  49. #undef S_ISBLK
  50. #undef S_ISCHR
  51. #undef S_ISDIR
  52. #undef S_ISFIFO
  53. #undef S_ISLNK
  54. #undef S_ISMPB
  55. #undef S_ISMPC
  56. #undef S_ISNWK
  57. #undef S_ISREG
  58. #undef S_ISSOCK
  59. #endif 
  60.  
  61. #if !defined(S_ISBLK) && defined(S_IFBLK)
  62. #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
  63. #endif
  64. #if !defined(S_ISCHR) && defined(S_IFCHR)
  65. #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
  66. #endif
  67. #if !defined(S_ISDIR) && defined(S_IFDIR)
  68. #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  69. #endif
  70. #if !defined(S_ISREG) && defined(S_IFREG)
  71. #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
  72. #endif
  73. #if !defined(S_ISFIFO) && defined(S_IFIFO)
  74. #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
  75. #endif
  76. #if !defined(S_ISLNK) && defined(S_IFLNK)
  77. #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
  78. #endif
  79. #if !defined(S_ISSOCK) && defined(S_IFSOCK)
  80. #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
  81. #endif
  82. #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
  83. #define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
  84. #define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
  85. #endif
  86. #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
  87. #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
  88. #endif
  89.  
  90. // Since major is a function on SVR4, we can't use `ifndef major'. 
  91. // might want to put MAJOR_IN_MKDEV for SYSV
  92. #ifdef MAJOR_IN_MKDEV
  93. #include <sys/mkdev.h>
  94. #define HAVE_MAJOR
  95. #endif
  96. #ifdef MAJOR_IN_SYSMACROS
  97. #include <sys/sysmacros.h>
  98. #define HAVE_MAJOR
  99. #endif
  100. #ifdef major        
  101. #define HAVE_MAJOR
  102. #endif
  103.  
  104. #ifndef HAVE_MAJOR
  105. #define major(dev)  (((dev) >> 8) & 0xff)
  106. #define minor(dev)  ((dev) & 0xff)
  107. #define makedev(maj, min)  (((maj) << 8) | (min))
  108. #endif
  109. #undef HAVE_MAJOR
  110.  
  111.  
  112. FileInfo::FileInfo()
  113. {
  114.     init();
  115. }
  116.  
  117.  
  118. FileInfo::FileInfo(LString const &path, bool link)
  119.     : fname(path)
  120. {
  121.     init();
  122.     dostat(link);
  123. }
  124.  
  125.  
  126. FileInfo::FileInfo(int fildes)
  127. {
  128.     init();
  129.     status = fstat(fildes, buf);
  130.     if (status) err = errno;
  131. }
  132.  
  133.  
  134. FileInfo::~FileInfo()
  135. {
  136.     delete[] buf;
  137. }
  138.  
  139.  
  140. void FileInfo::init()
  141. {
  142.     status = 0;
  143.     err = NoErr;
  144.     buf = (struct stat*) new char[sizeof(struct stat)];
  145. }
  146.  
  147.  
  148. void FileInfo::dostat(bool link)
  149. {
  150.     if (link) {
  151.         status = lstat(fname.c_str(), buf);
  152.     } else {
  153.         status = stat(fname.c_str(), buf);
  154.     }
  155.     if (status) err = errno;
  156. }
  157.  
  158.  
  159. FileInfo& FileInfo::newFile(LString const &path, bool link)
  160. {
  161.     fname = path;
  162.     
  163.     status = 0;
  164.     err = NoErr;
  165.  
  166.     dostat(link);
  167.  
  168.     return *this;
  169. }
  170.  
  171.  
  172. FileInfo& FileInfo::newFile(int fildes)
  173. {
  174.     status = 0;
  175.     err = NoErr;
  176.     status = fstat(fildes, buf);
  177.     if (status) err = errno;
  178.     return *this;
  179. }
  180.  
  181.  
  182. char const *FileInfo::typeIndicator()
  183. {
  184.     if (S_ISDIR(buf->st_mode)) return ("/");
  185. #ifdef S_ISLNK
  186.     if (S_ISLNK(buf->st_mode)) return ("@");
  187. #endif
  188. #ifdef S_ISFIFO
  189.     if (S_ISFIFO(buf->st_mode)) return ("|");
  190. #endif
  191. #ifdef S_ISSOCK
  192.     if (S_ISSOCK(buf->st_mode)) return ("=");
  193. #endif
  194.     if (S_ISREG(buf->st_mode) && (buf->st_mode & (S_IEXEC | S_IXGRP | S_IXOTH)))
  195.         return ("*");
  196.     return "";
  197. }
  198.  
  199.  
  200. mode_t FileInfo::getMode()
  201. {
  202.     return buf->st_mode;
  203. }
  204.  
  205. long FileInfo::getBlockSize()
  206. {
  207. #ifndef __EMX__
  208.     return buf->st_blksize; /* Preferred I/O block size */
  209. #else
  210. #warning May be fixed in 0.13 (SMiyata)
  211.     return 512; /* Assume HPFS */
  212. #endif
  213. }
  214.  
  215. void FileInfo::modeString(char *szString)
  216. {
  217.     szString[0] = typeLetter();
  218.     flagRWX((buf->st_mode & 0700) << 0, &szString[1]);
  219.     flagRWX((buf->st_mode & 0070) << 3, &szString[4]);
  220.     flagRWX((buf->st_mode & 0007) << 6, &szString[7]);
  221.     setSticky(szString);
  222.     szString[10] = 0;
  223. }
  224.  
  225.  
  226. char FileInfo::typeLetter()
  227. {
  228. #ifdef S_ISBLK
  229.     if (S_ISBLK(buf->st_mode)) return 'b';
  230. #endif
  231.     if (S_ISCHR(buf->st_mode)) return 'c';
  232.     if (S_ISDIR(buf->st_mode)) return 'd';
  233.     if (S_ISREG(buf->st_mode)) return '-';
  234. #ifdef S_ISFIFO
  235.     if (S_ISFIFO(buf->st_mode)) return 'p';
  236. #endif
  237. #ifdef S_ISLNK
  238.     if (S_ISLNK(buf->st_mode)) return 'l';
  239. #endif
  240. #ifdef S_ISSOCK
  241.     if (S_ISSOCK(buf->st_mode)) return 's';
  242. #endif
  243. #ifdef S_ISMPC
  244.     if (S_ISMPC(buf->st_mode)) return 'm';
  245. #endif
  246. #ifdef S_ISNWK
  247.     if (S_ISNWK(buf->st_mode)) return 'n';
  248. #endif
  249.     return '?';
  250. }
  251.  
  252.  
  253. void FileInfo::flagRWX(unsigned short i, char *szString)
  254. {
  255.     szString[0] = (i & S_IRUSR) ? 'r' : '-';
  256.     szString[1] = (i & S_IWUSR) ? 'w' : '-';
  257.     szString[2] = (i & S_IXUSR) ? 'x' : '-';
  258. }
  259.  
  260.  
  261. void FileInfo::setSticky(char *szString)
  262. {
  263. #ifdef S_ISUID
  264.     if (buf->st_mode & S_ISUID) {
  265.         if (szString[3] != 'x') szString[3] = 'S';
  266.         else szString[3] = 's';
  267.     }
  268. #endif
  269. #ifdef S_ISGID
  270.     if (buf->st_mode & S_ISGID) {
  271.         if (szString[6] != 'x') szString[6] = 'S';
  272.         else szString[6] = 's';
  273.     }
  274. #endif
  275. #ifdef S_ISVTX
  276.     if (buf->st_mode & S_ISVTX) {
  277.         if (szString[9] != 'x') szString[9] = 'T';
  278.         else szString[9] = 't';
  279.     }
  280. #endif
  281. }
  282.  
  283.  
  284. time_t& FileInfo::getModificationTime()
  285. {
  286.     return buf->st_mtime;
  287. }
  288.  
  289.  
  290. time_t& FileInfo::getAccessTime()
  291. {
  292.     return buf->st_atime;
  293. }
  294.  
  295.  
  296. time_t& FileInfo::getStatusChangeTime()
  297. {
  298.     return buf->st_ctime;
  299. }
  300.  
  301.  
  302. nlink_t FileInfo::getNumberOfLinks()
  303. {
  304.     return buf->st_nlink;
  305. }
  306.  
  307.  
  308. uid_t  FileInfo::getUid()
  309. {
  310.     return buf->st_uid;
  311. }
  312.  
  313.  
  314. gid_t  FileInfo::getGid()
  315. {
  316.     return buf->st_gid;
  317. }
  318.  
  319.  
  320. off_t FileInfo::getSize()
  321. {
  322.     return buf->st_size;
  323. }
  324.  
  325.  
  326. int FileInfo::getError()
  327. {
  328.     return err;
  329. }
  330.  
  331.  
  332. bool FileInfo::isOK()
  333. {
  334.     return (status) ? false : true;
  335. }
  336.  
  337.  
  338. bool FileInfo::isLink()
  339. {
  340.     return S_ISLNK(buf->st_mode);
  341. }
  342.  
  343.  
  344. bool FileInfo::isRegular()
  345. {
  346.     return S_ISREG(buf->st_mode);
  347. }
  348.  
  349.  
  350. bool FileInfo::isDir()
  351. {
  352.     return S_ISDIR(buf->st_mode);
  353. }
  354.  
  355.  
  356. bool FileInfo::isChar()
  357. {
  358.     return S_ISCHR(buf->st_mode);
  359. }
  360.  
  361.  
  362. bool FileInfo::isBlock()
  363. {
  364.     return S_ISBLK(buf->st_mode);
  365. }
  366.  
  367.  
  368. bool FileInfo::isFifo()
  369. {
  370.     return S_ISFIFO(buf->st_mode);
  371. }
  372.  
  373.  
  374. bool FileInfo::isSocket()
  375. {
  376. #ifdef S_ISSOCK
  377.     return S_ISSOCK(buf->st_mode);
  378. #else
  379.     return false;
  380. #endif
  381. }
  382.  
  383.  
  384. bool FileInfo::access(int p)
  385. {
  386.     // if we don`t have a filename we fail
  387.     if (fname.empty()) return false;
  388.     
  389.     if (::access(fname.c_str(), p) == 0)
  390.         return true;
  391.     else {
  392.         // If we were really kind, we would also tell why
  393.         // the file access failed.
  394.         return false;
  395.     }
  396. }
  397.