if StrBuf_ServGetln() is called in a loop, its return value has to be checked for...
[citadel.git] / webcit / mainmenu.c
1 #include "webcit.h"
2
3 /*
4  * The Main Menu
5  */
6 void display_main_menu(void)
7 {
8         begin_burst();
9         output_headers(1, 0, 0, 0, 1, 0);
10         DoTemplate(HKEY("display_main_menu"), NULL, &NoCtx);
11         end_burst();
12 }
13
14
15 /*
16  * System administration menu
17  */
18 void display_aide_menu(void)
19 {
20         begin_burst();
21         output_headers(1, 0, 0, 0, 1, 0);
22         DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
23         end_burst();
24 }
25
26
27 /*
28  * Interactive window to perform generic Citadel server commands.
29  */
30 void do_generic(void)
31 {
32         WCTemplputParams SubTP;
33         int Done = 0;
34         StrBuf *Buf;
35         StrBuf *LineBuf;
36         char *junk;
37         size_t len;
38
39         if (!havebstr("sc_button")) {
40                 display_main_menu();
41                 return;
42         }
43
44         memset(&SubTP, 0, sizeof(WCTemplputParams));
45         Buf = NewStrBuf();
46         serv_puts(bstr("g_cmd"));
47         StrBuf_ServGetln(Buf);
48         
49         switch (GetServerStatus(Buf, NULL)) {
50         case 8:
51                 serv_puts("\n\n000");
52                 if ( (StrLength(Buf)==3) && 
53                      !strcmp(ChrPtr(Buf), "000")) {
54                         StrBufAppendBufPlain(Buf, HKEY("\000"), 0);
55                         break;
56                 }
57         case 1:
58                 LineBuf = NewStrBuf();
59                 StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
60                 while (!Done) {
61                         if (StrBuf_ServGetln(LineBuf) < 0)
62                                 break;
63                         if ( (StrLength(LineBuf)==3) && 
64                              !strcmp(ChrPtr(LineBuf), "000")) {
65                                 Done = 1;
66                         }
67                         StrBufAppendBuf(Buf, LineBuf, 0);
68                         StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
69                 }
70                 FreeStrBuf(&LineBuf);
71                 break;
72         case 2:
73                 break;
74         case 4:
75                 text_to_server(bstr("g_input"));
76                 serv_puts("000");
77                 break;
78         case 6:
79                 len = atol(&ChrPtr(Buf)[4]);
80                 StrBuf_ServGetBLOBBuffered(Buf, len);
81                 break;
82         case 7:
83                 len = atol(&ChrPtr(Buf)[4]);
84                 junk = malloc(len);
85                 memset(junk, 0, len);
86                 serv_write(junk, len);
87                 free(junk);
88                 break;
89         }
90         
91         begin_burst();
92         output_headers(1, 0, 0, 0, 1, 0);
93
94         SubTP.Filter.ContextType = CTX_STRBUF;
95         SubTP.Context = Buf;
96
97         DoTemplate(HKEY("aide_display_generic_result"), NULL, &SubTP);
98
99         wDumpContent(1);
100
101         FreeStrBuf(&Buf);
102 }
103
104 /*
105  * Display the wait / input dialog while restarting the server.
106  */
107 void display_shutdown(void)
108 {
109         char buf[SIZ];
110         char *when;
111         
112         when=bstr("when");
113         if (strcmp(when, "now") == 0){
114                 serv_printf("DOWN 1");
115                 serv_getln(buf, sizeof buf);
116                 if (atol(buf) == 500)
117                 { /* upsie. maybe the server is not running as daemon? */
118                         
119                         safestrncpy(WC->ImportantMessage,
120                                     &buf[4],
121                                     sizeof WC->ImportantMessage);
122                 }
123                 begin_burst();
124                 output_headers(1, 0, 0, 0, 1, 0);
125                 DoTemplate(HKEY("aide_display_serverrestart"), NULL, &NoCtx);
126                 end_burst();
127                 lingering_close(WC->Hdr->http_sock);
128                 sleeeeeeeeeep(10);
129                 serv_printf("NOOP");
130                 serv_printf("NOOP");
131         }
132         else if (strcmp(when, "page") == 0) {
133                 char *message;
134                
135                 message = bstr("message");
136                 if ((message == NULL) || (IsEmptyStr(message)))
137                 {
138                         begin_burst();
139                         output_headers(1, 0, 0, 0, 1, 0);
140                         DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
141                         end_burst();
142                 }
143                 else
144                 {
145                         serv_printf("SEXP broadcast|%s", message);
146                         serv_getln(buf, sizeof buf); /* TODO: should we care? */
147                         begin_burst();
148                         output_headers(1, 0, 0, 0, 1, 0);
149                         DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
150                         end_burst();                    
151                 }
152         }
153         else if (!strcmp(when, "idle")) {
154                 serv_printf("SCDN 3");
155                 serv_getln(buf, sizeof buf);
156
157                 if (atol(buf) == 500)
158                 { /* upsie. maybe the server is not running as daemon? */
159                         safestrncpy(WC->ImportantMessage,
160                                     &buf[4],
161                                     sizeof WC->ImportantMessage);
162                 }
163                 begin_burst();
164                 output_headers(1, 0, 0, 0, 1, 0);
165                 DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
166                 end_burst();                    
167         }
168 }
169
170 void 
171 InitModule_MAINMENU
172 (void)
173 {
174         WebcitAddUrlHandler(HKEY("display_aide_menu"), "", 0, display_aide_menu, 0);
175         WebcitAddUrlHandler(HKEY("server_shutdown"), "", 0, display_shutdown, 0);
176         WebcitAddUrlHandler(HKEY("display_main_menu"), "", 0, display_main_menu, 0);
177         WebcitAddUrlHandler(HKEY("do_generic"), "", 0, do_generic, 0);
178 }