Another win for short circuit evaluation
[citadel] / 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 {
13         char buf[1024];
14
15         sock_puts(server_socket, "CONF listval");
16         sock_getln(server_socket, buf, sizeof buf);
17         if (buf[0] != '1') {
18                 printf("%s\n", &buf[4]);
19                 return (cmdret_error);
20         }
21
22         while (sock_getln(server_socket, buf, sizeof buf), strcmp(buf, "000")) {
23                 char *val = NULL;
24                 char *p = strchr(buf, '|');
25                 if (p != NULL) {
26                         val = p;
27                         ++val;
28                         *p = 0;
29                 }
30                 printf("%-30s = %s\n", buf, val);
31         }
32
33         return (cmdret_ok);
34 }
35
36
37 int show_single_config(int server_socket, char *keyname)
38 {
39         char buf[1024];
40
41         sock_printf(server_socket, "CONF getval|%s\n", keyname);
42         sock_getln(server_socket, buf, sizeof buf);
43         if (buf[0] == '2') {
44                 char *v = &buf[4];
45                 char *t = NULL;
46                 while (t = strrchr(v, '|'), t != NULL)
47                         t[0] = 0;
48                 printf("%-30s = %s\n", keyname, v);
49                 return (cmdret_ok);
50         } else {
51                 printf("\n");
52                 return (cmdret_error);
53         }
54 }
55
56
57 int set_single_config(int server_socket, char *keyname, char *val)
58 {
59         char buf[1024];
60
61         sock_printf(server_socket, "CONF putval|%s|%s\n", keyname, val);
62         sock_getln(server_socket, buf, sizeof buf);
63         if (buf[0] != '2') {
64                 printf("%s\n", buf);
65                 return (cmdret_error);
66         }
67         return (show_single_config(server_socket, keyname));
68 }
69
70
71 int cmd_config(int server_socket, char *cmdbuf)
72 {
73
74         char buf[4096];
75         strncpy(buf, cmdbuf, sizeof buf);
76         char *k = strchr(buf, ' ');
77         if (k == NULL) {
78                 return show_full_config(server_socket);
79         }
80
81         while (k[0] == ' ')
82                 ++k;
83
84         if (strlen(k) == 0) {
85                 return show_full_config(server_socket);
86         }
87
88         if (k[0] == '?') {
89                 printf("config                 Print values of all configuration keys\n");
90                 printf("config ?               Display this message\n");
91                 printf("config [key]           Print value of configuration key 'key'\n");
92                 printf("config [key] [value]   Set configuration key 'key' to 'value'\n");
93                 return (cmdret_ok);
94         }
95
96         char *v = strchr(k, ' ');
97         if (v == NULL) {
98                 return show_single_config(server_socket, k);
99         }
100
101         v[0] = 0;
102         ++v;
103         while (v[0] == ' ')
104                 ++v;
105
106         if (strlen(v) == 0) {
107                 return show_single_config(server_socket, k);
108         }
109
110         return set_single_config(server_socket, k, v);
111 }