diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | file.c | 83 | ||||
-rw-r--r-- | lib/cgi.rb | 2 |
3 files changed, 91 insertions, 1 deletions
@@ -1,3 +1,10 @@ +Mon Jan 12 18:00:11 2004 Ian Macdonald <ian@caliban.org> + + * file.c (test_wr, test_ww): New functions implementing new + methods (File::world_readable?, File::world_writable?). + + * file.c (S_IRUGO, S_IGUGO): New macros. + Mon Jan 12 12:07:22 2004 Dave Thomas <dave@pragprog.com> * lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_methods): @@ -1015,6 +1015,50 @@ test_R(obj, fname) return Qtrue; } +/* + * call-seq: + * File.world_readable?(file_name) => fixnum or nil + * + * If <i>file_name</i> is readable by others, returns an integer + * representing the file permission bits of <i>file_name</i>. Returns + * <code>nil</code> otherwise. The meaning of the bits is platform + * dependent; on Unix systems, see <code>stat(2)</code>. + * + * File.world_readable?("/etc/passwd") # => 420 + * m = File.world_readable?("/etc/passwd") + * sprintf("%o", m) # => "644" + */ + +#ifndef S_IRUGO +# define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) +#endif + +#ifndef S_IWUGO +# define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) +#endif + +static VALUE +test_wr(obj, fname) + VALUE obj, fname; +{ +#ifdef S_IROTH + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if ((st.st_mode & (S_IROTH)) == S_IROTH) { +#ifdef __BORLANDC__ + return UINT2NUM((unsigned short)(st.st_mode & + (S_IRUGO|S_IWUGO|S_IXUGO))); +#else + return UINT2NUM(st.st_mode & (S_IRUGO|S_IWUGO|S_IXUGO)); +#endif + } + else { + return Qnil; + } +#endif + return Qfalse; +} /* * call-seq: @@ -1052,6 +1096,43 @@ test_W(obj, fname) /* * call-seq: + * File.world_writable?(file_name) => fixnum or nil + * + * If <i>file_name</i> is writable by others, returns an integer + * representing the file permission bits of <i>file_name</i>. Returns + * <code>nil</code> otherwise. The meaning of the bits is platform + * dependent; on Unix systems, see <code>stat(2)</code>. + * + * File.world_writable?("/tmp") #=> 511 + * m = File.world_writable?("/tmp") + * sprintf("%o", m) #=> "777" + */ + +static VALUE +test_ww(obj, fname) + VALUE obj, fname; +{ +#ifdef S_IWOTH + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if ((st.st_mode & (S_IWOTH)) == S_IWOTH) { +#ifdef __BORLANDC__ + return UINT2NUM((unsigned short)(st.st_mode & + (S_IRUGO|S_IWUGO|S_IXUGO))); +#else + return UINT2NUM(st.st_mode & (S_IRUGO|S_IWUGO|S_IXUGO)); +#endif + } + else { + return Qnil; + } +#endif + return Qfalse; +} + +/* + * call-seq: * File.executable?(file_name) => true or false * * Returns <code>true</code> if the named file is executable by the effective @@ -4052,8 +4133,10 @@ Init_File() define_filetest_function("exists?", test_e, 1); /* temporary */ define_filetest_function("readable?", test_r, 1); define_filetest_function("readable_real?", test_R, 1); + define_filetest_function("world_readable?", test_wr, 1); define_filetest_function("writable?", test_w, 1); define_filetest_function("writable_real?", test_W, 1); + define_filetest_function("world_writable?", test_ww, 1); define_filetest_function("executable?", test_x, 1); define_filetest_function("executable_real?", test_X, 1); define_filetest_function("file?", test_f, 1); diff --git a/lib/cgi.rb b/lib/cgi.rb index 7f1f42260..f8158858f 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -923,7 +923,7 @@ class CGI %w[ CONTENT_LENGTH SERVER_PORT ].each do |env| define_method(env.sub(/^HTTP_/n, '').downcase) do - val = env_table[env] && Integer(val) + (val = env_table[env]) && Integer(val) end end |