18static char SccsId[] =
"%W% %G%";
47#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR)
53static int SocketPutc(
int,
int);
54static int ConsoleSocketPutc(
int,
int);
55static int SocketGetc(
int);
56static int ConsoleSocketGetc(
int);
61 st->stream_putc = SocketPutc;
68 st->stream_putc = ConsoleSocketPutc;
76 if (LOCAL_sockets_io &&
79 s->status |= Socket_Stream_f;
80 s->u.socket.domain = af_inet;
81 s->u.socket.flags = client_socket;
99#if _MSC_VER || defined(__MINGW32__)
100 count = recv(s->u.socket.fd, &c,
sizeof(
char), 0);
102 count = read(s->u.socket.fd, &c,
sizeof(
char));
105 s->u.socket.flags = closed_socket;
107 }
else if (count > 0) {
111 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
112 "( socket_getc: %s)", strerror(errno));
114 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
127ConsoleSocketGetc(
int sno)
137 char *cptr = LOCAL_Prompt, ch;
139 while ((ch = *cptr++) !=
'\0') {
140 GLOBAL_Stream[StdErrStream].stream_putc(StdErrStream, ch);
142 strncpy(LOCAL_Prompt, RepAtom (LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
143 LOCAL_newline = FALSE;
146 LOCAL_PrologMode |= ConsoleGetcMode;
147#if _MSC_VER || defined(__MINGW32__)
148 count = recv(s->u.socket.fd, (
void *)&c,
sizeof(
char), 0);
150 count = read(s->u.socket.fd, &c,
sizeof(
char));
152 LOCAL_PrologMode &= ~ConsoleGetcMode;
154 return console_post_process_eof(s);
155 }
else if (count > 0) {
158 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"read");
159 return console_post_process_eof(s);
166ConsoleSocketPutc (
int sno,
int ch)
176#if _MSC_VER || defined(__MINGW32__)
177 send(s->u.socket.fd, &c,
sizeof(c), 0);
179 if (write(s->u.socket.fd, &c,
sizeof(c)) < 0) {
181 Yap_Error(SYSTEM_ERROR_FATAL, TermNil,
"no access to console: %s", strerror(errno));
183 Yap_Error(SYSTEM_ERROR_FATAL, TermNil,
"no access to console");
187 count_output_char(ch,s);
192SocketPutc (
int sno,
int ch)
202#if _MSC_VER || defined(__MINGW32__)
203 send(s->u.socket.fd, &c,
sizeof(c), 0);
208 out = write(s->u.socket.fd, &c,
sizeof(c));
211 Yap_Error(PERMISSION_ERROR_INPUT_STREAM, TermNil,
"error writing stream socket: %s", strerror(errno));
213 Yap_Error(PERMISSION_ERROR_INPUT_STREAM, TermNil,
"error writing stream socket");
225Yap_CheckIOStream(Term stream,
char * error)
227 int sno = Yap_CheckStream(stream, Input_Stream_f|Output_Stream_f|Socket_Stream_f, error);
228 UNLOCK(GLOBAL_Stream[sno].streamlock);
233Yap_InitSocketStream(
int fd, socket_info flags, socket_domain domain) {
237 sno = GetFreeStreamD();
239 PlIOError (SYSTEM_ERROR_INTERNAL,TermNil,
"new stream not available for socket/4");
242 st = &GLOBAL_Stream[sno];
243 st->u.socket.domain = domain;
244 st->u.socket.flags = flags;
246 if (flags & (client_socket|server_session_socket)) {
248 st->status = (Socket_Stream_f|Input_Stream_f|Output_Stream_f);
251 st->status = Socket_Stream_f;
253 st->u.socket.fd = fd;
255 st->file = fdopen( fd,
"rw");
261 st->stream_putc = SocketPutc;
263 Yap_DefaultStreamOps( st );
264 UNLOCK(st->streamlock);
265 return(Yap_MkStream(sno));
270Yap_CheckSocketStream(Term stream,
const char * error)
272 int sno = Yap_CheckStream(stream, Socket_Stream_f, error);
273 UNLOCK(GLOBAL_Stream[sno].streamlock);
279Yap_GetSocketDomain(
int sno)
281 return(GLOBAL_Stream[sno].u.socket.domain);
286Yap_GetSocketStatus(
int sno)
288 return(GLOBAL_Stream[sno].u.socket.flags);
293Yap_UpdateSocketStream(
int sno, socket_info flags, socket_domain domain) {
296 st = &GLOBAL_Stream[sno];
297 st->u.socket.domain = domain;
298 st->u.socket.flags = flags;
299 if (flags & (client_socket|server_session_socket)) {
301 st->status = (Socket_Stream_f|Input_Stream_f|Output_Stream_f);
304 st->status = Socket_Stream_f;
310Yap_InitSockets(
void )
312 Yap_InitSocketLayer( );
int(* stream_getc)(int)
function the stream uses for writing a character
struct vfs * vfs
function the stream uses for reading a character