--- eb-4.2.2/eb/zio.c 2006-09-04 19:34:01.000000000 +0200 +++ eb-4.2.2-new/eb/zio.c 2006-09-04 19:34:27.000000000 +0200 @@ -39,6 +39,175 @@ #include #include +/* ======================= for Zaurus ======================== */ +#define ZAURUS +#ifdef ZAURUS +#include +#include +#define ZAU_MAX_OPEN 1024 + +int zau_use_itimer=1; +int zau_opened=0; +int zau_temporary_close_all(void); +void (*zau_open_trig)() = NULL; +void zau_get_zio_status(char *buf,int fd); + +static int zau_n_files = 0; +static int zau_fd[ZAU_MAX_OPEN+1]; +static char *zau_fname[ZAU_MAX_OPEN+1]; +static int zau_flags[ZAU_MAX_OPEN+1]; +static off_t zau_pos[ZAU_MAX_OPEN+1]; + +static int zau_open(const char *pathname, int flags); +static int zau_close(int fd); +static ssize_t zau_read(int fd, void *buf, size_t count); + +static int zau_reopen(int fd); + +static void settimer(int sec, int usec) { + if (zau_use_itimer) { + struct itimerval itv; + itv.it_interval.tv_sec=0; + itv.it_interval.tv_usec=0; + itv.it_value.tv_sec=sec; + itv.it_value.tv_usec=usec; + setitimer(ITIMER_REAL, &itv, NULL); + } +} + +static void sigvtalrm(int x) { + settimer(0,0); + zau_temporary_close_all(); +} + +static void sigalrm(int x) { + settimer(0,0); + zau_temporary_close_all(); +} + +static int zau_initialize_library(void) { + if (zau_use_itimer) { + signal(SIGVTALRM, sigvtalrm); + signal(SIGALRM, sigalrm); + } + zau_n_files=1; +} + +void zau_get_zio_status(char *buf, int fd) { + /* Buffer size must be larger than 1024 */ + *buf=0; + if (fd==0) { + int count=0,count2=0,i; + for(i=1;i0) count++; + if (zau_fd[i]==-10) count2++; + } + sprintf(buf,"Inactive=%d, Access=%d, Total=%d\n", + count2, count, count+count2); + } else if (zau_fd[fd]>0 || zau_fd[fd]==-10) { + if (zau_fname[fd]!=NULL) { + sprintf(buf,"%4d : %s\n", fd,zau_fname[fd]); + } else { + sprintf(buf,"%4d : %s\n", "----"); + } + } + return; +} + +static int zau_open(const char *pathname, int flags) { + int i, fd; + fd = -1; + if (pathname==NULL) return -1; + for(i=1;i=0) { + zau_fname[fd]=strdup(pathname); + zau_flags[fd]=flags; + } + + settimer(1,0); + zau_opened = 1; + if (zau_open_trig != NULL) zau_open_trig(); + return fd; +} + +static int zau_close(int fd) { + if (fd<=0 || fd>=zau_n_files) return -1; + if (zau_fd[fd]>0) { + close(zau_fd[fd]); + } + zau_fd[fd]=-1; + if (zau_fname[fd]!=NULL) { + free(zau_fname[fd]); + zau_fname[fd]=NULL; + } + while(zau_n_files>1 && zau_fd[zau_n_files-1]==-1) zau_n_files--; + return 0; +} + +static int zau_temporary_close(int fd) { + if (fd<0 || fd>=zau_n_files) return -1; + if (zau_fd[fd]>0) { + zau_pos[fd]=lseek(zau_fd[fd], 0, SEEK_CUR); + close(zau_fd[fd]); + zau_fd[fd]=-10; + } + return zau_fd[fd]; +} + +int zau_temporary_close_all(void) { + int i; + for(i=1; i=zau_n_files) return -1; + if (zau_fd[fd]==-10) { + i=open(zau_fname[fd], zau_flags[fd]); + zau_fd[fd]=i; + if (i>=0) { + lseek(i, zau_pos[i], SEEK_SET); + zau_opened = 1; + if (zau_open_trig != NULL) zau_open_trig(); + settimer(1, 0); + } + } + return i; +} + +static int zau_read(int fd, void *buf, size_t count) { + zau_reopen(fd); + return read(zau_fd[fd], buf, count); +} + +static int zau_lseek(int fd, off_t offset, int whence) { + zau_reopen(fd); + return lseek(zau_fd[fd], offset, whence); +} + +#define open(a,b) zau_open(a,b) +#define close(a) zau_close(a) +#define read(a,b,c) zau_read(a,b,c) +#define lseek(a,b,c) zau_lseek(a,b,c) + +#endif +/* ======================= for Zaurus ======================== */ + + #ifdef ENABLE_PTHREAD #include #endif @@ -201,7 +370,9 @@ if (cache_buffer == NULL) goto failed; } - +#ifdef ZAURUS + zau_initialize_library(); +#endif LOG(("out: zio_initialize_library() = %d", 0)); pthread_mutex_unlock(&zio_mutex); return 0;