home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CBASE09.ZIP / LSEQ.ZIP / LSOPEN.C < prev    next >
Text File  |  1989-08-30  |  4KB  |  142 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "lsopen.c    1.1 - 89/07/03" */
  5.  
  6. #include <blkio.h>
  7. #include <errno.h>
  8. /* #include <string.h> */
  9. #include "lseq_.h"
  10.  
  11. /* lseq control structure table definition */
  12. lseq_t lsb[LSOPEN_MAX];
  13.  
  14. /*man---------------------------------------------------------------------------
  15. NAME
  16.      lsopen - open an lseq
  17.  
  18. SYNOPSIS
  19.      lseq_t *lsopen(filename, type)
  20.      char *filename;
  21.      char *type;
  22.  
  23. DESCRIPTION
  24.      The lsopen function opens the file named by filename as an lseq.  A
  25.      pointer to the lseq_t structure associated with the file is returned.
  26.  
  27.      filename points to a character string that contains the name of the
  28.      file to be opened.
  29.  
  30.      type is a character string having one of the following values:
  31.           "r"            open for reading
  32.           "r+"           open for update (reading and writing)
  33.  
  34.      lsopen will fail if one or more of the following is true:
  35.  
  36.      [EINVAL]       filename is the NULL pointer.
  37.      [EINVAL]       type is not "r" or "r+".
  38.      [ENOENT]       The named lseq file does not exist.
  39.      [LSECORRUPT]   The named file is corrupt.
  40.      [LSEEOF]       No file header.
  41.      [LSEMFILE]     Too many open lseqs.  The maximum
  42.                     is defined as LSOPEN_MAX in lseq.h.
  43.  
  44. SEE ALSO
  45.      lsclose, lscreate.
  46.  
  47. DIAGNOSTICS
  48.      lsopen returns a NULL pointer on failure, and errno is set to
  49.      indicate the error.
  50.  
  51. ------------------------------------------------------------------------------*/
  52. lseq_t *lsopen(filename, type)
  53. char * filename;
  54. char * type;
  55. {
  56.     int        rs    = 0;
  57.     int        terrno    = 0;
  58.     lseq_t *    lsp    = NULL;
  59.  
  60.     errno = 0;
  61.  
  62.     /* validate input parameters */
  63.     if ((filename == NULL) || (type == NULL)) {
  64.         errno = EINVAL;
  65.         return NULL;
  66.     }
  67.  
  68.     /* find free slot in lsb table */
  69.     for (lsp = lsb; lsp < (lsb + LSOPEN_MAX); lsp++) {
  70.         if (!(lsp->flags & LSOPEN)) {
  71.             break;        /* found */
  72.         }
  73.     }
  74.     if (lsp >= lsb + LSOPEN_MAX) {
  75.         errno = LSEMFILE;
  76.         return NULL;        /* no free slots */
  77.     }
  78.  
  79.     /* open file */
  80.     if (strcmp(type, LS_READ) == 0) {
  81.         lsp->flags = LSREAD;
  82.     } else if (strcmp(type, LS_RDWR) == 0) {
  83.         lsp->flags = LSREAD | LSWRITE;
  84.     } else {
  85.         errno = EINVAL;
  86.         return NULL;
  87.     }
  88.     lsp->bp = bopen(filename, type, sizeof(lshdr_t), (size_t)1, (size_t)0);
  89.     if (lsp->bp == NULL) {
  90.         if ((errno != EACCES) && (errno != ENOENT)) LSEPRINT;
  91.         memset((void *)lsp, 0, sizeof(lsb[0]));
  92.         lsp->flags = 0;
  93.         return NULL;
  94.     }
  95.  
  96.     /* load lseq_t structure */
  97.     rs = bgeth(lsp->bp, (void *)&lsp->lshdr);    /* header */
  98.     if (rs == -1) {
  99.         LSEPRINT;
  100.         terrno = errno;
  101.         bclose(lsp->bp);
  102.         memset((void *)lsp, 0, sizeof(lsb[0]));
  103.         lsp->flags = 0;
  104.         errno = terrno;
  105.         return NULL;
  106.     }
  107.     if (lsp->lshdr.flags & LSHMOD) {        /* corrupt file */
  108.         bclose(lsp->bp);
  109.         memset((void *)lsp, 0, sizeof(lsb[0]));
  110.         lsp->flags = 0;
  111.         errno = LSECORRUPT;
  112.         return NULL;
  113.     }
  114.     lsp->clspos = 0;                /* cursor */
  115.     rs = ls_alloc(lsp);
  116.     if (rs == -1) {
  117.         LSEPRINT;
  118.         terrno = errno;
  119.         bclose(lsp->bp);
  120.         memset((void *)lsp, 0, sizeof(lsb[0]));
  121.         lsp->flags = 0;
  122.         errno = terrno;
  123.         return NULL;
  124.     }
  125.  
  126.     /* set up buffering */
  127.     rs = bsetvbuf(lsp->bp, NULL, ls_blksize(lsp), LSBUFCNT);
  128.     if (rs == -1) {
  129.         LSEPRINT;
  130.         terrno = errno;
  131.         ls_free(lsp);
  132.         bclose(lsp->bp);
  133.         memset((void *)lsp, 0, sizeof(lsb[0]));
  134.         lsp->flags = 0;
  135.         errno = terrno;
  136.         return NULL;
  137.     }
  138.  
  139.     errno = 0;
  140.     return lsp;
  141. }
  142.