diff --git a/source/include/proto.h b/source/include/proto.h index 98cb20b12a1..ad5fd558cf7 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -562,6 +562,7 @@ char *client_addr(int fd); BOOL get_connection_status(struct connect_record **crec, uint32 *connection_count); +BOOL get_session_count(struct connect_record **srec,uint32 *session_count); /*The following definitions come from lib/util_str.c */ @@ -3225,6 +3226,16 @@ void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action, SRV_FILE_INFO_3 *ctr); void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, SRV_FILE_INFO_CTR *ctr); +void display_sess_info_0(FILE *out_hnd, enum action_type action, + SESS_INFO_0 *info0, SESS_INFO_0_STR *str0); +void display_sess_info_1(FILE *out_hnd, enum action_type action, + SESS_INFO_1 *info1, SESS_INFO_1_STR *str1); +void display_srv_sess_info_0_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_0 *ctr); +void display_srv_sess_info_1_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_1 *ctr); +void display_srv_sess_info_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_CTR *ctr); void display_server(FILE *out_hnd, enum action_type action, char *sname, uint32 type, char *comment); void display_share(FILE *out_hnd, enum action_type action, diff --git a/source/rpcclient/cmd_srvsvc.c b/source/rpcclient/cmd_srvsvc.c index 477e68561c1..c433908e202 100644 --- a/source/rpcclient/cmd_srvsvc.c +++ b/source/rpcclient/cmd_srvsvc.c @@ -258,6 +258,13 @@ void cmd_srv_enum_sess(struct client_info *info) res = res ? do_srv_net_srv_sess_enum(smb_cli, nt_pipe_fnum, dest_srv, NULL, NULL, info_level, &ctr, 0x1000, &hnd) : False; + if (res) + { + display_srv_sess_info_ctr(out_hnd, ACTION_HEADER , &ctr); + display_srv_sess_info_ctr(out_hnd, ACTION_ENUMERATE, &ctr); + display_srv_sess_info_ctr(out_hnd, ACTION_FOOTER , &ctr); + } + /* close the session */ cli_nt_session_close(smb_cli, nt_pipe_fnum); diff --git a/source/rpcclient/display.c b/source/rpcclient/display.c index fd876c54328..55010390b49 100644 --- a/source/rpcclient/display.c +++ b/source/rpcclient/display.c @@ -785,6 +785,202 @@ void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, } } +/**************************************************************************** +sess info level 0 display function +****************************************************************************/ +void display_sess_info_0(FILE *out_hnd, enum action_type action, + SESS_INFO_0 *info0, SESS_INFO_0_STR *str0) +{ + if (info0 == NULL || str0 == NULL) + { + return; + } + + switch (action) + { + case ACTION_HEADER: + { + fprintf(out_hnd, "Session Info Level 0:\n"); + + break; + } + case ACTION_ENUMERATE: + { + fstring name; + + unistr2_to_ascii(name, &str0->uni_name, + sizeof(name)-1); + + fprintf(out_hnd, "\tname:\t%s\n", name); + + break; + } + case ACTION_FOOTER: + { + fprintf(out_hnd, "\n"); + break; + } + } + +} + +/**************************************************************************** +sess info level 1 display function +****************************************************************************/ +void display_sess_info_1(FILE *out_hnd, enum action_type action, + SESS_INFO_1 *info1, SESS_INFO_1_STR *str1) +{ + if (info1 == NULL || str1 == NULL) + { + return; + } + + switch (action) + { + case ACTION_HEADER: + { + fprintf(out_hnd, "Session Info Level 1:\n"); + + break; + } + case ACTION_ENUMERATE: + { + fstring name; + fstring user_name; + + unistr2_to_ascii(user_name, &str1->uni_user, + sizeof(user_name)-1); + unistr2_to_ascii(name, &str1->uni_name, + sizeof(name)-1); + + fprintf(out_hnd, "\tname:\t%s\n", name); + + fprintf(out_hnd, "\topen :\t%d\n", info1->num_opens); + fprintf(out_hnd, "\ttime :\t%d\n", info1->open_time); + fprintf(out_hnd, "\tidle :\t%d\n", info1->idle_time); + fprintf(out_hnd, "\tflags:\t%d\n", info1->user_flags); + + fprintf(out_hnd, "\tuser :\t%s\n", user_name); + + break; + } + case ACTION_FOOTER: + { + fprintf(out_hnd, "\n"); + break; + } + } + +} + +/**************************************************************************** +sess info level 0 container display function +****************************************************************************/ +void display_srv_sess_info_0_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_0 *ctr) +{ + if (ctr == NULL) + { + fprintf(out_hnd, "display_srv_sess_info_0_ctr: unavailable due to an internal error\n"); + return; + } + + switch (action) + { + case ACTION_HEADER: + { + break; + } + case ACTION_ENUMERATE: + { + int i; + + for (i = 0; i < ctr->num_entries_read; i++) + { + display_sess_info_0(out_hnd, ACTION_HEADER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); + display_sess_info_0(out_hnd, ACTION_ENUMERATE, &(ctr->info_0[i]), &(ctr->info_0_str[i])); + display_sess_info_0(out_hnd, ACTION_FOOTER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); + } + break; + } + case ACTION_FOOTER: + { + break; + } + } +} + +/**************************************************************************** +sess info level 1 container display function +****************************************************************************/ +void display_srv_sess_info_1_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_1 *ctr) +{ + if (ctr == NULL) + { + fprintf(out_hnd, "display_srv_sess_info_1_ctr: unavailable due to an internal error\n"); + return; + } + + switch (action) + { + case ACTION_HEADER: + { + break; + } + case ACTION_ENUMERATE: + { + int i; + + for (i = 0; i < ctr->num_entries_read; i++) + { + display_sess_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); + display_sess_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i])); + display_sess_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); + } + break; + } + case ACTION_FOOTER: + { + break; + } + } +} + +/**************************************************************************** +sess info container display function +****************************************************************************/ +void display_srv_sess_info_ctr(FILE *out_hnd, enum action_type action, + SRV_SESS_INFO_CTR *ctr) +{ + if (ctr == NULL || ctr->ptr_sess_ctr == 0) + { + fprintf(out_hnd, "display_srv_sess_info_ctr: unavailable due to an internal error\n"); + return; + } + + switch (ctr->switch_value) + { + case 0: + { + display_srv_sess_info_0_ctr(out_hnd, action, + &(ctr->sess.info0)); + break; + } + case 1: + { + display_srv_sess_info_1_ctr(out_hnd, action, + &(ctr->sess.info1)); + break; + } + default: + { + fprintf(out_hnd, "display_srv_sess_info_ctr: Unknown Info Level\n"); + break; + } + } +} + /**************************************************************************** print browse connection on a host ****************************************************************************/