diff options
| author | Shekhar Amlekar <samlekar@in.ibm.com> | 2014-01-08 11:32:21 +0530 |
|---|---|---|
| committer | Jeremy Allison <jra@samba.org> | 2014-01-17 14:12:58 -0800 |
| commit | de899754ac201c8a63646e1bc684f2a6a6e5c821 (patch) | |
| tree | c56048a73550b49e305fa926bd1c1974df3a8201 /source3/rpc_server/srvsvc | |
| parent | 090f010006a0105a070ee4e0347a877814200d19 (diff) | |
| download | samba-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.c | 55 |
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. ********************************************************************/ |
