net-smb 0.0.2 → 0.0.3
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/README.md +29 -0
- data/Rakefile +12 -8
- data/ext/{net/smb → net_smb}/dlinklist.h +0 -0
- data/ext/{net/smb → net_smb}/extconf.rb +2 -2
- data/ext/{net/smb → net_smb}/rb_smb.h +13 -11
- data/ext/{net/smb → net_smb}/smb.c +11 -8
- data/ext/{net/smb → net_smb}/smbdir.c +25 -2
- data/ext/net_smb/smbdirentry.c +145 -0
- data/ext/{net/smb → net_smb}/smbfile.c +7 -1
- data/lib/net/smb/version.rb +2 -2
- data/lib/net/smb.rb +3 -0
- data/net-smb.gemspec +2 -0
- data/test/test_net_smb.rb +126 -61
- metadata +29 -10
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Ruby Net::SMB - SMB/CIFS client class for Ruby
|
2
|
+
======================================================================
|
3
|
+
|
4
|
+
Synopsis
|
5
|
+
----------------------------------------------------------------------
|
6
|
+
|
7
|
+
This is a Samba libsmbclient binding, i.e., SMB/CIFS client class
|
8
|
+
for Ruby.
|
9
|
+
|
10
|
+
Requirement
|
11
|
+
----------------------------------------------------------------------
|
12
|
+
|
13
|
+
* Ruby 1.9.3+
|
14
|
+
* Samba 3.5+ (libsmbclient)
|
15
|
+
* C compiler
|
16
|
+
|
17
|
+
Development Resources
|
18
|
+
----------------------------------------------------------------------
|
19
|
+
|
20
|
+
* Source: https://github.com/fumiyas/ruby-net-smb
|
21
|
+
* Issues: https://github.com/fumiyas/ruby-net-smb/issues
|
22
|
+
|
23
|
+
Copyright
|
24
|
+
----------------------------------------------------------------------
|
25
|
+
|
26
|
+
Copyright (C) 2012 SATOH Fumiyas @ OSS Technology Corp., Japan
|
27
|
+
|
28
|
+
Licensed under the GNU General Public License version 3
|
29
|
+
|
data/Rakefile
CHANGED
@@ -9,18 +9,15 @@ rescue LoadError => e
|
|
9
9
|
end
|
10
10
|
|
11
11
|
require 'rake/clean'
|
12
|
+
require 'rake/extensiontask'
|
12
13
|
require 'rake/testtask'
|
13
14
|
|
14
|
-
|
15
|
+
GEMSPEC = eval(File.read(File.dirname(__FILE__) + '/net-smb.gemspec'))
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
CLEAN.include('lib/**/*.so')
|
19
|
-
CLOBBER.include('pkg/*')
|
20
|
-
CLOBBER.include('test/log')
|
21
|
-
CLOBBER.include('test/log.[0-9]')
|
17
|
+
Rake::ExtensionTask.new("net_smb", GEMSPEC)
|
18
|
+
Rake::TestTask.new
|
22
19
|
|
23
|
-
EXT_PATH = '
|
20
|
+
EXT_PATH = 'net_smb'
|
24
21
|
|
25
22
|
file "lib/#{EXT_PATH}.so" => Dir.glob("ext/#{EXT_PATH}/*.{rb,c,h}") do
|
26
23
|
Dir.chdir("ext/#{EXT_PATH}") do
|
@@ -32,3 +29,10 @@ end
|
|
32
29
|
|
33
30
|
task :test => "lib/#{EXT_PATH}.so"
|
34
31
|
|
32
|
+
CLEAN.include('ext/**/*.{log,o,so}')
|
33
|
+
CLEAN.include('ext/**/Makefile')
|
34
|
+
CLEAN.include('lib/**/*.so')
|
35
|
+
CLOBBER.include('pkg/*')
|
36
|
+
CLOBBER.include('test/log')
|
37
|
+
CLOBBER.include('test/log.[0-9]')
|
38
|
+
|
File without changes
|
@@ -14,7 +14,7 @@ $CFLAGS += " " + ENV["CFLAGS"] if ENV["CFLAGS"]
|
|
14
14
|
$CPPFLAGS += " " + ENV["CPPFLAGS"] if ENV["CPPFLAGS"]
|
15
15
|
$LDFLAGS += " " + ENV["LDFLAGS"] if ENV["LDFLAGS"]
|
16
16
|
|
17
|
-
dir_config "
|
17
|
+
dir_config "net_smb"
|
18
18
|
|
19
19
|
h = have_header("libsmbclient.h")
|
20
20
|
l = have_library("smbclient", "smbc_new_context")
|
@@ -32,5 +32,5 @@ if try_link(<<-'EOS')
|
|
32
32
|
$defs << "-DHAVE_SMBC_ALLOWDEBUGCHANGE"
|
33
33
|
end
|
34
34
|
|
35
|
-
create_makefile "
|
35
|
+
create_makefile "net_smb"
|
36
36
|
|
@@ -50,8 +50,15 @@
|
|
50
50
|
|
51
51
|
#define RB_SMBFILE_BUFFER_SIZE 8192
|
52
52
|
|
53
|
-
typedef struct rb_smb_data
|
54
|
-
typedef struct rb_smbfile_data
|
53
|
+
typedef struct rb_smb_data RB_SMB_DATA;
|
54
|
+
typedef struct rb_smbfile_data RB_SMBFILE_DATA;
|
55
|
+
|
56
|
+
struct rb_smb_data {
|
57
|
+
rb_encoding *enc;
|
58
|
+
SMBCCTX *smbcctx;
|
59
|
+
VALUE auth_callback;
|
60
|
+
RB_SMBFILE_DATA *smbfile_data_list;
|
61
|
+
};
|
55
62
|
|
56
63
|
struct rb_smbfile_data {
|
57
64
|
rb_encoding *enc;
|
@@ -71,13 +78,6 @@ struct rb_smbfile_data {
|
|
71
78
|
RB_SMBFILE_DATA *next, *prev;
|
72
79
|
};
|
73
80
|
|
74
|
-
struct rb_smb_data {
|
75
|
-
rb_encoding *enc;
|
76
|
-
SMBCCTX *smbcctx;
|
77
|
-
VALUE auth_callback;
|
78
|
-
RB_SMBFILE_DATA *smbfile_data_list;
|
79
|
-
};
|
80
|
-
|
81
81
|
#define RB_SMB_DATA_FROM_OBJ(obj, data) \
|
82
82
|
RB_SMB_DATA *data; \
|
83
83
|
Data_Get_Struct(obj, RB_SMB_DATA, data);
|
@@ -89,10 +89,12 @@ struct rb_smb_data {
|
|
89
89
|
extern VALUE rb_cSMB;
|
90
90
|
extern VALUE rb_eSMBError;
|
91
91
|
extern VALUE rb_cSMBDir;
|
92
|
+
extern VALUE rb_cSMBDirEntry;
|
92
93
|
extern VALUE rb_cSMBFile;
|
93
94
|
|
94
|
-
void
|
95
|
-
void
|
95
|
+
void Init_net_smbdir(void);
|
96
|
+
void Init_net_smbdirentry(void);
|
97
|
+
void Init_net_smbfile(void);
|
96
98
|
|
97
99
|
#define _RB_SMB_H_
|
98
100
|
|
@@ -50,12 +50,14 @@ static void smbcctx_auth_fn(SMBCCTX *smbcctx,
|
|
50
50
|
if (TYPE(cred_obj) != T_ARRAY) {
|
51
51
|
rb_raise(rb_eTypeError,
|
52
52
|
RB_SMB_NAME
|
53
|
-
"#
|
53
|
+
"#auth_callback must return an array of username, "
|
54
|
+
"passsword, and optional workgroup name");
|
54
55
|
}
|
55
56
|
if (RARRAY_LEN(cred_obj) < 2 || RARRAY_LEN(cred_obj) > 3) {
|
56
57
|
rb_raise(rb_eArgError,
|
57
58
|
RB_SMB_NAME
|
58
|
-
"#
|
59
|
+
"#auth_callback must return an array of username, "
|
60
|
+
"passsword, and optional workgroup name");
|
59
61
|
}
|
60
62
|
|
61
63
|
username_obj = RARRAY_PTR(cred_obj)[0];
|
@@ -197,7 +199,7 @@ static VALUE rb_smb_use_kerberos_set(VALUE self, VALUE flag)
|
|
197
199
|
return flag;
|
198
200
|
}
|
199
201
|
|
200
|
-
static VALUE
|
202
|
+
static VALUE rb_smb_auth_callback(int argc, VALUE* argv, VALUE self)
|
201
203
|
{
|
202
204
|
RB_SMB_DATA_FROM_OBJ(self, data);
|
203
205
|
|
@@ -257,7 +259,7 @@ static VALUE rb_smb_open(int argc, VALUE *argv, VALUE self)
|
|
257
259
|
|
258
260
|
/* ====================================================================== */
|
259
261
|
|
260
|
-
void
|
262
|
+
void Init_net_smb(void)
|
261
263
|
{
|
262
264
|
VALUE rb_mNet = rb_define_module("Net");
|
263
265
|
|
@@ -269,8 +271,8 @@ void Init_smb(void)
|
|
269
271
|
rb_define_method(rb_cSMB, "debug=", rb_smb_debug_set, 1);
|
270
272
|
rb_define_method(rb_cSMB, "use_kerberos", rb_smb_use_kerberos_get, 0);
|
271
273
|
rb_define_method(rb_cSMB, "use_kerberos=", rb_smb_use_kerberos_set, 1);
|
272
|
-
rb_define_method(rb_cSMB, "
|
273
|
-
rb_define_alias(rb_cSMB, "
|
274
|
+
rb_define_method(rb_cSMB, "auth_callback", rb_smb_auth_callback, -1);
|
275
|
+
rb_define_alias(rb_cSMB, "auth", "auth_callback");
|
274
276
|
rb_define_method(rb_cSMB, "opendir", rb_smb_opendir, 1);
|
275
277
|
rb_define_method(rb_cSMB, "open", rb_smb_open, -1);
|
276
278
|
|
@@ -304,7 +306,8 @@ void Init_smb(void)
|
|
304
306
|
smbc_init_context(smbcctx);
|
305
307
|
}
|
306
308
|
|
307
|
-
|
308
|
-
|
309
|
+
Init_net_smbdir();
|
310
|
+
Init_net_smbdirentry();
|
311
|
+
Init_net_smbfile();
|
309
312
|
}
|
310
313
|
|
@@ -200,13 +200,25 @@ static VALUE rb_smbdir_read(VALUE self)
|
|
200
200
|
return Qnil;
|
201
201
|
}
|
202
202
|
|
203
|
-
|
203
|
+
VALUE args[4];
|
204
|
+
args[0] = rb_external_str_new_with_enc(smbcdent->name,
|
205
|
+
strlen(smbcdent->name), data->enc);
|
206
|
+
args[1] = INT2NUM(smbcdent->smbc_type);
|
207
|
+
args[2] = rb_str_new2(data->url);
|
208
|
+
rb_str_cat2(args[2], "/"); /* FIXME: Unless if the last char is not "/" */
|
209
|
+
rb_str_cat2(args[2], smbcdent->name); /* FIXME: Must be URL encoding */
|
210
|
+
args[3] = rb_str_new(smbcdent->comment, smbcdent->commentlen);
|
211
|
+
VALUE entry_obj = rb_class_new_instance(4, args, rb_cSMBDirEntry);
|
212
|
+
|
213
|
+
return entry_obj;
|
204
214
|
}
|
205
215
|
|
206
216
|
static VALUE rb_smbdir_each(VALUE self)
|
207
217
|
{
|
208
218
|
VALUE name;
|
209
219
|
|
220
|
+
rb_smbdir_rewind(self);
|
221
|
+
|
210
222
|
RETURN_ENUMERATOR(self, 0, 0);
|
211
223
|
|
212
224
|
while (!NIL_P(name = rb_smbdir_read(self))) {
|
@@ -218,10 +230,11 @@ static VALUE rb_smbdir_each(VALUE self)
|
|
218
230
|
|
219
231
|
/* ====================================================================== */
|
220
232
|
|
221
|
-
void
|
233
|
+
void Init_net_smbdir(void)
|
222
234
|
{
|
223
235
|
rb_cSMBDir = rb_define_class_under(rb_cSMB, "Dir", rb_cObject);
|
224
236
|
rb_define_alloc_func(rb_cSMBDir, rb_smbdir_data_alloc);
|
237
|
+
rb_include_module(rb_cSMBDir, rb_mEnumerable);
|
225
238
|
rb_define_method(rb_cSMBDir, "initialize", rb_smbdir_initialize, 2);
|
226
239
|
rb_define_method(rb_cSMBDir, "smb", rb_smbdir_smb, 0);
|
227
240
|
rb_define_method(rb_cSMBDir, "url", rb_smbdir_url, 0);
|
@@ -232,5 +245,15 @@ void Init_smbdir(void)
|
|
232
245
|
rb_define_method(rb_cSMBDir, "rewind", rb_smbdir_rewind, 0);
|
233
246
|
rb_define_method(rb_cSMBDir, "read", rb_smbdir_read, 0);
|
234
247
|
rb_define_method(rb_cSMBDir, "each", rb_smbdir_each, 0);
|
248
|
+
|
249
|
+
rb_define_const(rb_cSMB, "SMBC_WORKGROUP", INT2FIX(SMBC_WORKGROUP));
|
250
|
+
rb_define_const(rb_cSMB, "SMBC_SERVER", INT2FIX(SMBC_SERVER));
|
251
|
+
rb_define_const(rb_cSMB, "SMBC_FILE_SHARE", INT2FIX(SMBC_FILE_SHARE));
|
252
|
+
rb_define_const(rb_cSMB, "SMBC_PRINTER_SHARE", INT2FIX(SMBC_PRINTER_SHARE));
|
253
|
+
rb_define_const(rb_cSMB, "SMBC_COMMS_SHARE", INT2FIX(SMBC_COMMS_SHARE));
|
254
|
+
rb_define_const(rb_cSMB, "SMBC_IPC_SHARE", INT2FIX(SMBC_IPC_SHARE));
|
255
|
+
rb_define_const(rb_cSMB, "SMBC_DIR", INT2FIX(SMBC_DIR));
|
256
|
+
rb_define_const(rb_cSMB, "SMBC_FILE", INT2FIX(SMBC_FILE));
|
257
|
+
rb_define_const(rb_cSMB, "SMBC_LINK", INT2FIX(SMBC_LINK));
|
235
258
|
}
|
236
259
|
|
@@ -0,0 +1,145 @@
|
|
1
|
+
/*
|
2
|
+
* Ruby/Net::SMB - SMB/CIFS client (Samba libsmbclient binding) for Ruby
|
3
|
+
* Net::SMB::DirEntry class
|
4
|
+
* Copyright (C) 2012 SATOH Fumiyas @ OSS Technology Corp., Japan
|
5
|
+
*
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
7
|
+
* it under the terms of the GNU General Public License as published by
|
8
|
+
* the Free Software Foundation; either version 3 of the License, or
|
9
|
+
* (at your option) any later version.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
* GNU General Public License for more details.
|
15
|
+
*
|
16
|
+
* You should have received a copy of the GNU General Public License
|
17
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "rb_smb.h"
|
21
|
+
|
22
|
+
VALUE rb_cSMBDirEntry;
|
23
|
+
|
24
|
+
VALUE sym_name;
|
25
|
+
VALUE sym_type;
|
26
|
+
VALUE sym_url;
|
27
|
+
VALUE sym_comment;
|
28
|
+
|
29
|
+
/* ====================================================================== */
|
30
|
+
|
31
|
+
static VALUE rb_smbdirentry_initialize(VALUE self,
|
32
|
+
VALUE name_obj, VALUE type_obj, VALUE url_obj, VALUE comment_obj)
|
33
|
+
{
|
34
|
+
rb_call_super(0, 0);
|
35
|
+
|
36
|
+
rb_hash_aset(self, sym_name, name_obj);
|
37
|
+
rb_hash_aset(self, sym_type, type_obj);
|
38
|
+
rb_hash_aset(self, sym_url, comment_obj);
|
39
|
+
rb_hash_aset(self, sym_comment, comment_obj);
|
40
|
+
|
41
|
+
return self;
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE rb_smbdirentry_name(VALUE self)
|
45
|
+
{
|
46
|
+
return rb_hash_lookup(self, sym_name);
|
47
|
+
}
|
48
|
+
|
49
|
+
static VALUE rb_smbdirentry_type(VALUE self)
|
50
|
+
{
|
51
|
+
return rb_hash_lookup(self, sym_type);
|
52
|
+
}
|
53
|
+
|
54
|
+
static VALUE rb_smbdirentry_url(VALUE self)
|
55
|
+
{
|
56
|
+
return rb_hash_lookup(self, sym_url);
|
57
|
+
}
|
58
|
+
|
59
|
+
static VALUE rb_smbdirentry_comment(VALUE self)
|
60
|
+
{
|
61
|
+
return rb_hash_lookup(self, sym_comment);
|
62
|
+
}
|
63
|
+
|
64
|
+
static VALUE rb_smbdirentry_workgroup_p(VALUE self)
|
65
|
+
{
|
66
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_WORKGROUP) ?
|
67
|
+
Qtrue : Qfalse;
|
68
|
+
}
|
69
|
+
|
70
|
+
static VALUE rb_smbdirentry_server_p(VALUE self)
|
71
|
+
{
|
72
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_SERVER) ?
|
73
|
+
Qtrue : Qfalse;
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE rb_smbdirentry_file_share_p(VALUE self)
|
77
|
+
{
|
78
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_FILE_SHARE) ?
|
79
|
+
Qtrue : Qfalse;
|
80
|
+
}
|
81
|
+
|
82
|
+
static VALUE rb_smbdirentry_printer_share_p(VALUE self)
|
83
|
+
{
|
84
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_PRINTER_SHARE) ?
|
85
|
+
Qtrue : Qfalse;
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE rb_smbdirentry_comms_share_p(VALUE self)
|
89
|
+
{
|
90
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_COMMS_SHARE) ?
|
91
|
+
Qtrue : Qfalse;
|
92
|
+
}
|
93
|
+
|
94
|
+
static VALUE rb_smbdirentry_ipc_share_p(VALUE self)
|
95
|
+
{
|
96
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_IPC_SHARE) ?
|
97
|
+
Qtrue : Qfalse;
|
98
|
+
}
|
99
|
+
|
100
|
+
static VALUE rb_smbdirentry_dir_p(VALUE self)
|
101
|
+
{
|
102
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_DIR) ?
|
103
|
+
Qtrue : Qfalse;
|
104
|
+
}
|
105
|
+
|
106
|
+
static VALUE rb_smbdirentry_file_p(VALUE self)
|
107
|
+
{
|
108
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_FILE) ?
|
109
|
+
Qtrue : Qfalse;
|
110
|
+
}
|
111
|
+
|
112
|
+
static VALUE rb_smbdirentry_link_p(VALUE self)
|
113
|
+
{
|
114
|
+
return rb_hash_lookup(self, sym_type) == INT2FIX(SMBC_LINK) ?
|
115
|
+
Qtrue : Qfalse;
|
116
|
+
}
|
117
|
+
|
118
|
+
/* ====================================================================== */
|
119
|
+
|
120
|
+
void Init_net_smbdirentry(void)
|
121
|
+
{
|
122
|
+
rb_cSMBDirEntry = rb_define_class_under(rb_cSMB, "DirEntry", rb_cHash);
|
123
|
+
rb_define_method(rb_cSMBDirEntry, "initialize", rb_smbdirentry_initialize, 4);
|
124
|
+
rb_define_method(rb_cSMBDirEntry, "name", rb_smbdirentry_name, 0);
|
125
|
+
rb_define_alias(rb_cSMBDirEntry, "to_s", "name");
|
126
|
+
rb_define_method(rb_cSMBDirEntry, "type", rb_smbdirentry_type, 0);
|
127
|
+
rb_define_method(rb_cSMBDirEntry, "url", rb_smbdirentry_url, 0);
|
128
|
+
rb_define_method(rb_cSMBDirEntry, "comment", rb_smbdirentry_comment, 0);
|
129
|
+
rb_define_method(rb_cSMBDirEntry, "workgroup?", rb_smbdirentry_workgroup_p, 0);
|
130
|
+
rb_define_method(rb_cSMBDirEntry, "server?", rb_smbdirentry_server_p, 0);
|
131
|
+
rb_define_method(rb_cSMBDirEntry, "file_share?", rb_smbdirentry_file_share_p, 0);
|
132
|
+
rb_define_method(rb_cSMBDirEntry, "printer_share?", rb_smbdirentry_printer_share_p, 0);
|
133
|
+
rb_define_method(rb_cSMBDirEntry, "comms_share?", rb_smbdirentry_comms_share_p, 0);
|
134
|
+
rb_define_method(rb_cSMBDirEntry, "ipc_share?", rb_smbdirentry_ipc_share_p, 0);
|
135
|
+
rb_define_method(rb_cSMBDirEntry, "directory?", rb_smbdirentry_dir_p, 0);
|
136
|
+
rb_define_alias(rb_cSMBDirEntry, "dir?", "directory?");
|
137
|
+
rb_define_method(rb_cSMBDirEntry, "file?", rb_smbdirentry_file_p, 0);
|
138
|
+
rb_define_method(rb_cSMBDirEntry, "link?", rb_smbdirentry_link_p, 0);
|
139
|
+
|
140
|
+
sym_name = ID2SYM(rb_intern("name"));
|
141
|
+
sym_type = ID2SYM(rb_intern("type"));
|
142
|
+
sym_url = ID2SYM(rb_intern("url"));
|
143
|
+
sym_comment = ID2SYM(rb_intern("comment"));
|
144
|
+
}
|
145
|
+
|
@@ -202,6 +202,11 @@ static VALUE rb_smbfile_url(VALUE self)
|
|
202
202
|
return rb_str_new2(data->url);
|
203
203
|
}
|
204
204
|
|
205
|
+
static VALUE rb_smbfile_read_buffer_size(VALUE self)
|
206
|
+
{
|
207
|
+
return INT2NUM(RB_SMBFILE_BUFFER_SIZE);
|
208
|
+
}
|
209
|
+
|
205
210
|
static VALUE rb_smbfile_close(VALUE self)
|
206
211
|
{
|
207
212
|
RB_SMBFILE_DATA_FROM_OBJ(self, data);
|
@@ -336,13 +341,14 @@ static VALUE rb_smbfile_read(int argc, VALUE *argv, VALUE self)
|
|
336
341
|
|
337
342
|
/* ====================================================================== */
|
338
343
|
|
339
|
-
void
|
344
|
+
void Init_net_smbfile(void)
|
340
345
|
{
|
341
346
|
rb_cSMBFile = rb_define_class_under(rb_cSMB, "File", rb_cObject);
|
342
347
|
rb_define_alloc_func(rb_cSMBFile, rb_smbfile_data_alloc);
|
343
348
|
rb_define_method(rb_cSMBFile, "initialize", rb_smbfile_initialize, -1);
|
344
349
|
rb_define_method(rb_cSMBFile, "smb", rb_smbfile_smb, 0);
|
345
350
|
rb_define_method(rb_cSMBFile, "url", rb_smbfile_url, 0);
|
351
|
+
rb_define_method(rb_cSMBFile, "read_buffer_size", rb_smbfile_read_buffer_size, 0);
|
346
352
|
rb_define_method(rb_cSMBFile, "close", rb_smbfile_close, 0);
|
347
353
|
rb_define_method(rb_cSMBFile, "tell", rb_smbfile_tell, 0);
|
348
354
|
rb_define_alias(rb_cSMBFile, "pos", "tell");
|
data/lib/net/smb/version.rb
CHANGED
data/lib/net/smb.rb
ADDED
data/net-smb.gemspec
CHANGED
data/test/test_net_smb.rb
CHANGED
@@ -32,7 +32,7 @@ class SMBTest < Test::Unit::TestCase
|
|
32
32
|
@dirs_readable = [@dir_readable]
|
33
33
|
@dir_noaccess = "dir.noaccess"
|
34
34
|
@dirs_noaccess = [@dir_noaccess]
|
35
|
-
@dirs = @dirs_readable + @dirs_writeable + @dirs_noaccess
|
35
|
+
@dirs = [".", ".."] + @dirs_readable + @dirs_writeable + @dirs_noaccess
|
36
36
|
@file_noexist = "file.noexist"
|
37
37
|
@file_writeable = "file.writeable"
|
38
38
|
@file_writeable_m = "ファイル.writeable"
|
@@ -128,9 +128,18 @@ class SMBTest < Test::Unit::TestCase
|
|
128
128
|
return smbstatus_r
|
129
129
|
end
|
130
130
|
|
131
|
+
def smb
|
132
|
+
smb = Net::SMB.new
|
133
|
+
smb.auth_callback {|server, share|
|
134
|
+
[@username, @password]
|
135
|
+
}
|
136
|
+
|
137
|
+
return smb
|
138
|
+
end
|
139
|
+
|
131
140
|
def test_auth
|
132
141
|
smb = Net::SMB.new
|
133
|
-
smb.
|
142
|
+
smb.auth_callback {|server, share|
|
134
143
|
[@username, @password]
|
135
144
|
}
|
136
145
|
assert_nothing_raised do
|
@@ -139,7 +148,7 @@ class SMBTest < Test::Unit::TestCase
|
|
139
148
|
end
|
140
149
|
|
141
150
|
smb = Net::SMB.new
|
142
|
-
smb.
|
151
|
+
smb.auth_callback {|server, share|
|
143
152
|
[@username, 'invalid-password']
|
144
153
|
}
|
145
154
|
assert_raise(Errno::EPERM) do
|
@@ -147,7 +156,7 @@ class SMBTest < Test::Unit::TestCase
|
|
147
156
|
end
|
148
157
|
|
149
158
|
smb = Net::SMB.new
|
150
|
-
smb.
|
159
|
+
smb.auth_callback {|server, share|
|
151
160
|
['invalid-user', @password]
|
152
161
|
}
|
153
162
|
assert_raise(Errno::EACCES) do
|
@@ -155,7 +164,7 @@ class SMBTest < Test::Unit::TestCase
|
|
155
164
|
end
|
156
165
|
|
157
166
|
smb = Net::SMB.new
|
158
|
-
smb.
|
167
|
+
smb.auth_callback {|server, share|
|
159
168
|
'blah-blah'
|
160
169
|
}
|
161
170
|
assert_raise(TypeError) do
|
@@ -163,7 +172,7 @@ class SMBTest < Test::Unit::TestCase
|
|
163
172
|
end
|
164
173
|
|
165
174
|
smb = Net::SMB.new
|
166
|
-
smb.
|
175
|
+
smb.auth_callback {|server, share|
|
167
176
|
[@username]
|
168
177
|
}
|
169
178
|
assert_raise(ArgumentError) do
|
@@ -172,10 +181,7 @@ class SMBTest < Test::Unit::TestCase
|
|
172
181
|
end
|
173
182
|
|
174
183
|
def test_dir_open_close
|
175
|
-
smb =
|
176
|
-
smb.on_auth {|server, share|
|
177
|
-
[@username, @password]
|
178
|
-
}
|
184
|
+
smb = self.smb
|
179
185
|
|
180
186
|
smbdir = smb.opendir(@share_public)
|
181
187
|
assert_equal(smb.object_id, smbdir.smb.object_id)
|
@@ -199,66 +205,123 @@ class SMBTest < Test::Unit::TestCase
|
|
199
205
|
end ## test_dir_open_close
|
200
206
|
|
201
207
|
def test_dir_read
|
202
|
-
|
208
|
+
smb = self.smb
|
209
|
+
dent_names_all = [*@dirs, *@files]
|
203
210
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
211
|
+
smbdir = smb.opendir(@share_private)
|
212
|
+
dent_names = dent_names_all.clone
|
213
|
+
while dent = smbdir.read
|
214
|
+
assert_equal(dent.name, dent_names.delete(dent.name),
|
215
|
+
"Unexpected directory entry: #{dent.name}")
|
216
|
+
if @dirs.include?(dent.name)
|
217
|
+
assert(dent.dir?)
|
218
|
+
elsif @files.include?(dent.name)
|
219
|
+
assert(dent.file?)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
assert_empty(dent_names)
|
223
|
+
smbdir.close
|
224
|
+
|
225
|
+
smb.opendir(@share_public) do |smbdir|
|
226
|
+
dent_names = dent_names_all.clone
|
227
|
+
while dent = smbdir.read
|
228
|
+
assert_equal(dent.name, dent_names.delete(dent.name),
|
229
|
+
"Unexpected directory entry: #{dent.name}")
|
230
|
+
end
|
231
|
+
assert_empty(dent_names)
|
232
|
+
end
|
233
|
+
end ## test_dir_read
|
234
|
+
|
235
|
+
def test_dir_seek
|
236
|
+
smb = self.smb
|
237
|
+
dent_names_all = [*@dirs, *@files]
|
208
238
|
|
209
239
|
smbdir = smb.opendir(@share_private)
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
240
|
+
|
241
|
+
smbdir_pos_all = Array.new
|
242
|
+
fname_by_pos = Hash.new
|
243
|
+
loop do
|
244
|
+
pos = smbdir.pos
|
245
|
+
smbdir_pos_all << pos
|
246
|
+
dent = smbdir.read
|
247
|
+
fname_by_pos[pos] = dent ? dent.name : nil;
|
248
|
+
break unless dent
|
215
249
|
end
|
216
|
-
assert_empty(dents)
|
217
250
|
|
218
251
|
smbdir.rewind
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
assert_equal(
|
252
|
+
dent_names = dent_names_all.clone
|
253
|
+
smbdir_pos = smbdir_pos_all.clone
|
254
|
+
loop do
|
255
|
+
pos = smbdir.pos
|
256
|
+
assert_equal(smbdir_pos.shift, pos)
|
257
|
+
unless dent = smbdir.read
|
258
|
+
break
|
259
|
+
end
|
260
|
+
assert_equal(dent.name, dent_names.delete(dent.name),
|
261
|
+
"Unexpected directory entry: #{dent.name}")
|
262
|
+
assert_equal(fname_by_pos[pos], dent.name,
|
263
|
+
"Unexpected directory entry: #{dent.name} #{pos}")
|
264
|
+
end
|
265
|
+
assert_empty(dent_names)
|
266
|
+
|
267
|
+
smbdir_pos_all.each do |pos|
|
268
|
+
smbdir.seek(pos)
|
269
|
+
dent = smbdir.read
|
270
|
+
dent_name = dent ? dent.name : nil;
|
271
|
+
assert_equal(fname_by_pos[pos], dent_name,
|
272
|
+
"Unexpected directory entry: #{dent_name} #{pos}")
|
273
|
+
end
|
274
|
+
|
275
|
+
smbdir_pos_all.reverse.each do |pos|
|
276
|
+
smbdir.seek(pos)
|
277
|
+
dent = smbdir.read
|
278
|
+
dent_name = dent ? dent.name : nil;
|
279
|
+
assert_equal(fname_by_pos[pos], dent_name,
|
280
|
+
"Unexpected directory entry: #{dent_name} #{pos}")
|
224
281
|
end
|
225
|
-
assert_empty(dents)
|
226
282
|
|
227
283
|
smbdir.close
|
284
|
+
end ## test_dir_seek
|
228
285
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
286
|
+
def test_dir_enum
|
287
|
+
smb = self.smb
|
288
|
+
dent_names_all = [*@dirs, *@files]
|
289
|
+
|
290
|
+
smbdir = smb.opendir(@share_private)
|
291
|
+
dent_names = dent_names_all.clone
|
292
|
+
smbdir.each do |dent|
|
293
|
+
assert(dent_names.delete(dent.name) != nil)
|
235
294
|
end
|
295
|
+
assert_empty(dent_names)
|
296
|
+
smbdir.close
|
236
297
|
|
237
298
|
smbdir = smb.opendir(@share_private)
|
238
|
-
|
239
|
-
smbdir.
|
240
|
-
|
299
|
+
dent_names = dent_names_all.clone
|
300
|
+
smbdir.read
|
301
|
+
smbdir.read
|
302
|
+
smbdir.each do |dent|
|
303
|
+
assert(dent_names.delete(dent.name) != nil)
|
241
304
|
end
|
242
|
-
assert_empty(
|
305
|
+
assert_empty(dent_names)
|
306
|
+
smbdir.close
|
243
307
|
|
244
308
|
smbdir = smb.opendir(@share_private)
|
245
|
-
|
309
|
+
dent_names = dent_names_all.clone
|
246
310
|
smbdir_enum = smbdir.each
|
247
|
-
|
248
|
-
|
249
|
-
assert_equal(
|
311
|
+
dent_names.size.times do |n|
|
312
|
+
dent = smbdir_enum.next
|
313
|
+
assert_equal(dent.name, dent_names.delete(dent.name),
|
314
|
+
"Unexpected directory entry: #{dent.name}")
|
250
315
|
end
|
251
316
|
assert_raise(StopIteration) do
|
252
317
|
smbdir_enum.next
|
253
318
|
end
|
254
|
-
assert_empty(
|
255
|
-
|
319
|
+
assert_empty(dent_names)
|
320
|
+
smbdir.close
|
321
|
+
end ## test_dir_enum
|
256
322
|
|
257
323
|
def test_file_open_read_close
|
258
|
-
smb =
|
259
|
-
smb.on_auth {|server, share|
|
260
|
-
[@username, @password]
|
261
|
-
}
|
324
|
+
smb = self.smb
|
262
325
|
|
263
326
|
@files_readable.each do |filename|
|
264
327
|
url = @share_public + '/' + filename
|
@@ -280,34 +343,36 @@ class SMBTest < Test::Unit::TestCase
|
|
280
343
|
end
|
281
344
|
end ## test_file_open_read_close
|
282
345
|
|
283
|
-
def
|
284
|
-
smb =
|
285
|
-
smb.on_auth {|server, share|
|
286
|
-
[@username, @password]
|
287
|
-
}
|
346
|
+
def test_file_read_sequential
|
347
|
+
smb = self.smb
|
288
348
|
|
289
349
|
file = File.open(@share_dir + '/' + @file_large)
|
290
350
|
smbfile = smb.open(@share_public + '/' + @file_large)
|
291
351
|
|
292
|
-
buffer_size =
|
293
|
-
|
352
|
+
buffer_size = smbfile.read_buffer_size
|
353
|
+
[
|
354
|
+
1..16,
|
355
|
+
(buffer_size/3-16)..(buffer_size/3+16),
|
356
|
+
(buffer_size/2-16)..(buffer_size/2+16),
|
357
|
+
(buffer_size -16)..(buffer_size +16),
|
358
|
+
(buffer_size*2-16)..(buffer_size*2+16),
|
359
|
+
(buffer_size*3-16)..(buffer_size*3+16),
|
360
|
+
].each do |read_size_range| read_size_range.each do |read_size|
|
294
361
|
file.rewind
|
295
362
|
smbfile.rewind
|
296
|
-
(buffer_size / read_size *
|
363
|
+
(buffer_size / read_size * 4).times do |n|
|
297
364
|
file_data = file.read(read_size)
|
298
365
|
smbfile_data = smbfile.read(read_size)
|
299
366
|
assert_equal(file_data, smbfile_data, "read_size #{read_size}, n=#{n}")
|
367
|
+
assert_equal(file.pos, smbfile.pos, "read_size #{read_size}, n=#{n}")
|
300
368
|
end
|
301
|
-
end
|
369
|
+
end end
|
302
370
|
|
303
371
|
smbfile.close
|
304
|
-
end ##
|
372
|
+
end ## test_file_read_sequential
|
305
373
|
|
306
374
|
def test_file_read_eof
|
307
|
-
smb =
|
308
|
-
smb.on_auth {|server, share|
|
309
|
-
[@username, @password]
|
310
|
-
}
|
375
|
+
smb = self.smb
|
311
376
|
|
312
377
|
smbfile = smb.open(@share_public + '/' + @file_readable)
|
313
378
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-smb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,27 +9,46 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake-compiler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
description: SMB/CIFS client (Samba libsmbclient binding)
|
15
31
|
email:
|
16
32
|
- fumiyas@osstech.co.jp
|
17
33
|
executables: []
|
18
34
|
extensions:
|
19
|
-
- ext/
|
35
|
+
- ext/net_smb/extconf.rb
|
20
36
|
extra_rdoc_files: []
|
21
37
|
files:
|
22
38
|
- .gitignore
|
23
39
|
- Gemfile
|
24
40
|
- Makefile
|
41
|
+
- README.md
|
25
42
|
- Rakefile
|
26
43
|
- Rakefile.local.example
|
27
|
-
- ext/
|
28
|
-
- ext/
|
29
|
-
- ext/
|
30
|
-
- ext/
|
31
|
-
- ext/
|
32
|
-
- ext/
|
44
|
+
- ext/net_smb/dlinklist.h
|
45
|
+
- ext/net_smb/extconf.rb
|
46
|
+
- ext/net_smb/rb_smb.h
|
47
|
+
- ext/net_smb/smb.c
|
48
|
+
- ext/net_smb/smbdir.c
|
49
|
+
- ext/net_smb/smbdirentry.c
|
50
|
+
- ext/net_smb/smbfile.c
|
51
|
+
- lib/net/smb.rb
|
33
52
|
- lib/net/smb/version.rb
|
34
53
|
- net-smb.gemspec
|
35
54
|
- test/bin/smbd.wrapper
|