1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-02 03:52:49 -05:00

Added uxsel.c, into which I've moved those parts of the uxnet.c

functionality that deal with selectable fds in general. The idea is
that pty.c will stop passing its fd straight to pterm.c and hand it
to this module instead, and pterm.c will start requesting a general
list of fds from this module rather than expecting a single one from
pty.c, with the ultimate aim of pterm.c being able to form the basis
of a Unix PuTTY as well as pterm proper.

[originally from svn r3015]
This commit is contained in:
Simon Tatham
2003-03-29 16:47:06 +00:00
parent d36a4c3685
commit b109918032
5 changed files with 172 additions and 65 deletions

View File

@ -273,9 +273,9 @@ int main(int argc, char **argv)
{
int sending;
int portnumber = -1;
int *sklist;
int socket;
int i, skcount, sksize, socketstate;
int *fdlist;
int fd;
int i, fdcount, fdsize, fdstate;
int connopen;
int exitcode;
int errors;
@ -283,8 +283,8 @@ int main(int argc, char **argv)
ssh_get_line = console_get_line;
sklist = NULL;
skcount = sksize = 0;
fdlist = NULL;
fdcount = fdsize = 0;
/*
* Initialise port and protocol to sensible defaults. (These
* will be overridden by more or less anything.)
@ -559,6 +559,7 @@ int main(int argc, char **argv)
putty_signal(SIGWINCH, sigwinch);
sk_init();
uxsel_init();
/*
* Start up the connection.
@ -623,31 +624,31 @@ int main(int argc, char **argv)
FD_SET_MAX(2, maxfd, wset);
}
/* Count the currently active sockets. */
/* Count the currently active fds. */
i = 0;
for (socket = first_socket(&socketstate, &rwx); socket >= 0;
socket = next_socket(&socketstate, &rwx)) i++;
for (fd = first_fd(&fdstate, &rwx); fd >= 0;
fd = next_fd(&fdstate, &rwx)) i++;
/* Expand the sklist buffer if necessary. */
if (i > sksize) {
sksize = i + 16;
sklist = sresize(sklist, sksize, int);
/* Expand the fdlist buffer if necessary. */
if (i > fdsize) {
fdsize = i + 16;
fdlist = sresize(fdlist, fdsize, int);
}
/*
* Add all currently open sockets to the select sets, and
* store them in sklist as well.
* Add all currently open fds to the select sets, and store
* them in fdlist as well.
*/
skcount = 0;
for (socket = first_socket(&socketstate, &rwx); socket >= 0;
socket = next_socket(&socketstate, &rwx)) {
sklist[skcount++] = socket;
fdcount = 0;
for (fd = first_fd(&fdstate, &rwx); fd >= 0;
fd = next_fd(&fdstate, &rwx)) {
fdlist[fdcount++] = fd;
if (rwx & 1)
FD_SET_MAX(socket, maxfd, rset);
FD_SET_MAX(fd, maxfd, rset);
if (rwx & 2)
FD_SET_MAX(socket, maxfd, wset);
FD_SET_MAX(fd, maxfd, wset);
if (rwx & 4)
FD_SET_MAX(socket, maxfd, xset);
FD_SET_MAX(fd, maxfd, xset);
}
do {
@ -659,19 +660,19 @@ int main(int argc, char **argv)
exit(1);
}
for (i = 0; i < skcount; i++) {
socket = sklist[i];
for (i = 0; i < fdcount; i++) {
fd = fdlist[i];
/*
* We must process exceptional notifications before
* ordinary readability ones, or we may go straight
* past the urgent marker.
*/
if (FD_ISSET(socket, &xset))
select_result(socket, 4);
if (FD_ISSET(socket, &rset))
select_result(socket, 1);
if (FD_ISSET(socket, &wset))
select_result(socket, 2);
if (FD_ISSET(fd, &xset))
select_result(fd, 4);
if (FD_ISSET(fd, &rset))
select_result(fd, 1);
if (FD_ISSET(fd, &wset))
select_result(fd, 2);
}
if (FD_ISSET(signalpipe[0], &rset)) {