home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / FMAIL102.LZH / FMSTRUCT.LZH / CFGFILE.C next >
C/C++ Source or Header  |  1995-06-26  |  9KB  |  264 lines

  1. /* os2 */
  2. /*
  3.    CFGFILE.C
  4.  
  5.    Config file interface routines for FMail 1.01c
  6.    Copyright (C) 1995 Folkert J. Wijnstra. All rights reserved.
  7.  
  8.    All information in this document is subject to change at any time
  9.    without prior notice!
  10. */
  11.  
  12.  
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <fcntl.h>
  16. #include <sys\stat.h>
  17. #include <io.h>
  18. #include <time.h>
  19.  
  20. #include "fmstruct.h"
  21. #include "cfgfile.h"
  22. #include "internal.h" /* not necessary for 3rd party programs */
  23.  
  24.  
  25. typedef struct
  26. {
  27.    const char     *fileName;
  28.    const u16      recordSize;
  29.    fhandle        handle;
  30.    char           *recBuf;
  31.    char           *revString;
  32.    u16            revNumber;
  33.    const u16      dataType;
  34.    const u16      init;
  35.    u16            status;
  36.    headerType     header;
  37. } configFileInfoType;
  38.  
  39.  
  40. static configFileInfoType fileData[MAX_CFG_FILES] =
  41.    {
  42.     /* CFG_GENERAL */
  43.     {       "FMAIL.CFG", sizeof(configType),    -1, NULL,
  44.         "FMail Configuration File rev. 1.0\x1a",
  45.                  0x0100, DATATYPE_CF, 'CF', 0 },
  46.     /* CFG_NODES */
  47.     {       "FMAIL.NOD", sizeof(nodeInfoType), -1, NULL,
  48.                 "FMail Node File rev. 1.0\x1a",
  49.                  0x0100, DATATYPE_NO, 'NO', 0 },
  50.     /* CFG_ECHOAREAS */
  51.     {       "FMAIL.AR",  sizeof(rawEchoType),  -1, NULL,
  52.                 "FMail Area File rev. 1.0\x1a",
  53.                  0x0100, DATATYPE_AE, 'AE', 0 },
  54.     /* CFG_AREADEF */
  55.     {       "FMAIL.ARD", sizeof(rawEchoType),  -1, NULL,
  56.                 "FMail Area File rev. 1.0\x1a",
  57.                  0x0100, DATATYPE_AD, 'AD', 0 } };
  58.  
  59.  
  60. static configFileInfoType cfiArr[MAX_CFG_FILES];
  61.  
  62. extern char configPath[128]; /* Path to directory with FMail config files */
  63.  
  64.  
  65.  
  66. s16 openConfig(u16 fileType, headerType **header, void **buf)
  67. {
  68.    pathType areaInfoPath;
  69.  
  70.    if (fileType >= MAX_CFG_FILES) return 0;
  71.  
  72.    strcpy(areaInfoPath, configPath);
  73.    strcat(areaInfoPath, fileData[fileType].fileName);
  74.  
  75.    memset(&cfiArr[fileType].header, 0, sizeof(headerType));
  76.    cfiArr[fileType].status = 0;
  77.  
  78.    if ((cfiArr[fileType].handle = open(areaInfoPath, O_BINARY|O_RDWR|O_CREAT|O_DENYALL, S_IREAD|S_IWRITE)) == -1)
  79.    {  return 0;
  80.    }
  81.    if (filelength(cfiArr[fileType].handle) == 0)
  82.    {
  83.       strcpy(cfiArr[fileType].header.versionString, fileData[fileType].revString);
  84.       cfiArr[fileType].header.revNumber    = fileData[fileType].revNumber;
  85.       cfiArr[fileType].header.headerSize   = sizeof(headerType);
  86.       cfiArr[fileType].header.recordSize   = fileData[fileType].recordSize;
  87.       cfiArr[fileType].header.dataType     = fileData[fileType].dataType;
  88.       cfiArr[fileType].header.totalRecords = 0;
  89.       cfiArr[fileType].header.lastModified = time(&cfiArr[fileType].header.creationDate);
  90.  
  91.       write(cfiArr[fileType].handle, &cfiArr[fileType].header, sizeof(headerType));
  92.    }
  93.    else
  94.    {
  95.       read(cfiArr[fileType].handle, &cfiArr[fileType].header, sizeof(headerType));
  96.  
  97.       if (memcmp(cfiArr[fileType].header.versionString, "FMail", 5) ||
  98.       (cfiArr[fileType].header.headerSize < sizeof(headerType)) ||
  99.       (cfiArr[fileType].header.recordSize < fileData[fileType].recordSize) ||
  100.       (cfiArr[fileType].header.dataType != fileData[fileType].dataType))
  101.       {
  102.      close(cfiArr[fileType].handle);
  103.      cfiArr[fileType].handle = -1;
  104.      *header = NULL;
  105.      *buf = NULL;
  106.      return 0;
  107.       }
  108.    }
  109.    if ((cfiArr[fileType].recBuf = malloc(cfiArr[fileType].header.recordSize)) == NULL)
  110.    {  close(cfiArr[fileType].handle);
  111.       cfiArr[fileType].handle = -1;
  112.       *header = NULL;
  113.       *buf = NULL;
  114.       return 0;
  115.    }
  116.    *header = &cfiArr[fileType].header;
  117.    *buf    = cfiArr[fileType].recBuf;
  118.    return 1;
  119. }
  120.  
  121.  
  122. s16 getRec(u16 fileType, s16 index)
  123. {
  124.    if (cfiArr[fileType].handle == -1) return 0;
  125.  
  126.    if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  127.              cfiArr[fileType].header.recordSize*(s32)index, SEEK_SET) == -1)
  128.    {  return 0;
  129.    }
  130.    if (read(cfiArr[fileType].handle, cfiArr[fileType].recBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  131.    {  return 0;
  132.    }
  133.    return 1;
  134. }
  135.  
  136.  
  137. s16 putRec(u16 fileType, s16 index)
  138. {
  139.    if (cfiArr[fileType].handle == -1) return 0;
  140.  
  141.    *(u16*)cfiArr[fileType].recBuf = fileData[fileType].init;
  142.    if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  143.              cfiArr[fileType].header.recordSize*(s32)index, SEEK_SET) == -1)
  144.    {  return 0;
  145.    }
  146.    if (write (cfiArr[fileType].handle, cfiArr[fileType].recBuf,
  147.           cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  148.    {  return 0;
  149.    }
  150.    cfiArr[fileType].status = 1;
  151.    return 1;
  152. }
  153.  
  154.  
  155. s16 insRec(u16 fileType, s16 index)
  156. {
  157.    s16  count;
  158.    void *tempBuf;
  159.  
  160.    if (cfiArr[fileType].handle == -1) return 0;
  161.  
  162.    *(u16*)cfiArr[fileType].recBuf = fileData[fileType].init;
  163.  
  164.    if ((tempBuf = malloc(cfiArr[fileType].header.recordSize)) == NULL) return 0;
  165.    count = cfiArr[fileType].header.totalRecords;
  166.  
  167.    while (--count >= index)
  168.    {  if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  169.                 cfiArr[fileType].header.recordSize*(s32)count, SEEK_SET) == -1)
  170.       {  free(tempBuf);
  171.      return 0;
  172.       }
  173.       if (read(cfiArr[fileType].handle, tempBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  174.       {  free(tempBuf);
  175.      return 0;
  176.       }
  177.       if (write(cfiArr[fileType].handle, tempBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  178.       {  free(tempBuf);
  179.      return 0;
  180.       }
  181.    }
  182.    free(tempBuf);
  183.    if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  184.              cfiArr[fileType].header.recordSize*(s32)index, SEEK_SET) == -1)
  185.    {  return 0;
  186.    }
  187.    if (write(cfiArr[fileType].handle, cfiArr[fileType].recBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  188.    {  return 0;
  189.    }
  190.    cfiArr[fileType].header.totalRecords++;
  191.    if (lseek(cfiArr[fileType].handle, 0, SEEK_SET) == -1)
  192.    {  return 0;
  193.    }
  194.    time(&cfiArr[fileType].header.lastModified);
  195.    if (write(cfiArr[fileType].handle, &cfiArr[fileType].header, cfiArr[fileType].header.headerSize) != cfiArr[fileType].header.headerSize)
  196.    {  return 0;
  197.    }
  198.    cfiArr[fileType].status = 1;
  199.    return 1;
  200. }
  201.  
  202.  
  203. s16 delRec(u16 fileType, s16 index)
  204. {
  205.    if (cfiArr[fileType].handle == -1) return 0;
  206.    while (++index < cfiArr[fileType].header.totalRecords)
  207.    {  if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  208.                 cfiArr[fileType].header.recordSize*(s32)index, SEEK_SET) == -1)
  209.       {  return 0;
  210.       }
  211.       if (read(cfiArr[fileType].handle, cfiArr[fileType].recBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  212.       {  return 0;
  213.       }
  214.       if (lseek(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  215.                 cfiArr[fileType].header.recordSize*(s32)(index-1), SEEK_SET) == -1)
  216.       {  return 0;
  217.       }
  218.       if (write(cfiArr[fileType].handle, cfiArr[fileType].recBuf, cfiArr[fileType].header.recordSize) != cfiArr[fileType].header.recordSize)
  219.       {  return 0;
  220.       }
  221.    }
  222.    chsize(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  223.           cfiArr[fileType].header.recordSize*(s32)--cfiArr[fileType].header.totalRecords);
  224.  
  225.    if (lseek(cfiArr[fileType].handle, 0, SEEK_SET) == -1)
  226.    {  return 0;
  227.    }
  228.    time(&cfiArr[fileType].header.lastModified);
  229.    write(cfiArr[fileType].handle, &cfiArr[fileType].header, cfiArr[fileType].header.headerSize);
  230.  
  231.    cfiArr[fileType].status = 1;
  232.    return 1;
  233. }
  234.  
  235.  
  236. s16 chgNumRec(u16 fileType, s16 number)
  237. {
  238.     cfiArr[fileType].header.totalRecords = number;
  239.     cfiArr[fileType].status = 1;
  240.     return 1;
  241. }
  242.  
  243.  
  244. s16 closeConfig(u16 fileType)
  245. {
  246.    if (cfiArr[fileType].handle == -1) return 0;
  247.  
  248.    if ((cfiArr[fileType].status == 1) &&
  249.        (lseek(cfiArr[fileType].handle, 0, SEEK_SET) != -1))
  250.    {
  251.       time(&cfiArr[fileType].header.lastModified);
  252.       write(cfiArr[fileType].handle, &cfiArr[fileType].header, cfiArr[fileType].header.headerSize);
  253.       chsize(cfiArr[fileType].handle, cfiArr[fileType].header.headerSize+
  254.                       cfiArr[fileType].header.recordSize*
  255.                                       (s32)cfiArr[fileType].header.totalRecords);
  256.    }
  257.    close(cfiArr[fileType].handle);
  258.    cfiArr[fileType].handle = -1;
  259.    free(cfiArr[fileType].recBuf);
  260.    cfiArr[fileType].recBuf = NULL;
  261.  
  262.    return 1;
  263. }
  264.