summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/locking.h6
-rw-r--r--source3/locking/locking.c27
-rw-r--r--source3/rpc_server/srv_srvsvc_nt.c17
-rw-r--r--source3/utils/status.c7
-rw-r--r--source3/web/statuspage.c7
5 files changed, 41 insertions, 23 deletions
diff --git a/source3/include/locking.h b/source3/include/locking.h
index 8eabb305f7..9e70411fa6 100644
--- a/source3/include/locking.h
+++ b/source3/include/locking.h
@@ -67,12 +67,6 @@ struct byte_range_lock {
enum brl_flavour lock_flav, \
br_off start, br_off size)
-#define LOCKING_FN_CAST() \
- void (*)(struct share_mode_entry *, const char *, const char *)
-
-#define LOCKING_FN(fn) \
- void (*fn)(struct share_mode_entry *, const char *, const char *)
-
/* Internal structure in brlock.tdb.
The data in brlock records is an unsorted linear array of these
records. It is unnecessary to store the count as tdb provides the
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index a7cadd3a40..3cbf318007 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -1249,15 +1249,23 @@ BOOL set_delete_on_close(files_struct *fsp, BOOL delete_on_close, UNIX_USER_TOKE
return True;
}
+struct forall_state {
+ void (*fn)(const struct share_mode_entry *entry,
+ const char *sharepath,
+ const char *fname,
+ void *private_data);
+ void *private_data;
+};
+
static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
- void *state)
+ void *_state)
{
+ struct forall_state *state = (struct forall_state *)_state;
struct locking_data *data;
struct share_mode_entry *shares;
const char *sharepath;
const char *fname;
int i;
- LOCKING_FN(traverse_callback) = (LOCKING_FN_CAST())state;
/* Ensure this is a locking_key record. */
if (kbuf.dsize != sizeof(struct locking_key))
@@ -1274,7 +1282,8 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
strlen(sharepath) + 1;
for (i=0;i<data->u.s.num_share_mode_entries;i++) {
- traverse_callback(&shares[i], sharepath, fname);
+ state->fn(&shares[i], sharepath, fname,
+ state->private_data);
}
return 0;
}
@@ -1284,9 +1293,17 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
share mode system.
********************************************************************/
-int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *, const char *))
+int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
+ const char *, void *),
+ void *private_data)
{
+ struct forall_state state;
+
if (tdb == NULL)
return 0;
- return tdb_traverse(tdb, traverse_fn, (void *)fn);
+
+ state.fn = fn;
+ state.private_data = private_data;
+
+ return tdb_traverse(tdb, traverse_fn, (void *)&state);
}
diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c
index be4c51c0d2..e4e5bde215 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -123,7 +123,8 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info,
static struct file_enum_count f_enum_cnt;
static void enum_file_fn( const struct share_mode_entry *e,
- const char *sharepath, const char *fname )
+ const char *sharepath, const char *fname,
+ void *dummy )
{
struct file_enum_count *fenum = &f_enum_cnt;
@@ -191,7 +192,7 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info,
f_enum_cnt.count = *count;
f_enum_cnt.info = *info;
- share_mode_forall( enum_file_fn );
+ share_mode_forall( enum_file_fn, NULL );
*info = f_enum_cnt.info;
*count = f_enum_cnt.count;
@@ -802,13 +803,11 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto
/*******************************************************************
********************************************************************/
-/* global needed to make use of the share_mode_forall() callback */
-static struct sess_file_count s_file_cnt;
-
static void sess_file_fn( const struct share_mode_entry *e,
- const char *sharepath, const char *fname )
+ const char *sharepath, const char *fname,
+ void *private_data )
{
- struct sess_file_count *sess = &s_file_cnt;
+ struct sess_file_count *sess = (struct sess_file_count *)private_data;
if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) {
sess->count++;
@@ -822,11 +821,13 @@ static void sess_file_fn( const struct share_mode_entry *e,
static int net_count_files( uid_t uid, pid_t pid )
{
+ struct sess_file_count s_file_cnt;
+
s_file_cnt.count = 0;
s_file_cnt.uid = uid;
s_file_cnt.pid = pid;
- share_mode_forall( sess_file_fn );
+ share_mode_forall( sess_file_fn, (void *)&s_file_cnt );
return s_file_cnt.count;
}
diff --git a/source3/utils/status.c b/source3/utils/status.c
index 58349f1f9a..4f66501511 100644
--- a/source3/utils/status.c
+++ b/source3/utils/status.c
@@ -101,7 +101,10 @@ static BOOL Ucrit_addPid( pid_t pid )
return True;
}
-static void print_share_mode(const struct share_mode_entry *e, const char *sharepath, const char *fname)
+static void print_share_mode(const struct share_mode_entry *e,
+ const char *sharepath,
+ const char *fname,
+ void *dummy)
{
static int count;
@@ -369,7 +372,7 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo
exit(1);
}
- ret = share_mode_forall(print_share_mode);
+ ret = share_mode_forall(print_share_mode, NULL);
if (ret == 0) {
d_printf("No locked files\n");
diff --git a/source3/web/statuspage.c b/source3/web/statuspage.c
index cb6fa91171..459b679d81 100644
--- a/source3/web/statuspage.c
+++ b/source3/web/statuspage.c
@@ -106,7 +106,10 @@ static char *tstring(time_t t)
return buf;
}
-static void print_share_mode(const struct share_mode_entry *e, const char *sharepath, const char *fname)
+static void print_share_mode(const struct share_mode_entry *e,
+ const char *sharepath,
+ const char *fname,
+ void *dummy)
{
char *utf8_fname;
int deny_mode;
@@ -434,7 +437,7 @@ void status_page(void)
printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n", _("PID"), _("Sharing"), _("R/W"), _("Oplock"), _("File"), _("Date"));
locking_init(1);
- share_mode_forall(print_share_mode);
+ share_mode_forall(print_share_mode, NULL);
locking_end();
printf("</table>\n");