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 | }