do{
fd_set rfds; FD_ZERO (&rfds); FD_SET (port->fd, &rfds);
tv.tv_sec=0; tv.tv_usec=ITER_WAIT_TIME;
int intr=0;
switch(select(port->fd+1, &rfds, NULL, NULL, &tv))
{
case 1: bytes_readed=(size>14)?read(port->fd,buff,14):read(port->fd,buff,size);
if(errno==EINTR){time_req+=ITER_WAIT_TIME; intr++;};
switch(bytes_readed)
{
case -1: if(errno!=EINTR){syslog(LOG_ERR,"can't read port %s : %s",port->name,strerror(errno));return -1;}; break;
case 0: break;
default: buff+=bytes_readed; size-=bytes_readed; break;
};
break;
case 0: break;
case -1: if(errno!=EINTR){syslog(LOG_ERR,"ERROR read port %s : %s",port->name,strerror(errno));return -1;}
else {time_req+=ITER_WAIT_TIME; intr++;};
break;
default: syslog(LOG_ERR,"unexpected ERROR while read port %s : %s",port->name,strerror(errno));return -1; break;
};
gettimeofday(&time_cur,NULL);
time_out=(time_cur.tv_sec-time_start.tv_sec)*1000000+(time_cur.tv_usec-time_star
t.tv_usec);
}while((time_out<time_req) && (size>0) && !((time_out>ITER_WAIT_TIME) && (intr==0) && (size==answer_size)));
Форум —
Development
