Feature #11273 ยป 0001-file.c-load-now-supports-reading-from-a-FIFO-file.patch
| ChangeLog | ||
|---|---|---|
| 
     Wed Jun 17 16:00:00 2015  Franck Verrot  <franck@verrot.fr> 
   | 
||
| 
     	file.c : `load` now supports reading from a FIFO file 
   | 
||
| 
     	* file.c (rb_file_load_ok): `load` can now load not only regular files 
   | 
||
| 
     	  but also FIFOS. 
   | 
||
| 
     Wed Jun 17 15:15:53 2015  NAKAMURA Usaku  <usa@ruby-lang.org> 
   | 
||
| 
     	* safe.c (safe_setter): of course, don't have to warn the limitation of 
   | 
||
| NEWS | ||
|---|---|---|
| 
     === Core classes updates (outstanding ones only) 
   | 
||
| 
     * Kernel 
   | 
||
| 
       * Kernel.load now supports reading from a FIFO file. 
   | 
||
| 
     * Enumerable 
   | 
||
| 
       * Enumerable#grep_v is added as inverse version of Enumerable#grep. 
   | 
||
| file.c | ||
|---|---|---|
| 
     #define STAT(p, s)	stat((p), (s)) 
   | 
||
| 
     #endif 
   | 
||
| 
     #ifdef S_IFIFO 
   | 
||
| 
     #  ifndef S_ISFIFO 
   | 
||
| 
     #    define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 
   | 
||
| 
     #  endif 
   | 
||
| 
     #endif 
   | 
||
| 
     #if defined(__BEOS__) || defined(__HAIKU__) /* should not change ID if -1 */ 
   | 
||
| 
     static int 
   | 
||
| 
     be_chown(const char *path, uid_t owner, gid_t group) 
   | 
||
| ... | ... | |
| 
     rb_file_pipe_p(VALUE obj, VALUE fname) 
   | 
||
| 
     { 
   | 
||
| 
     #ifdef S_IFIFO 
   | 
||
| 
     #  ifndef S_ISFIFO 
   | 
||
| 
     #    define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 
   | 
||
| 
     #  endif 
   | 
||
| 
         struct stat st; 
   | 
||
| 
         if (rb_stat(fname, &st) < 0) return Qfalse; 
   | 
||
| ... | ... | |
| 
         rb_update_max_fd(fd); 
   | 
||
| 
     #if !defined DOSISH 
   | 
||
| 
         { 
   | 
||
| 
     	struct stat st; 
   | 
||
| 
     	if (fstat(fd, &st) || !S_ISREG(st.st_mode)) { 
   | 
||
| 
     	    ret = 0; 
   | 
||
| 
     	} 
   | 
||
| 
           struct stat st; 
   | 
||
| 
           fstat(fd, &st); 
   | 
||
| 
           #ifdef S_IFIFO 
   | 
||
| 
           if (!(S_ISREG(st.st_mode) || S_ISFIFO(st.st_mode))) { 
   | 
||
| 
           #else 
   | 
||
| 
           if (!S_ISREG(st.st_mode)) { 
   | 
||
| 
           #endif 
   | 
||
| 
               ret = 0; 
   | 
||
| 
           } 
   | 
||
| 
         } 
   | 
||
| 
     #endif 
   | 
||
| 
         (void)close(fd); 
   | 
||
| test/ruby/test_require.rb | ||
|---|---|---|
| 
           END 
   | 
||
| 
         } 
   | 
||
| 
       end unless /mswin|mingw/ =~ RUBY_PLATFORM 
   | 
||
| 
       def test_loading_from_fifo 
   | 
||
| 
         Dir.mktmpdir {|tmp| 
   | 
||
| 
           file = File.join(tmp,'fifo.rb') 
   | 
||
| 
           File.mkfifo(file) 
   | 
||
| 
           thread = Thread.new { open(file,'w') { |f| f.puts "class Foo; end" } } 
   | 
||
| 
           assert_separately([], <<-INPUT) 
   | 
||
| 
             assert_nothing_raised(LoadError) { load("#{ file }") } 
   | 
||
| 
             assert_nothing_raised(NameError) { Foo } 
   | 
||
| 
           INPUT 
   | 
||
| 
         } 
   | 
||
| 
       end unless /mswin|mingw/ =~ RUBY_PLATFORM 
   | 
||
| 
     end 
   | 
||