1 /* Config files tab */
2 #include "disk.h"
3 
4 GtkWidget *fc;			/* File choser combo box */
5 GtkWidget *bt;			/* Save button */
6 GtkTextBuffer *textbuf;
7 
8 
save_cb(GtkMenuItem * item,gpointer user_data)9 void save_cb (GtkMenuItem *item, gpointer user_data) {
10 
11 	char *cmd;
12 	char *filename;
13 	gchar *text;
14 	int len;
15 	GtkTextIter start;
16 	GtkTextIter end;
17 
18 //	gint len;
19 
20 	/* file location */
21 	filename = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (fc));
22 	if(filename == NULL)
23 		return;
24 
25 	/* File contents */
26 	gtk_text_buffer_get_bounds(textbuf, &start, &end);
27 	text = gtk_text_buffer_get_text(textbuf, &start, &end, FALSE);
28 
29 	/*
30 	 * Save the file.
31 	 * Since the sudo backend doesn't like multiple pipes,
32 	 * we just use a tempfile..
33 	 */
34 
35 	len = strlen(text) + strlen(filename) + 20;
36 	if(len <= 0) {
37 		msg("config.c: error in strlen.");
38 		return;
39 	}
40 
41 	cmd = malloc(len);
42 	if(cmd == NULL) {
43 		free(text);
44 		return;
45 	}
46 
47 	/* temporary save the file. */
48 	char *r = random_filename();
49 	sprintf(cmd, "echo \"%s\" > %s", text, r);
50 	submit(cmd, 0);
51 
52 	/* Move the copy. */
53 	sprintf(cmd, "mv %s %s", r, filename);
54 
55 	execute_me(cmd, USR);
56 	free(r);
57 	free(text);
58 	return;
59 }
60 
fc_entries(GtkWidget * fc)61 void fc_entries(GtkWidget *fc) {
62 
63 	/* cleanup */
64 	gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(fc));
65 
66 	/* System files */
67 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/boot/loader.conf");
68 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/etc/devd.conf");
69 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/etc/fstab");
70 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/etc/rc.conf");
71 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/etc/sysctl.conf");
72 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (fc), NULL, "/etc/wpa_supplicant.conf");
73 }
74 
show(char * filename)75 void show( char *filename) {
76 
77 	/* Show the selected file in the textview. */
78 
79 	char cmd[CMDSIZE];
80 	char *content;
81 
82 	snprintf(cmd, CMDSIZE, "cat %s", filename);
83 	content = command(cmd);
84 	if(content == NULL) {
85 		msg("File not found, or no read access on it.");
86 		return;
87 	}
88 
89 	gtk_text_buffer_set_text(textbuf, content, strlen(content));
90 	gtk_widget_show_all(configbox);
91 }
92 
fc_changed(GtkMenuItem * item,gpointer user_data)93 void fc_changed(GtkMenuItem *item, gpointer user_data) {
94 
95 //	if(GTK_IS_TEXT_BUFFER(textbuf))
96 //		free(textbuf);
97 
98 	char *filename;
99 	filename = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (item));
100 	if(filename == NULL)
101 		return;
102 	else
103 		show(filename);
104 }
105 
files_combo(GtkWidget * g)106 void files_combo(GtkWidget *g) {
107 
108 	/*
109 	 * A combo box with file names.
110 	 */
111 
112 	fc = gtk_combo_box_text_new();
113 	gtk_widget_set_focus_on_click(fc, TRUE);
114 	gtk_grid_attach(GTK_GRID (g), GTK_WIDGET (fc), 1, 0, 1, 1);
115 	g_signal_connect (fc, "changed", G_CALLBACK (fc_changed), NULL);
116 
117 	/* Add disk names */
118 	fc_entries(fc);
119 }
120 
add_topbar()121 void add_topbar() {
122 
123 	/* A grid */
124 	GtkWidget *g = gtk_grid_new();
125 //	gtk_grid_insert_column(GTK_GRID(g), 3);
126 	gtk_box_pack_start(GTK_BOX(configbox), g, FALSE, TRUE, 0);
127 	gtk_grid_set_column_homogeneous(GTK_GRID(g), FALSE);
128 	gtk_grid_set_column_spacing(GTK_GRID(g), 7);
129 
130 	/*
131 	 * This grid has three entries.
132 	 */
133 
134 	 /* 1. A label. */
135 	 gtk_grid_attach(GTK_GRID (g), gtk_label_new(l.cfchose), 0, 0, 1, 1);
136 
137 	 /* 2. combo box that lets users chose the config file to view/edit. */
138 	files_combo(g);
139 
140 	/* 2. A 'save' button. */
141 	bt = gtk_button_new_with_mnemonic(l.csave);
142 	gtk_grid_attach(GTK_GRID (g), GTK_WIDGET (bt), 2, 0, 1, 1);
143 	g_signal_connect (bt, "clicked", G_CALLBACK (save_cb), NULL);
144 }
145 
add_textview()146 void add_textview() {
147 
148 	/* Show the file in a scrolled window. */
149 
150 	GtkWidget *tmpbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
151 	gtk_container_add(GTK_CONTAINER (configbox), tmpbox);
152 
153 
154 	/* Scrolled Window */
155 	GtkWidget *scrollw = gtk_scrolled_window_new (NULL, NULL);
156 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollw),
157                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
158 
159 	gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW(scrollw), TRUE);
160 	gtk_scrolled_window_set_propagate_natural_width (GTK_SCROLLED_WINDOW(scrollw), TRUE);
161 
162 	gtk_box_pack_start(GTK_BOX(tmpbox), scrollw, TRUE, TRUE, 0);
163 
164 	/* Text view */
165 	GtkWidget *txt = gtk_text_view_new();
166 	gtk_container_add(GTK_CONTAINER (scrollw), txt);
167 	gtk_text_view_set_editable(GTK_TEXT_VIEW(txt), TRUE);
168 	gtk_text_view_set_top_margin(GTK_TEXT_VIEW(txt), 10);
169 
170 	textbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt));
171 	gtk_text_buffer_set_text(textbuf, "    ", strlen("    "));
172 }
173 
config()174 void config() {
175 
176 	/* Cleanup */
177 	if(GTK_IS_WIDGET(configbox))
178 			gtk_widget_destroy(configbox);
179 
180 	/* A top level container. */
181 	configbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
182 	gtk_container_add(GTK_CONTAINER (tab7), configbox);
183 
184 	/* A combo box to chose a file; and a 'safe' button. */
185 	add_topbar();
186 
187 	/* The config files are displayed here: */
188 	add_textview();
189 
190 	gtk_widget_show_all(configbox);
191 	gtk_widget_hide(bt);
192 }
193