Has anyone used File.stat to check permissions

In ruby API there is an example

s = File.stat(“testfile”)
sprintf("%o", s.mode) #=> “100644”

I need to check the last three numbers from the octal notation which is
“644”
which means:
rw- for user
r-- for group
r-- for other

Does anyone know how i could check just those three numbers and leave
the rest

Regards
Loftz

On Nov 25, 3:29 pm, Peter L. [email protected] wrote:

r-- for other

Does anyone know how i could check just those three numbers and leave
the rest

Regards
Loftz

Posted viahttp://www.ruby-forum.com/.

If you’re wanting to compare to the String “644”:

s.mode.to_s(8)[-3…-1] == “644”

otherwise, you can mask using bitwise & and compare to the Fixnum
0644:

(s.mode & 0xFFF) == 0644
(s.mode & 07777) == 0644

Jeremy

2007/11/26, yermej [email protected]:

I need to check the last three numbers from the octal notation which is
Loftz
(s.mode & 0xFFF) == 0644
(s.mode & 07777) == 0644

Jeremy

Sorry, those masks will probably work in most cases, but I guess you
should really use 0777 or 0x1FF to only get the ugo fields. Otherwise,
there might be problems if something is setuid or has the sticky bit
set.

I don’t see why it should be necessary to go through string
representation. You can simply use bit operations:

s = File.stat(“testfile”)
puts “all set!” if s.mode & 0644 != 0

Peter, or did you mean “set” and not “check”? Then you need to
actually set the mode, for example

untested

require ‘fileutils’
s = File.stat(“testfile”)
FileUtils.chmod(s | 0644, [“testfile”])

Kind regards

robert

On Nov 25, 4:36 pm, yermej [email protected] wrote:

“644”

(s.mode & 07777) == 0644

Jeremy

Sorry, those masks will probably work in most cases, but I guess you
should really use 0777 or 0x1FF to only get the ugo fields. Otherwise,
there might be problems if something is setuid or has the sticky bit
set.

Jeremy