Diff for /freem/src/global_bltin.c between versions 1.8 and 1.16

version 1.8, 2025/04/08 14:39:21 version 1.16, 2025/04/11 00:52:40
Line 24 Line 24
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
  *   $Log$   *   $Log$
    *   Revision 1.16  2025/04/11 00:52:40  snw
    *   Replace all lseek/read calls in global handler to use gbl_read_block function
    *
    *   Revision 1.15  2025/04/10 01:24:38  snw
    *   Remove C++ style comments
    *
    *   Revision 1.14  2025/04/09 19:52:02  snw
    *   Eliminate as many warnings as possible while building with -Wall
    *
    *   Revision 1.13  2025/04/09 14:34:30  snw
    *   Further work on global_bltin.c refactor
    *
    *   Revision 1.12  2025/04/09 00:43:07  snw
    *   Exit with fatal error if a header mismatch found
    *
    *   Revision 1.11  2025/04/08 21:41:13  snw
    *   Make insert, update, and splitp global handler functions take a ptr to a global_handle instead of a file descriptor
    *
    *   Revision 1.10  2025/04/08 20:00:56  snw
    *   Global handler now uses a header file and maintains the last journaling transaction ID
    *
    *   Revision 1.9  2025/04/08 16:46:11  snw
    *   Add global file header and offsets
    *
  *   Revision 1.8  2025/04/08 14:39:21  snw   *   Revision 1.8  2025/04/08 14:39:21  snw
  *   Initial work on global handler refactor   *   Initial work on global handler refactor
  *   *
Line 53 Line 77
 #include <errno.h>  #include <errno.h>
   
 #include "mpsdef.h"  #include "mpsdef.h"
   #include "journal.h"
 #include "global_bltin.h"  #include "global_bltin.h"
   
 global_handle *global_handles_head;  global_handle *global_handles_head;
   unsigned long gbl_cache_misses = 0;
   unsigned long gbl_cache_hits = 0;
   
 static void b_free (short filedes, unsigned long blknbr);  static void b_free (short filedes, unsigned long blknbr);
 static void splitp (short filedes, char *block, long *addr, long *offs, unsigned long *blknbr);  static void splitp (global_handle *g, char *block, long *addr, long *offs, unsigned long *blknbr);
 static void update (short filedes, char *ins_key, long keyl);  static void update (global_handle *g, char *ins_key, long keyl);
 static void insert (int filedes, char *ins_key, long key_len, unsigned long blknbr);  static void insert (global_handle *g, char *ins_key, long key_len, unsigned long blknbr);
 static void scanpblk (char *block, long *adr, long *fnd);  static void scanpblk (char *block, long *adr, long *fnd);
 static void scandblk (char *block, long *adr, long *fnd);  static void scandblk (char *block, long *adr, long *fnd);
 static void getnewblk (int filedes, unsigned long *blknbr);  static void getnewblk (int filedes, unsigned long *blknbr);
 static short int g_collate (char *t);  static short int g_collate (char *t);
 //static short int g_numeric (char *str);  
 short g_numeric (char *str);  short g_numeric (char *str);
 void close_all_globals(void);  void close_all_globals(void);
 static void panic (void);  static void panic (void);
Line 116  static void panic (void); Line 142  static void panic (void);
 inline long gbl_path(char *key, char *buf)  inline long gbl_path(char *key, char *buf)
 {  {
     long savj;      long savj;
     long savch;                 /* saved j and ch for multiple pathes */  
   
     register long int i;      register long int i;
     register long int j;      register long int j;
     register long int k;      register long int k;
     register long int ch;      register long int ch;
     long pathscan;                      /* flag for repeated scan of pathlist setting an undef global */  
         
     /* construct full UNIX filename */      /* construct full UNIX filename */
     savj = 0;      savj = 0;
     savch = ch = EOL;  
     pathscan = TRUE;  
 nextpath:  
     k = 0;      k = 0;
     j = savj;      j = savj;
   
Line 152  nextpath: Line 173  nextpath:
         }          }
   
     }      }
   
     if (savj == 0 && ch == EOL) pathscan = FALSE;               /* one path only: inhibit search */  
           
     if (k > 0) {      if (k > 0) {
   
Line 166  nextpath: Line 185  nextpath:
   
     }      }
   
     savch = ch;  
     savj = j;      savj = j;
     i = 0;      i = 0;
     j = 0;      j = 0;
Line 197  nextpath: Line 215  nextpath:
     buf[k] = NUL;                       /* NUL not EOL !!! */      buf[k] = NUL;                       /* NUL not EOL !!! */
   
     return i;      return i;
 } /* global_file */  } /* gbl_path() */
   
   void gbl_cache_hit(global_handle *g)
   {
       g->cache_hits++;
       gbl_cache_hits++;
   } /* gbl_cache_hit() */
   
   void gbl_cache_miss(global_handle *g)
   {
       g->fast_path = 0;
       g->cache_misses++;
       gbl_cache_misses++;
   } /* gbl_cache_miss() */
   
 int gbl_lock(global_handle *g, int type)  int gbl_lock(global_handle *g, int type)
 {  {
Line 207  int gbl_lock(global_handle *g, int type) Line 238  int gbl_lock(global_handle *g, int type)
   
     locking (g->fd, type, 0L);      locking (g->fd, type, 0L);
     g->locked = TRUE;      g->locked = TRUE;
 }  
       return TRUE;
   } /* gbl_lock() */
   
 int gbl_unlock(global_handle *g)  int gbl_unlock(global_handle *g)
 {  {
Line 217  int gbl_unlock(global_handle *g) Line 250  int gbl_unlock(global_handle *g)
   
     locking (g->fd, 0, 0L);      locking (g->fd, 0, 0L);
     g->locked = FALSE;      g->locked = FALSE;
 }  
       return TRUE;
   } /* gbl_unlock() */
   
 void gbl_close(global_handle *g)  void gbl_close(global_handle *g)
 {  {
Line 230  void gbl_close(global_handle *g) Line 265  void gbl_close(global_handle *g)
         g->locked = FALSE;          g->locked = FALSE;
         g->opened = FALSE;          g->opened = FALSE;
     }      }
 }  } /* gbl_close() */
   
 void gbl_close_all(void)  void gbl_close_all(void)
 {  {
Line 239  void gbl_close_all(void) Line 274  void gbl_close_all(void)
     for (g = global_handles_head; g != NULL; g = g->next) {      for (g = global_handles_head; g != NULL; g = g->next) {
         gbl_close (g);          gbl_close (g);
     }      }
 }  } /* gbl_close_all() */
   
   int gbl_write_initial_header(global_handle *g)
   {
       global_header hdr;
       unsigned long old_position;
       char m[5] = GBL_MAGIC;
       char msg[256];
       
       if (g->opened == FALSE) {
           return FALSE;
       }
   
       memcpy (hdr.magic, m, 5);
       hdr.format_version = GBL_FORMAT_VERSION;
       strncpy (hdr.host_triplet, HOST, 40);
       hdr.block_size = BLOCKLEN;
       hdr.last_transaction_id = 0;
       hdr.created = time (0L);
       hdr.last_backup = -1;
       
       gbl_lock (g, 1);
       old_position = lseek (g->fd, 0, SEEK_CUR);
       lseek (g->fd, 0, SEEK_SET);
   
       if (write (g->fd, &hdr, sizeof (global_header)) == -1) {
           snprintf (msg, sizeof (msg), "error %d writing global header for %s", errno, g->global_name);
           m_fatal (msg);
       }
       
       lseek (g->fd, old_position, SEEK_SET);
       gbl_unlock (g);
   
       return TRUE;
   } /* gbl_write_initial_header() */
   
   
   int gbl_write_header(global_handle *g, global_header *hdr)
   {
       unsigned long old_position;
       char msg[256];
       
       if (g->opened == FALSE) {
           return FALSE;
       }
       
       gbl_lock (g, 1);
       old_position = lseek (g->fd, 0, SEEK_CUR);
       lseek (g->fd, 0, SEEK_SET);
   
       if (write (g->fd, hdr, sizeof (global_header)) == -1) {
           snprintf (msg, sizeof (msg), "error %d writing global header for %s", errno, g->global_name);
           m_fatal (msg);
       }
   
       lseek (g->fd, old_position, SEEK_SET);
       gbl_unlock (g);
   
       gbl_read_header (g, &g->header);
       
       return TRUE;    
   } /* gbl_write_header() */
   
   int gbl_read_header(global_handle *g, global_header *h)
   {
       unsigned long old_position;
       char m[5] = GBL_MAGIC;
   
       
       if (g->opened == FALSE) {
           return GBL_HDR_NOTOPEN;
       }
   
       gbl_lock (g, 1);
       old_position = lseek (g->fd, 0, SEEK_CUR);
       lseek (g->fd, 0, SEEK_SET);
   
       read (g->fd, h, sizeof (global_header));
   
       lseek (g->fd, old_position, SEEK_SET);
       gbl_unlock (g);
   
       if (strncmp (h->magic, m, 5) != 0) {
           return GBL_HDR_BADMAGIC;
       }
       if (h->format_version != GBL_FORMAT_VERSION) {
           return GBL_HDR_BADVERSION;
       }
       if (h->block_size != BLOCKLEN) {
           return GBL_HDR_BADBLOCKSIZE;
       }
   
       return GBL_HDR_OK;                          
   } /* gbl_read_header() */
   
   int gbl_update_tid(global_handle *g)
   {
       global_header h;
   
       if (gbl_read_header (g, &h) != GBL_HDR_OK) {
           return FALSE;
       }
   
       h.last_transaction_id = jnl_tran_id;
   
       return gbl_write_header (g, &h);        
   } /* gbl_update_tid() */
   
 int gbl_create(global_handle *g)  int gbl_create(global_handle *g)
 {  {
Line 260  int gbl_create(global_handle *g) Line 401  int gbl_create(global_handle *g)
     g->age = time (0L);      g->age = time (0L);
     g->last_block = 0;      g->last_block = 0;
     g->use_count = 1;      g->use_count = 1;
       g->fast_path = 0;
       
       gbl_write_initial_header (g);
           
     return OK;      return OK;
 }  } /* gbl_create() */
   
 short gbl_open(global_handle *g, short action)  short gbl_open(global_handle *g, short action)
 {  {
       int result;
       
     if (g->opened == FALSE) {      if (g->opened == FALSE) {
           gbl_cache_miss (g);
         while (1) {          while (1) {
             errno = 0;              errno = 0;
             g->fd = open (g->global_path, 2);              g->fd = open (g->global_path, 2);
Line 279  short gbl_open(global_handle *g, short a Line 426  short gbl_open(global_handle *g, short a
                                           
                 case EMFILE:                  case EMFILE:
                 case ENFILE:                  case ENFILE:
                     close_all_globals ();                      gbl_close_all ();
                     continue;                      continue;
             }              }
                           
Line 295  short gbl_open(global_handle *g, short a Line 442  short gbl_open(global_handle *g, short a
         }          }
         else {          else {
             g->opened = TRUE;              g->opened = TRUE;
               result = gbl_read_header (g, &g->header);
               
               if (result == GBL_HDR_OK) {
                   g->opened = TRUE;
               }
               else {                
                   gbl_close (g);
                   set_io (UNIX);
                   
                   switch (result) {
                       
                       case GBL_HDR_BADMAGIC:
                           fprintf (stderr, "gbl_open:  bad magic value in %s [FATAL]\n", g->global_name);
                           exit (1);
                           break;
   
                       case GBL_HDR_BADVERSION:
                           fprintf (stderr, "gbl_open:  global version is %d in %s (must be %d) [FATAL]\n", g->header.format_version, g->global_name, GBL_FORMAT_VERSION);
                           exit (1);
                           break;
   
                   }
                           
                   return FALSE;
               }
         }          }
     }      }
   
     return g->opened;      return g->opened;
           
 } /* gbl_open */  } /* gbl_open() */
   
   int gbl_read_block(global_handle *g, unsigned long blocknum, char *block)
   {
       unsigned long hdr_offset;
       hdr_offset = sizeof (global_header);
       
       if (g->opened == FALSE) {
           return FALSE;
       }
   
       gbl_lock (g, 1);
       lseek (g->fd, hdr_offset + ((long) blocknum * (long) (g->header.block_size)), SEEK_SET);
       read (g->fd, block, g->header.block_size);
       g->last_block = blocknum;
       g->use_count++;
       g->read_ops++;
       gbl_unlock (g);
   
       return TRUE;    
   }
   
 global_handle *gbl_handle(char *key)  global_handle *gbl_handle(char *key)
 {  {
     global_handle *g;      global_handle *g;
     char global_name[256];      char global_name[256];
     int i;      int i;
     long path_len;  
     char block[BLOCKLEN];  
     struct stat dinf;                  struct stat dinf;            
           
     i = 0;      i = 0;
Line 349  global_handle *gbl_handle(char *key) Line 539  global_handle *gbl_handle(char *key)
     g->opened = FALSE;      g->opened = FALSE;
     g->fd = 0;      g->fd = 0;
     g->fast_path = -1;      g->fast_path = -1;
       g->cache_misses = 0;
       g->cache_hits = 0;
       g->read_ops = 0;
       g->write_ops = 0;
           
     strcpy (g->global_name, global_name);          strcpy (g->global_name, global_name);    
     gbl_path (key, g->global_path);      gbl_path (key, g->global_path);
Line 357  global_handle *gbl_handle(char *key) Line 551  global_handle *gbl_handle(char *key)
     global_handles_head = g;      global_handles_head = g;
   
     return g;          return g;    
 }  } /* gbl_handle() */
   
   
 /* globals management */  /* globals management */
Line 439  void global_bltin (short action, char *k Line 633  void global_bltin (short action, char *k
 {  {
   
     global_handle *g;      global_handle *g;
   
       unsigned long hdr_offset;
           
     /* these must be static variables */      /* these must be static variables */
   
     static short filedes;               /* filedescr for global access */  
     static char filnam[256];            /* name of global/unix file */      static char filnam[256];            /* name of global/unix file */
   
     /* the following vars may be */      /* the following vars may be */
     /* static or dynamic */      /* static or dynamic */
   
     static unsigned long blknbr;        /* block number */      static unsigned long blknbr;        /* block number */
 //    static unsigned long oldblk;  
     static unsigned long newblk;      static unsigned long newblk;
     static unsigned long other;      static unsigned long other;
     static long j1;      static long j1;
     static long limit;      static long limit;
     static short typ;                   /* block type */      static short typ;                   /* block type */
     static long keyl,                   /* length of compacted key */      static long keyl;                   /* length of compacted key */
                 datal,                  /* length of data */      static long datal;                  /* length of data */
                 olddatal,      static long olddatal;
                 offset,      static long offset;
                 found,      static long found;
                 addr,                   /* address of key in 'block' */      static long addr;                   /* address of key in 'block' */
                 needed,                 /* new bytes needed to ins. stuff */      static long needed;                 /* new bytes needed to ins. stuff */
                 ret_to,                 /* return code */      static long ret_to;                 /* return code */
                 kill_again;      static long kill_again;
     static char key1[256];      static char key1[256];
     static char tmp1[256];              /* intermediate storage for op= */      static char tmp1[256];              /* intermediate storage for op= */
     static char block[BLOCKLEN];      static char block[BLOCKLEN];
Line 473  void global_bltin (short action, char *k Line 665  void global_bltin (short action, char *k
   
     int iresult;      int iresult;
           
     struct stat dinf;                   /* get modification date */      register long int i;
       register long int j;
     long    savj,      register long int k;
     savch;                      /* saved j and ch for multiple pathes */      register long int ch;
     register long int i,  
     j,  
     k,  
     ch;  
     long    pathscan;                   /* flag for repeated scan of pathlist setting an undef global */  
   
       j = 0;
       
       hdr_offset = sizeof (global_header);
       
     /* process optional limitations */      /* process optional limitations */
     if (glvnflag.all && key[0] >= '%' && key[0] <= 'z') {      if (glvnflag.all && key[0] >= '%' && key[0] <= 'z') {
   
Line 561  void global_bltin (short action, char *k Line 752  void global_bltin (short action, char *k
   
   
     if (action == getnext) {      if (action == getnext) {
   
         getnflag = TRUE;          getnflag = TRUE;
         varnam[0] = EOL;          varnam[0] = EOL;
                   
Line 851  reopen: Line 1041  reopen:
                           
             errno = 0;              errno = 0;
                   
             lseek (g->fd, ROOT * BLOCKLEN, 0);              lseek (g->fd, hdr_offset + (ROOT * BLOCKLEN), SEEK_SET);
             write (g->fd, block, BLOCKLEN);              write (g->fd, block, BLOCKLEN);
                   
             if (errno == 0) break;              if (errno == 0) break;
Line 877  reopen: Line 1067  reopen:
                           
             if (errno == 0) break;              if (errno == 0) break;
                           
             lseek (g->fd, (ROOT + 1L) * BLOCKLEN, 0);              lseek (g->fd, hdr_offset + ((ROOT + 1L) * BLOCKLEN), SEEK_SET);
             panic ();              panic ();
   
         }          }
Line 894  reopen: Line 1084  reopen:
     /* odd numbered actions get read access (get_sym,data,fra_order) 3 */      /* odd numbered actions get read access (get_sym,data,fra_order) 3 */
     /* even ones read/write access          (set_sym,kill_sym)   1 */      /* even ones read/write access          (set_sym,kill_sym)   1 */
   
   /* temporarily disabled    
 lock:  lock:
   */
   
     if (action == get_sym) {      if (action == get_sym) {
   
 tfast0:  tfast0:
         gbl_lock (g, 3);          gbl_lock (g, 3);
         if (tryfast) goto tfast1;               /* try again last block */          
           if (g->fast_path > 0) goto tfast1;              /* try again last block */
                   
         blknbr = g->last_block = ROOT;          /* start with ROOT block */          blknbr = g->last_block = ROOT;          /* start with ROOT block */
                   
Line 908  tfast0: Line 1101  tfast0:
   
   
 tfast1:  tfast1:
               gbl_read_block (g, blknbr, block);
   
             lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);  /* temporarily disabled
             read (g->fd, block, BLOCKLEN);  
   
   
 tfast2:  tfast2:
   */
         if ((typ = block[BTYP]) == DATA) {      /* scan data block: here we test for equality only */          if ((typ = block[BTYP]) == DATA) {      /* scan data block: here we test for equality only */
   
             offset = UNSIGN (block[OFFS]) * 256 +                          offset = UNSIGN (block[OFFS]) * 256 +            
Line 931  tfast2: Line 1122  tfast2:
                 j = UNSIGN (block[i++]);        /* length of key - offset */                  j = UNSIGN (block[i++]);        /* length of key - offset */
                 k = UNSIGN (block[i++]);        /* offset into previous entry */                  k = UNSIGN (block[i++]);        /* offset into previous entry */
   
 #ifdef VERSNEW  
   
                 stcpy0 (&key0[k], &block[i], j);  
                 i += j;  
                 j += k;  
   
 #else  
   
                 j += k;                  j += k;
                           
                 while (k < j) key1[k++] = block[i++];           /* get key */                  while (k < j) key1[k++] = block[i++];           /* get key */
   
 #endif /* VERSNEW */  
   
                 if (j != ch) {  /* keys have different length */                  if (j != ch) {  /* keys have different length */
                                           
                     i += UNSIGN (block[i]);                      i += UNSIGN (block[i]);
Line 978  tfast2: Line 1159  tfast2:
   
             /* fast access failed. try normal path */              /* fast access failed. try normal path */
             if (tryfast) {              if (tryfast) {
                 tryfast = FALSE;                  gbl_cache_miss (g);
                 goto tfast0;                  goto tfast0;
             }              }
   
Line 989  tfast2: Line 1170  tfast2:
         }           } 
         else {          else {
                   
             if (tryfast) {              if (g->fast_path > 0) {
                 tryfast = FALSE;                  gbl_cache_miss (g);
                 goto tfast0;                  goto tfast0;
             }              }
   
             if (typ == EMPTY) {              if (typ == EMPTY) {
                                   
                 if (blknbr == ROOT) {                  if (blknbr == ROOT) {
                     //close (filedes);  
                     gbl_close (g);                      gbl_close (g);
                     goto reopen;                      goto reopen;
                 }                  }
Line 1020  tfast2: Line 1200  tfast2:
   
         addr += PLEN;           /* skip data */          addr += PLEN;           /* skip data */
         g->last_block = blknbr;          g->last_block = blknbr;
           g->fast_path = 1;
                   
         if (merr () == INRPT) goto quit;          if (merr () == INRPT) goto quit;
   
Line 1031  tfast2: Line 1212  tfast2:
     /* a KILL on an unsubscripted global deletes the entire file */      /* a KILL on an unsubscripted global deletes the entire file */
     if (action == kill_sym && compactkey[0] == g_EOL) {      if (action == kill_sym && compactkey[0] == g_EOL) {
                   
         lseek (g->fd, ROOT, 0);          lseek (g->fd, hdr_offset + ROOT, SEEK_SET);
   
         /* note : UNIX does not tell other    */          /* note : UNIX does not tell other    */
         block[BTYP] = EMPTY;            /* jobs that a file has been unlinked */          block[BTYP] = EMPTY;            /* jobs that a file has been unlinked */
Line 1063  k_again:    /* entry point for repeated Line 1244  k_again:    /* entry point for repeated
   
         traceblk[trx] = blknbr;          traceblk[trx] = blknbr;
         traceadr[trx] = 0;          traceadr[trx] = 0;
           
         lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);          gbl_read_block (g, blknbr, block);
         read (g->fd, block, BLOCKLEN);  
           
         typ = block[BTYP];          typ = block[BTYP];
                   
         if (typ == DATA) {          if (typ == DATA) {
Line 1098  k_again:    /* entry point for repeated Line 1277  k_again:    /* entry point for repeated
   
         addr += PLEN;                   /* skip data */          addr += PLEN;                   /* skip data */
         g->last_block = blknbr;          g->last_block = blknbr;
           g->fast_path = 1;
     }      }
   
     traceadr[trx] = addr;      traceadr[trx] = addr;
Line 1232  s10:            { Line 1412  s10:            {
   
                 }                  }
   
                 lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                  lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
                 write (g->fd, block, BLOCKLEN);                  write (g->fd, block, BLOCKLEN);
   
                 if (traceadr[trx] == 0) update (g->fd, compactkey, keyl);                  if (traceadr[trx] == 0) update (g, compactkey, keyl);
   
                 break;                  break;
             }              }
Line 1319  s20: Line 1499  s20:
             }              }
           
             stcpy0 (&block[++addr], data, (long) datal);              stcpy0 (&block[++addr], data, (long) datal);
             lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
             write (g->fd, block, BLOCKLEN);              write (g->fd, block, BLOCKLEN);
   
               gbl_update_tid (g);
               
             break;              break;
   
   
Line 1350  s20: Line 1533  s20:
                 if (addr >= offset) {                  if (addr >= offset) {
   
                     if ((blknbr = UNSIGN (block[RLPTR]) * 65536 + UNSIGN (block[RLPTR + 1]) * 256 + UNSIGN (block[RLPTR + 2]))) {                      if ((blknbr = UNSIGN (block[RLPTR]) * 65536 + UNSIGN (block[RLPTR + 1]) * 256 + UNSIGN (block[RLPTR + 2]))) {
                       
                         lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                          gbl_read_block (g, blknbr, block);
                         read (g->fd, block, BLOCKLEN);  
                         j1 = UNSIGN (block[0]);                          j1 = UNSIGN (block[0]);
                                           
                         i = 0;                          i = 0;
Line 1433  s20: Line 1615  s20:
                                   
                     goto quit;                      goto quit;
                 }       /* no next block */                  }       /* no next block */
                   
                 lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                  gbl_read_block (g, blknbr, block);
                 read (g->fd, block, BLOCKLEN);  
                 scandblk (block, &addr, &found);                  scandblk (block, &addr, &found);
   
             }               } 
Line 1591  s20: Line 1772  s20:
                         goto quit;              /* no next block */                          goto quit;              /* no next block */
                     }                      }
   
                     lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                      gbl_read_block (g, blknbr, block);
                     read (g->fd, block, BLOCKLEN);  
   
                     addr = 0;                      addr = 0;
                     offset = UNSIGN (block[OFFS]) * 256 +                      offset = UNSIGN (block[OFFS]) * 256 +
Line 1615  s20: Line 1795  s20:
                     goto quit;          /* no next block */                      goto quit;          /* no next block */
                 }                  }
   
                 lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                  gbl_read_block (g, blknbr, block);
                 read (g->fd, block, BLOCKLEN);  
                                   
                 addr = 0;                  addr = 0;
             }               } 
Line 1825  killo:    /* entry from killone section Line 2004  killo:    /* entry from killone section
   
                         other = traceblk[--trx];                          other = traceblk[--trx];
                         addr = traceadr[trx];                          addr = traceadr[trx];
                           
                         lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);                          gbl_read_block (g, other, block);
                         read (g->fd, block, BLOCKLEN);  
                                                   
                         addr += UNSIGN (block[addr]);                          addr += UNSIGN (block[addr]);
                         addr += (2 + PLEN);     /* skip previous entry */                          addr += (2 + PLEN);     /* skip previous entry */
Line 1846  killo:    /* entry from killone section Line 2024  killo:    /* entry from killone section
   
                     trx = trxsav;                      trx = trxsav;
   
                     lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                      gbl_read_block (g, blknbr, block);
                     read (g->fd, block, BLOCKLEN);  
   
                     offset = UNSIGN (block[OFFS]) * 256 +                      offset = UNSIGN (block[OFFS]) * 256 +
                     UNSIGN (block[OFFS + 1]);                      UNSIGN (block[OFFS + 1]);
Line 1953  p_empty:  /* entry if pointer block goes Line 2130  p_empty:  /* entry if pointer block goes
   
                     if (left) {                      if (left) {
   
                         lseek (g->fd, (long) left * (long) (BLOCKLEN), 0);                          gbl_read_block (g, left, block0);
                         read (g->fd, block0, BLOCKLEN);  
                                                   
                         block0[RLPTR] = block[RLPTR];                          block0[RLPTR] = block[RLPTR];
                         block0[RLPTR + 1] = block[RLPTR + 1];                          block0[RLPTR + 1] = block[RLPTR + 1];
                         block0[RLPTR + 2] = block[RLPTR + 2];                          block0[RLPTR + 2] = block[RLPTR + 2];
                                                   
                         lseek (g->fd, (long) left * (long) (BLOCKLEN), 0);                          lseek (g->fd, hdr_offset + ((long) left * (long) (BLOCKLEN)), SEEK_SET);
                         write (g->fd, block0, BLOCKLEN);                          write (g->fd, block0, BLOCKLEN);
   
                     }                      }
   
                     if (right) {                      if (right) {
                           
                         lseek (g->fd, (long) right * (long) (BLOCKLEN), 0);                          gbl_read_block (g, right, block0);
                         read (g->fd, block0, BLOCKLEN);  
                                                   
                         block0[LLPTR] = block[LLPTR];                          block0[LLPTR] = block[LLPTR];
                         block0[LLPTR + 1] = block[LLPTR + 1];                          block0[LLPTR + 1] = block[LLPTR + 1];
                         block0[LLPTR + 2] = block[LLPTR + 2];                          block0[LLPTR + 2] = block[LLPTR + 2];
                                                   
                         lseek (g->fd, (long) right * (long) (BLOCKLEN), 0);                          lseek (g->fd, hdr_offset + ((long) right * (long) (BLOCKLEN)), SEEK_SET);
                         write (g->fd, block0, BLOCKLEN);                          write (g->fd, block0, BLOCKLEN);
   
                     }                      }
Line 1992  p_empty:  /* entry if pointer block goes Line 2167  p_empty:  /* entry if pointer block goes
                         blknbr = traceblk[--trx];                          blknbr = traceblk[--trx];
                         addr = traceadr[trx];                          addr = traceadr[trx];
   
                         lseek (g->fd, (long) (blknbr) * (long) (BLOCKLEN), 0);                          gbl_read_block (g, blknbr, block);
                         read (g->fd, block, BLOCKLEN);  
                         offset = UNSIGN (block[OFFS]) * 256 +                          offset = UNSIGN (block[OFFS]) * 256 +
                         UNSIGN (block[OFFS + 1]);                          UNSIGN (block[OFFS + 1]);
                         freecnt = UNSIGN (block[addr]) + 2 + PLEN;                          freecnt = UNSIGN (block[addr]) + 2 + PLEN;
Line 2005  p_empty:  /* entry if pointer block goes Line 2179  p_empty:  /* entry if pointer block goes
   
                             if (blknbr == ROOT) {       /* global went empty */                              if (blknbr == ROOT) {       /* global went empty */
   
                                 lseek (g->fd, 0L, 0);                                  lseek (g->fd, hdr_offset + 0L, SEEK_SET);
                                                   
                                 /* note : UNIX does not tell other    */                                  /* note : UNIX does not tell other    */
                                 block[BTYP] = EMPTY;    /* jobs that a file has been unlinked */                                  block[BTYP] = EMPTY;    /* jobs that a file has been unlinked */
Line 2037  p_empty:  /* entry if pointer block goes Line 2211  p_empty:  /* entry if pointer block goes
                                                   
                         for (i = offset; i < offset + freecnt; block[i++] = 0);                          for (i = offset; i < offset + freecnt; block[i++] = 0);
   
                         lseek (g->fd, (long) (blknbr) * (long) (BLOCKLEN), 0);                          lseek (g->fd, hdr_offset + ((long) (blknbr) * (long) (BLOCKLEN)), SEEK_SET);
                         write (g->fd, block, BLOCKLEN);                          write (g->fd, block, BLOCKLEN);
   
                         if (addr == 0) {        /* update of pointer */                          if (addr == 0) {        /* update of pointer */
                             traceadr[trx] = 0;                              traceadr[trx] = 0;
                                                           
                             update (g->fd, &block[2], (long) UNSIGN (block[0]));                              update (g, &block[2], (long) UNSIGN (block[0]));
                         }                          }
   
                         trx = trxsav;                          trx = trxsav;
Line 2085  p_empty:  /* entry if pointer block goes Line 2259  p_empty:  /* entry if pointer block goes
                 }                  }
                 block[OFFS] = offset / 256;                  block[OFFS] = offset / 256;
                 block[OFFS + 1] = offset % 256;                  block[OFFS + 1] = offset % 256;
                 lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                  lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
                 write (g->fd, block, BLOCKLEN);                  write (g->fd, block, BLOCKLEN);
                 if (addr < 3) {         /* update of pointer */                  if (addr < 3) {         /* update of pointer */
                 traceadr[trx] = 0;                  traceadr[trx] = 0;
                 update (g->fd, &block[2], (long) UNSIGN (block[0]));                  update (g, &block[2], (long) UNSIGN (block[0]));
                 }                  }
             }              }
   
Line 2111  zinv: Line 2285  zinv:
                         data[0] = EOL1;                          data[0] = EOL1;
                         goto quit;                          goto quit;
                     }                   /* no previous block */                      }                   /* no previous block */
                       
                     lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                      gbl_read_block (g, blknbr, block);
                     read (g->fd, block, BLOCKLEN);  
                                           
                     addr = UNSIGN (block[OFFS]) * 256 +                      addr = UNSIGN (block[OFFS]) * 256 +
                     UNSIGN (block[OFFS + 1]);                      UNSIGN (block[OFFS + 1]);
Line 2292  zinv: Line 2465  zinv:
                             break;              /* no next block */                              break;              /* no next block */
                         }                          }
   
                         lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);                          gbl_read_block (g, blknbr, block);
                         read (g->fd, block, BLOCKLEN);  
                                                   
                         addr = 0;                          addr = 0;
                         offset = UNSIGN (block[OFFS]) * 256 +                          offset = UNSIGN (block[OFFS]) * 256 +
Line 2408  quit: Line 2580  quit:
           
     /* clean things up */      /* clean things up */
   
     lseek (g->fd, ROOT, 0);      lseek (g->fd, hdr_offset + ROOT, SEEK_SET);
     gbl_unlock (g);      gbl_unlock (g);
           
     return;      return;
Line 2439  splitd:    /* split data block in two se Line 2611  splitd:    /* split data block in two se
         block[RLPTR + 1] = newblk % 65536 / 256;          block[RLPTR + 1] = newblk % 65536 / 256;
         block[RLPTR + 2] = newblk % 256;          block[RLPTR + 2] = newblk % 256;
   
         lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
         write (g->fd, block, BLOCKLEN);          write (g->fd, block, BLOCKLEN);
                   
         block[RLPTR] = right;          block[RLPTR] = right;
Line 2452  splitd:    /* split data block in two se Line 2624  splitd:    /* split data block in two se
         addr = 0;          addr = 0;
         blknbr = newblk;          blknbr = newblk;
                   
         insert (g->fd, compactkey, keyl, newblk);          insert (g, compactkey, keyl, newblk);
                   
         /* up-date LL-PTR of RL-block */          /* up-date LL-PTR of RL-block */
         if ((other = right * 65536 + right1 * 256 + right2)) {          if ((other = right * 65536 + right1 * 256 + right2)) {
                   
             char    block0[BLOCKLEN];              char    block0[BLOCKLEN];
   
             lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);              gbl_read_block (g, other, block0);
             read (g->fd, block0, BLOCKLEN);  
                   
             block0[LLPTR] = blknbr / 65536;              block0[LLPTR] = blknbr / 65536;
             block0[LLPTR + 1] = blknbr % 65536 / 256;              block0[LLPTR + 1] = blknbr % 65536 / 256;
             block0[LLPTR + 2] = blknbr % 256;              block0[LLPTR + 2] = blknbr % 256;
                   
             lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
             write (g->fd, block0, BLOCKLEN);              write (g->fd, block0, BLOCKLEN);
                   
         }          }
Line 2485  splitd:    /* split data block in two se Line 2656  splitd:    /* split data block in two se
         block[LLPTR + 1] = newblk % 65536 / 256;          block[LLPTR + 1] = newblk % 65536 / 256;
         block[LLPTR + 2] = newblk % 256;          block[LLPTR + 2] = newblk % 256;
   
         lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
         write (g->fd, block, BLOCKLEN);          write (g->fd, block, BLOCKLEN);
                   
         block[LLPTR] = left;          block[LLPTR] = left;
Line 2498  splitd:    /* split data block in two se Line 2669  splitd:    /* split data block in two se
         blknbr = newblk;          blknbr = newblk;
         traceadr[trx] = (-1);           /* inhibit second update of pointers */          traceadr[trx] = (-1);           /* inhibit second update of pointers */
                   
         insert (g->fd, compactkey, keyl, newblk);          insert (g, compactkey, keyl, newblk);
                   
         if (addr < 3) {                 /* update of pointer */          if (addr < 3) {                 /* update of pointer */
             traceadr[trx] = 0;              traceadr[trx] = 0;
                           
             update (g->fd, compactkey, keyl);              update (g, compactkey, keyl);
         }          }
   
         /* other is ***always*** zero !!!          /* other is ***always*** zero !!!
Line 2611  splitd:    /* split data block in two se Line 2782  splitd:    /* split data block in two se
             block0[LLPTR + 1] = blknbr % 65536 / 256;              block0[LLPTR + 1] = blknbr % 65536 / 256;
             block0[LLPTR + 2] = blknbr % 256;              block0[LLPTR + 2] = blknbr % 256;
   
             lseek (g->fd, (long) (newblk) * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) (newblk) * (long) (BLOCKLEN)), SEEK_SET);
             write (g->fd, block0, BLOCKLEN);              write (g->fd, block0, BLOCKLEN);
                   
             offset = limit;              offset = limit;
             /* insert new block in pointer structure */              /* insert new block in pointer structure */
                   
             insert (g->fd, &block0[2], (long) UNSIGN (block0[0]), newblk);              insert (g, &block0[2], (long) UNSIGN (block0[0]), newblk);
                   
             /* up-date LL-PTR of RL-block */              /* up-date LL-PTR of RL-block */
             if (other != 0) {              if (other != 0) {
   
                 lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);                  gbl_read_block (g, other, block0);
                 read (g->fd, block0, BLOCKLEN);  
   
                 block0[LLPTR] = newblk / 65536;                  block0[LLPTR] = newblk / 65536;
                 block0[LLPTR + 1] = newblk % 65536 / 256;                  block0[LLPTR + 1] = newblk % 65536 / 256;
                 block0[LLPTR + 2] = newblk % 256;                  block0[LLPTR + 2] = newblk % 256;
                                   
                 lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);                  lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
                 write (g->fd, block0, BLOCKLEN);                  write (g->fd, block0, BLOCKLEN);
   
             }              }
Line 2651  splitd:    /* split data block in two se Line 2821  splitd:    /* split data block in two se
             block0[LLPTR + 1] = blknbr % 65536 / 256;              block0[LLPTR + 1] = blknbr % 65536 / 256;
             block0[LLPTR + 2] = blknbr % 256;              block0[LLPTR + 2] = blknbr % 256;
   
             lseek (g->fd, (long) blknbr * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
             write (g->fd, block, BLOCKLEN);              write (g->fd, block, BLOCKLEN);
             stcpy0 (block, block0, (long) BLOCKLEN);              stcpy0 (block, block0, (long) BLOCKLEN);
   
Line 2659  splitd:    /* split data block in two se Line 2829  splitd:    /* split data block in two se
             traceblk[trx] = (blknbr = newblk);              traceblk[trx] = (blknbr = newblk);
                           
             /* insert new block in pointer structure */              /* insert new block in pointer structure */
             insert (g->fd, &block0[2], (long) UNSIGN (block0[0]), newblk);              insert (g, &block0[2], (long) UNSIGN (block0[0]), newblk);
                           
             /* up-date LL-PTR of RL-block */              /* up-date LL-PTR of RL-block */
             if (other != 0) {              if (other != 0) {
   
                 lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);                  gbl_read_block (g, other, block0);
                 read (g->fd, block0, BLOCKLEN);  
                                   
                 block0[LLPTR] = newblk / 65536;                  block0[LLPTR] = newblk / 65536;
                 block0[LLPTR + 1] = newblk % 65536 / 256;                  block0[LLPTR + 1] = newblk % 65536 / 256;
                 block0[LLPTR + 2] = newblk % 256;                  block0[LLPTR + 2] = newblk % 256;
                                   
                 lseek (g->fd, (long) other * (long) (BLOCKLEN), 0);                  lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
                 write (g->fd, block0, BLOCKLEN);                  write (g->fd, block0, BLOCKLEN);
   
             }              }
Line 2699  spltex: Line 2868  spltex:
  *   'addr' there I would like to insert, if possible (which is not)   *   'addr' there I would like to insert, if possible (which is not)
  *   'offset' filled up to this limit   *   'offset' filled up to this limit
  */   */
 static void splitp (short filedes, char *block, long *addr, long *offs, unsigned long *blknbr)    static void splitp (global_handle *g, char *block, long *addr, long *offs, unsigned long *blknbr)       
 {  {
   
     char block0[BLOCKLEN];      char block0[BLOCKLEN];
Line 2708  static void splitp (short filedes, char Line 2877  static void splitp (short filedes, char
     unsigned long other;      unsigned long other;
     register int i, j;      register int i, j;
   
     getnewblk (filedes, &newblk);       /* get a new block */      long hdr_offset;
   
       hdr_offset = sizeof (global_header);
       
       getnewblk (g->fd, &newblk); /* get a new block */
           
     if (*blknbr == ROOT) {              /* ROOT overflow is special */      if (*blknbr == ROOT) {              /* ROOT overflow is special */
   
Line 2743  static void splitp (short filedes, char Line 2916  static void splitp (short filedes, char
         block0[NRBLK + 2] = i % 256;          block0[NRBLK + 2] = i % 256;
         block0[BTYP] = POINTER;          block0[BTYP] = POINTER;
                   
         lseek (filedes, ROOT, 0);          lseek (g->fd, hdr_offset + ROOT, SEEK_SET);
         write (filedes, block0, BLOCKLEN);          write (g->fd, block0, BLOCKLEN);
                   
         /* shift trace_stack */          /* shift trace_stack */
         j = trx++;          j = trx++;
Line 2761  static void splitp (short filedes, char Line 2934  static void splitp (short filedes, char
         traceblk[1] = newblk;          traceblk[1] = newblk;
         *blknbr = newblk;          *blknbr = newblk;
                   
         getnewblk (filedes, &newblk);   /* get a new block */          getnewblk (g->fd, &newblk);     /* get a new block */
   
     }      }
   
Line 2815  static void splitp (short filedes, char Line 2988  static void splitp (short filedes, char
         block0[LLPTR + 1] = (*blknbr) % 65536 / 256;          block0[LLPTR + 1] = (*blknbr) % 65536 / 256;
         block0[LLPTR + 2] = (*blknbr) % 256;          block0[LLPTR + 2] = (*blknbr) % 256;
   
         lseek (filedes, (long) (newblk) * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) (newblk) * (long) (BLOCKLEN)), SEEK_SET);
         write (filedes, block0, BLOCKLEN);          write (g->fd, block0, BLOCKLEN);
   
         (*offs) = limit;          (*offs) = limit;
                   
         insert (filedes, &block0[2], (long) UNSIGN (block0[0]), newblk);          insert (g, &block0[2], (long) UNSIGN (block0[0]), newblk);
                   
         /* up-date LL-PTR of RL-block */          /* up-date LL-PTR of RL-block */
         if (other != 0) {          if (other != 0) {
   
             lseek (filedes, (long) other * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
             read (filedes, block0, BLOCKLEN);              read (g->fd, block0, BLOCKLEN);
                           
             block0[LLPTR] = newblk / 65536;              block0[LLPTR] = newblk / 65536;
             block0[LLPTR + 1] = newblk % 65536 / 256;              block0[LLPTR + 1] = newblk % 65536 / 256;
             block0[LLPTR + 2] = newblk % 256;              block0[LLPTR + 2] = newblk % 256;
                           
             lseek (filedes, (long) other * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
             write (filedes, block0, BLOCKLEN);              write (g->fd, block0, BLOCKLEN);
   
         }          }
   
Line 2858  static void splitp (short filedes, char Line 3031  static void splitp (short filedes, char
         (*addr) -= limit;          (*addr) -= limit;
         (*offs) -= limit;          (*offs) -= limit;
                   
         lseek (filedes, (long) (*blknbr) * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) (*blknbr) * (long) (BLOCKLEN)), SEEK_SET);
         write (filedes, block, BLOCKLEN);          write (g->fd, block, BLOCKLEN);
         stcpy0 (block, block0, (long) BLOCKLEN);          stcpy0 (block, block0, (long) BLOCKLEN);
                   
         (*blknbr) = newblk;          (*blknbr) = newblk;
                   
         insert (filedes, &block0[2], (long) UNSIGN (block0[0]), newblk);          insert (g, &block0[2], (long) UNSIGN (block0[0]), newblk);
                   
         /* up-date LL-PTR of RL-block */          /* up-date LL-PTR of RL-block */
         if (other != 0) {          if (other != 0) {
   
             lseek (filedes, (long) other * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
             read (filedes, block0, BLOCKLEN);              read (g->fd, block0, BLOCKLEN);
                           
             block0[LLPTR] = newblk / 65536;              block0[LLPTR] = newblk / 65536;
             block0[LLPTR + 1] = newblk % 65536 / 256;              block0[LLPTR + 1] = newblk % 65536 / 256;
             block0[LLPTR + 2] = newblk % 256;              block0[LLPTR + 2] = newblk % 256;
                           
             lseek (filedes, (long) other * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) other * (long) (BLOCKLEN)), SEEK_SET);
             write (filedes, block0, BLOCKLEN);              write (g->fd, block0, BLOCKLEN);
   
         }          }
   
Line 2892  static void splitp (short filedes, char Line 3065  static void splitp (short filedes, char
  *  ins_key:    key to be inserted   *  ins_key:    key to be inserted
  *  keyl:       length of that key   *  keyl:       length of that key
  */   */
 static void update (short filedes, char *ins_key, long keyl)  static void update (global_handle *g, char *ins_key, long keyl)
 {  {
     long offset;      long offset;
     long addr;      long addr;
     unsigned long blknbr;      unsigned long blknbr;
     char block[BLOCKLEN];      char block[BLOCKLEN];
     long i, j, k;      long i, j, k;
       long hdr_offset;
   
       hdr_offset = sizeof (global_header);
       
     while (traceadr[trx] == 0) {        /* update of pointer blocks necessary */      while (traceadr[trx] == 0) {        /* update of pointer blocks necessary */
   
         if (--trx < 0) break;          if (--trx < 0) break;
Line 2907  static void update (short filedes, char Line 3083  static void update (short filedes, char
         blknbr = traceblk[trx];          blknbr = traceblk[trx];
         addr = traceadr[trx];          addr = traceadr[trx];
                   
         lseek (filedes, (long) blknbr * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
         read (filedes, block, BLOCKLEN);          read (g->fd, block, BLOCKLEN);
                   
         {          {
             long    oldkeyl;              long    oldkeyl;
Line 2935  static void update (short filedes, char Line 3111  static void update (short filedes, char
             else if (j < 0) {           /* we need more space */              else if (j < 0) {           /* we need more space */
                           
                 /* block too small */                  /* block too small */
                 if ((offset - j) > DATALIM) splitp (filedes, block, &addr, &offset, &blknbr);                  if ((offset - j) > DATALIM) splitp (g, block, &addr, &offset, &blknbr);
                                   
                 i = offset;                  i = offset;
                 offset -= j;                  offset -= j;
Line 2958  static void update (short filedes, char Line 3134  static void update (short filedes, char
             while (i < keyl) block[j++] = ins_key[i++];              while (i < keyl) block[j++] = ins_key[i++];
                           
             /* block pointed to remains the same */              /* block pointed to remains the same */
             lseek (filedes, (long) blknbr * (long) (BLOCKLEN), 0);              lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
             write (filedes, block, BLOCKLEN);              write (g->fd, block, BLOCKLEN);
   
         }          }
                   
         lseek (filedes, (long) blknbr * (long) (BLOCKLEN), 0);          lseek (g->fd, hdr_offset + ((long) blknbr * (long) (BLOCKLEN)), SEEK_SET);
         read (filedes, block, BLOCKLEN);          read (g->fd, block, BLOCKLEN);
   
     }      }
   
Line 2979  static void update (short filedes, char Line 3155  static void update (short filedes, char
  *  key_len:    length of that key   *  key_len:    length of that key
  *  blknbr:     key points to this block   *  blknbr:     key points to this block
  */   */
 static void insert (int filedes, char *ins_key, long key_len, unsigned long blknbr)     /* insert pointer */  static void insert (global_handle *g, char *ins_key, long key_len, unsigned long blknbr)        /* insert pointer */
 {  {
     unsigned long blk;      unsigned long blk;
     char block[BLOCKLEN];      char block[BLOCKLEN];
Line 2988  static void insert (int filedes, char *i Line 3164  static void insert (int filedes, char *i
     long needed;      long needed;
     long addr;      long addr;
     register int i, k;      register int i, k;
       long hdr_offset;
   
       hdr_offset = sizeof (global_header);
       
     trxsav = trx--;      trxsav = trx--;
     blk = traceblk[trx];      blk = traceblk[trx];
     addr = traceadr[trx];      addr = traceadr[trx];
   
     lseek (filedes, (long) (blk) * (long) (BLOCKLEN), 0);      lseek (g->fd, hdr_offset + ((long) (blk) * (long) (BLOCKLEN)), SEEK_SET);
     read (filedes, block, BLOCKLEN);      read (g->fd, block, BLOCKLEN);
           
     offset = UNSIGN (block[OFFS]) * 256 +      offset = UNSIGN (block[OFFS]) * 256 +
     UNSIGN (block[OFFS + 1]);      UNSIGN (block[OFFS + 1]);
Line 3006  static void insert (int filedes, char *i Line 3185  static void insert (int filedes, char *i
   
     needed = key_len + 2 + PLEN;      needed = key_len + 2 + PLEN;
           
     if ((offset + needed) > DATALIM) splitp (filedes, block, &addr, &offset, &blk);      if ((offset + needed) > DATALIM) splitp (g, block, &addr, &offset, &blk);
           
     /*  insert key */      /*  insert key */
     i = (offset += needed);      i = (offset += needed);
Line 3030  static void insert (int filedes, char *i Line 3209  static void insert (int filedes, char *i
     block[i++] = blknbr % 65536 / 256;      block[i++] = blknbr % 65536 / 256;
     block[i] = blknbr % 256;      block[i] = blknbr % 256;
   
     lseek (filedes, (long) (blk) * (long) (BLOCKLEN), 0);      lseek (g->fd, hdr_offset + ((long) (blk) * (long) (BLOCKLEN)), SEEK_SET);
     write (filedes, block, BLOCKLEN);      write (g->fd, block, BLOCKLEN);
           
     trx = trxsav;      trx = trxsav;
           
Line 3050  static void b_free (short filedes, unsig Line 3229  static void b_free (short filedes, unsig
     unsigned long other;      unsigned long other;
     long i;      long i;
     long offset;      long offset;
       long hdr_offset;
       
       hdr_offset = sizeof (global_header);
       
     /* mark block as empty */      /* mark block as empty */
     lseek (filedes, (long) (blknbr) * BLOCKLEN, 0);      lseek (filedes, hdr_offset + ((long) (blknbr) * BLOCKLEN), SEEK_SET);
     read (filedes, block0, BLOCKLEN);      read (filedes, block0, BLOCKLEN);
   
     block0[BTYP] = EMPTY;      block0[BTYP] = EMPTY;
           
     lseek (filedes, (long) (blknbr) * BLOCKLEN, 0);      lseek (filedes, hdr_offset + ((long) (blknbr) * BLOCKLEN), SEEK_SET);
     write (filedes, block0, BLOCKLEN);      write (filedes, block0, BLOCKLEN);
   
     /* do we have a list of free blocks? */      /* do we have a list of free blocks? */
     lseek (filedes, ROOT, 0);      lseek (filedes, hdr_offset + ROOT, SEEK_SET);
     read (filedes, block0, BLOCKLEN);      read (filedes, block0, BLOCKLEN);
           
     if ((free = UNSIGN (block0[FREE]) * 65536 + UNSIGN (block0[FREE + 1]) * 256 + UNSIGN (block0[FREE + 2]))) {      if ((free = UNSIGN (block0[FREE]) * 65536 + UNSIGN (block0[FREE + 1]) * 256 + UNSIGN (block0[FREE + 2]))) {
                   
         for (;;) {          for (;;) {
                   
             lseek (filedes, (long) free * (long) BLOCKLEN, 0);              lseek (filedes, hdr_offset + ((long) free * (long) BLOCKLEN), SEEK_SET);
             read (filedes, block0, BLOCKLEN);              read (filedes, block0, BLOCKLEN);
   
             other = UNSIGN (block0[RLPTR]) * 65536 +              other = UNSIGN (block0[RLPTR]) * 65536 +
Line 3101  static void b_free (short filedes, unsig Line 3283  static void b_free (short filedes, unsig
             block0[RLPTR + 1] = other % 65536 / 256;              block0[RLPTR + 1] = other % 65536 / 256;
             block0[RLPTR + 2] = other % 256;              block0[RLPTR + 2] = other % 256;
                           
             lseek (filedes, (long) free * (long) BLOCKLEN, 0);              lseek (filedes, hdr_offset + ((long) free * (long) BLOCKLEN), SEEK_SET);
             write (filedes, block0, BLOCKLEN);              write (filedes, block0, BLOCKLEN);
   
             for (i = 0; i < BLOCKLEN; block0[i++] = 0); /* clear block */              for (i = 0; i < BLOCKLEN; block0[i++] = 0); /* clear block */
Line 3122  static void b_free (short filedes, unsig Line 3304  static void b_free (short filedes, unsig
         getnewblk (filedes, &free);          getnewblk (filedes, &free);
   
         /* set FBLK free blocks pointer */          /* set FBLK free blocks pointer */
         lseek (filedes, ROOT, 0);          lseek (filedes, hdr_offset + ROOT, SEEK_SET);
         read (filedes, block0, BLOCKLEN);          read (filedes, block0, BLOCKLEN);
                   
         block0[FREE] = free / 65536;          block0[FREE] = free / 65536;
         block0[FREE + 1] = free % 65536 / 256;          block0[FREE + 1] = free % 65536 / 256;
         block0[FREE + 2] = free % 256;          block0[FREE + 2] = free % 256;
                   
         lseek (filedes, ROOT, 0);          lseek (filedes, hdr_offset + ROOT, SEEK_SET);
         write (filedes, block0, BLOCKLEN);          write (filedes, block0, BLOCKLEN);
   
         for (i = 0; i < BLOCKLEN; block0[i++] = 0);     /* clear block */          for (i = 0; i < BLOCKLEN; block0[i++] = 0);     /* clear block */
Line 3145  static void b_free (short filedes, unsig Line 3327  static void b_free (short filedes, unsig
     block0[OFFS] = offset / 256;      block0[OFFS] = offset / 256;
     block0[OFFS + 1] = offset % 256;      block0[OFFS + 1] = offset % 256;
   
     lseek (filedes, (long) free * (long) BLOCKLEN, 0);      lseek (filedes, hdr_offset + ((long) free * (long) BLOCKLEN), SEEK_SET);
     write (filedes, block0, BLOCKLEN);      write (filedes, block0, BLOCKLEN);
           
     return;      return;
Line 3272  static void getnewblk (int filedes, unsi Line 3454  static void getnewblk (int filedes, unsi
     unsigned long freeblks, no_of_blks;      unsigned long freeblks, no_of_blks;
     long other;      long other;
     long offset;      long offset;
       long hdr_offset;
   
     lseek (filedes, ROOT, 0);      hdr_offset = sizeof (global_header);
       
       lseek (filedes, hdr_offset + ROOT, SEEK_SET);
     read (filedes, nblock, BLOCKLEN);      read (filedes, nblock, BLOCKLEN);
   
     freeblks = UNSIGN (nblock[FREE]) * 65536 + UNSIGN (nblock[FREE + 1]) * 256 + UNSIGN (nblock[FREE + 2]);      freeblks = UNSIGN (nblock[FREE]) * 65536 + UNSIGN (nblock[FREE + 1]) * 256 + UNSIGN (nblock[FREE + 2]);
Line 3281  static void getnewblk (int filedes, unsi Line 3466  static void getnewblk (int filedes, unsi
           
     if (freeblks) {      if (freeblks) {
                   
         lseek (filedes, (long) (freeblks) * BLOCKLEN, 0);          lseek (filedes, hdr_offset + ((long) (freeblks) * BLOCKLEN), SEEK_SET);
         read (filedes, nblock, BLOCKLEN);          read (filedes, nblock, BLOCKLEN);
                   
         offset = UNSIGN (nblock[OFFS]) * 256 + UNSIGN (nblock[OFFS + 1]);          offset = UNSIGN (nblock[OFFS]) * 256 + UNSIGN (nblock[OFFS + 1]);
Line 3294  static void getnewblk (int filedes, unsi Line 3479  static void getnewblk (int filedes, unsi
             /* update RL-block, if any */              /* update RL-block, if any */
             if (other) {              if (other) {
   
                 lseek (filedes, (long) (other) * BLOCKLEN, 0);                  lseek (filedes, hdr_offset + ((long) (other) * BLOCKLEN), SEEK_SET);
                 read (filedes, nblock, BLOCKLEN);                  read (filedes, nblock, BLOCKLEN);
                                   
                 nblock[LLPTR] = 0;                  nblock[LLPTR] = 0;
                 nblock[LLPTR + 1] = 0;                  nblock[LLPTR + 1] = 0;
                 nblock[LLPTR + 2] = 0;                  nblock[LLPTR + 2] = 0;
                                   
                 lseek (filedes, (long) (other) * BLOCKLEN, 0);                  lseek (filedes, hdr_offset + ((long) (other) * BLOCKLEN), SEEK_SET);
                 write (filedes, nblock, BLOCKLEN);                  write (filedes, nblock, BLOCKLEN);
   
             }              }
   
             /* update ROOT block */              /* update ROOT block */
             lseek (filedes, ROOT, 0);              lseek (filedes, hdr_offset + ROOT, SEEK_SET);
             read (filedes, nblock, BLOCKLEN);              read (filedes, nblock, BLOCKLEN);
                           
             nblock[FREE] = other / 65536;              nblock[FREE] = other / 65536;
             nblock[FREE + 1] = other % 65536 / 256;              nblock[FREE + 1] = other % 65536 / 256;
             nblock[FREE + 2] = other % 256;              nblock[FREE + 2] = other % 256;
                           
             lseek (filedes, ROOT, 0);              lseek (filedes, hdr_offset + ROOT, SEEK_SET);
             write (filedes, nblock, BLOCKLEN);              write (filedes, nblock, BLOCKLEN);
                           
             return;              return;
Line 3328  static void getnewblk (int filedes, unsi Line 3513  static void getnewblk (int filedes, unsi
         nblock[OFFS] = offset / 256;          nblock[OFFS] = offset / 256;
         nblock[OFFS + 1] = offset % 256;          nblock[OFFS + 1] = offset % 256;
                   
         lseek (filedes, (long) (freeblks) * BLOCKLEN, 0);          lseek (filedes, hdr_offset + ((long) (freeblks) * BLOCKLEN), SEEK_SET);
         write (filedes, nblock, BLOCKLEN);          write (filedes, nblock, BLOCKLEN);
                   
         return;          return;
Line 3341  static void getnewblk (int filedes, unsi Line 3526  static void getnewblk (int filedes, unsi
     nblock[NRBLK + 1] = no_of_blks % 65536 / 256;      nblock[NRBLK + 1] = no_of_blks % 65536 / 256;
     nblock[NRBLK + 2] = no_of_blks % 256;      nblock[NRBLK + 2] = no_of_blks % 256;
           
     lseek (filedes, ROOT, 0);      lseek (filedes, hdr_offset + ROOT, SEEK_SET);
     write (filedes, nblock, BLOCKLEN);      write (filedes, nblock, BLOCKLEN);
           
     *blknbr = no_of_blks;      *blknbr = no_of_blks;
Line 3350  static void getnewblk (int filedes, unsi Line 3535  static void getnewblk (int filedes, unsi
   
         errno = 0;          errno = 0;
                   
         lseek (filedes, (long) (no_of_blks) * BLOCKLEN, 0);          lseek (filedes, hdr_offset + ((long) (no_of_blks) * BLOCKLEN), SEEK_SET);
         write (filedes, nblock, BLOCKLEN);          write (filedes, nblock, BLOCKLEN);
                   
         if (errno == 0) break;          if (errno == 0) break;
Line 3486  static short int g_collate (char *t) Line 3671  static short int g_collate (char *t)
 /*  /*
  * test whether 'str' is canonical   * test whether 'str' is canonical
  */   */
 //static short int g_numeric (char *str)  
 short g_numeric (char *str)  short g_numeric (char *str)
 {  {
     register int ptr = 0, ch;      register int ptr = 0, ch;
Line 3529  short g_numeric (char *str) Line 3713  short g_numeric (char *str)
   
 }                                       /* end g_numeric() */  }                                       /* end g_numeric() */
   
   
   /* DEPRECATED: use gbl_close_all() instead */
 void close_all_globals (void)  void close_all_globals (void)
 {                                         {                                       
     register int i;      gbl_close_all ();
       
     for (i = 0; i < NO_GLOBLS; i++) {  
           
         if (oldfil[i][0] != NUL) {  
               
             close (olddes[i]);  
               
             usage[i] = 0;  
             olddes[i] = 0;  
             oldfil[i][0] = NUL;  
   
         }  
   
     }  
   
     return;      return;
   
 }                                       /* end close_all_globals() */  }                                       /* end close_all_globals() */
   
 static void panic (void)  static void panic (void)
Line 3575  static void panic (void) Line 3746  static void panic (void)
 void gbl_dump_stat(void)  void gbl_dump_stat(void)
 {  {
     global_handle *g;      global_handle *g;
       int ct;
       int miss_pct;
       int hit_pct;
       unsigned long access_total;   
       unsigned long hit_total;
           
     printf ("FreeM Global Statistics [PID %d]\r\n", pid);      printf ("\r\nFreeM Global Statistics [PID %d]\r\n\r\n", pid);
   
     printf ("%-20s%-10s%-20s%-10s%s\r\n", "GLOBAL", "USECT", "AGE", "LAST BLK", "FILE");      printf ("%-20s%-10s%-12s%-20s%-10s%s\r\n", "GLOBAL", "USECT", "SLOW PTHCT", "AGE", "LAST BLK", "FILE");
     printf ("%-20s%-10s%-20s%-10s%s\r\n", "======", "=====", "===", "========", "====");      printf ("%-20s%-10s%-12s%-20s%-10s%s\r\n", "======", "=====", "==========", "===", "========", "====");
       
       access_total = 0;
       ct = 0;
     for (g = global_handles_head; g != NULL; g = g->next) {      for (g = global_handles_head; g != NULL; g = g->next) {
         printf ("%-20s%-10d%-20d%-10d%s\r\n", g->global_name, g->use_count, g->age, g->last_block, g->global_path);          printf ("%-20s%-10ld%-12ld%-20ld%-10ld%s\r\n",
     }                  g->global_name,
                       g->use_count,
                   g->cache_misses,
                   g->age,
                   g->last_block,
                   g->global_path);
           ct++;
           access_total += g->use_count;      
       }
       if (!ct) printf ("<no globals opened in this pid>\r\n");
   
       hit_total = access_total - gbl_cache_misses;
       miss_pct = (gbl_cache_misses * 100) / access_total;
       hit_pct = (hit_total * 100) / access_total;
       
       printf ("\r\nTotal accesses:      %ld\r\n", access_total);
       printf ("Fast path hits       %ld\t(%d%%)\r\n", hit_total, hit_pct);
       printf ("Fast path misses:    %ld\t(%d%%)\r\n", gbl_cache_misses, miss_pct);    
 }  }

Removed from v.1.8  
changed lines
  Added in v.1.16


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>