Listing 3. Using an Exception Set
void
getdata(int ixj1)
{
fd_set rfds,wfds,efds;
struct timeval tv;
union telephony_exception ixje1;
int nmax, size, state, nlen;
char buf[480], jbuf[480], dtmf1;
char date[5], time[5], clen[2], pnum[11], cname[80];
nmax = ixj1+1;
/* clear the file descriptor sets */
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&efds);
/* set them all to include our descriptor ixj1 */
FD_SET(ixj1, &rfds);
FD_SET(ixj1, &wfds);
FD_SET(ixj1, &efds);
/* set the timeout for select to be quite short */
tv.tv_sec = 0;
tv.tv_usec = 300;
/* block for the time period or until
activity occurs on the file descriptor */
select(nmax, NULL, &wfds, &efds, &tv);
if(FD_ISSET(ixj1,&wfds))
{
/* the file descriptor is ready for writing
-send it some data! */
}
if(FD_ISSET(ixj1,&rfds))
{
/* the file descriptor is ready for reading
-read some data! */
}
if(FD_ISSET(ixj1,&efds))
{
/* ask the device what kind of
exception occurred */
ixje1.bytes = ioctl(ixj1, PHONE_EXCEPTION);
/* check to see if the user hung up or
picked up the phone */
if(ixje.bits.hookstate)
{
if(ioctl(ixj1, PHONE_HOOKSTATE))
{
printf("Off Hook\n");
}
else
printf("On Hook\n");
}
}
}