class FileStat S_IFMTMSK = 0170000 # bit mask for the file type bit fields S_IFSOCK = 0140000 # socket S_IFLNK = 0120000 # symbolic link S_IFREG = 0100000 # regular file S_IFBLK = 0060000 # block device S_IFDIR = 0040000 # directory S_IFCHR = 0020000 # character device S_IFIFO = 0010000 # FIFO S_ISUID = 0004000 # set UID bit S_ISGID = 0002000 # set-group-ID bit S_ISVTX = 0001000 # sticky bit S_IRWXU = 00700 # mask for file owner permissions S_IRUSR = 00400 # owner has read permission S_IWUSR = 00200 # owner has write permission S_IXUSR = 00100 # owner has execute permission S_IRWXG = 00070 # mask for group permissions S_IRGRP = 00040 # group has read permission S_IWGRP = 00020 # group has write permission S_IXGRP = 00010 # group has execute permission S_IRWXO = 00007 # mask for permissions for others (not in group) S_IROTH = 00004 # others have read permission S_IWOTH = 00002 # others have write permission S_IXOTH = 00001 # others have execute permission FILE_TYPES = { S_IFBLK => 'b', S_IFCHR => 'c', S_IFDIR => 'd', S_IFREG => '-', S_IFIFO => 'p', S_IFLNK => 'l', S_IFSOCK => 's', } SET_ID_STICKY = [ [S_ISUID,'s'], [S_ISGID,'s'], [S_ISVTX,'t'], ] def initialize(mode) @mode = mode end def modeStr self.class.modeStr(@mode) end def S_IFMT self.class.S_IFMT(@mode) end def S_IMODE self.class.S_IMODE(@mode) end def S_ISBLK self.class.S_ISBLK(@mode) end def S_ISCHR self.class.S_ISCHR(@mode) end def S_ISDIR self.class.S_ISDIR(@mode) end def S_ISFIFO self.class.S_ISFIFO(@mode) end def S_ISLNK self.class.S_ISLNK(@mode) end def S_ISREG self.class.S_ISREG(@mode) end def S_ISSOCK self.class.S_ISSOCK(@mode) end def self.modeStr(mode) ret = '----------' ret[0] = FILE_TYPES[mode & S_IFMTMSK] bit = 0 ['USR','GRP','OTH'].each do |who| ['r','w','x'].each do |access| bit += 1 if mode & eval("S_I#{access.upcase}#{who}") == eval("S_I#{access.upcase}#{who}") ret[bit] = access end end end bit = 0 SET_ID_STICKY.each do |setid,sticky| bit += 3 if mode & eval("#{setid}") == eval("#{setid}") if ret[bit,1] == 'x' ret[bit] = sticky.upcase else ret[bit] = sticky end end end return ret end def self.S_IFMT(mode) return (mode & S_IFMTMSK) end def self.S_IMODE(mode) return (mode & (S_IRWXU + S_IRWXG + S_IRWXO)) end def self.S_ISBLK(mode) return (mode & S_IFMTMSK) == S_IFBLK end def self.S_ISCHR(mode) return (mode & S_IFMTMSK) == S_IFCHR end def self.S_ISDIR(mode) return (mode & S_IFMTMSK) == S_IFDIR end def self.S_ISFIFO(mode) return (mode & S_IFMTMSK) == S_IFIFO end def self.S_ISLNK(mode) return (mode & S_IFMTMSK) == S_IFLNK end def self.S_ISREG(mode) return (mode & S_IFMTMSK) == S_IFREG end def self.S_ISSOCK(mode) return (mode & S_IFMTMSK) == S_IFSOCK end end