summaryrefslogtreecommitdiffstats
path: root/source3/rpc_server/srvsvc
diff options
context:
space:
mode:
authorShekhar Amlekar <samlekar@in.ibm.com>2014-01-08 11:32:21 +0530
committerJeremy Allison <jra@samba.org>2014-01-17 14:12:58 -0800
commitde899754ac201c8a63646e1bc684f2a6a6e5c821 (patch)
treec56048a73550b49e305fa926bd1c1974df3a8201 /source3/rpc_server/srvsvc
parent090f010006a0105a070ee4e0347a877814200d19 (diff)
downloadsamba-de899754ac201c8a63646e1bc684f2a6a6e5c821.tar.gz
samba-de899754ac201c8a63646e1bc684f2a6a6e5c821.tar.xz
samba-de899754ac201c8a63646e1bc684f2a6a6e5c821.zip
s3: rpc_server/srvsvc: Adding functions to determine open files on all sessions.
Introduce helper functions for counting the number of open files on an array of sessions. Signed-off-by: Shekhar Amlekar <samlekar@in.ibm.com> Reviewed-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source3/rpc_server/srvsvc')
-rw-r--r--source3/rpc_server/srvsvc/srv_srvsvc_nt.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index bb106caa53..e901550f61 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -60,6 +60,13 @@ struct sess_file_count {
int count;
};
+struct sess_file_info {
+ struct srvsvc_NetSessCtr1 *ctr;
+ struct sessionid *session_list;
+ uint32_t resume_handle;
+ uint32_t num_entries;
+};
+
/*******************************************************************
********************************************************************/
@@ -837,6 +844,54 @@ static int net_count_files( uid_t uid, struct server_id pid )
return s_file_cnt.count;
}
+/***********************************************************************
+ * find out the session on which this file is open and bump up its count
+ **********************************************************************/
+
+static void count_sess_files_fn(const struct share_mode_entry *e,
+ const char *sharepath, const char *fname,
+ void *data)
+{
+ struct sess_file_info *info = data;
+ uint32_t rh = info->resume_handle;
+ int i;
+
+ for (i=0; i < info->num_entries; i++) {
+ /* rh+info->num_entries is safe, as we've
+ ensured that:
+ *total_entries > resume_handle &&
+ info->num_entries = *total_entries - resume_handle;
+ inside init_srv_sess_info_1() below.
+ */
+ struct sessionid *sess = &info->session_list[rh + i];
+ if ((e->uid == sess->uid) &&
+ serverid_equal(&e->pid, &sess->pid)) {
+
+ info->ctr->array[i].num_open++;
+ return;
+ }
+ }
+}
+
+/*******************************************************************
+ * count the num of open files on all sessions
+ *******************************************************************/
+
+static void net_count_files_for_all_sess(struct srvsvc_NetSessCtr1 *ctr1,
+ struct sessionid *session_list,
+ uint32_t resume_handle,
+ uint32_t num_entries)
+{
+ struct sess_file_info s_file_info;
+
+ s_file_info.ctr = ctr1;
+ s_file_info.session_list = session_list;
+ s_file_info.resume_handle = resume_handle;
+ s_file_info.num_entries = num_entries;
+
+ share_mode_forall(count_sess_files_fn, &s_file_info);
+}
+
/*******************************************************************
fill in a sess info level 1 structure.
********************************************************************/