net-smb 0.0.3 → 0.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/CHANGES ADDED
@@ -0,0 +1,5 @@
1
+ Ruby Net::SMB 0.0.4 (2013-02-28)
2
+
3
+ * Add Net::SMB::Stat
4
+ * Add Net::SMB#stat, Net::SMB::Dir#stat, Net::SMB::File#stat
5
+
data/Makefile CHANGED
@@ -1,18 +1,23 @@
1
- default: build
1
+ default: PHONY build
2
2
 
3
- build: gem
3
+ build: PHONY
4
+ rake compile
4
5
 
5
- gem:
6
- rm pkg/*.gem
6
+ test t: PHONY
7
+ rake test
8
+
9
+ gem: PHONY
7
10
  rake build
8
11
 
9
- upload:
12
+ upload: PHONY
13
+ rm -f pkg/*.gem
10
14
  $(MAKE) gem
11
15
  gem push pkg/*.gem
12
16
 
13
- clean:
17
+ clean: PHONY
14
18
  rake clean
15
19
 
16
- distclean:
20
+ distclean: PHONY
17
21
  rake clobber
18
22
 
23
+ PHONY:
data/README.md CHANGED
@@ -11,7 +11,7 @@ Requirement
11
11
  ----------------------------------------------------------------------
12
12
 
13
13
  * Ruby 1.9.3+
14
- * Samba 3.5+ (libsmbclient)
14
+ * Samba 3.6+ (libsmbclient)
15
15
  * C compiler
16
16
 
17
17
  Development Resources
@@ -23,7 +23,7 @@ Development Resources
23
23
  Copyright
24
24
  ----------------------------------------------------------------------
25
25
 
26
- Copyright (C) 2012 SATOH Fumiyas @ OSS Technology Corp., Japan
26
+ Copyright (C) 2013 SATOH Fumiyas @ OSS Technology Corp., Japan
27
27
 
28
28
  Licensed under the GNU General Public License version 3
29
29
 
data/Rakefile CHANGED
@@ -1,38 +1,60 @@
1
+ require 'find'
2
+
1
3
  begin
2
4
  load 'Rakefile.local'
3
- rescue LoadError => e
5
+ rescue LoadError
6
+ ## Ignore
4
7
  end
5
8
 
6
- begin
7
- require 'bundler/gem_tasks'
8
- rescue LoadError => e
9
+ GEM_SPEC = begin
10
+ require 'bundler/gem_helper'
11
+ helper = Bundler::GemHelper.new(Dir.pwd)
12
+ helper.install
13
+ helper.gemspec
14
+ rescue LoadError
15
+ fname = File.basename(Dir.pwd).sub(%r#^(?:ruby-)?(.+?)(?:-\d.*)?$#, '\1.gemspec')
16
+ contents = File.read(fname)
17
+ eval(contents, TOPLEVEL_BINDING, fname)
9
18
  end
10
19
 
20
+ EXT_NAME = GEM_SPEC.name.gsub(/-/, '_')
21
+
22
+ ## ======================================================================
23
+
11
24
  require 'rake/clean'
25
+
26
+ CLEAN.include('pkg')
27
+ CLOBBER.include('test/log')
28
+ CLOBBER.include('test/log.*')
29
+
30
+ ## ======================================================================
31
+
12
32
  require 'rake/extensiontask'
13
- require 'rake/testtask'
14
33
 
15
- GEMSPEC = eval(File.read(File.dirname(__FILE__) + '/net-smb.gemspec'))
34
+ Rake::ExtensionTask.new(EXT_NAME, GEM_SPEC) do |task|
35
+ task.source_pattern = '*.{c,h}'
36
+ end
37
+
38
+ ## ======================================================================
39
+
40
+ require 'rake/testtask'
16
41
 
17
- Rake::ExtensionTask.new("net_smb", GEMSPEC)
18
42
  Rake::TestTask.new
19
43
 
20
- EXT_PATH = 'net_smb'
44
+ ## ======================================================================
45
+
46
+ task :default => [:compile]
21
47
 
22
- file "lib/#{EXT_PATH}.so" => Dir.glob("ext/#{EXT_PATH}/*.{rb,c,h}") do
23
- Dir.chdir("ext/#{EXT_PATH}") do
24
- ruby 'extconf.rb'
25
- sh ENV['MAKE'] || 'make'
48
+ task :clobber_pre do
49
+ ## Fix directory permissions to be able to remove by task :clobber
50
+ Find.find(*Dir.glob("test/log/share"), *Dir.glob("test/log.*/share")) do |path|
51
+ if File.directory?(path)
52
+ File.chmod(0755, path)
53
+ end
26
54
  end
27
- cp "ext/#{EXT_PATH}/#{File.basename(EXT_PATH)}.so", "lib/#{EXT_PATH}.so"
28
55
  end
29
56
 
30
- task :test => "lib/#{EXT_PATH}.so"
57
+ task :clobber => [:clobber_pre]
31
58
 
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]')
59
+ task :test => "lib/#{EXT_NAME}.so"
38
60
 
@@ -0,0 +1 @@
1
+ $(OBJS): rb_smb.h
data/ext/net_smb/rb_smb.h CHANGED
@@ -51,6 +51,7 @@
51
51
  #define RB_SMBFILE_BUFFER_SIZE 8192
52
52
 
53
53
  typedef struct rb_smb_data RB_SMB_DATA;
54
+ typedef struct rb_smbstat_data RB_SMBSTAT_DATA;
54
55
  typedef struct rb_smbfile_data RB_SMBFILE_DATA;
55
56
 
56
57
  struct rb_smb_data {
@@ -60,6 +61,10 @@ struct rb_smb_data {
60
61
  RB_SMBFILE_DATA *smbfile_data_list;
61
62
  };
62
63
 
64
+ struct rb_smbstat_data {
65
+ struct stat stat;
66
+ };
67
+
63
68
  struct rb_smbfile_data {
64
69
  rb_encoding *enc;
65
70
  VALUE smb_obj; /* Net::SMB object */
@@ -82,16 +87,27 @@ struct rb_smbfile_data {
82
87
  RB_SMB_DATA *data; \
83
88
  Data_Get_Struct(obj, RB_SMB_DATA, data);
84
89
 
90
+ #define RB_SMBSTAT_DATA_FROM_OBJ(obj, data) \
91
+ RB_SMBSTAT_DATA *data; \
92
+ Data_Get_Struct(obj, RB_SMBSTAT_DATA, data);
93
+
85
94
  #define RB_SMBFILE_DATA_FROM_OBJ(obj, data) \
86
95
  RB_SMBFILE_DATA *data; \
87
96
  Data_Get_Struct(obj, RB_SMBFILE_DATA, data);
88
97
 
98
+ #define RB_SMBFILE_DATA_CLOSED(data) \
99
+ if ((data)->smbcfile == NULL) { \
100
+ rb_raise(rb_eIOError, "Closed Net::SMB::File stream"); \
101
+ }
102
+
89
103
  extern VALUE rb_cSMB;
90
104
  extern VALUE rb_eSMBError;
105
+ extern VALUE rb_cSMBStat;
91
106
  extern VALUE rb_cSMBDir;
92
107
  extern VALUE rb_cSMBDirEntry;
93
108
  extern VALUE rb_cSMBFile;
94
109
 
110
+ void Init_net_smbstat(void);
95
111
  void Init_net_smbdir(void);
96
112
  void Init_net_smbdirentry(void);
97
113
  void Init_net_smbfile(void);
data/ext/net_smb/smb.c CHANGED
@@ -224,6 +224,18 @@ static VALUE rb_smb_auth_callback(int argc, VALUE* argv, VALUE self)
224
224
  return Qnil;
225
225
  }
226
226
 
227
+ static VALUE rb_smb_stat(VALUE self, VALUE url_obj)
228
+ {
229
+ VALUE args[2];
230
+ VALUE smbstat;
231
+
232
+ args[0] = self;
233
+ args[1] = url_obj;
234
+ smbstat = rb_class_new_instance(2, args, rb_cSMBStat);
235
+
236
+ return smbstat;
237
+ }
238
+
227
239
  static VALUE rb_smb_opendir(VALUE self, VALUE url_obj)
228
240
  {
229
241
  RB_SMB_DATA_FROM_OBJ(self, data);
@@ -273,6 +285,7 @@ void Init_net_smb(void)
273
285
  rb_define_method(rb_cSMB, "use_kerberos=", rb_smb_use_kerberos_set, 1);
274
286
  rb_define_method(rb_cSMB, "auth_callback", rb_smb_auth_callback, -1);
275
287
  rb_define_alias(rb_cSMB, "auth", "auth_callback");
288
+ rb_define_method(rb_cSMB, "stat", rb_smb_stat, 1);
276
289
  rb_define_method(rb_cSMB, "opendir", rb_smb_opendir, 1);
277
290
  rb_define_method(rb_cSMB, "open", rb_smb_open, -1);
278
291
 
@@ -306,6 +319,7 @@ void Init_net_smb(void)
306
319
  smbc_init_context(smbcctx);
307
320
  }
308
321
 
322
+ Init_net_smbstat();
309
323
  Init_net_smbdir();
310
324
  Init_net_smbdirentry();
311
325
  Init_net_smbfile();
data/ext/net_smb/smbdir.c CHANGED
@@ -109,8 +109,7 @@ static VALUE rb_smbdir_initialize(VALUE self, VALUE smb_obj, VALUE url_obj)
109
109
  RB_SMB_DEBUG("smbcctx=%p smbcfile=%p\n", data->smbcctx, data->smbcfile);
110
110
 
111
111
  if (rb_block_given_p()) {
112
- rb_ensure(rb_yield, self, rb_smbdir_close, self);
113
- return Qnil;
112
+ return rb_ensure(rb_yield, self, rb_smbdir_close, self);
114
113
  }
115
114
 
116
115
  return self;
@@ -133,6 +132,7 @@ static VALUE rb_smbdir_url(VALUE self)
133
132
  static VALUE rb_smbdir_close(VALUE self)
134
133
  {
135
134
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
135
+ RB_SMBFILE_DATA_CLOSED(data);
136
136
 
137
137
  RB_SMB_DEBUG("data=%p smbcctx=%p smbcfile=%p\n", data, data->smbcctx, data->smbcfile);
138
138
 
@@ -141,9 +141,25 @@ static VALUE rb_smbdir_close(VALUE self)
141
141
  return self;
142
142
  }
143
143
 
144
+ #define rb_smbdir_closed_p_by_data(data) \
145
+ (((data)->smbcfile == NULL) ? Qtrue : Qfalse)
146
+
147
+ static VALUE rb_smbdir_closed_p(VALUE self)
148
+ {
149
+ RB_SMBFILE_DATA_FROM_OBJ(self, data);
150
+
151
+ return rb_smbdir_closed_p_by_data(data);
152
+ }
153
+
154
+ static VALUE rb_smbdir_stat(VALUE self)
155
+ {
156
+ return rb_class_new_instance(1, &self, rb_cSMBStat);
157
+ }
158
+
144
159
  static VALUE rb_smbdir_tell(VALUE self)
145
160
  {
146
161
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
162
+ RB_SMBFILE_DATA_CLOSED(data);
147
163
  smbc_telldir_fn fn;
148
164
  off_t offset;
149
165
 
@@ -163,6 +179,7 @@ static VALUE rb_smbdir_tell(VALUE self)
163
179
  static VALUE rb_smbdir_seek(VALUE self, VALUE offset_num)
164
180
  {
165
181
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
182
+ RB_SMBFILE_DATA_CLOSED(data);
166
183
  smbc_lseekdir_fn fn;
167
184
  off_t offset = (off_t)NUM2LONG(offset_num);
168
185
 
@@ -184,6 +201,7 @@ static VALUE rb_smbdir_rewind(VALUE self)
184
201
  static VALUE rb_smbdir_read(VALUE self)
185
202
  {
186
203
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
204
+ RB_SMBFILE_DATA_CLOSED(data);
187
205
  smbc_readdir_fn fn;
188
206
  struct smbc_dirent *smbcdent;
189
207
 
@@ -239,6 +257,8 @@ void Init_net_smbdir(void)
239
257
  rb_define_method(rb_cSMBDir, "smb", rb_smbdir_smb, 0);
240
258
  rb_define_method(rb_cSMBDir, "url", rb_smbdir_url, 0);
241
259
  rb_define_method(rb_cSMBDir, "close", rb_smbdir_close, 0);
260
+ rb_define_method(rb_cSMBDir, "closed?", rb_smbdir_closed_p, 0);
261
+ rb_define_method(rb_cSMBDir, "stat", rb_smbdir_stat, 0);
242
262
  rb_define_method(rb_cSMBDir, "tell", rb_smbdir_tell, 0);
243
263
  rb_define_alias(rb_cSMBDir, "pos", "tell");
244
264
  rb_define_method(rb_cSMBDir, "seek", rb_smbdir_seek, 1);
@@ -21,10 +21,10 @@
21
21
 
22
22
  VALUE rb_cSMBDirEntry;
23
23
 
24
- VALUE sym_name;
25
- VALUE sym_type;
26
- VALUE sym_url;
27
- VALUE sym_comment;
24
+ static VALUE sym_name;
25
+ static VALUE sym_type;
26
+ static VALUE sym_url;
27
+ static VALUE sym_comment;
28
28
 
29
29
  /* ====================================================================== */
30
30
 
@@ -35,7 +35,7 @@ static VALUE rb_smbdirentry_initialize(VALUE self,
35
35
 
36
36
  rb_hash_aset(self, sym_name, name_obj);
37
37
  rb_hash_aset(self, sym_type, type_obj);
38
- rb_hash_aset(self, sym_url, comment_obj);
38
+ rb_hash_aset(self, sym_url, url_obj);
39
39
  rb_hash_aset(self, sym_comment, comment_obj);
40
40
 
41
41
  return self;
@@ -151,6 +151,8 @@ try:
151
151
  data->eof = (read_size == 0);
152
152
  }
153
153
 
154
+ static VALUE rb_smbfile_close(VALUE self);
155
+
154
156
  static VALUE rb_smbfile_initialize(int argc, VALUE *argv, VALUE self)
155
157
  {
156
158
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
@@ -185,6 +187,10 @@ static VALUE rb_smbfile_initialize(int argc, VALUE *argv, VALUE self)
185
187
 
186
188
  rb_smbfile_open_by_data(data);
187
189
 
190
+ if (rb_block_given_p()) {
191
+ return rb_ensure(rb_yield, self, rb_smbfile_close, self);
192
+ }
193
+
188
194
  return self;
189
195
  }
190
196
 
@@ -210,6 +216,7 @@ static VALUE rb_smbfile_read_buffer_size(VALUE self)
210
216
  static VALUE rb_smbfile_close(VALUE self)
211
217
  {
212
218
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
219
+ RB_SMBFILE_DATA_CLOSED(data);
213
220
 
214
221
  RB_SMB_DEBUG("data=%p smbcctx=%p smbcfile=%p\n", data, data->smbcctx, data->smbcfile);
215
222
 
@@ -218,18 +225,38 @@ static VALUE rb_smbfile_close(VALUE self)
218
225
  return self;
219
226
  }
220
227
 
221
- static VALUE rb_smbfile_tell(VALUE self)
228
+ #define rb_smbfile_closed_p_by_data(data) \
229
+ (((data)->smbcfile == NULL) ? Qtrue : Qfalse)
230
+
231
+ static VALUE rb_smbfile_closed_p(VALUE self)
222
232
  {
223
233
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
224
234
 
235
+ return rb_smbfile_closed_p_by_data(data);
236
+ }
237
+
238
+ static VALUE rb_smbfile_stat(VALUE self)
239
+ {
240
+ return rb_class_new_instance(1, &self, rb_cSMBStat);
241
+ }
242
+
243
+ static VALUE rb_smbfile_pos(VALUE self)
244
+ {
245
+ RB_SMBFILE_DATA_FROM_OBJ(self, data);
246
+ RB_SMBFILE_DATA_CLOSED(data);
247
+
225
248
  return SIZET2NUM(data->pos);
226
249
  }
227
250
 
228
- static VALUE rb_smbfile_seek(VALUE self, VALUE offset_num, VALUE whence_num)
251
+ static VALUE rb_smbfile_seek(int argc, VALUE *argv, VALUE self)
229
252
  {
230
253
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
231
- off_t offset = NUM2OFFT(offset_num);
232
- int whence = NUM2INT(whence_num);
254
+ RB_SMBFILE_DATA_CLOSED(data);
255
+
256
+ VALUE whence_num;
257
+ rb_scan_args(argc, argv, "11", NULL, &whence_num);
258
+ off_t offset = NUM2OFFT(argv[0]);
259
+ int whence = NIL_P(whence_num) ? SEEK_SET : NUM2INT(whence_num);
233
260
 
234
261
  switch (whence) {
235
262
  case SEEK_SET:
@@ -255,14 +282,22 @@ static VALUE rb_smbfile_seek(VALUE self, VALUE offset_num, VALUE whence_num)
255
282
  return self;
256
283
  }
257
284
 
285
+ static VALUE rb_smbfile_pos_set(VALUE self, VALUE offset)
286
+ {
287
+ return rb_smbfile_seek(1, &offset, self);
288
+ }
289
+
258
290
  static VALUE rb_smbfile_rewind(VALUE self)
259
291
  {
260
- return rb_smbfile_seek(self, OFFT2NUM(0), INT2NUM(SEEK_SET));
292
+ VALUE argv = OFFT2NUM(0);
293
+
294
+ return rb_smbfile_seek(1, &argv, self);
261
295
  }
262
296
 
263
297
  static VALUE rb_smbfile_eof_p(VALUE self)
264
298
  {
265
299
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
300
+ RB_SMBFILE_DATA_CLOSED(data);
266
301
 
267
302
  if (data->buffer_used_size - data->buffer_pos > 0) {
268
303
  /* Remained data exist in buffer */
@@ -290,6 +325,7 @@ static void rb_smbfile_readable_p_by_data(RB_SMBFILE_DATA *data)
290
325
  static VALUE rb_smbfile_read(int argc, VALUE *argv, VALUE self)
291
326
  {
292
327
  RB_SMBFILE_DATA_FROM_OBJ(self, data);
328
+ RB_SMBFILE_DATA_CLOSED(data);
293
329
  ssize_t req_read_size;
294
330
  VALUE str = rb_str_new2("");
295
331
 
@@ -350,11 +386,15 @@ void Init_net_smbfile(void)
350
386
  rb_define_method(rb_cSMBFile, "url", rb_smbfile_url, 0);
351
387
  rb_define_method(rb_cSMBFile, "read_buffer_size", rb_smbfile_read_buffer_size, 0);
352
388
  rb_define_method(rb_cSMBFile, "close", rb_smbfile_close, 0);
353
- rb_define_method(rb_cSMBFile, "tell", rb_smbfile_tell, 0);
354
- rb_define_alias(rb_cSMBFile, "pos", "tell");
355
- rb_define_method(rb_cSMBFile, "seek", rb_smbfile_seek, 2);
389
+ rb_define_method(rb_cSMBFile, "closed?", rb_smbfile_closed_p, 0);
390
+ rb_define_method(rb_cSMBFile, "stat", rb_smbfile_stat, 0);
391
+ rb_define_method(rb_cSMBFile, "pos", rb_smbfile_pos, 0);
392
+ rb_define_alias(rb_cSMBFile, "tell", "pos");
393
+ rb_define_method(rb_cSMBFile, "seek", rb_smbfile_seek, -1);
394
+ rb_define_method(rb_cSMBFile, "pos=", rb_smbfile_pos_set, 1);
356
395
  rb_define_method(rb_cSMBFile, "rewind", rb_smbfile_rewind, 0);
357
396
  rb_define_method(rb_cSMBFile, "eof?", rb_smbfile_eof_p, 0);
397
+ rb_define_alias(rb_cSMBFile, "eof", "eof?");
358
398
  rb_define_method(rb_cSMBFile, "read", rb_smbfile_read, -1);
359
399
  }
360
400
 
@@ -0,0 +1,200 @@
1
+ /*
2
+ * Ruby/Net::SMB - SMB/CIFS client (Samba libsmbclient binding) for Ruby
3
+ * Net::SMB::Stat 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
+ #ifndef NUM2DEVT
23
+ # define NUM2DEVT(v) NUM2UINT(v)
24
+ #endif
25
+ #ifndef DEVT2NUM
26
+ # define DEVT2NUM(v) UINT2NUM(v)
27
+ #endif
28
+
29
+ VALUE rb_cSMBStat;
30
+
31
+ static ID id_to_s;
32
+
33
+ /* ====================================================================== */
34
+
35
+ static void rb_smbstat_data_free(RB_SMBSTAT_DATA *data)
36
+ {
37
+ ruby_xfree(data);
38
+ }
39
+
40
+ static VALUE rb_smbstat_data_alloc(VALUE klass)
41
+ {
42
+ RB_SMBSTAT_DATA *data = ALLOC(RB_SMBSTAT_DATA);
43
+
44
+ memset(data, 0, sizeof(*data));
45
+
46
+ return Data_Wrap_Struct(klass, NULL, rb_smbstat_data_free, data);
47
+ }
48
+
49
+ static VALUE rb_smbstat_initialize(int argc, VALUE *argv, VALUE self)
50
+ {
51
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
52
+ VALUE smb_or_file_obj;
53
+ VALUE url_obj;
54
+
55
+ rb_scan_args(argc, argv, "11", &smb_or_file_obj, &url_obj);
56
+
57
+ if (rb_obj_is_kind_of(smb_or_file_obj, rb_cSMB)) {
58
+ RB_SMB_DATA_FROM_OBJ(smb_or_file_obj, smb_data);
59
+
60
+ if (rb_obj_is_kind_of(url_obj, rb_cString)) {
61
+ /* OK */
62
+ }
63
+ else if (rb_respond_to(url_obj, id_to_s)) {
64
+ url_obj = rb_funcall(url_obj, id_to_s, 0);
65
+ }
66
+ else {
67
+ rb_raise(rb_eTypeError, "String was expected");
68
+ }
69
+
70
+ const char *url = StringValueCStr(url_obj);
71
+ smbc_stat_fn fn = smbc_getFunctionStat(smb_data->smbcctx);
72
+ if ((*fn)(smb_data->smbcctx, url, &data->stat)) {
73
+ rb_sys_fail("SMBC_stat_ctx() failed");
74
+ }
75
+ }
76
+ else if (rb_obj_is_kind_of(smb_or_file_obj, rb_cSMBFile)) {
77
+ RB_SMBFILE_DATA_FROM_OBJ(smb_or_file_obj, smbfile_data);
78
+ smbc_fstat_fn fn = smbc_getFunctionFstat(smbfile_data->smbcctx);
79
+
80
+ if ((*fn)(smbfile_data->smbcctx, smbfile_data->smbcfile, &data->stat)) {
81
+ rb_sys_fail("SMBC_fstat_ctx() failed");
82
+ }
83
+ }
84
+ else if (rb_obj_is_kind_of(smb_or_file_obj, rb_cSMBDir)) {
85
+ RB_SMBFILE_DATA_FROM_OBJ(smb_or_file_obj, smbfile_data);
86
+ #if 0
87
+ /*
88
+ * SMBC_fstatdir_ctx() does nothing. See source/libsmb/libsmb_dir.c in
89
+ * Samba source tree.
90
+ */
91
+ smbc_fstatdir_fn fn = smbc_getFunctionFstatdir(smbfile_data->smbcctx);
92
+
93
+ if ((*fn)(smbfile_data->smbcctx, smbfile_data->smbcfile, &data->stat)) {
94
+ rb_sys_fail("SMBC_fstatdir_ctx() failed");
95
+ }
96
+ #else
97
+ smbc_stat_fn fn = smbc_getFunctionStat(smbfile_data->smbcctx);
98
+ if ((*fn)(smbfile_data->smbcctx, smbfile_data->url, &data->stat)) {
99
+ rb_sys_fail("SMBC_stat_ctx() failed");
100
+ }
101
+ #endif
102
+ }
103
+ else {
104
+ rb_raise(rb_eTypeError, "Net::SMB, Net::SMB::Dir or Net::SMB::File was expected");
105
+ }
106
+
107
+ return self;
108
+ }
109
+
110
+ static VALUE rb_smbstat_dev(VALUE self)
111
+ {
112
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
113
+
114
+ return DEVT2NUM(data->stat.st_dev);
115
+ }
116
+
117
+ static VALUE rb_smbstat_ino(VALUE self)
118
+ {
119
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
120
+
121
+ return ULL2NUM(data->stat.st_ino);
122
+ }
123
+
124
+ static VALUE rb_smbstat_mode(VALUE self)
125
+ {
126
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
127
+
128
+ return UINT2NUM(data->stat.st_mode);
129
+ }
130
+
131
+ static VALUE rb_smbstat_nlink(VALUE self)
132
+ {
133
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
134
+
135
+ return ULL2NUM(data->stat.st_nlink);
136
+ }
137
+
138
+ static VALUE rb_smbstat_uid(VALUE self)
139
+ {
140
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
141
+
142
+ return UIDT2NUM(data->stat.st_uid);
143
+ }
144
+
145
+ static VALUE rb_smbstat_gid(VALUE self)
146
+ {
147
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
148
+
149
+ return GIDT2NUM(data->stat.st_gid);
150
+ }
151
+
152
+ static VALUE rb_smbstat_size(VALUE self)
153
+ {
154
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
155
+
156
+ return OFFT2NUM(data->stat.st_size);
157
+ }
158
+
159
+ static VALUE rb_smbstat_atime(VALUE self)
160
+ {
161
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
162
+
163
+ return rb_time_new(data->stat.st_atime, 0);
164
+ }
165
+
166
+ static VALUE rb_smbstat_mtime(VALUE self)
167
+ {
168
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
169
+
170
+ return rb_time_new(data->stat.st_mtime, 0);
171
+ }
172
+
173
+ static VALUE rb_smbstat_ctime(VALUE self)
174
+ {
175
+ RB_SMBSTAT_DATA_FROM_OBJ(self, data);
176
+
177
+ return rb_time_new(data->stat.st_ctime, 0);
178
+ }
179
+
180
+ /* ====================================================================== */
181
+
182
+ void Init_net_smbstat(void)
183
+ {
184
+ rb_cSMBStat = rb_define_class_under(rb_cSMB, "Stat", rb_cObject);
185
+ rb_define_alloc_func(rb_cSMBStat, rb_smbstat_data_alloc);
186
+ rb_define_method(rb_cSMBStat, "initialize", rb_smbstat_initialize, -1);
187
+ rb_define_method(rb_cSMBStat, "dev", rb_smbstat_dev, 0);
188
+ rb_define_method(rb_cSMBStat, "ino", rb_smbstat_ino, 0);
189
+ rb_define_method(rb_cSMBStat, "nlink", rb_smbstat_nlink, 0);
190
+ rb_define_method(rb_cSMBStat, "mode", rb_smbstat_mode, 0);
191
+ rb_define_method(rb_cSMBStat, "uid", rb_smbstat_uid, 0);
192
+ rb_define_method(rb_cSMBStat, "gid", rb_smbstat_gid, 0);
193
+ rb_define_method(rb_cSMBStat, "size", rb_smbstat_size, 0);
194
+ rb_define_method(rb_cSMBStat, "atime", rb_smbstat_atime, 0);
195
+ rb_define_method(rb_cSMBStat, "mtime", rb_smbstat_mtime, 0);
196
+ rb_define_method(rb_cSMBStat, "ctime", rb_smbstat_ctime, 0);
197
+
198
+ id_to_s = rb_intern("to_s");
199
+ }
200
+
@@ -1,5 +1,5 @@
1
1
  module Net #:nodoc:
2
2
  class SMB #:nodoc:
3
- VERSION = "0.0.3" #:nodoc:
3
+ VERSION = "0.0.4" #:nodoc:
4
4
  end
5
5
  end
data/net-smb.gemspec CHANGED
@@ -18,5 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_development_dependency 'rake-compiler'
21
+ s.required_ruby_version = ">= 1.9.2"
21
22
  end
22
23
 
data/test/etc/smb.conf CHANGED
@@ -7,6 +7,7 @@ pid directory = %$(TEST_SAMBA_VAR_DIR)
7
7
  ncalrpc dir = %$(TEST_SAMBA_VAR_DIR)
8
8
 
9
9
  map to guest = BAD USER
10
+ stat cache = no
10
11
 
11
12
  [template]
12
13
  path = %$(TEST_SHARE_DIR)
data/test/test_net_smb.rb CHANGED
@@ -8,106 +8,107 @@ require 'etc'
8
8
  module Net
9
9
 
10
10
  class SMBTest < Test::Unit::TestCase
11
- def setup
12
- @test_dir = ENV['TEST_DIR'] = "#{Dir.getwd}/test"
13
- @username = Etc.getpwuid(Process.uid)['name']
14
- @password = 'password'
15
-
16
- @smb_conf = ENV['TEST_SMB_CONF'] ||= @test_dir + "/etc/smb.conf"
17
- @smbd = ENV['TEST_SMBD'] ||= "smbd"
18
- @pdbedit = ENV['TEST_PDBEDIT'] ||= "pdbedit"
19
- @smbstatus = ENV['TEST_SMBSTATUS'] ||= "smbstatus"
20
- @samba_debug_level = ENV['TEST_SAMBA_DEBUGLEVEL'] ||= "10"
21
- @samba_log_dir = ENV['TEST_SAMBA_LOG_DIR'] ||= @test_dir + "/log"
22
- @samba_var_dir = ENV['TEST_SAMBA_VAR_DIR'] ||= @samba_log_dir + "/var"
23
- @share_dir = ENV['TEST_SHARE_DIR'] ||= @samba_log_dir + "/share"
24
-
25
- @share_private = "smb://localhost/private"
26
- @share_public = "smb://localhost/public"
27
- @dir_noexist = "dir.noexist"
28
- @dir_writeable = "dir.writeable"
29
- @dir_writeable_m = "ディレクトリ.writeable"
30
- @dirs_writeable = [@dir_writeable, @dir_writeable_m]
31
- @dir_readable = "dir.readable"
32
- @dirs_readable = [@dir_readable]
33
- @dir_noaccess = "dir.noaccess"
34
- @dirs_noaccess = [@dir_noaccess]
35
- @dirs = [".", ".."] + @dirs_readable + @dirs_writeable + @dirs_noaccess
36
- @file_noexist = "file.noexist"
37
- @file_writeable = "file.writeable"
38
- @file_writeable_m = "ファイル.writeable"
39
- @files_writeable = [@file_writeable, @file_writeable_m]
40
- @file_readable = "file.readable"
41
- @files_readable = [@file_readable]
42
- @file_noaccess = "file.noaccess"
43
- @files_noaccess = [@file_noaccess]
44
- @file_large = "file.large"
45
- @files_misc = [@file_large]
46
- @files = @files_readable + @files_writeable + @files_noaccess + @files_misc
47
-
48
- ENV['SMB_CONF_PATH'] = nil;
49
- ENV['LIBSMB_PROG'] ||= @test_dir + "/bin/smbd.wrapper"
50
-
51
- ## Rotate log directory
52
- if File.exist?(@samba_log_dir + '.9')
53
- system('/bin/rm', '-rf', @samba_log_dir + '.9');
54
- end
55
- if File.exist?(@samba_log_dir)
56
- File.rename(@samba_log_dir, @samba_log_dir + '.0')
57
- end
58
- 9.downto(1) do |i|
59
- logdir_a = @samba_log_dir + '.' + (i-1).to_s
60
- logdir_b = @samba_log_dir + '.' + i.to_s
61
- if File.exist?(logdir_a)
62
- File.rename(logdir_a, logdir_b)
63
- end
11
+ @@test_dir = ENV['TEST_DIR'] = "#{Dir.getwd}/test"
12
+ @@username = Etc.getpwuid(Process.uid)['name']
13
+ @@password = 'password'
14
+
15
+ @@smb_conf = ENV['TEST_SMB_CONF'] ||= @@test_dir + "/etc/smb.conf"
16
+ @@smbd = ENV['TEST_SMBD'] ||= "smbd"
17
+ @@pdbedit = ENV['TEST_PDBEDIT'] ||= "pdbedit"
18
+ @@smbstatus = ENV['TEST_SMBSTATUS'] ||= "smbstatus"
19
+ @@samba_debug_level = ENV['TEST_SAMBA_DEBUGLEVEL'] ||= "10"
20
+ @@samba_log_dir = ENV['TEST_SAMBA_LOG_DIR'] ||= @@test_dir + "/log"
21
+ @@samba_var_dir = ENV['TEST_SAMBA_VAR_DIR'] ||= @@samba_log_dir + "/var"
22
+ @@share_dir = ENV['TEST_SHARE_DIR'] ||= @@samba_log_dir + "/share"
23
+
24
+ @@share_private = "smb://localhost/private"
25
+ @@share_public = "smb://localhost/public"
26
+ @@dir_noexist = "dir.noexist"
27
+ @@dir_writeable = "dir.writeable"
28
+ @@dir_writeable_m = "ディレクトリ.writeable"
29
+ @@dirs_writeable = [@@dir_writeable, @@dir_writeable_m]
30
+ @@dir_readable = "dir.readable"
31
+ @@dirs_readable = [@@dir_readable]
32
+ @@dir_noaccess = "dir.noaccess"
33
+ @@dirs_noaccess = [@@dir_noaccess]
34
+ @@dirs = [".", ".."] + @@dirs_readable + @@dirs_writeable + @@dirs_noaccess
35
+ @@file_noexist = "file.noexist"
36
+ @@file_writeable = "file.writeable"
37
+ @@file_writeable_m = "ファイル.writeable"
38
+ @@files_writeable = [@@file_writeable, @@file_writeable_m]
39
+ @@file_readable = "file.readable"
40
+ @@files_readable = [@@file_readable]
41
+ @@file_noaccess = "file.noaccess"
42
+ @@files_noaccess = [@@file_noaccess]
43
+ @@file_large = "file.large"
44
+ @@files_misc = [@@file_large]
45
+ @@files = @@files_readable + @@files_writeable + @@files_noaccess + @@files_misc
46
+
47
+ ENV['SMB_CONF_PATH'] = nil;
48
+ ENV['LIBSMB_PROG'] ||= @@test_dir + "/bin/smbd.wrapper"
49
+
50
+ ## Rotate log directory
51
+ if File.exist?(@@samba_log_dir + '.9')
52
+ system('/bin/rm', '-rf', @@samba_log_dir + '.9');
53
+ end
54
+ if File.exist?(@@samba_log_dir)
55
+ File.rename(@@samba_log_dir, @@samba_log_dir + '.0')
56
+ end
57
+ 9.downto(1) do |i|
58
+ logdir_a = @@samba_log_dir + '.' + (i-1).to_s
59
+ logdir_b = @@samba_log_dir + '.' + i.to_s
60
+ if File.exist?(logdir_a)
61
+ File.rename(logdir_a, logdir_b)
64
62
  end
63
+ end
65
64
 
66
- Dir.mkdir(@samba_log_dir, 0750)
67
- Dir.mkdir(@samba_var_dir, 0750)
68
- Dir.mkdir(@share_dir, 0750)
69
- @dirs_readable.each do |dname|
70
- Dir.mkdir(@share_dir + '/' + dname, 0550)
71
- end
72
- @dirs_writeable.each do |dname|
73
- Dir.mkdir(@share_dir + '/' + dname, 0750)
74
- end
75
- @dirs_noaccess.each do |dname|
76
- Dir.mkdir(@share_dir + '/' + dname, 0000)
77
- end
78
- @files_readable.each do |fname|
79
- File.open(@share_dir + '/' + fname, "wb", 0440) do |file|
80
- file.write(fname)
81
- end
65
+ Dir.mkdir(@@samba_log_dir, 0750)
66
+ Dir.mkdir(@@samba_var_dir, 0750)
67
+ Dir.mkdir(@@share_dir, 0750)
68
+ @@dirs_readable.each do |dname|
69
+ Dir.mkdir(@@share_dir + '/' + dname, 0550)
70
+ end
71
+ @@dirs_writeable.each do |dname|
72
+ Dir.mkdir(@@share_dir + '/' + dname, 0750)
73
+ end
74
+ @@dirs_noaccess.each do |dname|
75
+ Dir.mkdir(@@share_dir + '/' + dname, 0000)
76
+ end
77
+ @@files_readable.each do |fname|
78
+ File.open(@@share_dir + '/' + fname, "wb", 0440) do |file|
79
+ file.write(fname)
82
80
  end
83
- @files_writeable.each do |fname|
84
- File.open(@share_dir + '/' + fname, "wb", 0660) do |file|
85
- file.write(fname)
86
- end
81
+ end
82
+ @@files_writeable.each do |fname|
83
+ File.open(@@share_dir + '/' + fname, "wb", 0660) do |file|
84
+ file.write(fname)
87
85
  end
88
- @files_noaccess.each do |fname|
89
- File.open(@share_dir + '/' + fname, "wb", 0000) do |file|
90
- file.write(fname)
91
- end
86
+ end
87
+ @@files_noaccess.each do |fname|
88
+ File.open(@@share_dir + '/' + fname, "wb", 0000) do |file|
89
+ file.write(fname)
92
90
  end
91
+ end
93
92
 
94
- File.open(@share_dir + '/' + @file_large, "wb", 0660) do |file|
95
- random_chars = (0...100).map { rand(256).chr }.join("")
96
- 100000.times do |n|
97
- file.write(random_chars)
98
- end
93
+ File.open(@@share_dir + '/' + @@file_large, "wb", 0660) do |file|
94
+ random_chars = (0...100).map { rand(256).chr }.join("")
95
+ 100000.times do |n|
96
+ file.write(random_chars)
99
97
  end
98
+ end
100
99
 
101
- pdbedit_r, pdbedit_w = IO.pipe
102
- pdbedit_pid = Kernel.spawn(
103
- @pdbedit, "--configfile", @smb_conf, "--create", "--password-from-stdin", @username,
104
- :in => pdbedit_r,
105
- [:out, :err] => [@samba_log_dir + '/pdbedit.log', 'w'],
106
- )
107
- pdbedit_r.close
108
- pdbedit_w.print(@password, "\n")
109
- pdbedit_w.print(@password, "\n")
110
- pdbedit_w.close
100
+ pdbedit_r, pdbedit_w = IO.pipe
101
+ pdbedit_pid = Kernel.spawn(
102
+ @@pdbedit, "--configfile", @@smb_conf, "--create", "--password-from-stdin", @@username,
103
+ :in => pdbedit_r,
104
+ [:out, :err] => [@@samba_log_dir + '/pdbedit.log', 'w'],
105
+ )
106
+ pdbedit_r.close
107
+ pdbedit_w.print(@@password, "\n")
108
+ pdbedit_w.print(@@password, "\n")
109
+ pdbedit_w.close
110
+
111
+ def setup
111
112
  end
112
113
 
113
114
  def teardown
@@ -116,9 +117,9 @@ class SMBTest < Test::Unit::TestCase
116
117
  def smbstatus
117
118
  smbstatus_r, smbstatus_w = IO.pipe
118
119
  smbstatus_pid = Kernel.spawn(
119
- @smbstatus, "--configfile", @smb_conf, "--shares",
120
+ @@smbstatus, "--configfile", @@smb_conf, "--shares",
120
121
  :out => smbstatus_w,
121
- :err => [@samba_log_dir + '/smbstatus.log', 'w+'],
122
+ :err => [@@samba_log_dir + '/smbstatus.log', 'w+'],
122
123
  )
123
124
  smbstatus_w.close
124
125
  smbstatus_r.readline
@@ -131,7 +132,7 @@ class SMBTest < Test::Unit::TestCase
131
132
  def smb
132
133
  smb = Net::SMB.new
133
134
  smb.auth_callback {|server, share|
134
- [@username, @password]
135
+ [@@username, @@password]
135
136
  }
136
137
 
137
138
  return smb
@@ -140,27 +141,27 @@ class SMBTest < Test::Unit::TestCase
140
141
  def test_auth
141
142
  smb = Net::SMB.new
142
143
  smb.auth_callback {|server, share|
143
- [@username, @password]
144
+ [@@username, @@password]
144
145
  }
145
146
  assert_nothing_raised do
146
- smbdir = smb.opendir(@share_private)
147
+ smbdir = smb.opendir(@@share_private)
147
148
  smbdir.close
148
149
  end
149
150
 
150
151
  smb = Net::SMB.new
151
152
  smb.auth_callback {|server, share|
152
- [@username, 'invalid-password']
153
+ [@@username, 'invalid-password']
153
154
  }
154
155
  assert_raise(Errno::EPERM) do
155
- smb.opendir(@share_private)
156
+ smb.opendir(@@share_private)
156
157
  end
157
158
 
158
159
  smb = Net::SMB.new
159
160
  smb.auth_callback {|server, share|
160
- ['invalid-user', @password]
161
+ ['invalid-user', @@password]
161
162
  }
162
163
  assert_raise(Errno::EACCES) do
163
- smb.opendir(@share_private)
164
+ smb.opendir(@@share_private)
164
165
  end
165
166
 
166
167
  smb = Net::SMB.new
@@ -168,61 +169,74 @@ class SMBTest < Test::Unit::TestCase
168
169
  'blah-blah'
169
170
  }
170
171
  assert_raise(TypeError) do
171
- smb.opendir(@share_private)
172
+ smb.opendir(@@share_private)
172
173
  end
173
174
 
174
175
  smb = Net::SMB.new
175
176
  smb.auth_callback {|server, share|
176
- [@username]
177
+ [@@username]
177
178
  }
178
179
  assert_raise(ArgumentError) do
179
- smb.opendir(@share_private)
180
+ smb.opendir(@@share_private)
180
181
  end
181
182
  end
182
183
 
183
184
  def test_dir_open_close
184
185
  smb = self.smb
185
186
 
186
- smbdir = smb.opendir(@share_public)
187
+ smbdir = smb.opendir(@@share_public)
187
188
  assert_equal(smb.object_id, smbdir.smb.object_id)
188
- assert_equal(@share_public, smbdir.url)
189
+ assert_equal(@@share_public, smbdir.url)
190
+
191
+ assert_equal(false, smbdir.closed?)
189
192
  smbdir.close
193
+ assert_equal(true, smbdir.closed?)
194
+
190
195
  assert_raise(IOError) do
191
196
  smbdir.close
192
197
  end
198
+ assert_raise(IOError) do
199
+ smbdir.read
200
+ end
201
+ assert_raise(IOError) do
202
+ smbdir.pos
203
+ end
204
+ assert_raise(IOError) do
205
+ smbdir.seek(0)
206
+ end
193
207
 
194
208
  assert_raise(Errno::ENOENT) do
195
- smbdir = smb.opendir(@share_public + '/' + @dir_noexist)
209
+ smbdir = smb.opendir(@@share_public + '/' + @@dir_noexist)
196
210
  end
197
211
  assert_raise(Errno::EACCES) do
198
- smbdir = smb.opendir(@share_public + '/' + @dir_noaccess)
212
+ smbdir = smb.opendir(@@share_public + '/' + @@dir_noaccess)
199
213
  end
200
214
  ## Errno::ENOENT is not expected, but Samba 3.5 and 3.6 has a bug:
201
215
  ## https://bugzilla.samba.org/show_bug.cgi?id=9021
202
216
  assert_raise(Errno::ENOTDIR, Errno::ENOENT) do
203
- smbdir = smb.opendir(@share_public + '/' + @file_writeable)
217
+ smbdir = smb.opendir(@@share_public + '/' + @@file_writeable)
204
218
  end
205
219
  end ## test_dir_open_close
206
220
 
207
221
  def test_dir_read
208
222
  smb = self.smb
209
- dent_names_all = [*@dirs, *@files]
223
+ dent_names_all = [*@@dirs, *@@files]
210
224
 
211
- smbdir = smb.opendir(@share_private)
225
+ smbdir = smb.opendir(@@share_private)
212
226
  dent_names = dent_names_all.clone
213
227
  while dent = smbdir.read
214
228
  assert_equal(dent.name, dent_names.delete(dent.name),
215
229
  "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?)
230
+ if @@dirs.include?(dent.name)
231
+ assert_equal(true, dent.dir?)
232
+ elsif @@files.include?(dent.name)
233
+ assert_equal(true, dent.file?)
220
234
  end
221
235
  end
222
236
  assert_empty(dent_names)
223
237
  smbdir.close
224
238
 
225
- smb.opendir(@share_public) do |smbdir|
239
+ smb.opendir(@@share_public) do |smbdir|
226
240
  dent_names = dent_names_all.clone
227
241
  while dent = smbdir.read
228
242
  assert_equal(dent.name, dent_names.delete(dent.name),
@@ -234,9 +248,9 @@ class SMBTest < Test::Unit::TestCase
234
248
 
235
249
  def test_dir_seek
236
250
  smb = self.smb
237
- dent_names_all = [*@dirs, *@files]
251
+ dent_names_all = [*@@dirs, *@@files]
238
252
 
239
- smbdir = smb.opendir(@share_private)
253
+ smbdir = smb.opendir(@@share_private)
240
254
 
241
255
  smbdir_pos_all = Array.new
242
256
  fname_by_pos = Hash.new
@@ -285,27 +299,27 @@ class SMBTest < Test::Unit::TestCase
285
299
 
286
300
  def test_dir_enum
287
301
  smb = self.smb
288
- dent_names_all = [*@dirs, *@files]
302
+ dent_names_all = [*@@dirs, *@@files]
289
303
 
290
- smbdir = smb.opendir(@share_private)
304
+ smbdir = smb.opendir(@@share_private)
291
305
  dent_names = dent_names_all.clone
292
306
  smbdir.each do |dent|
293
- assert(dent_names.delete(dent.name) != nil)
307
+ assert_equal(dent.name, dent_names.delete(dent.name))
294
308
  end
295
309
  assert_empty(dent_names)
296
310
  smbdir.close
297
311
 
298
- smbdir = smb.opendir(@share_private)
312
+ smbdir = smb.opendir(@@share_private)
299
313
  dent_names = dent_names_all.clone
300
314
  smbdir.read
301
315
  smbdir.read
302
316
  smbdir.each do |dent|
303
- assert(dent_names.delete(dent.name) != nil)
317
+ assert_equal(dent.name, dent_names.delete(dent.name))
304
318
  end
305
319
  assert_empty(dent_names)
306
320
  smbdir.close
307
321
 
308
- smbdir = smb.opendir(@share_private)
322
+ smbdir = smb.opendir(@@share_private)
309
323
  dent_names = dent_names_all.clone
310
324
  smbdir_enum = smbdir.each
311
325
  dent_names.size.times do |n|
@@ -320,11 +334,92 @@ class SMBTest < Test::Unit::TestCase
320
334
  smbdir.close
321
335
  end ## test_dir_enum
322
336
 
337
+ def file_time2libsmb_time(file_time)
338
+ ## Discard fractional seconds
339
+ smb_time = Time.at(file_time.to_i)
340
+ ## Round up if fractional seconds is greater than 0.5
341
+ smb_time += 1 if (file_time - smb_time >= 0.5)
342
+ return smb_time
343
+ end
344
+
345
+ def test_smb_stat
346
+ smb = self.smb
347
+
348
+ smb.opendir(@@share_public) do |smbdir|
349
+ while dent = smbdir.read
350
+ next if (dent.name =~ /^\.\.?$/)
351
+
352
+ smb_stat = smb.stat(dent.url)
353
+ file_stat = File.stat(@@share_dir + '/' + dent.name)
354
+
355
+ assert_kind_of(Integer, smb_stat.dev, "Net::SMB::Stat#dev #{dent.name}")
356
+ assert_kind_of(Integer, smb_stat.ino, "Net::SMB::Stat#ino #{dent.name}")
357
+ assert_kind_of(Integer, smb_stat.nlink, "Net::SMB::Stat#nlink #{dent.name}")
358
+ #assert_equal(file_stat.mode, smb_stat.mode, "Net::SMB::Stat#mode #{dent.name}")
359
+ assert_equal(file_stat.uid, smb_stat.uid, "Net::SMB::Stat#uid #{dent.name}")
360
+ assert_equal(file_stat.gid, smb_stat.gid, "Net::SMB::Stat#gid #{dent.name}")
361
+ if (dent.dir?)
362
+ assert_equal(0, smb_stat.size, "Net::SMB::Stat#size #{dent.name}")
363
+ else
364
+ assert_equal(file_stat.size, smb_stat.size, "Net::SMB::Stat#size #{dent.name}")
365
+ end
366
+ assert_equal(file_time2libsmb_time(file_stat.atime), smb_stat.atime,
367
+ "Net::SMB::Stat#atime #{dent.name}")
368
+ assert_equal(file_time2libsmb_time(file_stat.mtime), smb_stat.mtime,
369
+ "Net::SMB::Stat#mtime #{dent.name}")
370
+ assert_equal(file_time2libsmb_time(file_stat.ctime), smb_stat.ctime,
371
+ "Net::SMB::Stat#ctime #{dent.name}")
372
+ end
373
+ end
374
+ end
375
+
376
+ def test_smbfile_stat
377
+ smb = self.smb
378
+
379
+ smb.opendir(@@share_public) do |smbdir|
380
+ while dent = smbdir.read
381
+ next if (dent.name =~ /^\.\.?$/)
382
+ next if (dent.name =~ /\.noaccess$/)
383
+
384
+ smb_stat = nil
385
+ if (dent.dir?)
386
+ smb.opendir(dent.url) do |smb_dir|
387
+ smb_stat = smb_dir.stat
388
+ end
389
+ else
390
+ smb.open(dent.url) do |smb_file|
391
+ smb_stat = smb_file.stat
392
+ end
393
+ end
394
+
395
+ file_stat = File.stat(@@share_dir + '/' + dent.name)
396
+
397
+ assert_kind_of(Integer, smb_stat.dev, "Net::SMB::Stat#dev #{dent.name}")
398
+ assert_kind_of(Integer, smb_stat.ino, "Net::SMB::Stat#ino #{dent.name}")
399
+ assert_kind_of(Integer, smb_stat.nlink, "Net::SMB::Stat#nlink #{dent.name}")
400
+ #assert_equal(file_stat.mode, smb_stat.mode, "Net::SMB::Stat#mode #{dent.name}")
401
+ assert_equal(file_stat.uid, smb_stat.uid, "Net::SMB::Stat#uid #{dent.name}")
402
+ assert_equal(file_stat.gid, smb_stat.gid, "Net::SMB::Stat#gid #{dent.name}")
403
+ if (dent.dir?)
404
+ assert_equal(0, smb_stat.size, "Net::SMB::Stat#size #{dent.name}")
405
+ else
406
+ assert_equal(file_stat.size, smb_stat.size, "Net::SMB::Stat#size #{dent.name}")
407
+ end
408
+ assert_equal(file_time2libsmb_time(file_stat.atime), smb_stat.atime,
409
+ "Net::SMB::Stat#atime #{dent.name}")
410
+ assert_equal(file_time2libsmb_time(file_stat.mtime), smb_stat.mtime,
411
+ "Net::SMB::Stat#mtime #{dent.name}")
412
+ assert_equal(file_time2libsmb_time(file_stat.ctime), smb_stat.ctime,
413
+ "Net::SMB::Stat#ctime #{dent.name}")
414
+ end
415
+ end
416
+ end
417
+
323
418
  def test_file_open_read_close
324
419
  smb = self.smb
325
420
 
326
- @files_readable.each do |filename|
327
- url = @share_public + '/' + filename
421
+ @@files_readable.each do |filename|
422
+ url = @@share_public + '/' + filename
328
423
  smbfile = smb.open(url)
329
424
 
330
425
  assert_equal(url, smbfile.url)
@@ -333,21 +428,35 @@ class SMBTest < Test::Unit::TestCase
333
428
  smbfile.read(-1)
334
429
  end
335
430
 
336
- assert_equal(@file_readable, smbfile.read)
431
+ assert_equal(@@file_readable, smbfile.read)
337
432
 
433
+ assert_equal(false, smbfile.closed?)
338
434
  smbfile.close
435
+ assert_equal(true, smbfile.closed?)
339
436
 
340
437
  assert_raise(IOError) do
341
438
  smbfile.close
342
439
  end
440
+ assert_raise(IOError) do
441
+ smbfile.read(1)
442
+ end
443
+ assert_raise(IOError) do
444
+ smbfile.pos
445
+ end
446
+ assert_raise(IOError) do
447
+ smbfile.seek(0)
448
+ end
449
+ assert_raise(IOError) do
450
+ smbfile.eof?
451
+ end
343
452
  end
344
453
  end ## test_file_open_read_close
345
454
 
346
455
  def test_file_read_sequential
347
456
  smb = self.smb
348
457
 
349
- file = File.open(@share_dir + '/' + @file_large)
350
- smbfile = smb.open(@share_public + '/' + @file_large)
458
+ file = File.open(@@share_dir + '/' + @@file_large)
459
+ smbfile = smb.open(@@share_public + '/' + @@file_large)
351
460
 
352
461
  buffer_size = smbfile.read_buffer_size
353
462
  [
@@ -374,11 +483,11 @@ class SMBTest < Test::Unit::TestCase
374
483
  def test_file_read_eof
375
484
  smb = self.smb
376
485
 
377
- smbfile = smb.open(@share_public + '/' + @file_readable)
486
+ smbfile = smb.open(@@share_public + '/' + @@file_readable)
378
487
 
379
- assert(smbfile.eof? != true)
488
+ assert_equal(false, smbfile.eof?)
380
489
  smbfile.read
381
- assert(smbfile.eof? == true)
490
+ assert_equal(true, smbfile.eof?)
382
491
 
383
492
  assert_equal("", smbfile.read)
384
493
  assert_equal("", smbfile.read(0))
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.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-19 00:00:00.000000000 Z
12
+ date: 2013-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake-compiler
@@ -36,11 +36,13 @@ extensions:
36
36
  extra_rdoc_files: []
37
37
  files:
38
38
  - .gitignore
39
+ - CHANGES
39
40
  - Gemfile
40
41
  - Makefile
41
42
  - README.md
42
43
  - Rakefile
43
44
  - Rakefile.local.example
45
+ - ext/net_smb/depend
44
46
  - ext/net_smb/dlinklist.h
45
47
  - ext/net_smb/extconf.rb
46
48
  - ext/net_smb/rb_smb.h
@@ -48,6 +50,7 @@ files:
48
50
  - ext/net_smb/smbdir.c
49
51
  - ext/net_smb/smbdirentry.c
50
52
  - ext/net_smb/smbfile.c
53
+ - ext/net_smb/smbstat.c
51
54
  - lib/net/smb.rb
52
55
  - lib/net/smb/version.rb
53
56
  - net-smb.gemspec
@@ -65,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - ! '>='
67
70
  - !ruby/object:Gem::Version
68
- version: '0'
71
+ version: 1.9.2
69
72
  required_rubygems_version: !ruby/object:Gem::Requirement
70
73
  none: false
71
74
  requirements: