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 "gtk/common/gtk-smb.h"
25 static GtkWidget *mainwin;
26 static GtkWidget *entry_binding;
27 static GtkTreeStore *store_eps;
29 static void on_quit1_activate (GtkMenuItem *menuitem, gpointer user_data)
35 static void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data)
37 GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gepdump"));
38 gtk_dialog_run(aboutwin);
39 gtk_widget_destroy(GTK_WIDGET(aboutwin));
42 static const char *get_protocol_name(enum epm_protocols protocol)
45 case EPM_PROTOCOL_UUID: return "UUID";
46 case EPM_PROTOCOL_NCACN: return "NCACN";
47 case EPM_PROTOCOL_NCALRPC: return "NCALRPC";
48 case EPM_PROTOCOL_NCADG: return "NCADG";
49 case EPM_PROTOCOL_IP: return "IP";
50 case EPM_PROTOCOL_TCP: return "TCP";
51 case EPM_PROTOCOL_NETBIOS: return "NetBIOS";
52 case EPM_PROTOCOL_SMB: return "SMB";
53 case EPM_PROTOCOL_PIPE: return "PIPE";
54 case EPM_PROTOCOL_UNIX_DS: return "Unix";
55 default: return "Unknown";
59 static void add_epm_entry(TALLOC_CTX *mem_ctx, const char *annotation, struct epm_tower *t)
61 struct dcerpc_binding bd;
64 GtkTreeIter toweriter;
66 status = dcerpc_binding_from_tower(mem_ctx, t, &bd);
67 if (!NT_STATUS_IS_OK(status)) {
68 gtk_show_ntstatus(mainwin, status);
72 /* Don't show UUID's */
73 ZERO_STRUCT(bd.object);
75 gtk_tree_store_append(store_eps, &toweriter, NULL);
76 gtk_tree_store_set(store_eps, &toweriter, 0, strdup(annotation), 1, strdup(dcerpc_binding_string(mem_ctx, &bd)), -1);
78 for (i = 0; i < t->num_floors; i++) {
81 gtk_tree_store_append(store_eps, &iter, &toweriter);
83 if (t->floors[i].lhs.protocol == EPM_PROTOCOL_UUID) {
84 data = GUID_string(mem_ctx, &t->floors[i].lhs.info.uuid.uuid);
86 data = dcerpc_floor_get_rhs_data(mem_ctx, &t->floors[i]);
89 gtk_tree_store_set(store_eps, &iter, 0, get_protocol_name(t->floors[i].lhs.protocol), 1, data, -1);
93 static void on_dump_clicked (GtkButton *btn, gpointer user_data)
98 struct rpc_if_id_t iface;
99 struct policy_handle handle;
100 struct dcerpc_pipe *p;
101 TALLOC_CTX *mem_ctx = talloc_init("dump");
103 status = dcerpc_pipe_connect(&p, gtk_entry_get_text(GTK_ENTRY(entry_binding)), DCERPC_EPMAPPER_UUID, DCERPC_EPMAPPER_VERSION, lp_workgroup(), NULL, NULL);
105 if (NT_STATUS_IS_ERR(status)) {
106 gtk_show_ntstatus(mainwin, status);
107 talloc_destroy(mem_ctx);
115 r.in.inquiry_type = 0;
117 r.in.interface_id = &iface;
118 r.in.vers_option = 0;
119 r.in.entry_handle = &handle;
120 r.out.entry_handle = &handle;
123 gtk_tree_store_clear(store_eps);
127 status = dcerpc_epm_Lookup(p, mem_ctx, &r);
128 if (!NT_STATUS_IS_OK(status) || r.out.result != 0) {
131 for (i=0;i<r.out.num_ents;i++) {
132 add_epm_entry(mem_ctx, r.out.entries[i].annotation, &r.out.entries[i].tower->tower);
134 } while (NT_STATUS_IS_OK(status) &&
136 r.out.num_ents == r.in.max_ents);
138 if (!NT_STATUS_IS_OK(status)) {
139 gtk_show_ntstatus(mainwin, status);
140 talloc_destroy(mem_ctx);
143 talloc_destroy(mem_ctx);
146 static void on_select_target_clicked(GtkButton *btn, gpointer user_data)
148 GtkRpcBindingDialog *d;
150 struct dcerpc_binding *bd;
153 d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(TRUE, NULL));
154 result = gtk_dialog_run(GTK_DIALOG(d));
156 case GTK_RESPONSE_ACCEPT:
159 gtk_widget_destroy(GTK_WIDGET(d));
163 mem_ctx = talloc_init("select_target");
164 bd = gtk_rpc_binding_dialog_get_binding (d, mem_ctx),
165 gtk_entry_set_text(GTK_ENTRY(entry_binding), dcerpc_binding_string(mem_ctx, bd));
166 talloc_destroy(mem_ctx);
167 gtk_widget_destroy(GTK_WIDGET(d));
170 static GtkWidget* create_mainwindow (void)
172 GtkWidget *mainwindow;
175 GtkWidget *menuitem1;
176 GtkWidget *menuitem1_menu;
178 GtkWidget *menuitem4;
179 GtkWidget *menuitem4_menu;
181 GtkWidget *handlebox1;
184 GtkWidget *btn_select_target;
186 GtkWidget *scrolledwindow1;
188 GtkTreeViewColumn *curcol;
189 GtkCellRenderer *renderer;
190 GtkWidget *statusbar;
191 GtkAccelGroup *accel_group;
193 accel_group = gtk_accel_group_new ();
195 mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
196 gtk_window_set_title (GTK_WINDOW (mainwindow), "Gtk+ Endpoint Mapper Viewer");
198 vbox1 = gtk_vbox_new (FALSE, 0);
199 gtk_widget_show (vbox1);
200 gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
202 menubar1 = gtk_menu_bar_new ();
203 gtk_widget_show (menubar1);
204 gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
206 menuitem1 = gtk_menu_item_new_with_mnemonic ("_File");
207 gtk_widget_show (menuitem1);
208 gtk_container_add (GTK_CONTAINER (menubar1), menuitem1);
210 menuitem1_menu = gtk_menu_new ();
211 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu);
213 quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
214 gtk_widget_show (quit1);
215 gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit1);
217 menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help");
218 gtk_widget_show (menuitem4);
219 gtk_container_add (GTK_CONTAINER (menubar1), menuitem4);
221 menuitem4_menu = gtk_menu_new ();
222 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
224 about1 = gtk_menu_item_new_with_mnemonic ("_About");
225 gtk_widget_show (about1);
226 gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1);
228 handlebox1 = gtk_handle_box_new ();
229 gtk_widget_show (handlebox1);
230 gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
232 hbox1 = gtk_hbox_new (FALSE, 0);
233 gtk_widget_show (hbox1);
234 gtk_container_add (GTK_CONTAINER (handlebox1), hbox1);
236 label1 = gtk_label_new ("Location:");
237 gtk_widget_show (label1);
238 gtk_box_pack_start (GTK_BOX (hbox1), label1, FALSE, FALSE, 0);
240 entry_binding = gtk_entry_new ();
241 gtk_entry_set_text(GTK_ENTRY(entry_binding), "ncalrpc:");
242 gtk_widget_show (entry_binding);
243 gtk_box_pack_start (GTK_BOX (hbox1), entry_binding, FALSE, FALSE, 0);
245 btn_select_target = gtk_button_new_with_mnemonic ("_Select Target");
246 gtk_widget_show (btn_select_target);
247 gtk_box_pack_start (GTK_BOX (hbox1), btn_select_target, FALSE, FALSE, 0);
249 btn_dump = gtk_button_new_with_mnemonic ("_Dump");
250 gtk_widget_show (btn_dump);
251 gtk_box_pack_start (GTK_BOX (hbox1), btn_dump, FALSE, FALSE, 0);
253 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
254 gtk_widget_show (scrolledwindow1);
255 gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
257 tree_eps = gtk_tree_view_new ();
259 curcol = gtk_tree_view_column_new ();
260 gtk_tree_view_column_set_title(curcol, "Name");
261 renderer = gtk_cell_renderer_text_new();
262 gtk_tree_view_column_pack_start(curcol, renderer, True);
264 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
265 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
267 curcol = gtk_tree_view_column_new ();
268 gtk_tree_view_column_set_title(curcol, "Binding String");
269 renderer = gtk_cell_renderer_text_new();
270 gtk_tree_view_column_pack_start(curcol, renderer, True);
271 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
274 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
276 store_eps = gtk_tree_store_new(2, GTK_TYPE_STRING, GTK_TYPE_STRING);
277 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_eps), GTK_TREE_MODEL(store_eps));
278 g_object_unref(store_eps);
280 gtk_widget_show (tree_eps);
281 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_eps);
283 statusbar = gtk_statusbar_new ();
284 gtk_widget_show (statusbar);
285 gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
287 g_signal_connect ((gpointer) quit1, "activate",
288 G_CALLBACK (on_quit1_activate),
290 g_signal_connect ((gpointer) about1, "activate",
291 G_CALLBACK (on_about1_activate),
293 g_signal_connect ((gpointer) btn_select_target, "clicked",
294 G_CALLBACK (on_select_target_clicked),
296 g_signal_connect ((gpointer) btn_dump, "clicked",
297 G_CALLBACK (on_dump_clicked),
300 gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
306 int main(int argc, char **argv)
308 gtk_init(&argc, &argv);
309 mainwin = create_mainwindow();
310 gtk_widget_show(mainwin);