47c5d9a55b11413da45834a3219391d277f73dba
[citadel.git] / ctdlsh / config.c
1 /*
2  * (c) 1987-2016 by Art Cancro and citadel.org
3  * This program is open source software, released under the terms of the GNU General Public License v3.
4  * It runs really well on the Linux operating system.
5  * We love open source software but reject Richard Stallman's linguistic fascism.
6  */
7
8 #include "ctdlsh.h"
9
10
11 int show_full_config(int server_socket) {
12         char buf[1024];
13
14         sock_puts(server_socket, "CONF listval");
15         sock_getln(server_socket, buf, sizeof buf);
16         if (buf[0] != '1') {
17                 printf("%s\n", &buf[4]);
18                 return(cmdret_error);
19         }
20
21         while (sock_getln(server_socket, buf, sizeof buf), strcmp(buf, "000")) {
22                 char *val = NULL;
23                 char *p = strchr(buf, '|');
24                 if (p != NULL) {
25                         val = p;
26                         ++val;
27                         *p = 0;
28                 }
29                 printf("%-30s = %s\n", buf, val);
30         }
31
32         return(cmdret_ok);
33 }
34
35
36 int show_single_config(int server_socket, char *keyname) {
37         char buf[1024];
38
39         sock_printf(server_socket, "CONF getval|%s\n", keyname);
40         sock_getln(server_socket, buf, sizeof buf);
41         if (buf[0] == '2') {
42                 char *v = &buf[4];
43                 char *t = NULL;
44                 while(t = strrchr(v, '|'), t!=NULL) t[0]=0;
45                 printf("%-30s = %s\n", keyname, v);
46                 return(cmdret_ok);
47         }
48         else {
49                 printf("\n");
50                 return(cmdret_error);
51         }
52 }
53
54
55 int set_single_config(int server_socket, char *keyname, char *val) {
56         char buf[1024];
57
58         sock_printf(server_socket, "CONF putval|%s|%s\n", keyname, val);
59         sock_getln(server_socket, buf, sizeof buf);
60         if (buf[0] != '2') {
61                 printf("%s\n", buf);
62                 return(cmdret_error);
63         }
64         return(show_single_config(server_socket, keyname));
65 }
66
67
68 int cmd_config(int server_socket, char *cmdbuf) {
69
70         char buf[4096];
71         strncpy(buf, cmdbuf, sizeof buf);
72         char *k = strchr(buf, ' ');
73         if (k == NULL) {
74                 return show_full_config(server_socket);
75         }
76
77         while (k[0]==' ') ++k;
78
79         if (strlen(k) == 0) {
80                 return show_full_config(server_socket);
81         }
82
83         char *v = strchr(k, ' ');
84         if (v == NULL) {
85                 return show_single_config(server_socket, k);
86         }
87
88         v[0] = 0;
89         ++v;
90         while (v[0]==' ') ++v;
91
92         if (strlen(v) == 0) {
93                 return show_single_config(server_socket, k);
94         }
95
96         return set_single_config(server_socket, k, v);
97 }