total_written += len;
}
+static int num_waiting(int fd)
+{
+ int len=0;
+#ifdef FIONREAD
+ ioctl(fd,FIONREAD,&len);
+#endif
+ return(len);
+}
+
+static char *read_buffer = NULL;
+static char *read_buffer_p = NULL;
+static int read_buffer_len = 0;
+static int read_buffer_size = 0;
+
+
void write_flush(int f)
{
}
+void read_check(int f)
+{
+ int n;
+
+ if (read_buffer_len == 0) {
+ read_buffer_p = read_buffer;
+ }
+
+ if ((n=num_waiting(f)) <= 0)
+ return;
+
+ if (read_buffer_p != read_buffer) {
+ memmove(read_buffer,read_buffer_p,read_buffer_len);
+ read_buffer_p = read_buffer;
+ }
+
+ if (n > (read_buffer_size - read_buffer_len)) {
+ read_buffer_size += n;
+ if (!read_buffer)
+ read_buffer = (char *)malloc(read_buffer_size);
+ else
+ read_buffer = (char *)realloc(read_buffer,read_buffer_size);
+ if (!read_buffer) out_of_memory("read check");
+ read_buffer_p = read_buffer;
+ }
+
+ n = read(f,read_buffer+read_buffer_len,n);
+ if (n > 0) {
+ read_buffer_len += n;
+ }
+}
+
-int readfd(int fd,char *buffer,int N)
+static int readfd(int fd,char *buffer,int N)
{
int ret;
int total=0;
while (total < N)
{
- ret = read(fd,buffer + total,N - total);
+ if (read_buffer_len > 0) {
+ ret = MIN(read_buffer_len,N-total);
+ memcpy(buffer+total,read_buffer_p,ret);
+ read_buffer_p += ret;
+ read_buffer_len -= ret;
+ } else {
+ ret = read(fd,buffer + total,N - total);
+ }
if (ret <= 0)
return total;
void unmap_file(char *buf,off_t len)
{
- if (len > 0)
+ if (len > 0 && buf)
munmap(buf,len);
}
return utimes(fname,t);
#endif
}
+