#include "ruby.h" #include "ruby/encoding.h" #include "internal.h" #if defined HAVE_DIRENT_H && !defined _WIN32 # include #elif defined HAVE_DIRECT_H && !defined _WIN32 # include #else # define dirent direct # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # endif # ifdef _WIN32 # include "win32/dir.h" # endif #endif #if defined(__native_client__) && defined(NACL_NEWLIB) # include "nacl/dirent.h" # include "nacl/stat.h" #endif struct dir_data { DIR *dir; VALUE path; rb_encoding *enc; }; #ifdef HAVE_DIRFD static void * rb_check_typeddata0(VALUE obj /*, const rb_data_type_t *data_type */) { const char *etype; /* static const char mesg[] = "wrong argument type %s (expected %s)"; */ if (!RB_TYPE_P(obj, T_DATA)) { etype = rb_builtin_class_name(obj); /* rb_raise(rb_eTypeError, mesg, etype, data_type->wrap_struct_name); */ rb_raise(rb_eTypeError, "wrong argument type %s", etype); } /* if (!RTYPEDDATA_P(obj)) { etype = rb_obj_classname(obj); rb_raise(rb_eTypeError, mesg, etype, data_type->wrap_struct_name); } else if (!rb_typeddata_inherited_p(RTYPEDDATA_TYPE(obj), data_type)) { etype = RTYPEDDATA_TYPE(obj)->wrap_struct_name; rb_raise(rb_eTypeError, mesg, etype, data_type->wrap_struct_name); } */ return DATA_PTR(obj); } static void dir_closed(void) { rb_raise(rb_eIOError, "closed directory"); } static struct dir_data * dir_check(VALUE dir) { struct dir_data *dirp; rb_check_frozen(dir); dirp = rb_check_typeddata0(dir /*, &dir_data_type*/); if (!dirp->dir) dir_closed(); return dirp; } #endif #define GetDIR(obj, dirp) ((dirp) = dir_check(obj)) #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 void Init_fileno(VALUE klass) { rb_define_method(rb_cDir,"fileno", dir_fileno, 0); }