2 Unix SMB/CIFS implementation.
3 GTK+ Endpoint Mapper frontend
5 Copyright (C) Jelmer Vernooij 2004
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "dynconfig.h"
24 #include "librpc/gen_ndr/ndr_epmapper.h"
25 #include "librpc/gen_ndr/ndr_mgmt.h"
26 #include "gtk/common/select.h"
27 #include "gtk/common/gtk-smb.h"
32 * - Available interfaces
33 * - Per interface: available endpoints
34 * - Per interface auth details
37 static GtkWidget *mainwin;
38 static GtkTreeStore *store_eps;
39 static GtkWidget *table_statistics;
40 static GtkWidget *lbl_calls_in, *lbl_calls_out, *lbl_pkts_in, *lbl_pkts_out;
41 static GtkWidget *lbl_iface_version, *lbl_iface_uuid, *lbl_iface_name;
42 TALLOC_CTX *eps_ctx = NULL;
43 TALLOC_CTX *conn_ctx = NULL;
45 struct dcerpc_pipe *epmapper_pipe;
46 struct dcerpc_pipe *mgmt_pipe;
48 static void on_quit1_activate (GtkMenuItem *menuitem, gpointer user_data)
54 static void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data)
56 GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gepdump"));
57 gtk_dialog_run(aboutwin);
58 gtk_widget_destroy(GTK_WIDGET(aboutwin));
61 static const char *get_protocol_name(enum epm_protocol protocol)
64 case EPM_PROTOCOL_UUID: return "UUID";
65 case EPM_PROTOCOL_NCACN: return "NCACN";
66 case EPM_PROTOCOL_NCALRPC: return "NCALRPC";
67 case EPM_PROTOCOL_NCADG: return "NCADG";
68 case EPM_PROTOCOL_IP: return "IP";
69 case EPM_PROTOCOL_TCP: return "TCP";
70 case EPM_PROTOCOL_NETBIOS: return "NetBIOS";
71 case EPM_PROTOCOL_SMB: return "SMB";
72 case EPM_PROTOCOL_PIPE: return "PIPE";
73 case EPM_PROTOCOL_UNIX_DS: return "Unix";
74 default: return "Unknown";
78 static void add_epm_entry(TALLOC_CTX *mem_ctx, const char *annotation, struct epm_tower *t)
80 struct dcerpc_binding *bd;
83 GtkTreeIter toweriter;
85 status = dcerpc_binding_from_tower(mem_ctx, t, &bd);
86 if (!NT_STATUS_IS_OK(status)) {
87 gtk_show_ntstatus(mainwin, status);
91 /* Don't show UUID's */
92 ZERO_STRUCT(bd->object);
94 gtk_tree_store_append(store_eps, &toweriter, NULL);
95 gtk_tree_store_set(store_eps, &toweriter, 0, strdup(annotation), 1, strdup(dcerpc_binding_string(mem_ctx, bd)), 2, t, -1);
97 for (i = 0; i < t->num_floors; i++) {
102 gtk_tree_store_append(store_eps, &iter, &toweriter);
104 dcerpc_floor_get_lhs_data(&t->floors[i], &if_uuid, &if_version);
105 if (t->floors[i].lhs.protocol == EPM_PROTOCOL_UUID) {
106 data = GUID_string(mem_ctx, &if_uuid);
108 data = dcerpc_floor_get_rhs_data(mem_ctx, &t->floors[i]);
111 gtk_tree_store_set(store_eps, &iter, 0, get_protocol_name(t->floors[i].lhs.protocol), 1, data, -1);
115 static void refresh_eps(void)
120 struct rpc_if_id_t iface;
121 struct policy_handle handle;
122 TALLOC_CTX *mem_ctx = talloc_init("dump");
124 talloc_free(eps_ctx);
128 r.in.inquiry_type = 0;
130 r.in.interface_id = &iface;
131 r.in.vers_option = 0;
132 r.in.entry_handle = r.out.entry_handle = &handle;
135 gtk_tree_store_clear(store_eps);
137 eps_ctx = talloc_init("current endpoint list data");
144 status = dcerpc_epm_Lookup(epmapper_pipe, eps_ctx, &r);
145 if (!NT_STATUS_IS_OK(status) || r.out.result != 0) {
148 for (i=0;i<r.out.num_ents;i++) {
149 add_epm_entry(mem_ctx, r.out.entries[i].annotation, &r.out.entries[i].tower->tower);
152 } while (NT_STATUS_IS_OK(status) &&
154 r.out.num_ents == r.in.max_ents);
156 if (!NT_STATUS_IS_OK(status)) {
157 gtk_show_ntstatus(mainwin, status);
158 talloc_free(mem_ctx);
161 talloc_free(mem_ctx);
164 static void on_refresh_clicked (GtkButton *btn, gpointer user_data)
169 static void on_connect_clicked(GtkButton *btn, gpointer user_data)
171 GtkRpcBindingDialog *d;
177 d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(TRUE, NULL));
178 result = gtk_dialog_run(GTK_DIALOG(d));
180 case GTK_RESPONSE_ACCEPT:
183 gtk_widget_destroy(GTK_WIDGET(d));
187 mem_ctx = talloc_init("connect");
188 bs = gtk_rpc_binding_dialog_get_binding_string (d, mem_ctx);
190 status = dcerpc_pipe_connect(&epmapper_pipe, bs,
191 DCERPC_EPMAPPER_UUID, DCERPC_EPMAPPER_VERSION,
192 lp_netbios_name(), lp_workgroup(), "", "");
194 if (NT_STATUS_IS_ERR(status)) {
195 gtk_show_ntstatus(mainwin, status);
201 status = dcerpc_secondary_context(epmapper_pipe, &mgmt_pipe, DCERPC_MGMT_UUID, DCERPC_MGMT_VERSION);
203 if (NT_STATUS_IS_ERR(status)) {
205 gtk_show_ntstatus(NULL, status);
210 gtk_widget_destroy(GTK_WIDGET(d));
213 static gboolean on_eps_select(GtkTreeSelection *selection,
214 GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data)
219 if (mgmt_pipe == NULL)
222 mem_ctx = talloc_init("eps");
225 /* Do an InqStats call */
226 struct mgmt_inq_stats r;
228 r.in.max_count = MGMT_STATS_ARRAY_MAX_SIZE;
231 status = dcerpc_mgmt_inq_stats(mgmt_pipe, mem_ctx, &r);
232 if (NT_STATUS_IS_ERR(status)) {
233 gtk_show_ntstatus(NULL, status);
237 if (r.out.statistics.count != MGMT_STATS_ARRAY_MAX_SIZE) {
238 printf("Unexpected array size %d\n", r.out.statistics.count);
242 gtk_label_set_text(GTK_LABEL(lbl_calls_in), talloc_asprintf(mem_ctx, "%6d", r.out.statistics.statistics[MGMT_STATS_CALLS_IN]));
243 gtk_label_set_text(GTK_LABEL(lbl_calls_out), talloc_asprintf(mem_ctx, "%6d", r.out.statistics.statistics[MGMT_STATS_CALLS_OUT]));
244 gtk_label_set_text(GTK_LABEL(lbl_pkts_in), talloc_asprintf(mem_ctx, "%6d", r.out.statistics.statistics[MGMT_STATS_PKTS_IN]));
245 gtk_label_set_text(GTK_LABEL(lbl_pkts_out), talloc_asprintf(mem_ctx, "%6d", r.out.statistics.statistics[MGMT_STATS_PKTS_OUT]));
249 struct mgmt_inq_princ_name r;
252 for (i=0;i<100;i++) {
253 r.in.authn_proto = i; /* DCERPC_AUTH_TYPE_* */
254 r.in.princ_name_size = 100;
256 status = dcerpc_mgmt_inq_princ_name(mgmt_pipe, mem_ctx, &r);
257 if (!NT_STATUS_IS_OK(status)) {
260 if (W_ERROR_IS_OK(r.out.result)) {
261 const char *name = gensec_get_name_by_authtype(i);
263 printf("\tprinciple name for proto %u (%s) is '%s'\n",
264 i, name, r.out.princ_name);
266 printf("\tprinciple name for proto %u is '%s'\n",
267 i, r.out.princ_name);
277 static GtkWidget* create_mainwindow (void)
279 GtkWidget *mainwindow;
280 GtkWidget *vbox1, *vbox2, *vbox3;
282 GtkWidget *menuitem1;
283 GtkWidget *menuitem1_menu;
285 GtkWidget *menuitem4;
286 GtkWidget *menuitem4_menu;
287 GtkWidget *mnu_connect;
288 GtkWidget *mnu_refresh;
291 GtkWidget *scrolledwindow1;
294 GtkTreeViewColumn *curcol;
295 GtkCellRenderer *renderer;
296 GtkWidget *statusbar;
297 GtkAccelGroup *accel_group;
299 accel_group = gtk_accel_group_new ();
301 mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
302 gtk_window_set_title (GTK_WINDOW (mainwindow), "Gtk+ Endpoint Mapper Viewer");
304 vbox1 = gtk_vbox_new (FALSE, 0);
305 gtk_widget_show (vbox1);
306 gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
308 menubar1 = gtk_menu_bar_new ();
309 gtk_widget_show (menubar1);
310 gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
312 menuitem1 = gtk_menu_item_new_with_mnemonic ("_File");
313 gtk_widget_show (menuitem1);
314 gtk_container_add (GTK_CONTAINER (menubar1), menuitem1);
316 menuitem1_menu = gtk_menu_new ();
317 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu);
319 mnu_connect = gtk_menu_item_new_with_mnemonic ("_Connect");
320 gtk_container_add(GTK_CONTAINER(menuitem1_menu), mnu_connect);
322 mnu_refresh = gtk_menu_item_new_with_mnemonic ("_Refresh");
323 gtk_container_add(GTK_CONTAINER(menuitem1_menu), mnu_refresh);
325 quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
326 gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit1);
328 menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help");
329 gtk_container_add (GTK_CONTAINER (menubar1), menuitem4);
331 menuitem4_menu = gtk_menu_new ();
332 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
334 about1 = gtk_menu_item_new_with_mnemonic ("_About");
335 gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1);
337 hbox2 = gtk_hbox_new (FALSE, 0);
338 gtk_container_add (GTK_CONTAINER (vbox1), hbox2);
340 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
341 gtk_box_pack_start (GTK_BOX(hbox2), scrolledwindow1, TRUE, TRUE, 0);
343 tree_eps = gtk_tree_view_new ();
345 curcol = gtk_tree_view_column_new ();
346 gtk_tree_view_column_set_title(curcol, "Name");
347 renderer = gtk_cell_renderer_text_new();
348 gtk_tree_view_column_pack_start(curcol, renderer, True);
350 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
351 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
353 curcol = gtk_tree_view_column_new ();
354 gtk_tree_view_column_set_title(curcol, "Binding String");
355 renderer = gtk_cell_renderer_text_new();
356 gtk_tree_view_column_pack_start(curcol, renderer, True);
357 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
360 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
362 store_eps = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
363 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_eps), GTK_TREE_MODEL(store_eps));
364 g_object_unref(store_eps);
366 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_eps);
368 gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_eps)), on_eps_select, NULL, NULL);
370 vbox2 = gtk_vbox_new (FALSE, 0);
371 gtk_container_add (GTK_CONTAINER (hbox2), vbox2);
373 frame1 = gtk_frame_new("Interface");
374 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
376 vbox3 = gtk_vbox_new (FALSE, 0);
377 gtk_container_add (GTK_CONTAINER (frame1), vbox3);
378 gtk_container_add (GTK_CONTAINER (vbox3), lbl_iface_uuid = gtk_label_new(""));
379 gtk_container_add (GTK_CONTAINER (vbox3), lbl_iface_version = gtk_label_new(""));
380 gtk_container_add (GTK_CONTAINER (vbox3), lbl_iface_name = gtk_label_new(""));
382 frame1 = gtk_frame_new("Statistics");
383 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
385 table_statistics = gtk_table_new(4, 2, TRUE);
386 gtk_container_add (GTK_CONTAINER(frame1), table_statistics);
388 gtk_table_attach_defaults (GTK_TABLE(table_statistics), gtk_label_new("Calls In: "), 0, 1, 0, 1);
389 gtk_table_attach_defaults (GTK_TABLE(table_statistics), lbl_calls_in = gtk_label_new(""), 1, 2, 0, 1);
390 gtk_table_attach_defaults (GTK_TABLE(table_statistics), gtk_label_new("Calls Out: "), 0, 1, 1, 2);
391 gtk_table_attach_defaults (GTK_TABLE(table_statistics), lbl_calls_out = gtk_label_new(""), 1, 2, 1, 2);
392 gtk_table_attach_defaults (GTK_TABLE(table_statistics), gtk_label_new("Packets In: "), 0, 1, 2, 3);
393 gtk_table_attach_defaults (GTK_TABLE(table_statistics), lbl_pkts_in = gtk_label_new(""), 1, 2, 2, 3);
394 gtk_table_attach_defaults (GTK_TABLE(table_statistics), gtk_label_new("Packets Out: "), 0, 1, 3, 4);
395 gtk_table_attach_defaults (GTK_TABLE(table_statistics), lbl_pkts_out = gtk_label_new(""), 1, 2, 3, 4);
397 frame1 = gtk_frame_new("Authentication");
398 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
400 statusbar = gtk_statusbar_new ();
401 gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
403 g_signal_connect ((gpointer) quit1, "activate",
404 G_CALLBACK (on_quit1_activate),
406 g_signal_connect ((gpointer) about1, "activate",
407 G_CALLBACK (on_about1_activate),
409 g_signal_connect ((gpointer) mnu_connect, "activate",
410 G_CALLBACK (on_connect_clicked),
412 g_signal_connect ((gpointer) mnu_refresh, "activate",
413 G_CALLBACK (on_refresh_clicked),
416 gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
422 int main(int argc, char **argv)
424 gepdump_init_subsystems;
425 lp_load(dyn_CONFIGFILE,True,False,False);
427 setup_logging(argv[0], DEBUG_STDERR);
429 gtk_init(&argc, &argv);
430 mainwin = create_mainwindow();
431 gtk_widget_show_all(mainwin);
433 return gtk_event_loop();