1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
/*
* Copyright 1987, 1988, 1989 by Massachusetts Institute of Technology
*
* For copyright info, see copyright.h.
*/
#include "ss_internal.h"
#include "copyright.h"
#include <stdio.h>
#ifndef lint
static char const rcsid[] =
"$Header: /mit/zephyr/repository/zephyr/lib/ss/execute_cmd.c,v 1.3 1995/06/30 22:02:34 ghudson Exp $";
#endif
/*
* get_request(tbl, idx)
*
* Function:
* Gets the idx'th request from the request table pointed to
* by tbl.
* Arguments:
* tbl (ss_request_table *)
* pointer to request table
* idx (int)
* index into table
* Returns:
* (ss_request_entry *)
* pointer to request table entry
* Notes:
* Has been replaced by a macro.
*/
#ifdef __SABER__
/* sigh. saber won't deal with pointer-to-const-struct */
static struct _ss_request_entry * get_request (tbl, idx)
ss_request_table * tbl;
int idx;
{
struct _ss_request_table *tbl1 = (struct _ss_request_table *) tbl;
struct _ss_request_entry *e = (struct _ss_request_entry *) tbl1->requests;
return e + idx;
}
#else
#define get_request(tbl,idx) ((tbl) -> requests + (idx))
#endif
/*
* check_request_table(rqtbl, argc, argv, sci_idx)
*
* Function:
* If the command string in argv[0] is in the request table, execute
* the commands and return error code 0. Otherwise, return error
* code ss_et_command_not_found.
* Arguments:
* rqtbl (ss_request_table *)
* pointer to request table
* argc (int)
* number of elements in argv[]
* argv (char *[])
* argument string array
* sci_idx (int)
* ss-internal index for subsystem control info structure
* Returns:
* (int)
* zero if command found, ss_et_command_not_found otherwise
* Notes:
*/
static int check_request_table (rqtbl, argc, argv, sci_idx)
register ss_request_table *rqtbl;
int argc;
char *argv[];
int sci_idx;
{
#ifdef __SABER__
struct _ss_request_entry *request;
#else
register ss_request_entry *request;
#endif
register ss_data *info;
register char const * const * name;
char *string = argv[0];
int i;
info = ss_info(sci_idx);
info->argc = argc;
info->argv = argv;
for (i = 0; (request = get_request(rqtbl, i))->command_names; i++) {
for (name = request->command_names; *name; name++)
if (!strcmp(*name, string)) {
info->current_request = request->command_names[0];
(request->function)(argc, (const char *const *) argv,
sci_idx,info->info_ptr);
info->current_request = (char *)NULL;
return(0);
}
}
return(SS_ET_COMMAND_NOT_FOUND);
}
/*
* really_execute_command(sci_idx, argc, argv)
*
* Function:
* Fills in the argc, argv values in the subsystem entry and
* call the appropriate routine.
* Arguments:
* sci_idx (int)
* ss-internal index for subsystem control info structure
* argc (int)
* number of arguments in argument list
* argv (char **[])
* pointer to parsed argument list (may be reallocated
* on abbrev expansion)
*
* Returns:
* (int)
* Zero if successful, ss_et_command_not_found otherwise.
* 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;
info = ss_info(sci_idx);
for (rqtbl = info->rqt_tables; *rqtbl; rqtbl++) {
if (check_request_table (*rqtbl, argc, *argv, sci_idx) == 0)
return(0);
}
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)
* Zero if successful, ss_et_command_not_found otherwise.
* Notes:
*/
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;
int retval;
/* 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 */
argv = ss_parse(sci_idx, line_ptr, &argc);
if (argc == 0)
return 0;
/* look it up in the request tables, execute if found */
retval = really_execute_command (sci_idx, argc, &argv);
free(argv);
return(retval);
}
|