[#3907] Obtaining mode information on an IO object — Jos Backus <jos@...>

The attached patch implements IO#mode. This method returns the mode the IO

17 messages 2004/12/06
[#3909] Re: [patch] Obtaining mode information on an IO object — nobu.nokada@... 2004/12/07

Hi,

[#3910] Re: [patch] Obtaining mode information on an IO object — Jos Backus <jos@...> 2004/12/07

On Tue, Dec 07, 2004 at 09:25:13AM +0900, nobu.nokada@softhome.net wrote:

[#3925] Re: [patch] Obtaining mode information on an IO object — James Britt <ruby@...> 2004/12/09

Jos Backus wrote:

[#4009] cgi.rb -- more GET/POST stuff — mde@...26.com

First of all, I think it would be great, as Eustaquio suggests, to

17 messages 2004/12/23
[#4016] Re: [PATCH] cgi.rb -- more GET/POST stuff — Francis Hwang <sera@...> 2004/12/24

GETs and POSTs are defined to be fairly different actions. I'd read

[#4027] Allowing custom number literal suffixes? — Florian Gro<florgro@...>

Moin!

35 messages 2004/12/27
[#4070] Re: Allowing custom number literal suffixes? — nobu.nokada@... 2005/01/02

Hi,

[#4072] Re: Allowing custom number literal suffixes? — Mathieu Bouchard <matju@...> 2005/01/02

[#4079] Re: Allowing custom number literal suffixes? — Florian Gro<florgro@...> 2005/01/03

Mathieu Bouchard wrote:

[#4081] Re: Allowing custom number literal suffixes? — Mathieu Bouchard <matju@...> 2005/01/03

[#4082] Re: Allowing custom number literal suffixes? — Florian Gro<florgro@...> 2005/01/03

Mathieu Bouchard wrote:

[#4084] Re: Allowing custom number literal suffixes? — Brent Roman <brent@...> 2005/01/04

I'm not sure I would advocate making Ruby's grammar even more

[#4086] Re: Allowing custom number literal suffixes? — Mathieu Bouchard <matju@...> 2005/01/04

[#4033] Garbage collection trouble — Christian Neukirchen <chneukirchen@...>

Hello,

13 messages 2004/12/27

mkdir, mkdir_p in FileUtils and mode

From: Florian Frank <flori@...>
Date: 2004-12-03 18:55:10 UTC
List: ruby-core #3881
Hello,

if I get this correct, the methods in FileUtils are supposed to mirror
the unix shell commands.

In shell mkdir can be used in this way:

(flori@lambda:flori 0)$ mkdir -m 2750 foo
(flori@lambda:flori 0)$ ls -ld foo
drwxr-s---  2 flori flori 4096 Dec  3  2004 foo

But if I do
  >> FileUtils::mkdir 'foo', :mode => 02750

the s-bit is silently ignored, because the mkdir libc function and thus
Dir::mkdir ignores some bits depending  on
the used operation system.

I've made a patch (attached) to chmod the file in FileUtils::mkdir(_p)
to the given mode, and also changed the Dir::mkdir comment to warn
people about the libc behaviour.

Perhaps Dir::mkdir should be portable in Ruby and not rely on the
operating system's behaviour? Or is it more important to make the
original libc mkdir available in Dir class?

-- 
Florian Frank

Attachments (1)

mkdir.patch (2.66 KB, text/x-diff)
Index: dir.c
===================================================================
RCS file: /src/ruby/dir.c,v
retrieving revision 1.134
diff -u -p -r1.134 dir.c
--- dir.c	22 Nov 2004 15:26:02 -0000	1.134
+++ dir.c	3 Dec 2004 12:36:08 -0000
@@ -870,8 +870,9 @@ dir_s_chroot(dir, path)
  *     Dir.mkdir( string [, integer] ) => 0
  *
  *  Makes a new directory named by <i>string</i>, with permissions
- *  specified by the optional parameter <i>anInteger</i>. The
- *  permissions may be modified by the value of
+ *  specified by the optional parameter <i>anInteger</i>; the
+ *  bits are interpreted exactly as the operating system's mkdir libc ibrary
+ *  call does. The permissions may be modified by the value of
  *  <code>File::umask</code>, and are ignored on NT. Raises a
  *  <code>SystemCallError</code> if the directory cannot be created. See
  *  also the discussion of permissions in the class documentation for
Index: lib/fileutils.rb
===================================================================
RCS file: /src/ruby/lib/fileutils.rb,v
retrieving revision 1.46
diff -u -p -r1.46 fileutils.rb
--- lib/fileutils.rb	8 Oct 2004 12:37:19 -0000	1.46
+++ lib/fileutils.rb	3 Dec 2004 12:36:13 -0000
@@ -131,6 +131,15 @@ module FileUtils
     true
   end
 
+  def create_dir(path, mode)
+    if mode
+      Dir.mkdir path.sub(%r</\z>, ''), mode
+      File.chmod mode, path
+    else
+      Dir.mkdir path.sub(%r</\z>, ''), 0777 & ~File.umask
+    end
+  end
+  private :create_dir
 
   #
   # Options: mode noop verbose
@@ -147,10 +156,8 @@ module FileUtils
     list = fu_list(list)
     fu_output_message "mkdir #{options[:mode] ? ('-m %03o ' % options[:mode]) : ''}#{list.join ' '}" if options[:verbose]
     return if options[:noop]
-
-    mode = options[:mode] || (0777 & ~File.umask)
     list.each do |dir|
-      Dir.mkdir dir.sub(%r</\z>, ''), mode
+      create_dir dir, options[:mode]
     end
   end
 
@@ -176,11 +183,10 @@ module FileUtils
     fu_output_message "mkdir -p #{options[:mode] ? ('-m %03o ' % options[:mode]) : ''}#{list.join ' '}" if options[:verbose]
     return *list if options[:noop]
 
-    mode = options[:mode] || (0777 & ~File.umask)
     list.map {|path| path.sub(%r</\z>, '') }.each do |path|
       # optimize for the most common case
       begin
-        Dir.mkdir path, mode
+        create_dir path, options[:mode]
         next
       rescue SystemCallError
         next if File.directory?(path)
@@ -193,7 +199,7 @@ module FileUtils
       end
       stack.reverse_each do |path|
         begin
-          Dir.mkdir path, mode
+          create_dir path, options[:mode]
         rescue SystemCallError => err
           raise unless File.directory?(path)
         end

In This Thread

Prev Next