118 lines
2.6 KiB
C++
118 lines
2.6 KiB
C++
/*
|
|
* COPYRIGHT (c) 1988-1994 BY *
|
|
* PARADIGM ASSOCIATES INCORPORATED, CAMBRIDGE, MASSACHUSETTS. *
|
|
* See the source file SLIB.C for more information. *
|
|
|
|
* Reorganization of files (Mar 1999) by Alan W Black <awb@cstr.ed.ac.uk>
|
|
|
|
* Client/server functions
|
|
|
|
*/
|
|
#include <cstdio>
|
|
#include "EST_io_aux.h"
|
|
#include "siod.h"
|
|
#include "siodp.h"
|
|
|
|
int siod_server_socket = -1;
|
|
|
|
LISP siod_send_lisp_to_client(LISP x)
|
|
{
|
|
// Send x to the client
|
|
if (siod_server_socket == -1)
|
|
{
|
|
err("siod: not in server mode",x);
|
|
}
|
|
|
|
EST_String tmpfile = make_tmp_filename();
|
|
FILE *fd;
|
|
EST_String m = siod_sprint(x);
|
|
|
|
if ((fd=fopen(tmpfile,"wb")) == NULL)
|
|
{
|
|
cerr << "siod: can't open temporary file \"" <<
|
|
tmpfile << "\" for client lisp return" << endl;
|
|
}
|
|
else
|
|
{
|
|
fwrite((const char *)m,sizeof(char),m.length(),fd);
|
|
fwrite("\n",1,1,fd);
|
|
fclose(fd);
|
|
#ifdef WIN32
|
|
send(siod_server_socket,"LP\n",3,0);
|
|
#else
|
|
write(siod_server_socket,"LP\n",3);
|
|
#endif
|
|
socket_send_file(siod_server_socket,tmpfile);
|
|
unlink(tmpfile);
|
|
}
|
|
|
|
return x;
|
|
}
|
|
|
|
void sock_acknowledge_error()
|
|
{
|
|
// Called to let client know if server gets an error
|
|
// Thanks to mcb for pointing out this omission
|
|
|
|
if (siod_server_socket != -1)
|
|
#ifdef WIN32
|
|
send(siod_server_socket,"ER\n",3,0);
|
|
#else
|
|
write(siod_server_socket,"ER\n",3);
|
|
#endif
|
|
|
|
}
|
|
|
|
static void acknowledge_sock_print(LISP x)
|
|
{ // simple return "OK" -- used in server socket mode
|
|
|
|
siod_send_lisp_to_client(x);
|
|
#ifdef WIN32
|
|
send(siod_server_socket,"OK\n",3,0);
|
|
#else
|
|
write(siod_server_socket,"OK\n",3);
|
|
#endif
|
|
}
|
|
|
|
static void ignore_puts(char *x)
|
|
{
|
|
(void)x;
|
|
}
|
|
|
|
long repl_from_socket(int fd)
|
|
{
|
|
/* Read from given fd as stdin */
|
|
struct repl_hooks hd;
|
|
|
|
#ifdef WIN32
|
|
if (!SetStdHandle(STD_INPUT_HANDLE,(HANDLE)fd))
|
|
{
|
|
GetLastError();
|
|
cerr << "repl_from_socket: couldn't set stdin to socket\n";
|
|
}
|
|
#else
|
|
dup2(fd,0); // make socket into stdin
|
|
// dup2(fd,1); // make socket into stdout
|
|
#endif
|
|
hd.repl_puts = ignore_puts;
|
|
hd.repl_print = acknowledge_sock_print;
|
|
hd.repl_eval = NULL;
|
|
#ifdef WIN32
|
|
hd.repl_read = lreadwinsock;
|
|
#else
|
|
hd.repl_read = NULL;
|
|
#endif
|
|
siod_interactive = FALSE;
|
|
siod_server_socket = fd;
|
|
|
|
return repl_driver(1,0,&hd);
|
|
}
|
|
|
|
void init_subrs_srv(void)
|
|
{
|
|
init_subr_1("send_client",siod_send_lisp_to_client,
|
|
"(send_client EXPR)\n\
|
|
Send EXPR to client. In server mode this will send a printed form of\n\
|
|
ESPR to the client. It is the client's job to expect it.");
|
|
}
|