aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--file.c83
-rw-r--r--lib/cgi.rb2
3 files changed, 91 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ede7754a14..ea12ab972c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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):
diff --git a/file.c b/file.c
index 1750eefff9..94da99ae8f 100644
--- a/file.c
+++ b/file.c
@@ -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 7f1f42260e..f8158858f3 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