static VALUE rb_smbdir_initialize(VALUE self, VALUE smb_obj, VALUE url_obj) { RB_SMBFILE_DATA_FROM_OBJ(self, data); RB_SMB_DATA_FROM_OBJ(smb_obj, smb_data); smbc_opendir_fn fn; const char *url = StringValueCStr(url_obj); fn = smbc_getFunctionOpendir(smb_data->smbcctx); data->smbcfile = (*fn)(smb_data->smbcctx, url); if (data->smbcfile == NULL) { rb_sys_fail_str(url_obj); } /* FIXME: Take encoding from argument */ /* FIXME: Read unix charset (?) from smb.conf for default encoding */ data->enc = rb_enc_find("UTF-8"); data->smb_obj = smb_obj; data->smb_data = smb_data; data->smbcctx = smb_data->smbcctx; data->url = ruby_strdup(url); RB_SMB_DEBUG("smbcctx=%p smbcfile=%p\n", data->smbcctx, data->smbcfile); if (rb_block_given_p()) { return rb_ensure(rb_yield, self, rb_smbdir_close, self); } return self; }
static void rb_smbfile_read_by_data(RB_SMBFILE_DATA *data) { smbc_read_fn fn; ssize_t read_size; char *buffer = data->buffer + data->buffer_used_size; size_t buffer_size = data->buffer_size - data->buffer_used_size; if (buffer_size == 0) { /* Buffer is full */ if (data->buffer_pos < data->buffer_used_size) { /* But remained data exists */ return; } /* Rewind */ data->buffer_used_size = 0; data->buffer_pos = 0; buffer = data->buffer; buffer_size = data->buffer_size; } fn = smbc_getFunctionRead(data->smbcctx); try: read_size = (*fn)(data->smbcctx, data->smbcfile, buffer, buffer_size); if (read_size < 0) { if (errno != EBADF) { rb_sys_fail("Bad SMBCFILE"); } else { rb_smbfile_reopen_by_data(data); goto try; } } data->buffer_used_size += read_size; data->eof = (read_size == 0); } static VALUE rb_smbfile_close(VALUE self); static VALUE rb_smbfile_initialize(int argc, VALUE *argv, VALUE self) { RB_SMBFILE_DATA_FROM_OBJ(self, data); VALUE smb_obj, url_obj, mode_obj; rb_scan_args(argc, argv, "21", &smb_obj, &url_obj, &mode_obj); RB_SMB_DATA_FROM_OBJ(smb_obj, smb_data); if (NIL_P(mode_obj)) { data->fmode = FMODE_READABLE; // FIXME data->fmode = FMODE_READABLE | DEFAULT_TEXTMODE; data->oflags = O_RDONLY; } else if (FIXNUM_P(mode_obj)) { rb_raise(rb_eArgError, "FIXME"); data->fmode = 0; data->oflags = NUM2INT(mode_obj); } else { const char *mode_str = StringValueCStr(mode_obj); data->fmode = rb_io_modestr_fmode(mode_str); data->oflags = rb_io_modestr_oflags(mode_str); } data->smb_obj = smb_obj; data->smb_data = smb_data; data->smbcctx = smb_data->smbcctx; data->url = ruby_strdup(RSTRING_PTR(url_obj)); data->buffer = ruby_xmalloc(RB_SMBFILE_BUFFER_SIZE); data->buffer_size = RB_SMBFILE_BUFFER_SIZE; rb_smbfile_open_by_data(data); if (rb_block_given_p()) { return rb_ensure(rb_yield, self, rb_smbfile_close, self); } return self; }