* Rewrote the HTTP engine and application coupling to run in a worker thread
[citadel.git] / webcit / netconf.c
1
2
3
4 #include <ctype.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include <stdio.h>
8 #include <fcntl.h>
9 #include <signal.h>
10 #include <sys/types.h>
11 #include <sys/wait.h>
12 #include <sys/socket.h>
13 #include <sys/time.h>
14 #include <limits.h>
15 #include <netinet/in.h>
16 #include <netdb.h>
17 #include <string.h>
18 #include <pwd.h>
19 #include <errno.h>
20 #include <stdarg.h>
21 #include <pthread.h>
22 #include <signal.h>
23 #include "webcit.h"
24
25
26
27
28
29
30 struct sharelist {
31         struct sharelist *next;
32         char shname[256];
33 };
34
35
36 void display_edit_node(void)
37 {
38         char buf[256];
39         char node[256];
40         char sroom[256];
41
42         strcpy(node, bstr("node"));
43
44         wprintf("HTTP/1.0 200 OK\n");
45         output_headers(1);
46         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=000077><TR><TD>");
47         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
48         wprintf("<B>Edit share list for ");
49         escputs(node);
50         wprintf("</B>\n");
51         wprintf("</FONT></TD></TR></TABLE>\n");
52
53         wprintf("<CENTER>\n");
54         wprintf("<A HREF=\"/display_share&node=");
55         urlescputs(node);
56         wprintf("\">Add a shared room</A><BR>\n");
57
58         wprintf("<A HREF=\"/display_netconf");
59         wprintf("\">Return to network configuration screen</A><BR>\n");
60
61         serv_printf("NSET roomlist|%s", node);
62         serv_gets(buf);
63         if (buf[0] == '1') {
64                 wprintf("<TABLE border=0>\n");
65                 while (serv_gets(buf), strcmp(buf, "000")) {
66                         extract(sroom, buf, 0);
67                         wprintf("<TR><TD><FONT SIZE=+1>");
68                         escputs(sroom);
69                         wprintf("</FONT></TD>");
70                         wprintf("<TD><A HREF=\"/display_confirm_unshare&sroom=");
71                         urlescputs(sroom);
72                         wprintf("&node=");
73                         urlescputs(node);
74                         wprintf("\">(UnShare)</A></TD>");
75                         wprintf("</TR>\n");
76                 }
77                 wprintf("</TABLE></CENTER>\n");
78         }
79         wDumpContent(1);
80 }
81
82
83
84 void display_netconf(void)
85 {
86         char buf[256];
87         char node[256];
88
89         wprintf("HTTP/1.0 200 OK\n");
90         output_headers(1);
91         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
92         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
93         wprintf("<B>Network configuration</B>\n");
94         wprintf("</FONT></TD></TR></TABLE>\n");
95
96         wprintf("<CENTER>");
97         wprintf("<A HREF=\"/display_add_node\">");
98         wprintf("Add a new node</A><BR>\n");
99         wprintf("</CENTER>");
100
101         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=000077><TR><TD>");
102         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
103         wprintf("<B>Currently configured nodes</B>\n");
104         wprintf("</FONT></TD></TR></TABLE>\n");
105         serv_puts("NSET nodelist");
106         serv_gets(buf);
107         if (buf[0] == '1') {
108                 wprintf("<CENTER><TABLE border=0>\n");
109                 while (serv_gets(buf), strcmp(buf, "000")) {
110                         extract(node, buf, 0);
111                         wprintf("<TR><TD><FONT SIZE=+1>");
112                         escputs(node);
113                         wprintf("</FONT></TD>");
114                         wprintf("<TD><A HREF=\"/display_edit_node&node=");
115                         urlescputs(node);
116                         wprintf("\">(Edit)</A></TD>");
117                         wprintf("<TD><A HREF=\"/display_confirm_delete_node&node=");
118                         urlescputs(node);
119                         wprintf("\">(Delete)</A></TD>");
120                         wprintf("</TR>\n");
121                 }
122                 wprintf("</TABLE></CENTER>\n");
123         }
124         wDumpContent(1);
125 }
126
127
128 void display_confirm_unshare(void)
129 {
130         char node[256];
131         char sroom[256];
132
133         wprintf("HTTP/1.0 200 OK\n");
134         output_headers(1);
135         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
136         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
137         wprintf("<B>Confirm unshare</B>\n");
138         wprintf("</FONT></TD></TR></TABLE>\n");
139
140         strcpy(node, bstr("node"));
141         strcpy(sroom, bstr("sroom"));
142         wprintf("<CENTER>Are you sure you want to unshare <FONT SIZE=+1>");
143         escputs(sroom);
144         wprintf("</FONT>?<BR>\n");
145         wprintf("<A HREF=\"/unshare&node=");
146         urlescputs(node);
147         wprintf("&sroom=");
148         urlescputs(sroom);
149         wprintf("\">Yes</A>&nbsp;&nbsp;&nbsp;");
150         wprintf("<A HREF=\"/display_edit_node&node=");
151         urlescputs(node);
152         wprintf("\">No</A><BR>\n");
153         wDumpContent(1);
154 }
155
156
157 void display_confirm_delete_node(void)
158 {
159         char node[256];
160
161         wprintf("HTTP/1.0 200 OK\n");
162         output_headers(1);
163         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
164         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
165         wprintf("<B>Confirm delete</B>\n");
166         wprintf("</FONT></TD></TR></TABLE>\n");
167
168         strcpy(node, bstr("node"));
169         wprintf("<CENTER>Are you sure you want to delete <FONT SIZE=+1>");
170         escputs(node);
171         wprintf("</FONT>?<BR>\n");
172         wprintf("<A HREF=\"/delete_node&node=");
173         urlescputs(node);
174         wprintf("\">Yes</A>&nbsp;&nbsp;&nbsp;");
175         wprintf("<A HREF=\"/display_netconf\">No</A><BR>\n");
176         wDumpContent(1);
177 }
178
179
180 void delete_node(void)
181 {
182         char node[256];
183         char buf[256];
184
185         strcpy(node, bstr("node"));
186         sprintf(buf, "NSET deletenode|%s", node);
187         serv_puts(buf);
188         serv_gets(buf);
189         if (buf[0] == '1') {
190                 wprintf("HTTP/1.0 200 OK\n");
191                 output_headers(1);
192                 server_to_text();
193                 wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
194                 wDumpContent(1);
195         } else {
196                 display_error(&buf[4]);
197         }
198 }
199
200
201 void unshare(void)
202 {
203         char node[256];
204         char sroom[256];
205         char buf[256];
206
207         strcpy(node, bstr("node"));
208         strcpy(sroom, bstr("sroom"));
209         sprintf(buf, "NSET unshare|%s|%s", node, sroom);
210         serv_puts(buf);
211         serv_gets(buf);
212         if (buf[0] == '1') {
213                 wprintf("HTTP/1.0 200 OK\n");
214                 output_headers(1);
215                 server_to_text();
216                 wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
217                 wDumpContent(1);
218         } else {
219                 display_error(&buf[4]);
220         }
221 }
222
223
224
225 void display_add_node(void)
226 {
227
228         wprintf("HTTP/1.0 200 OK\n");
229         output_headers(1);
230         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=007700><TR><TD>");
231         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
232         wprintf("<B>Add a new node</B>\n");
233         wprintf("</FONT></TD></TR></TABLE>\n");
234
235         wprintf("<CENTER>");
236         wprintf("<FORM METHOD=\"POST\" ACTION=\"/add_node\">\n");
237
238         wprintf("Enter name of new node: ");
239         wprintf("<INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"64\"><BR>\n");
240
241         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Add\">");
242         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
243
244         wprintf("</FORM></CENTER>\n");
245         wDumpContent(1);
246 }
247
248
249
250 void add_node(void)
251 {
252         char node[256];
253         char buf[256];
254         char sc[256];
255
256         strcpy(node, bstr("node"));
257         strcpy(sc, bstr("sc"));
258
259         if (!strcmp(sc, "Add")) {
260                 sprintf(buf, "NSET addnode|%s", node);
261                 serv_puts(buf);
262                 serv_gets(buf);
263                 if (buf[0] == '1') {
264                         wprintf("HTTP/1.0 200 OK\n");
265                         output_headers(1);
266                         server_to_text();
267                         wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
268                         wDumpContent(1);
269                 } else {
270                         display_error(&buf[4]);
271                 }
272         }
273 }
274
275
276
277 void display_share(void)
278 {
279         char buf[256];
280         char node[256];
281         char sroom[256];
282         struct sharelist *shlist = NULL;
283         struct sharelist *shptr;
284         int already_shared;
285
286         strcpy(node, bstr("node"));
287
288         wprintf("HTTP/1.0 200 OK\n");
289         output_headers(1);
290         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=007700><TR><TD>");
291         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
292         wprintf("<B>Add a shared room</B>\n");
293         wprintf("</FONT></TD></TR></TABLE>\n");
294
295         wprintf("<CENTER>");
296         wprintf("<FORM METHOD=\"POST\" ACTION=\"/share\">\n");
297         wprintf("<INPUT TYPE=\"hidden\" NAME=\"node\" VALUE=\"");
298         urlescputs(node);
299         wprintf("\">\n");
300
301         sprintf(buf, "NSET roomlist|%s", node);
302         serv_puts(buf);
303         serv_gets(buf);
304         if (buf[0] == '1') {
305                 while (serv_gets(buf), strcmp(buf, "000")) {
306                         shptr = (struct sharelist *)
307                             malloc(sizeof(struct sharelist));
308                         shptr->next = shlist;
309                         extract(shptr->shname, buf, 0);
310                         shlist = shptr;
311                 }
312         }
313         wprintf("<SELECT NAME=\"sroom\" SIZE=5 WIDTH=30>\n");
314         serv_puts("LKRA");
315         serv_gets(buf);
316         if (buf[0] == '1') {
317                 while (serv_gets(buf), strcmp(buf, "000")) {
318                         extract(sroom, buf, 0);
319                         already_shared = 0;
320                         for (shptr = shlist; shptr != NULL; shptr = shptr->next) {
321                                 if (!strcasecmp(sroom, shptr->shname))
322                                         already_shared = 1;
323                         }
324
325                         if (already_shared == 0) {
326                                 wprintf("<OPTION>");
327                                 escputs(sroom);
328                                 wprintf("\n");
329                         }
330                 }
331         }
332         wprintf("</SELECT>\n");
333         wprintf("<BR>\n");
334
335         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Share\">");
336         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
337
338         wprintf("</FORM></CENTER>\n");
339         wDumpContent(1);
340
341         /* free the list */
342         while (shlist != NULL) {
343                 shptr = shlist->next;
344                 free(shlist);
345                 shlist = shptr;
346         }
347
348 }
349
350
351
352 void share(void)
353 {
354         char node[256];
355         char buf[256];
356         char sc[256];
357         char sroom[256];
358
359         strcpy(node, bstr("node"));
360         strcpy(sc, bstr("sc"));
361         strcpy(sroom, bstr("sroom"));
362
363         if (!strcmp(sc, "Share")) {
364                 sprintf(buf, "NSET share|%s|%s", node, sroom);
365                 serv_puts(buf);
366                 serv_gets(buf);
367                 if (buf[0] == '1') {
368                         wprintf("HTTP/1.0 200 OK\n");
369                         output_headers(1);
370                         server_to_text();
371                         wprintf("<A HREF=\"/display_netconf\">Back to menu</A>\n");
372                         wDumpContent(1);
373                 } else {
374                         display_error(&buf[4]);
375                 }
376
377         }
378 }