extattr 0.1 → 0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/extattr.bsd DELETED
@@ -1,186 +0,0 @@
1
- #include <sys/types.h>
2
- #include <sys/extattr.h>
3
-
4
-
5
- static void
6
- split_name(const char list[], size_t size, void (*func)(void *, VALUE), void *userdata)
7
- {
8
- // Each list entry consists of a single byte containing the length of
9
- // the attribute name, followed by the attribute name.
10
- // The attribute name is not terminated by ASCII 0 (nul).
11
- const char *ptr = list;
12
- const char *end = list + size;
13
-
14
- while (ptr < end) {
15
- size_t len = (uint8_t)*ptr ++;
16
- if (ptr + len > end) { return; }
17
- func(userdata, rb_str_new(ptr, len));
18
- ptr += len;
19
- }
20
- }
21
-
22
- static int
23
- get_extattr_list_size(int (*extattr_list)(), intptr_t d, int namespace)
24
- {
25
- int size = extattr_list(d, namespace, NULL, 0);
26
- if (size < 0) { rb_sys_fail("extattr_list call error"); }
27
- return size;
28
- }
29
-
30
- static VALUE
31
- extattr_list0(int (*extattr_list)(), intptr_t d, int namespace)
32
- {
33
- size_t size = get_extattr_list_size(extattr_list, d, namespace);
34
- VALUE buf = rb_str_buf_new(size);
35
- char *ptr = RSTRING_PTR(buf);
36
-
37
- ssize_t size1 = extattr_list(d, namespace, ptr, size);
38
- if (size1 < 0) { rb_sys_fail("extattr_list call error"); }
39
-
40
- VALUE list = Qnil;
41
- if (rb_block_given_p()) {
42
- split_name(ptr, size1, (void (*)(void *, VALUE))rb_yield_values, (void *)(1));
43
- } else {
44
- list = rb_ary_new();
45
- split_name(ptr, size1, (void (*)(void *, VALUE))rb_ary_push, (void *)list);
46
- }
47
- rb_free_tmp_buffer(&buf);
48
-
49
- return list;
50
- }
51
-
52
- static VALUE
53
- file_extattr_list0(VALUE file, int fd, int namespace)
54
- {
55
- return extattr_list0(extattr_list_fd, fd, namespace);
56
- }
57
-
58
- static VALUE
59
- file_s_extattr_list0(VALUE path, int namespace)
60
- {
61
- return extattr_list0(extattr_list_file, (intptr_t)StringValueCStr(path), namespace);
62
- }
63
-
64
- static VALUE
65
- file_s_extattr_list_link0(VALUE path, int namespace)
66
- {
67
- return extattr_list0(extattr_list_link, (intptr_t)StringValueCStr(path), namespace);
68
- }
69
-
70
-
71
- static VALUE
72
- extattr_size0(int (*extattr_get)(), intptr_t d, int namespace, VALUE name)
73
- {
74
- ssize_t size = extattr_get(d, namespace, RSTRING_PTR(name), NULL, 0);
75
- if (size < 0) { rb_sys_fail("extattr_get call error"); }
76
- return SIZET2NUM(size);
77
- }
78
-
79
- static VALUE
80
- file_extattr_size0(VALUE file, int fd, int namespace, VALUE name)
81
- {
82
- return extattr_size0(extattr_get_fd, fd, namespace, name);
83
- }
84
-
85
- static VALUE
86
- file_s_extattr_size0(VALUE path, int namespace, VALUE name)
87
- {
88
- return extattr_size0(extattr_get_file, (intptr_t)StringValueCStr(path), namespace, name);
89
- }
90
-
91
- static VALUE
92
- file_s_extattr_size_link0(VALUE path, int namespace, VALUE name)
93
- {
94
- return extattr_size0(extattr_get_link, (intptr_t)StringValueCStr(path), namespace, name);
95
- }
96
-
97
-
98
- static VALUE
99
- extattr_get0(int (*extattr_get)(), intptr_t d, VALUE path, int namespace, VALUE name)
100
- {
101
- ssize_t size = extattr_get(d, namespace, RSTRING_PTR(name), NULL, 0);
102
- if (size < 0) { rb_sys_fail(StringValueCStr(path)); }
103
- VALUE buf = rb_str_buf_new(size);
104
- size = extattr_get(d, namespace, RSTRING_PTR(name), RSTRING_PTR(buf), size);
105
- if (size < 0) { rb_sys_fail(StringValueCStr(path)); }
106
- rb_str_set_len(buf, size);
107
- return buf;
108
- }
109
-
110
- static VALUE
111
- file_extattr_get0(VALUE file, int fd, int namespace, VALUE name)
112
- {
113
- return extattr_get0(extattr_get_fd, fd, RFILE(file)->fptr->pathv, namespace, name);
114
- }
115
-
116
- static VALUE
117
- file_s_extattr_get0(VALUE path, int namespace, VALUE name)
118
- {
119
- return extattr_get0(extattr_get_file, (intptr_t)StringValueCStr(path), path, namespace, name);
120
- }
121
-
122
- static VALUE
123
- file_s_extattr_get_link0(VALUE path, int namespace, VALUE name)
124
- {
125
- return extattr_get0(extattr_get_link, (intptr_t)StringValueCStr(path), path, namespace, name);
126
- }
127
-
128
-
129
- static VALUE
130
- extattr_set0(int (*extattr_set)(), intptr_t d, int namespace, VALUE name, VALUE data)
131
- {
132
- int status = extattr_set(d, namespace, RSTRING_PTR(name), RSTRING_PTR(data), RSTRING_LEN(data));
133
- if (status < 0) { rb_sys_fail("extattr_set call error"); }
134
- return Qnil;
135
- }
136
-
137
- static VALUE
138
- file_extattr_set0(VALUE file, int fd, int namespace, VALUE name, VALUE data)
139
- {
140
- return extattr_set0(extattr_set_fd, fd, namespace, name, data);
141
- }
142
-
143
- static VALUE
144
- file_s_extattr_set0(VALUE path, int namespace, VALUE name, VALUE data)
145
- {
146
- return extattr_set0(extattr_set_file, (intptr_t)StringValueCStr(path), namespace, name, data);
147
- }
148
-
149
- static VALUE
150
- file_s_extattr_set_link0(VALUE path, int namespace, VALUE name, VALUE data)
151
- {
152
- return extattr_set0(extattr_set_link, (intptr_t)StringValueCStr(path), namespace, name, data);
153
- }
154
-
155
-
156
- static VALUE
157
- extattr_delete0(int (*extattr_delete)(), intptr_t d, int namespace, VALUE name)
158
- {
159
- int status = extattr_delete(d, namespace, RSTRING_PTR(name), NULL, 0);
160
- if (status < 0) { rb_sys_fail("extattr_delete call error"); }
161
- return Qnil;
162
- }
163
-
164
- static VALUE
165
- file_extattr_delete0(VALUE file, int fd, int namespace, VALUE name)
166
- {
167
- return extattr_delete0(extattr_delete_fd, fd, namespace, name);
168
- }
169
-
170
- static VALUE
171
- file_s_extattr_delete0(VALUE path, int namespace, VALUE name)
172
- {
173
- return extattr_delete0(extattr_delete_file, (intptr_t)StringValueCStr(path), namespace, name);
174
- }
175
-
176
- static VALUE
177
- file_s_extattr_delete_link0(VALUE path, int namespace, VALUE name)
178
- {
179
- return extattr_delete0(extattr_delete_link, (intptr_t)StringValueCStr(path), namespace, name);
180
- }
181
-
182
-
183
- static void
184
- setup(void)
185
- {
186
- }
data/ext/extattr.linux DELETED
@@ -1,209 +0,0 @@
1
- #include <sys/types.h>
2
- #include <attr/xattr.h>
3
-
4
- #define EXTATTR_NAMESPACE_USER 0
5
- #define EXTATTR_NAMESPACE_SYSTEM 1
6
-
7
- static VALUE NAMESPACE_USER_PREFIX, NAMESPACE_SYSTEM_PREFIX;
8
-
9
-
10
- static VALUE
11
- extattr_list0(ssize_t (*func)(), void *d, int namespace)
12
- {
13
- ssize_t size = 65536;
14
- VALUE buf = rb_str_buf_new(size);
15
- char *ptr = RSTRING_PTR(buf);
16
- size = func(d, ptr, size);
17
- if (size < 0) { rb_sys_fail("listxattr call error"); }
18
-
19
- VALUE (*reduce)(void *, VALUE);
20
- void *first;
21
- VALUE list;
22
- if (rb_block_given_p()) {
23
- reduce = (VALUE (*)(void *, VALUE))rb_yield_values;
24
- first = (void *)1;
25
- list = Qnil;
26
- } else {
27
- reduce = (VALUE (*)(void *, VALUE))rb_ary_push;
28
- first = (void *)(list = rb_ary_new());
29
- }
30
-
31
- const char *end = ptr + size;
32
- while (ptr < end) {
33
- int len = strlen(ptr);
34
- VALUE name;
35
- if (namespace == EXTATTR_NAMESPACE_USER && len > 5 && strncmp(ptr, "user.", 5) == 0) {
36
- ptr += 5;
37
- } else if (namespace == EXTATTR_NAMESPACE_SYSTEM && len > 7 && strncmp(ptr, "system.", 7) == 0) {
38
- ptr += 7;
39
- } else {
40
- ptr += len + 1;
41
- continue;
42
- }
43
-
44
- name = rb_str_new_cstr(ptr);
45
- reduce(first, name);
46
- ptr += RSTRING_LEN(name) + 1; // 最後の『+1』は、ヌルバイトの分。
47
- }
48
-
49
- return list;
50
- }
51
-
52
- static VALUE
53
- file_extattr_list0(VALUE file, int fd, int namespace)
54
- {
55
- return extattr_list0(flistxattr, (void *)fd, namespace);
56
- }
57
-
58
- static VALUE
59
- file_s_extattr_list0(VALUE path, int namespace)
60
- {
61
- return extattr_list0(listxattr, StringValueCStr(path), namespace);
62
- }
63
-
64
- static VALUE
65
- file_s_extattr_list_link0(VALUE path, int namespace)
66
- {
67
- return extattr_list0(llistxattr, StringValueCStr(path), namespace);
68
- }
69
-
70
-
71
- static VALUE
72
- xattr_name(int namespace, VALUE name)
73
- {
74
- switch (namespace) {
75
- case EXTATTR_NAMESPACE_USER:
76
- return rb_str_plus(NAMESPACE_USER_PREFIX, name);
77
- case EXTATTR_NAMESPACE_SYSTEM:
78
- return rb_str_plus(NAMESPACE_SYSTEM_PREFIX, name);
79
- default:
80
- rb_raise(rb_eRuntimeError, "namespace error");
81
- return Qnil;
82
- }
83
- }
84
-
85
- static VALUE
86
- extattr_size0(ssize_t (*func)(), void *d, int namespace, VALUE name)
87
- {
88
- name = xattr_name(namespace, name);
89
- ssize_t size = func(d, StringValueCStr(name), NULL, 0);
90
- if (size < 0) { rb_sys_fail("getxattr call error"); }
91
- return SSIZET2NUM(size);
92
- }
93
-
94
- static VALUE
95
- file_extattr_size0(VALUE file, int fd, int namespace, VALUE name)
96
- {
97
- return extattr_size0(fgetxattr, (void *)fd, namespace, name);
98
- }
99
-
100
- static VALUE
101
- file_s_extattr_size0(VALUE path, int namespace, VALUE name)
102
- {
103
- return extattr_size0(getxattr, StringValueCStr(path), namespace, name);
104
- }
105
-
106
- static VALUE
107
- file_s_extattr_size_link0(VALUE path, int namespace, VALUE name)
108
- {
109
- return extattr_size0(lgetxattr, StringValueCStr(path), namespace, name);
110
- }
111
-
112
-
113
- static VALUE
114
- extattr_get0(ssize_t (*func)(), void *d, int namespace, VALUE name)
115
- {
116
- name = xattr_name(namespace, name);
117
- ssize_t size = 65536;
118
- VALUE buf = rb_str_buf_new(size);
119
- char *ptr = RSTRING_PTR(buf);
120
- size = func(d, StringValueCStr(name), ptr, size);
121
- if (size < 0) { rb_sys_fail("getxattr call error"); }
122
- rb_str_set_len(buf, size);
123
- return buf;
124
- }
125
-
126
- static VALUE
127
- file_extattr_get0(VALUE file, int fd, int namespace, VALUE name)
128
- {
129
- return extattr_get0(fgetxattr, (void *)fd, namespace, name);
130
- }
131
-
132
- static VALUE
133
- file_s_extattr_get0(VALUE path, int namespace, VALUE name)
134
- {
135
- return extattr_get0(getxattr, StringValueCStr(path), namespace, name);
136
- }
137
-
138
- static VALUE
139
- file_s_extattr_get_link0(VALUE path, int namespace, VALUE name)
140
- {
141
- return extattr_get0(lgetxattr, StringValueCStr(path), namespace, name);
142
- }
143
-
144
-
145
- static VALUE
146
- extattr_set0(int (*func)(), void *d, int namespace, VALUE name, VALUE data)
147
- {
148
- name = xattr_name(namespace, name);
149
- int status = func(d, StringValueCStr(name), RSTRING_PTR(data), RSTRING_LEN(data));
150
- if (status < 0) { rb_sys_fail("getxattr call error"); }
151
- return Qnil;
152
- }
153
-
154
- static VALUE
155
- file_extattr_set0(VALUE file, int fd, int namespace, VALUE name, VALUE data)
156
- {
157
- return extattr_set0(fsetxattr, (void *)fd, namespace, name, data);
158
- }
159
-
160
- static VALUE
161
- file_s_extattr_set0(VALUE path, int namespace, VALUE name, VALUE data)
162
- {
163
- return extattr_set0(setxattr, StringValueCStr(path), namespace, name, data);
164
- }
165
-
166
- static VALUE
167
- file_s_extattr_set_link0(VALUE path, int namespace, VALUE name, VALUE data)
168
- {
169
- return extattr_set0(lsetxattr, StringValueCStr(path), namespace, name, data);
170
- }
171
-
172
-
173
- static VALUE
174
- extattr_delete0(int (*func)(), void *d, int namespace, VALUE name)
175
- {
176
- name = xattr_name(namespace, name);
177
- int status = func(d, StringValueCStr(name));
178
- if (status < 0) { rb_sys_fail("removexattr call error"); }
179
- return Qnil;
180
- }
181
-
182
- static VALUE
183
- file_extattr_delete0(VALUE file, int fd, int namespace, VALUE name)
184
- {
185
- return extattr_delete0(fremovexattr, (void *)fd, namespace, name);
186
- }
187
-
188
- static VALUE
189
- file_s_extattr_delete0(VALUE path, int namespace, VALUE name)
190
- {
191
- return extattr_delete0(removexattr, StringValueCStr(path), namespace, name);
192
- }
193
-
194
- static VALUE
195
- file_s_extattr_delete_link0(VALUE path, int namespace, VALUE name)
196
- {
197
- return extattr_delete0(lremovexattr, StringValueCStr(path), namespace, name);
198
- }
199
-
200
-
201
- static void
202
- setup(void)
203
- {
204
- NAMESPACE_USER_PREFIX = rb_str_new_cstr("user.");
205
- NAMESPACE_SYSTEM_PREFIX = rb_str_new_cstr("system.");
206
-
207
- rb_gc_register_mark_object(NAMESPACE_USER_PREFIX);
208
- rb_gc_register_mark_object(NAMESPACE_SYSTEM_PREFIX);
209
- }