summaryrefslogtreecommitdiff
path: root/ext/-test-/dir/fileno.c
blob: 7a451bc1a7406f049590dd4669ff1527d5201aec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "ruby.h"
#include "ruby/encoding.h"
#include "internal.h"

#if defined HAVE_DIRENT_H && !defined _WIN32
# include <dirent.h>
#elif defined HAVE_DIRECT_H && !defined _WIN32
# include <direct.h>
#else
# define dirent direct
# if HAVE_SYS_NDIR_H
#  include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
#  include <sys/dir.h>
# endif
# if HAVE_NDIR_H
#  include <ndir.h>
# 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;
};

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;
}

#define GetDIR(obj, dirp) ((dirp) = dir_check(obj))

#ifdef HAVE_DIRFD
/*
 *  call-seq:
 *     dir.fileno -> integer
 *
 *  Returns the file descriptor used in <em>dir</em>.
 *
 *     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);
}