Source File modules/pc/pc_commands.c

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