4 * This module is a sort of all-purpose interchange for file
5 * descriptors. At one end it talks to uxnet.c and pty.c and
6 * anything else which might have one or more fds that need
7 * select()-type things doing to them during an extended program
8 * run; at the other end it talks to pterm.c or uxplink.c or
9 * anything else which might have its own means of actually doing
10 * those select()-type things.
20 int rwx
; /* 4=except 2=write 1=read */
21 uxsel_callback_fn callback
;
26 static int uxsel_fd_cmp(void *av
, void *bv
)
28 struct fd
*a
= (struct fd
*)av
;
29 struct fd
*b
= (struct fd
*)bv
;
36 static int uxsel_fd_findcmp(void *av
, void *bv
)
39 struct fd
*b
= (struct fd
*)bv
;
49 fds
= newtree234(uxsel_fd_cmp
);
53 * Here is the interface to fd-supplying modules. They supply an
54 * fd, a set of read/write/execute states, and a callback function
55 * for when the fd satisfies one of those states. Repeated calls to
56 * uxsel_set on the same fd are perfectly legal and serve to change
57 * the rwx state (typically you only want to select an fd for
58 * writing when you actually have pending data you want to write to
62 void uxsel_set(int fd
, int rwx
, uxsel_callback_fn callback
)
64 struct fd
*newfd
= snew(struct fd
);
69 newfd
->callback
= callback
;
71 oldfd
= find234(fds
, newfd
, NULL
);
80 void uxsel_del(int fd
)
82 struct fd
*oldfd
= find234(fds
, &fd
, uxsel_fd_findcmp
);
90 * And here is the interface to select-functionality-supplying
94 int next_fd(int *state
, int *rwx
)
97 fd
= index234(fds
, (*state
)++);
105 int first_fd(int *state
, int *rwx
)
108 return next_fd(state
, rwx
);
111 int select_result(int fd
, int event
)
113 struct fd
*fdstruct
= find234(fds
, &fd
, uxsel_fd_findcmp
);
114 assert(fdstruct
!= NULL
);
115 return fdstruct
->callback(fd
, event
);