home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / lib / lockfile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-29  |  3.5 KB  |  169 lines

  1.  
  2. /*
  3.  *  LOCKFILE.C
  4.  *
  5.  *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
  6.  *
  7.  *  Now uses OwnDevUnit.Library
  8.  *  Installs exit handler to deal with program exit
  9.  *
  10.  *  WARNING:    cannot call MakeConfigPath() since static buffer will
  11.  *        be overwritten and caller might expect it not to be
  12.  */
  13.  
  14. #include <exec/types.h>
  15. #include <exec/lists.h>
  16. #include <libraries/dos.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <config.h>
  20. #include <OwnDevUnit.h>
  21. #include <log.h>
  22.  
  23. typedef struct List LIST;
  24. typedef struct Node NODE;
  25.  
  26. typedef struct {
  27.     NODE    Node;
  28.     FILE    *Fi;
  29.     short   Refs;
  30. } LNode;
  31.  
  32. Prototype void LockFile(const char *);
  33. Prototype void UnLockFile(const char *);
  34. Prototype void UnLockFiles(void);
  35. Prototype int FileIsLocked(const char *);
  36. Local void FreeLockNode(LNode *);
  37.  
  38. LIST LockList = { (NODE *)&LockList.lh_Tail, NULL, (NODE *)&LockList.lh_Head };
  39. static char Buf[512];
  40.  
  41. extern struct Library *OwnDevUnitBase;
  42.  
  43. void
  44. LockFile(file)
  45. const char *file;
  46. {
  47.     const char *ptr;
  48.     char *lockDir = GetConfigDir(LOCKDIR);
  49.     short lockLen = strlen(lockDir);
  50.     LNode *node;
  51.     LNode *n;
  52.  
  53.     for (ptr = file + strlen(file); ptr >= file && *ptr != '/' && *ptr != ':'; --ptr)
  54.     ;
  55.     ++ptr;
  56.  
  57.     if (node = malloc(sizeof(LNode) + lockLen + 16 + strlen(ptr))) {
  58.     node->Node.ln_Name = (char *)(node + 1);
  59.  
  60.     strcpy(node->Node.ln_Name, MakeConfigPathBuf(Buf, LOCKDIR, ptr));
  61.     strcat(node->Node.ln_Name, ".LOCK");
  62.  
  63.     for (n = (LNode *)LockList.lh_Head; n != (LNode *)&LockList.lh_Tail; n = (LNode *)n->Node.ln_Succ) {
  64.         if (stricmp(node->Node.ln_Name, n->Node.ln_Name) == 0) {
  65.         ++n->Refs;
  66.         free(node);
  67.         return;
  68.         }
  69.     }
  70. #ifdef NOTDEF
  71.     while ((node->Fi = fopen(node->Node.ln_Name, "w")) == NULL) {
  72.         sleep(2);
  73.         chkabort();
  74.     }
  75. #endif
  76.     if (OwnDevUnitBase) {
  77.         if (ptr = LockDevUnit(node->Node.ln_Name, 0, LogProgram, 0)) {
  78.         ulog(-1, "LockDevUnit() failed: %s", ptr);
  79.         }
  80.     }
  81.     node->Refs = 1;
  82.     AddTail(&LockList, &node->Node);
  83.     }
  84. }
  85.  
  86. /*
  87.  *  Check to see whether a file is locked.  We could try to fopen the
  88.  *  file for 'w', but this causes unnecesary filesystem activity
  89.  */
  90.  
  91. int
  92. FileIsLocked(file)
  93. const char *file;
  94. {
  95.     const char *ptr;
  96.     FILE *fi;
  97.     char buf[128];
  98.     long lock;
  99.  
  100.     for (ptr = file + strlen(file); ptr >= file && *ptr != '/' && *ptr != ':'; --ptr)
  101.     ;
  102.     ++ptr;
  103.     sprintf(buf, "%s.LOCK", MakeConfigPathBuf(Buf, LOCKDIR, ptr));
  104.  
  105. #ifdef NOTDEF
  106.     if (lock = Lock(buf, EXCLUSIVE_LOCK)) {
  107.     UnLock(lock);
  108.     return(0);
  109.     }
  110.     if (IoErr() == ERROR_OBJECT_IN_USE)
  111.     return(1);
  112.     return(0);
  113. #endif
  114.     if (OwnDevUnitBase) {
  115.     if (AvailDevUnit(buf, 0))
  116.         return(0);
  117.     return(1);
  118.     }
  119.     return(0);
  120. }
  121.  
  122. void
  123. UnLockFile(file)
  124. const char *file;
  125. {
  126.     LNode *node;
  127.     short len;
  128.     const char *ptr;
  129.  
  130.     for (ptr = file + strlen(file); ptr >= file && *ptr != '/' && *ptr != ':'; --ptr)
  131.     ;
  132.     ++ptr;
  133.  
  134.     MakeConfigPathBuf(Buf, LOCKDIR, ptr);
  135.     strcat(Buf, ".LOCK");
  136.  
  137.     for (node = (LNode *)LockList.lh_Head; node != (LNode *)&LockList.lh_Tail; node = (LNode *)node->Node.ln_Succ) {
  138.     if (stricmp(Buf, node->Node.ln_Name) == 0) {
  139.         if (--node->Refs == 0)
  140.         FreeLockNode(node);
  141.         break;
  142.     }
  143.     }
  144. }
  145.  
  146. void
  147. UnLockFiles()
  148. {
  149.     LNode *node;
  150.  
  151.     while ((node = (LNode *)LockList.lh_Head) != (LNode *)&LockList.lh_Tail)
  152.     FreeLockNode(node);
  153. }
  154.  
  155. static void
  156. FreeLockNode(node)
  157. LNode *node;
  158. {
  159.     Remove(node);
  160. #ifdef NOTDEF
  161.     fclose(node->Fi);
  162.     unlink(node->Node.ln_Name);
  163. #endif
  164.     if (OwnDevUnitBase)
  165.     FreeDevUnit(node->Node.ln_Name, 0);
  166.     free(node);
  167. }
  168.  
  169.