1 /*
2  *                   COPYRIGHT (c) 1988-1994 BY                             *
3  *        PARADIGM ASSOCIATES INCORPORATED, CAMBRIDGE, MASSACHUSETTS.       *
4  *        See the source file SLIB.C for more information.                  *
5 
6  * Reorganization of files (Mar 1999) by Alan W Black <awb@cstr.ed.ac.uk>
7 
8  * Client/server functions
9 
10 */
11 #include <cstdio>
12 #include "EST_io_aux.h"
13 #include "siod.h"
14 #include "siodp.h"
15 
16 int siod_server_socket = -1;
17 
siod_send_lisp_to_client(LISP x)18 LISP siod_send_lisp_to_client(LISP x)
19 {
20     // Send x to the client
21     if (siod_server_socket == -1)
22     {
23 	err("siod: not in server mode",x);
24     }
25 
26     EST_String tmpfile = make_tmp_filename();
27     FILE *fd;
28     EST_String m = siod_sprint(x);
29 
30     if ((fd=fopen(tmpfile,"wb")) == NULL)
31     {
32 	cerr << "siod: can't open temporary file \"" <<
33 	    tmpfile << "\" for client lisp return" << endl;
34     }
35     else
36     {
37 	fwrite((const char *)m,sizeof(char),m.length(),fd);
38 	fwrite("\n",1,1,fd);
39 	fclose(fd);
40 #ifdef WIN32
41 	send(siod_server_socket,"LP\n",3,0);
42 #else
43 	write(siod_server_socket,"LP\n",3);
44 #endif
45 	socket_send_file(siod_server_socket,tmpfile);
46 	unlink(tmpfile);
47     }
48 
49     return x;
50 }
51 
sock_acknowledge_error()52 void sock_acknowledge_error()
53 {
54     // Called to let client know if server gets an error
55     // Thanks to mcb for pointing out this omission
56 
57     if (siod_server_socket != -1)
58 #ifdef WIN32
59 	send(siod_server_socket,"ER\n",3,0);
60 #else
61 	write(siod_server_socket,"ER\n",3);
62 #endif
63 
64 }
65 
acknowledge_sock_print(LISP x)66 static void acknowledge_sock_print(LISP x)
67 {   // simple return "OK" -- used in server socket mode
68 
69     siod_send_lisp_to_client(x);
70 #ifdef WIN32
71     send(siod_server_socket,"OK\n",3,0);
72 #else
73     write(siod_server_socket,"OK\n",3);
74 #endif
75 }
76 
ignore_puts(char * x)77 static void ignore_puts(char *x)
78 {
79     (void)x;
80 }
81 
repl_from_socket(int fd)82 long repl_from_socket(int fd)
83 {
84     /* Read from given fd as stdin */
85     struct repl_hooks hd;
86 
87 #ifdef WIN32
88     if (!SetStdHandle(STD_INPUT_HANDLE,(HANDLE)fd))
89     {
90 	GetLastError();
91 	cerr << "repl_from_socket: couldn't set stdin to socket\n";
92     }
93 #else
94     dup2(fd,0);                     // make socket into stdin
95     // dup2(fd,1);                     // make socket into stdout
96 #endif
97     hd.repl_puts = ignore_puts;
98     hd.repl_print = acknowledge_sock_print;
99     hd.repl_eval = NULL;
100 #ifdef WIN32
101     hd.repl_read = lreadwinsock;
102 #else
103     hd.repl_read = NULL;
104 #endif
105     siod_interactive = FALSE;
106     siod_server_socket = fd;
107 
108     return repl_driver(1,0,&hd);
109 }
110 
init_subrs_srv(void)111 void init_subrs_srv(void)
112 {
113  init_subr_1("send_client",siod_send_lisp_to_client,
114  "(send_client EXPR)\n\
115  Send EXPR to client.  In server mode this will send a printed form of\n\
116  ESPR to the client.  It is the client's job to expect it.");
117 }
118