execute_cmd.c revision 2
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright 1987, 1988, 1989 by Massachusetts Institute of Technology
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
12054bfce7d1b03f143c8287d83cc15b25ff43cfnd * For copyright info, see copyright.h.
12054bfce7d1b03f143c8287d83cc15b25ff43cfnd */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "ss_internal.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "copyright.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * get_request(tbl, idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Function:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Gets the idx'th request from the request table pointed to
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl * by tbl.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Arguments:
91de656b0815c0aeab4e6fc638e9bb4577aa9513Neil Perrin * tbl (ss_request_table *)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pointer to request table
fa9e4066f08beec538e775443c5be79dd423fcabahrens * idx (int)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * index into table
91de656b0815c0aeab4e6fc638e9bb4577aa9513Neil Perrin * Returns:
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * (ss_request_entry *)
12054bfce7d1b03f143c8287d83cc15b25ff43cfnd * pointer to request table entry
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Notes:
12054bfce7d1b03f143c8287d83cc15b25ff43cfnd * Has been replaced by a macro.
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick */
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __SABER__
91de656b0815c0aeab4e6fc638e9bb4577aa9513Neil Perrin/* sigh. saber won't deal with pointer-to-const-struct */
91de656b0815c0aeab4e6fc638e9bb4577aa9513Neil Perrinstatic struct _ss_request_entry * get_request (tbl, idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ss_request_table * tbl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
d5285cae913f4e01ffa0e6693a6d8ef1fbea30baGeorge Wilson struct _ss_request_table *tbl1 = (struct _ss_request_table *) tbl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct _ss_request_entry *e = (struct _ss_request_entry *) tbl1->requests;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return e + idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define get_request(tbl,idx) ((tbl) -> requests + (idx))
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * check_request_table(rqtbl, argc, argv, sci_idx)
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Function:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the command string in argv[0] is in the request table, execute
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the commands and return error code 0. Otherwise, return error
d5285cae913f4e01ffa0e6693a6d8ef1fbea30baGeorge Wilson * code ss_et_command_not_found.
d5285cae913f4e01ffa0e6693a6d8ef1fbea30baGeorge Wilson * Arguments:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * rqtbl (ss_request_table *)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * pointer to request table
fa9e4066f08beec538e775443c5be79dd423fcabahrens * argc (int)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * number of elements in argv[]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * argv (char *[])
fa9e4066f08beec538e775443c5be79dd423fcabahrens * argument string array
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sci_idx (int)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * ss-internal index for subsystem control info structure
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Returns:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (int)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Solaris Kerberos:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zero or SS_ET_COMMAND_ERR if command found,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ss_et_command_not_found otherwise
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Notes:
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int check_request_table (rqtbl, argc, argv, sci_idx)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick register ss_request_table *rqtbl;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick int argc;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick char *argv[];
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick int sci_idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __SABER__
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct _ss_request_entry *request;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens register ss_request_entry *request;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens register ss_data *info;
fa9e4066f08beec538e775443c5be79dd423fcabahrens register char const * const * name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *string = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Solaris Kerberos */
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i, ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens info = ss_info(sci_idx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens info->argc = argc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens info->argv = argv;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; (request = get_request(rqtbl, i))->command_names; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (name = request->command_names; *name; name++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!strcmp(*name, string)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens info->current_request = request->command_names[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Solaris Kerberos */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = (request->function)(argc, (const char *const *) argv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sci_idx,info->info_ptr);
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl info->current_request = (char *)NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return(ret == 0 ? 0 : SS_ET_COMMAND_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return(SS_ET_COMMAND_NOT_FOUND);
d5285cae913f4e01ffa0e6693a6d8ef1fbea30baGeorge Wilson}
d5285cae913f4e01ffa0e6693a6d8ef1fbea30baGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * really_execute_command(sci_idx, argc, argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Function:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Fills in the argc, argv values in the subsystem entry and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * call the appropriate routine.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Arguments:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sci_idx (int)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ss-internal index for subsystem control info structure
fa9e4066f08beec538e775443c5be79dd423fcabahrens * argc (int)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * number of arguments in argument list
fa9e4066f08beec538e775443c5be79dd423fcabahrens * argv (char **[])
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pointer to parsed argument list (may be reallocated
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on abbrev expansion)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Returns:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (int)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Solaris Kerberos:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Zero if successful, SS_ET_COMMAND_NOT_FOUND if unsucessful,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ss_et_command_not_found otherwise.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Notes:
*/
static int really_execute_command (sci_idx, argc, argv)
int sci_idx;
int argc;
char **argv[];
{
register ss_request_table **rqtbl;
register ss_data *info;
/* Solaris Kerberos */
int ret;
info = ss_info(sci_idx);
for (rqtbl = info->rqt_tables; *rqtbl; rqtbl++) {
/* Solaris Kerberos */
ret = check_request_table (*rqtbl, argc, *argv, sci_idx);
if (ret == 0 || ret == SS_ET_COMMAND_ERR)
return (ret);
}
return(SS_ET_COMMAND_NOT_FOUND);
}
/*
* ss_execute_command(sci_idx, argv)
*
* Function:
* Executes a parsed command list within the subsystem.
* Arguments:
* sci_idx (int)
* ss-internal index for subsystem control info structure
* argv (char *[])
* parsed argument list
* Returns:
* (int)
* Solaris Kerberos:
* Zero if successful, SS_ET_COMMAND_NOT_FOUND if unsucessful,
* ss_et_command_not_found otherwise.
* Notes:
*/
int
ss_execute_command(sci_idx, argv)
int sci_idx;
register char *argv[];
{
register int i, argc;
char **argp;
argc = 0;
for (argp = argv; *argp; argp++)
argc++;
argp = (char **)malloc((argc+1)*sizeof(char *));
for (i = 0; i <= argc; i++)
argp[i] = argv[i];
i = really_execute_command(sci_idx, argc, &argp);
free(argp);
return(i);
}
/*
* ss_execute_line(sci_idx, line_ptr)
*
* Function:
* Parses and executes a command line within a subsystem.
* Arguments:
* sci_idx (int)
* ss-internal index for subsystem control info structure
* line_ptr (char *)
* Pointer to command line to be parsed.
* Returns:
* (int)
* Error code.
* Notes:
*/
int ss_execute_line (sci_idx, line_ptr)
int sci_idx;
char *line_ptr;
{
char **argv;
int argc, ret;
/* flush leading whitespace */
while (line_ptr[0] == ' ' || line_ptr[0] == '\t')
line_ptr++;
/* check if it should be sent to operating system for execution */
if (*line_ptr == '!') {
if (ss_info(sci_idx)->flags.escape_disabled)
return SS_ET_ESCAPE_DISABLED;
else {
line_ptr++;
system(line_ptr);
return 0;
}
}
/* parse it */
/* Solaris Kerberos */
(void) ss_parse(sci_idx, line_ptr, &argc, &argv, 0);
if (argc == 0)
return 0;
/* look it up in the request tables, execute if found */
ret = really_execute_command (sci_idx, argc, &argv);
free(argv);
return(ret);
}