2 * (c) 2009 by Art Cancro and citadel.org
3 * This program is released under the terms of the GNU General Public License v3.
12 #include <readline/readline.h>
15 #define CTDLDIR "/root/ctdl/trunk/citadel"
18 int discover_ipgm_secret(void) {
20 struct partial_config ccc;
22 fd = open(CTDLDIR "/citadel.config", O_RDONLY);
24 fprintf(stderr, "citadel.config: %s\n", strerror(errno));
28 if (read(fd, &ccc, sizeof(struct partial_config)) != sizeof(struct partial_config)) {
29 fprintf(stderr, "citadel.config: %s\n", strerror(errno));
33 fprintf(stderr, "citadel.config: %s\n", strerror(errno));
36 return(ccc.c_ipgm_secret);
40 void do_main_loop(int server_socket) {
44 char server_reply[1024];
49 /* Do an INFO command and learn the hostname for the prompt */
50 sock_puts(server_socket, "INFO");
51 sock_getln(server_socket, buf, sizeof buf);
54 while(sock_getln(server_socket, buf, sizeof buf), strcmp(buf, "000")) {
56 sprintf(prompt, "\n%s> ", buf);
62 /* Here we go ... main command loop */
63 while (cmd = readline(prompt)) {
65 if ((cmd) && (*cmd)) {
68 sock_puts(server_socket, cmd);
69 sock_getln(server_socket, server_reply, sizeof server_reply);
70 printf("%s\n", server_reply);
72 if ((server_reply[0] == '4') || (server_reply[0] == '8')) {
76 if ((server_reply[0] == '1') || (server_reply[0] == '8')) {
77 while(sock_getln(server_socket, buf, sizeof buf), strcmp(buf, "000")) {
88 int main(int argc, char **argv)
90 int server_socket = 0;
92 int ipgm_secret = (-1);
94 printf("\nCitadel administration shell v" PACKAGE_VERSION "\n");
95 printf("(c) 2009 citadel.org GPLv3\n");
97 ipgm_secret = discover_ipgm_secret();
98 if (ipgm_secret < 0) {
102 printf("Attaching to server...\r");
104 server_socket = uds_connectsock(CTDLDIR "/citadel.socket");
105 if (server_socket < 0) {
110 sock_getln(server_socket, buf, sizeof buf);
113 sock_printf(server_socket, "IPGM %d\n", ipgm_secret);
114 sock_getln(server_socket, buf, sizeof buf);
118 do_main_loop(server_socket);
121 sock_puts(server_socket, "QUIT");
122 sock_getln(server_socket, buf, sizeof buf);
124 close(server_socket);