mirror of /home/gitosis/repositories/libowfat.git
Mirror of :pserver:cvs@cvs.fefe.de:/cvs libowfat
https://www.fefe.de/libowfat/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.1 KiB
48 lines
1.1 KiB
#include <unistd.h> |
|
#include <sys/time.h> |
|
#include <poll.h> |
|
#include <errno.h> |
|
#include "io_internal.h" |
|
|
|
int64 io_tryread(int64 d,char* buf,int64 len) { |
|
long r; |
|
struct itimerval old,new; |
|
struct pollfd p; |
|
io_entry* e=array_get(&io_fds,sizeof(io_entry),d); |
|
if (!e) { errno=EBADF; return -3; } |
|
if (!e->nonblock) { |
|
p.fd=d; |
|
if (p.fd != d) { errno=EBADF; return -3; } /* catch overflow */ |
|
p.events=POLLIN; |
|
switch (poll(&p,1,0)) { |
|
case -1: return -3; |
|
case 0: errno=EAGAIN; |
|
e->canread=0; |
|
e->next_read=-1; |
|
return -1; |
|
} |
|
new.it_interval.tv_usec=0; |
|
new.it_interval.tv_sec=0; |
|
new.it_value.tv_usec=10000; |
|
new.it_value.tv_sec=0; |
|
setitimer(ITIMER_REAL,&new,&old); |
|
} |
|
r=read(d,buf,len); |
|
if (!e->nonblock) { |
|
new.it_interval.tv_usec=0; |
|
new.it_interval.tv_sec=0; |
|
new.it_value.tv_usec=0; |
|
new.it_value.tv_sec=0; |
|
setitimer(ITIMER_REAL,&new,&old); |
|
} |
|
if (r==-1) { |
|
if (errno==EINTR) errno=EAGAIN; |
|
if (errno!=EAGAIN) |
|
r=-3; |
|
} |
|
if (r==-1 || r==0) { |
|
e->canread=0; |
|
e->next_read=-1; |
|
} |
|
return r; |
|
}
|
|
|