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