static void rb_smbdir_close_and_deref_by_data(RB_SMBFILE_DATA *data) { RB_SMB_DEBUG("data=%p smbcctx=%p smbcfile=%p\n", data, data->smbcctx, data->smbcfile); rb_smbdir_close_by_data(data); data->smbcctx = NULL; data->smbcfile = NULL; DLIST_REMOVE(data->smb_data->smbfile_data_list, data); RB_SMB_DEBUG("smbfile_data_list=%p smbfile_data=%p\n", data->smb_data->smbfile_data_list, data); }
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_smbdir_data_free(RB_SMBFILE_DATA *data) { RB_SMB_DEBUG("data=%p smbcctx=%p smbcfile=%p\n", data, data->smbcctx, data->smbcfile); if (data->smbcfile != NULL) { rb_smbdir_close_and_deref_by_data(data); } ruby_xfree(data->url); ruby_xfree(data); }
static VALUE rb_smbdir_close(VALUE self) { RB_SMBFILE_DATA_FROM_OBJ(self, data); RB_SMBFILE_DATA_CLOSED(data); RB_SMB_DEBUG("data=%p smbcctx=%p smbcfile=%p\n", data, data->smbcctx, data->smbcfile); rb_smbdir_close_and_deref_by_data(data); return self; }
static void rb_smbfile_open_by_data(RB_SMBFILE_DATA *data) { smbc_open_fn fn = smbc_getFunctionOpen(data->smbcctx); data->smbcfile = (*fn)(data->smbcctx, data->url, data->oflags, data->fmode); if (data->smbcfile == NULL) { rb_sys_fail(data->url); } RB_SMB_DEBUG("smbcctx=%p smbcfile=%p\n", data->smbcctx, data->smbcfile); }