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