2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright 1995 Matthias Ettrich
8 * Copyright 1995-1999 The LyX Team.
10 * ====================================================== */
14 #include <sys/types.h>
21 # define S_IRUSR S_IREAD
23 # define S_IRUSR 00400
29 # define S_IWUSR S_IWRITE
31 # define S_IWUSR 00200
37 # define S_IXUSR S_IEXEC
39 # define S_IXUSR 00100
43 #ifdef STAT_MACROS_BROKEN
56 #if !defined(S_ISBLK) && defined(S_IFBLK)
57 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
59 #if !defined(S_ISCHR) && defined(S_IFCHR)
60 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
62 #if !defined(S_ISDIR) && defined(S_IFDIR)
63 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
65 #if !defined(S_ISREG) && defined(S_IFREG)
66 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
68 #if !defined(S_ISFIFO) && defined(S_IFIFO)
69 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
71 #if !defined(S_ISLNK) && defined(S_IFLNK)
72 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
74 #if !defined(S_ISSOCK) && defined(S_IFSOCK)
75 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
77 #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
78 #define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
79 #define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
81 #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
82 #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
85 // Since major is a function on SVR4, we can't use `ifndef major'.
86 // might want to put MAJOR_IN_MKDEV for SYSV
88 #include <sys/mkdev.h>
91 #ifdef MAJOR_IN_SYSMACROS
92 #include <sys/sysmacros.h>
100 #define major(dev) (((dev) >> 8) & 0xff)
101 #define minor(dev) ((dev) & 0xff)
102 #define makedev(maj, min) (((maj) << 8) | (min))
113 FileInfo::FileInfo(string const & path, bool link)
121 FileInfo::FileInfo(int fildes)
124 status = fstat(fildes, &buf);
125 if (status) err = errno;
129 void FileInfo::init()
136 void FileInfo::dostat(bool link)
139 status = lstat(fname.c_str(), &buf);
141 status = stat(fname.c_str(), &buf);
143 if (status) err = errno;
147 FileInfo & FileInfo::newFile(string const & path, bool link)
160 FileInfo & FileInfo::newFile(int fildes)
164 status = fstat(fildes, &buf);
165 if (status) err = errno;
170 char const * FileInfo::typeIndicator() const
172 if (S_ISDIR(buf.st_mode)) return ("/");
174 if (S_ISLNK(buf.st_mode)) return ("@");
177 if (S_ISFIFO(buf.st_mode)) return ("|");
180 if (S_ISSOCK(buf.st_mode)) return ("=");
182 if (S_ISREG(buf.st_mode) && (buf.st_mode & (S_IEXEC | S_IXGRP | S_IXOTH)))
188 mode_t FileInfo::getMode() const
193 long FileInfo::getBlockSize() const
196 return buf.st_blksize; /* Preferred I/O block size */
198 #warning May be fixed in 0.13 (SMiyata)
199 return 512; /* Assume HPFS */
203 void FileInfo::modeString(char * szString) const
205 szString[0] = typeLetter();
206 flagRWX((buf.st_mode & 0700) << 0, &szString[1]);
207 flagRWX((buf.st_mode & 0070) << 3, &szString[4]);
208 flagRWX((buf.st_mode & 0007) << 6, &szString[7]);
214 char FileInfo::typeLetter() const
217 if (S_ISBLK(buf.st_mode)) return 'b';
219 if (S_ISCHR(buf.st_mode)) return 'c';
220 if (S_ISDIR(buf.st_mode)) return 'd';
221 if (S_ISREG(buf.st_mode)) return '-';
223 if (S_ISFIFO(buf.st_mode)) return 'p';
226 if (S_ISLNK(buf.st_mode)) return 'l';
229 if (S_ISSOCK(buf.st_mode)) return 's';
232 if (S_ISMPC(buf.st_mode)) return 'm';
235 if (S_ISNWK(buf.st_mode)) return 'n';
241 void FileInfo::flagRWX(unsigned short i, char * szString) const
243 szString[0] = (i & S_IRUSR) ? 'r' : '-';
244 szString[1] = (i & S_IWUSR) ? 'w' : '-';
245 szString[2] = (i & S_IXUSR) ? 'x' : '-';
249 void FileInfo::setSticky(char * szString) const
252 if (buf.st_mode & S_ISUID) {
253 if (szString[3] != 'x') szString[3] = 'S';
254 else szString[3] = 's';
258 if (buf.st_mode & S_ISGID) {
259 if (szString[6] != 'x') szString[6] = 'S';
260 else szString[6] = 's';
264 if (buf.st_mode & S_ISVTX) {
265 if (szString[9] != 'x') szString[9] = 'T';
266 else szString[9] = 't';
272 time_t FileInfo::getModificationTime() const
278 time_t FileInfo::getAccessTime() const
284 time_t FileInfo::getStatusChangeTime() const
290 nlink_t FileInfo::getNumberOfLinks() const
296 uid_t FileInfo::getUid() const
302 gid_t FileInfo::getGid() const
308 off_t FileInfo::getSize() const
314 int FileInfo::getError() const
320 bool FileInfo::isOK() const
322 // DEC cxx 6.0 chokes on this bizarre construct (compiler bug)
323 // return (status) ? false : true;
324 // So I replaced it with a simpler one (JMarc)
329 bool FileInfo::isLink() const
331 return S_ISLNK(buf.st_mode);
335 bool FileInfo::isRegular() const
337 return S_ISREG(buf.st_mode);
341 bool FileInfo::isDir() const
343 return S_ISDIR(buf.st_mode);
347 bool FileInfo::isChar() const
349 return S_ISCHR(buf.st_mode);
353 bool FileInfo::isBlock() const
355 return S_ISBLK(buf.st_mode);
359 bool FileInfo::isFifo() const
361 return S_ISFIFO(buf.st_mode);
365 bool FileInfo::isSocket() const
368 return S_ISSOCK(buf.st_mode);
375 bool FileInfo::access(int p)
377 // if we don't have a filename we fail
378 if (fname.empty()) return false;
380 if (::access(fname.c_str(), p) == 0)
383 // If we were really kind, we would also tell why
384 // the file access failed.