All pastes #160731 Raw Edit

Diff

public text v1 · immutable
·published 2006-09-04 17:35 UTC
rendered paste body
--- 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 <unistd.h> #include <fcntl.h> +/* ======================= for Zaurus ======================== */+#define ZAURUS+#ifdef ZAURUS+#include <signal.h>+#include <sys/time.h>+#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;i<zau_n_files;i++){+      if (zau_fd[i]>0) 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<zau_n_files;i++) {+    if (zau_fd[i]==-1) {+      fd=i;+      break;+    }+  }+  if (fd<0) {+    fd = zau_n_files ++;+  }+  i = open(pathname,flags);+  zau_fd[fd]=i;+  if (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; i++) {+    zau_temporary_close(i);+  }+  zau_opened = 0;+  sync();+}++static int zau_reopen(int fd) {+  int i;+  if (fd<0 || fd>=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 <pthread.h> #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;