% svn diff --diff-cmd diff -x '-u -p' Index: configure.in =================================================================== --- configure.in (revision 46224) +++ configure.in (working copy) @@ -1950,6 +1950,7 @@ AC_CHECK_FUNCS(chsize) AC_CHECK_FUNCS(clock_gettime) AC_CHECK_FUNCS(cosh) AC_CHECK_FUNCS(daemon) +AC_CHECK_FUNCS(dirfd) AC_CHECK_FUNCS(dl_iterate_phdr) AC_CHECK_FUNCS(dlopen) AC_CHECK_FUNCS(dladdr) Index: dir.c =================================================================== --- dir.c (revision 46224) +++ dir.c (working copy) @@ -539,6 +539,32 @@ dir_inspect(VALUE dir) return rb_funcall(dir, rb_intern("to_s"), 0, 0); } +#ifdef HAVE_DIRFD +/* + * call-seq: + * dir.fileno -> integer + * + * Returns the file descriptor used in dir. + * + * d = Dir.new("..") + * d.fileno #=> 8 + */ +static VALUE +dir_fileno(VALUE dir) +{ + struct dir_data *dirp; + int fd; + + GetDIR(dir, dirp); + fd = dirfd(dirp->dir); + if (fd == -1) + rb_sys_fail("dirfd"); + return INT2NUM(fd); +} +#else +#define dir_fileno rb_f_notimplement +#endif + /* * call-seq: * dir.path -> string or nil @@ -2254,6 +2280,7 @@ Init_Dir(void) rb_define_singleton_method(rb_cDir, "entries", dir_entries, -1); rb_define_method(rb_cDir,"initialize", dir_initialize, -1); + rb_define_method(rb_cDir,"fileno", dir_fileno, 0); rb_define_method(rb_cDir,"path", dir_path, 0); rb_define_method(rb_cDir,"to_path", dir_path, 0); rb_define_method(rb_cDir,"inspect", dir_inspect, 0);