struct share_entry_forall_state {
struct file_id fid;
- const struct share_mode_data *data;
- int (*fn)(struct file_id fid,
- const struct share_mode_data *data,
- const struct share_mode_entry *entry,
- void *private_data);
+ struct share_mode_data *data;
+ int (*ro_fn)(struct file_id fid,
+ const struct share_mode_data *data,
+ const struct share_mode_entry *entry,
+ void *private_data);
+ int (*rw_fn)(struct file_id fid,
+ struct share_mode_data *data,
+ struct share_mode_entry *entry,
+ void *private_data);
void *private_data;
int ret;
};
struct share_entry_forall_state *state = private_data;
int ret;
- ret = state->fn(state->fid, state->data, e, state->private_data);
+ if (state->ro_fn != NULL) {
+ ret = state->ro_fn(state->fid,
+ state->data,
+ e,
+ state->private_data);
+ } else {
+ ret = state->rw_fn(state->fid,
+ state->data,
+ e,
+ state->private_data);
+ }
if (ret == 0) {
/* Continue the whole traverse */
return 0;
return 1;
}
-static int share_entry_traverse_fn(struct file_id fid,
- const struct share_mode_data *data,
- void *private_data)
+static int share_entry_ro_traverse_fn(struct file_id fid,
+ const struct share_mode_data *data,
+ void *private_data)
{
struct share_entry_forall_state *state = private_data;
struct share_mode_lock lck = {
};
bool ok;
+ state->fid = fid;
+ state->data = discard_const_p(struct share_mode_data, data);
+ state->ret = 0;
+
+ ok = share_mode_forall_entries(
+ &lck, share_entry_traverse_walker, state);
+ if (!ok) {
+ DBG_ERR("share_mode_forall_entries failed\n");
+ return false;
+ }
+
+ return state->ret;
+}
+
+static int share_entry_rw_traverse_fn(struct file_id fid,
+ struct share_mode_data *data,
+ void *private_data)
+{
+ struct share_entry_forall_state *state = private_data;
+ struct share_mode_lock lck = {
+ .id = fid,
+ .cached_data = data,
+ };
+ bool ok;
+
state->fid = fid;
state->data = data;
state->ret = 0;
Any other return value is treated as -1.
********************************************************************/
+int share_entry_forall_read(int (*fn)(struct file_id fid,
+ const struct share_mode_data *data,
+ const struct share_mode_entry *entry,
+ void *private_data),
+ void *private_data)
+{
+ struct share_entry_forall_state state = {
+ .ro_fn = fn,
+ .private_data = private_data,
+ };
+
+ return share_mode_forall_read(share_entry_ro_traverse_fn, &state);
+}
+
int share_entry_forall(int (*fn)(struct file_id fid,
- const struct share_mode_data *data,
- const struct share_mode_entry *entry,
+ struct share_mode_data *data,
+ struct share_mode_entry *entry,
void *private_data),
void *private_data)
{
struct share_entry_forall_state state = {
- .fn = fn,
+ .rw_fn = fn,
.private_data = private_data,
};
- return share_mode_forall_read(share_entry_traverse_fn, &state);
+ return share_mode_forall(share_entry_rw_traverse_fn, &state);
}
static int share_mode_entry_cmp(
TALLOC_CTX *mem_ctx,
struct share_mode_lock **_lck);
-int share_entry_forall(
- int (*fn)(struct file_id fid,
- const struct share_mode_data *data,
- const struct share_mode_entry *entry,
- void *private_data),
- void *private_data);
+int share_entry_forall_read(int (*ro_fn)(struct file_id fid,
+ const struct share_mode_data *data,
+ const struct share_mode_entry *entry,
+ void *private_data),
+ void *private_data);
+int share_entry_forall(int (*fn)(struct file_id fid,
+ struct share_mode_data *data,
+ struct share_mode_entry *entry,
+ void *private_data),
+ void *private_data);
NTSTATUS share_mode_count_entries(struct file_id fid, size_t *num_share_modes);
int share_mode_forall(
};
uint32_t i;
- share_entry_forall(enum_file_fn, (void *)&f_enum_cnt );
+ share_entry_forall_read(enum_file_fn, (void *)&f_enum_cnt );
*ctr3 = f_enum_cnt.ctr3;
s_file_info.resume_handle = resume_handle;
s_file_info.num_entries = num_entries;
- share_entry_forall(count_sess_files_fn, &s_file_info);
+ share_entry_forall_read(count_sess_files_fn, &s_file_info);
}
/*******************************************************************
sfs.resp_entries = resp_entries;
sfs.total_entries = total_entries;
- share_entry_forall(share_file_fn, &sfs);
+ share_entry_forall_read(share_file_fn, &sfs);
}
/****************************************************************************
r->out.result = WERR_FILE_NOT_FOUND;
state.r = r;
state.msg_ctx = p->msg_ctx;
- share_entry_forall(enum_file_close_fn, &state);
+ share_entry_forall_read(enum_file_close_fn, &state);
return r->out.result;
}