1/* 2 * Copyright (c) 1998 - 2000 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include "sl_locl.h" 35#include <com_err.h> 36#include "ss.h" 37 38RCSID("$Id: ss.c 15429 2005-06-16 19:24:11Z lha $"); 39 40struct ss_subst { 41 char *name; 42 char *version; 43 char *info; 44 ss_request_table *table; 45}; 46 47static struct ss_subst subsystems[2]; 48static int num_subsystems; 49 50int 51ss_create_invocation(const char *subsystem, 52 const char *version, 53 const char *info, 54 ss_request_table *table, 55 int *code) 56{ 57 struct ss_subst *ss; 58 59 if(num_subsystems >= sizeof(subsystems) / sizeof(subsystems[0])) { 60 *code = 17; 61 return 0; 62 } 63 ss = &subsystems[num_subsystems]; 64 ss->name = ss->version = ss->info = NULL; 65 if (subsystem != NULL) { 66 ss->name = strdup (subsystem); 67 if (ss->name == NULL) { 68 *code = ENOMEM; 69 return 0; 70 } 71 } 72 if (version != NULL) { 73 ss->version = strdup (version); 74 if (ss->version == NULL) { 75 *code = ENOMEM; 76 return 0; 77 } 78 } 79 if (info != NULL) { 80 ss->info = strdup (info); 81 if (ss->info == NULL) { 82 *code = ENOMEM; 83 return 0; 84 } 85 } 86 ss->table = table; 87 *code = 0; 88 return num_subsystems++; 89} 90 91void 92ss_error (int idx, long code, const char *fmt, ...) 93{ 94 va_list ap; 95 va_start(ap, fmt); 96 com_err_va (subsystems[idx].name, code, fmt, ap); 97 va_end(ap); 98} 99 100void 101ss_perror (int idx, long code, const char *msg) 102{ 103 ss_error(idx, code, "%s", msg); 104} 105 106int 107ss_execute_command(int idx, char **argv) 108{ 109 int argc = 0; 110 int ret; 111 112 while(argv[argc++]); 113 ret = sl_command(subsystems[idx].table, argc, argv); 114 if (ret == SL_BADCOMMAND) 115 return SS_ET_COMMAND_NOT_FOUND; 116 return 0; 117} 118 119int 120ss_execute_line (int idx, const char *line) 121{ 122 char *buf = strdup(line); 123 int argc; 124 char **argv; 125 int ret; 126 127 if (buf == NULL) 128 return ENOMEM; 129 sl_make_argv(buf, &argc, &argv); 130 ret = sl_command(subsystems[idx].table, argc, argv); 131 free(buf); 132 if (ret == SL_BADCOMMAND) 133 return SS_ET_COMMAND_NOT_FOUND; 134 return 0; 135} 136 137int 138ss_listen (int idx) 139{ 140 char *prompt = malloc(strlen(subsystems[idx].name) + 3); 141 if (prompt == NULL) 142 return ENOMEM; 143 144 strcpy(prompt, subsystems[idx].name); 145 strcat(prompt, ": "); 146 sl_loop(subsystems[idx].table, prompt); 147 free(prompt); 148 return 0; 149} 150 151int 152ss_list_requests(int argc, char **argv /* , int idx, void *info */) 153{ 154 sl_help(subsystems[0 /* idx */].table, argc, argv); 155 return 0; 156} 157 158int 159ss_quit(int argc, char **argv) 160{ 161 return 1; 162} 163