9 static int sock
[OPEN_MAX
];
10 static int sock_inited
= FALSE
;
12 #define SOCK_MAX OPEN_MAX
14 static void cleanup(void)
17 for (i
= 0; i
< SOCK_MAX
; i
++)
19 Sock_close(sock
[i
], NULL
);
24 static LVAL
enter_sock(int fd
)
30 for (i
= 0; i
< SOCK_MAX
; i
++)
33 return cvfixnum((FIXTYPE
) fd
);
40 static LVAL
close_sock(int fd
)
43 for (i
= 0; i
< SOCK_MAX
; i
++)
46 return Sock_close(fd
, NULL
) == -1 ? NIL
: s_true
;
51 static void check_init(void)
55 for (i
= 0; i
< SOCK_MAX
; i
++)
65 int port
= getfixnum(xlgafixnum());
68 return enter_sock(Sock_open(port
, NULL
));
73 int sock
= getfixnum(xlgafixnum());
76 return enter_sock(Sock_listen(sock
, NULL
, 0, NULL
));
81 int port
= getfixnum(xlgafixnum());
82 char *serv
= getstring(xlgastring());
85 return enter_sock(Sock_connect(port
, serv
, NULL
));
90 int sock
= getfixnum(xlgafixnum());
92 return close_sock(sock
);
98 int port
= getfixnum(xlgafixnum());
99 LVAL buf
= xlgastring();
102 n
= Sock_read(port
, getstring(buf
), getslength(buf
), NULL
);
103 return n
== -1 ? NIL
: cvfixnum((FIXTYPE
) n
);
109 int port
, start
, end
, len
;
111 port
= getfixnum(xlgafixnum());
113 start
= getfixnum(xlgafixnum());
114 end
= getfixnum(xlgafixnum());
117 len
= getslength(buf
);
124 n
= Sock_write(port
, getstring(buf
) + start
, end
- start
, NULL
);
125 return n
== -1 ? NIL
: cvfixnum((FIXTYPE
) n
);
129 /* Under X11 after a fork() the next call to XSync() hangs. I'll try
130 to figure this out but for now if you want to use fork you can't
131 use graphics -- just undefine DISPLAY before tarting xlisp. I'm
132 sure it isn't the fork as such but rather something like the
133 attempt of both processes to wait on the display that is the
134 problem. But I don't know exactly what it is. */
137 #endif /* XLISP_STAT */
139 #include <sys/wait.h>
140 static void sig_child(int sig
)
143 while (waitpid(-1, &stat
, WNOHANG
) > 0);
146 static int sig_fork_inited
= FALSE
;
154 xlfail("can't fork under X11 (at least for now)");
155 #endif /* XLISP_STAT */
156 if (! sig_fork_inited
) {
158 sa
.sa_handler
= sig_child
;
160 sigaction(SIGCHLD
, &sa
, NULL
);
161 sig_fork_inited
= TRUE
;
164 return pid
== -1 ? NIL
: cvfixnum((FIXTYPE
) pid
);
168 static FUNDEF myfuns
[] = {
169 { "SOCKETS::SOCK-OPEN", SUBR
, xsockopen
},
170 { "SOCKETS::SOCK-LISTEN", SUBR
, xsocklisten
},
171 { "SOCKETS::SOCK-CONNECT", SUBR
, xsockconnect
},
172 { "SOCKETS::SOCK-CLOSE", SUBR
, xsockclose
},
173 { "SOCKETS::BASE-SOCK-READ", SUBR
, xsockread
},
174 { "SOCKETS::BASE-SOCK-WRITE", SUBR
, xsockwrite
},
176 { "SOCKETS::FORK", SUBR
, xsockfork
},
181 static xlshlib_modinfo_t myinfo
= {
182 XLSHLIB_VERSION_INFO(0,1,0,1),
189 xlshlib_modinfo_t
*xlsock__init() { return &myinfo
; }