1    | #include "mysql_driver.h"
2    | #include "access_control.h"
3    | #include "thread.h"
4    | #include "constants.h"
5    | #include "properties.h"
6    | #include "protocol_config.h"
7    | #include "ta.h"
8    | #include "pc_commands.h"
9    | 
10   | extern void purify_new_inuse(void);
11   | /*
12   |  * Command functions
13   |  */
14   | 
15   | int command_show(char *input, GString *output, sk_conn_st *condat) {
16   |   return command_execute(show, "show ", input, output, condat);
17   | } /* command_show() */
18   | 
19   | int command_set(char *input, GString *output, sk_conn_st *condat) {
20   |   return command_execute(set, "set ", input, output,condat);
21   | } /* command_set() */
22   | 
23   | int command_stop(char *input, GString *output, sk_conn_st *condat) {
24   |   return command_execute(stop, "stop ", input, output, condat);
25   | }
26   | 
27   | 
28   | int command_purify(char *input, GString *output, sk_conn_st *condat)
29   | {
30   | #if 0
31   |   purify_new_inuse();
32   | #else 
33   |   g_string_append(output, "NOP");
34   | #endif
35   |   
36   |   return 0;
37   | }
38   | 
39   | 
40   | 
41   | int command_quit(char *input, GString *output, sk_conn_st *condat) {
42   |     /* Administrator wishes to quit. */
43   |   return PC_RET_QUIT;
44   | } /* command_quit() */
45   | 
46   | int show_const(char *input, GString *output, sk_conn_st *condat) {
47   |   /* Administrator wishes to show constants. */
48   |   char *result, *name, *cursor;
49   |   int res = 0;
50   |   
51   |   if( strlen(input) > 0 ) {
52   |     cursor = input;
53   |     name = (char *)strsep(&cursor, " ");
54   | 
55   |     if( (result = CO_const_to_string(name)) != NULL ) {
56   |       g_string_append(output, result);
57   |       wr_free(result);
58   |     }
59   |     else {
60   |       g_string_append(output,  "unknown constant");
61   |       res = PC_RET_ERR;
62   |     }
63   |   }
64   |   else {
65   |     g_string_append(output,  "name required");
66   |     res = PC_RET_ERR;
67   |   }
68   |  
69   |   return res;
70   | 
71   | } /* show_const() */
72   | 
73   | int show_consts(char *input, GString *output, sk_conn_st *condat) {
74   |   /* Administrator wishes to show constants. */
75   |   char *s =  CO_to_string();
76   |   g_string_append(output, s);
77   |   free(s);
78   |   return 0;
79   | } /* show_consts() */
80   | 
81   | int show_props(char *input, GString *output, sk_conn_st *condat) {
82   |   /* Administrator wishes to show properties. */
83   |   char *s =  PR_to_string();
84   |   g_string_append(output, s);
85   |   free(s);  
86   |   return 0;
87   | } /* show_props() */
88   | 
89   | int show_threads(char *input, GString *output, sk_conn_st *condat) {
90   |   /* Administrator wishes to show thread information. */
91   |   char *s = TA_tostring();
92   |   g_string_append(output, s);
93   |   free(s);  
94   |   return 0;
95   | } /* show_thread() */
96   | 
97   | int show_whois(char *input, GString *output, sk_conn_st *condat) {
98   |   /* Administrator wishes to show whois query information. */
99   |   PW_interact(condat->sock);
100  |   return 0;
101  | } /* show_whois() */
102  | 
103  | int show_access(char *input, GString *output, sk_conn_st *condat) {
104  |   /* Administrator wishes to show whois query information. */
105  |   
106  |   char line[128];
107  |   int cnt = 0;
108  |   er_ret_t err; 
109  | 
110  |   if( act_runtime->top_ptr != NULL ) {
111  |     char *header = AC_to_string_header();
112  |     
113  |     /* print header */
114  |     SK_cd_puts(condat,header);
115  |     wr_free(header);
116  | 
117  |     cnt = rx_walk_tree(act_runtime->top_ptr, AC_rxwalkhook_print, 
118  | 		       RX_WALK_SKPGLU,  /* print no glue nodes */
119  | 		       255, 0, 0, condat, &err);
120  |   }
121  |   
122  |   g_string_sprintfa(output, "Found %d nodes\n", cnt);
123  | 
124  |   return 0;
125  | } /* show_access() */
126  | 
127  | 
128  | int show_acl(char *input, GString *output, sk_conn_st *condat) 
129  | {
130  |   /* Administrator wishes to show access control list. */  
131  |   char line[128];
132  |   int cnt = 0;
133  |   er_ret_t err; 
134  | 
135  |   if( act_acl->top_ptr != NULL ) {
136  |     char *header = AC_acl_to_string_header();
137  |     
138  |     /* print header */
139  |     SK_cd_puts(condat,header);
140  |     wr_free(header);
141  | 
142  |     cnt = rx_walk_tree(act_acl->top_ptr, AC_rxwalkhook_print_acl, 
143  | 		       RX_WALK_SKPGLU,  /* print no glue nodes */
144  | 		       255, 0, 0, condat, &err);
145  |   }
146  | 
147  |   g_string_sprintfa(output, "Found %d nodes\n", cnt);
148  | 
149  |   return 0;
150  | } /* show_acl() */
151  | 
152  | 
153  | int set_acl(char *input, GString *output, sk_conn_st *condat)
154  | {
155  |   int res = 0;
156  |   
157  |   /* first 8 characters ("set acl ") are already skipped */
158  |   if( ! NOERR( AC_asc_acl_command_set( input, "Manual"))) {
159  |     g_string_append(output, "Error!\n");
160  |     res = PC_RET_ERR;
161  |   }
162  |   return res;
163  | }
164  | 
165  | int set_nodeny(char *input, GString *output, sk_conn_st *condat) {
166  |   /* reset the deny counter in the access tree to 0 (after reenabling) */
167  |   /* first 11 characters ("set nodeny ")  are already skipped */
168  | 
169  |   if( ! NOERR( AC_asc_set_nodeny(input) )) {
170  |     g_string_append(output, "Error\n");
171  |     return PC_RET_ERR;
172  |   }
173  |   else {
174  |     return 0;
175  |   }
176  |   
177  | } /* set_nodeny() */
178  | 
179  | int set_updates(char *input, GString *output, sk_conn_st *condat) 
180  | {
181  |   char argstr[17];
182  |   int pause=0, resume=0;
183  |   int res = 0;
184  |  
185  |   if( sscanf(input, "%16s", argstr) == 1) {
186  |     pause = (strcmp(argstr,"pause") == 0);
187  |     resume = (strcmp(argstr,"resume") == 0);
188  |   }
189  |   
190  |   if( !pause && !resume ) {
191  |     g_string_append(output,  "syntax error.");
192  |     res = PC_RET_ERR;
193  |   }
194  |   else {
195  |     /* all params ok. just set the property */
196  |     char *value = pause ? "0" : "1";
197  |     
198  |     if (CO_set_const("UD.do_update", value) == 0) {
199  |       g_string_append(output, "Constant successfully set\n");
200  |     }
201  |     else {
202  |       g_string_append(output, "Could not set\n");
203  |       res = PC_RET_ERR;
204  |     }
205  |   }
206  |   return res;
207  | }
208  | 
209  | 
210  | int set_err(char *input, GString *output, sk_conn_st *condat) 
211  | {
212  |   char *erret = NULL;
213  |   int res;
214  | 
215  |   res = ER_macro_spec(input, &erret);
216  |   g_string_append(output, erret);
217  |   free(erret);
218  | 
219  |   return res;
220  | }
221  | 
222  | int show_err(char *input, GString *output, sk_conn_st *condat) 
223  | {
224  |   char *erret = NULL;
225  | 
226  |   er_print_paths(&erret);
227  |   g_string_append(output, erret);
228  |   free(erret);
229  | 
230  |   return 0;
231  | }
232  | 
233  | int show_macros(char *input, GString *output, sk_conn_st *condat)
234  | {
235  |   ER_macro_list(condat);
236  |   return 0;
237  | }
238  | 
239  | int set_macro(char *input, GString *output, sk_conn_st *condat)
240  | {
241  |   char *name, *body;
242  |   
243  |   if( strlen(input) > 0 ) {
244  |     body = input;
245  |     name = (char *)strsep(&body, " "); 
246  |     
247  |     ER_make_macro( name, body );
248  |   }
249  | 
250  |   return 0;
251  | }
252  | 
253  | 
254  | int stop_query(char *input, GString *output, sk_conn_st *condat) 
255  | {
256  |   int fd, thr;
257  |   /* assume the command is like "stop query 11 17". 
258  |      This is to limit ambiguities (a new thread on the same socket, 
259  |      for example).
260  | . */
261  |   
262  |   if( sscanf(input, "%d %d", &fd, &thr)<2 ) {
263  |     
264  |     g_string_append(output,"error!!");
265  |     return PC_RET_ERR;
266  |   }
267  |   else {
268  |     TA_trigger("whois", fd, thr);
269  |     return 0;
270  |   }
271  | }