41 #include "EST_SiodServer.h"
43 static bool have_read_table=FALSE;
45 static int tc_siod_server= -1;
51 if (TYPEP(x,tc_siod_server))
54 err(
"wrong type of argument to get_c_siod_server",x);
59 int siod_siod_server_p(LISP x)
61 if (TYPEP(x,tc_siod_server))
72 return siod_make_typed_cell(tc_siod_server,s);
75 static void siod_server_free(LISP lserver)
79 USERVAL(lserver) = NULL;
84 LISP siod_read_server_table(LISP args)
96 LISP siod_write_server_table(LISP args)
106 LISP siod_servers(
void)
111 if (!have_read_table)
112 siod_read_server_table(NIL);
118 for(p.
begin(names); p; ++p)
119 lnames = cons(strcons((*p).length(), *p), lnames);
133 case connect_not_found_error:
134 EST_sys_error(
"Can't find host '%s:%d'", (
const char *)server->
servername(), server->
port());
137 case connect_not_allowed_error:
138 EST_sys_error(
"Can't connect to '%s:%d'", (
const char *)server->
servername(), server->
port());
142 EST_sys_error(
"Error connecting to '%s:%d'", (
const char *)server->
servername(), server->
port());
147 LISP siod_server(LISP lname)
152 EST_String name=NULLP(lname)?
"siod":get_c_string(lname);
154 if (!have_read_table)
155 siod_read_server_table(NIL);
157 LISP verbose = siod_get_lval(
"siod_verbose", NULL);
162 siod_connect(server);
164 return siod_make_siod_server(server);
167 LISP siod_service_loop(LISP lname)
172 EST_String name=NULLP(lname)?
"siod":get_c_string(lname);
174 if (!have_read_table)
175 siod_read_server_table(NIL);
177 LISP verbose = siod_get_lval(
"siod_verbose", NULL);
181 !NULLP(verbose)?&cout:(ostream *)NULL);
183 return siod_make_siod_server(server);
188 if (siod_siod_server_p(lserver))
193 lserver = siod_server(lserver);
196 return get_c_siod_server(lserver);
199 LISP siod_connect(LISP lserver)
201 if (!siod_siod_server_p(lserver))
202 EST_error(
"not a siod server %s", get_c_string(lserver));
207 siod_connect(server);
212 LISP siod_disconnect(LISP lserver)
214 if (!siod_siod_server_p(lserver))
215 EST_error(
"not a siod server %s", get_c_string(lserver));
224 LISP siod_server_run(LISP lserver)
226 if (!siod_siod_server_p(lserver))
227 EST_error(
"not a siod server %s", get_c_string(lserver));
233 siod_write_server_table(NIL);
236 server->run(handler);
241 LISP siod_remote_command(LISP lserver,
250 args.
set_val(
"sexp", est_val(sexp));
256 siod_connect(server);
258 if (!server->execute(
"scheme",
"eval", args, handler))
263 return strcons(err.
length(), err);
269 return scheme(handler.res.
val(
"sexp"));
272 void siod_server_init(
void)
276 tc_siod_server = siod_register_user_type(
"SiodServer");
278 set_gc_hooks(tc_siod_server, 0, NULL,NULL,NULL,siod_server_free,NULL,&kind);
281 init_lsubr(
"siod_read_server_table", siod_read_server_table,
282 "(siod_read_server_table &opt FILENAME)\n"
283 " Read the users table of siod servers, or the table\n"
284 " in FILENAME if given.");
286 init_lsubr(
"siod_write_server_table", siod_write_server_table,
287 "(siod_write_server_table &opt FILENAME)\n"
288 " Write the users table of siod servers, or the table\n"
289 " in FILENAME if given.");
291 init_subr_0(
"siod_servers", siod_servers,
293 " Returns a list of the know siod servers. This doesn't\n"
294 " guarantee that they are still running.");
296 init_lsubr(
"siod_server", siod_server,
297 "(siod_server &opt NAME)\n"
298 " Return a connection to a siod server with the given name.\n"
299 " If name is omitted it defaults to \"siod\".");
301 init_lsubr(
"siod_service_loop", siod_service_loop,
302 "(siod_server_loop &opt NAME)\n"
303 " Return an object representing a network siod server main loop.\n"
304 " This service can be started by calling \\[siod_server_run\\].\n"
305 " If name is omitted it defaults to \"siod\".");
307 init_subr_1(
"siod_connect", siod_connect,
308 "(siod_connect SERVER)\n"
309 " Re-open the connection to the server.");
311 init_subr_1(
"siod_disconnect", siod_disconnect,
312 "(siod_disconnect SERVER)\n"
313 " Close the connection to the server.");
315 init_subr_1(
"siod_server_run", siod_server_run,
316 "(siod_server_run SERVER)\n"
317 " Start the main loop of a siod network server.");
319 init_subr_2(
"siod_remote_command", siod_remote_command,
320 "(siod_remote_command SERVER COMMAND)\n"
321 " Evaluate COMMAND on the siod server SERVER.");