home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / mush6.4 / part02 / lock.c < prev    next >
C/C++ Source or Header  |  1989-03-12  |  4KB  |  171 lines

  1. /*
  2.  * lock.c -- deal with file locking on various architectures and UNIXs.
  3.  * dot_lock() creates a file with the same name as the parameter passed
  4.  * with the appendage ".lock" -- this is to be compatible with certain
  5.  * systems that don't use flock or lockf or whatever they have available
  6.  * that they don't use.
  7.  */
  8.  
  9. #ifdef USG
  10. #include <unistd.h>
  11. #endif /* USG */
  12. #include "mush.h"
  13. #if defined(SYSV) && !defined(USG)
  14. #include <sys/locking.h>
  15. #endif /* SYSV && !USG */
  16.  
  17. extern int sgid;
  18. #ifdef BSD
  19. extern int rgid;
  20. #endif /* BSD */
  21.  
  22. #ifdef DOT_LOCK
  23. dot_lock(filename)
  24. char *filename;
  25. {
  26.     char buf[MAXPATHLEN];
  27.     int lockfd, cnt = 0;
  28.     SIGRET (*oldint)(), (*oldquit)();
  29.  
  30. #ifdef BSD
  31.     setregid(rgid, sgid);
  32. #else
  33.     setgid(sgid);
  34. #endif /* BSD */
  35. #ifdef M_XENIX
  36.     if (strcmp(spoolfile, mailfile) == 0)
  37.     (void) sprintf(buf, "/tmp/%.10s.mlk", login);
  38.     else
  39. #endif /* M_XENIX */
  40.     (void) sprintf(buf, "%s.lock", filename);
  41.     on_intr();
  42.     while ((lockfd = open(buf, O_CREAT|O_WRONLY|O_EXCL, 0600)) == -1) {
  43.     if (errno != EEXIST) {
  44.         error("unable to lock %s", filename);
  45.         break;
  46.     }
  47.     if (cnt++ == 0)
  48.         print("%s already locked, waiting", filename);
  49.     else
  50.         print_more(".");
  51.     sleep(1);
  52.     if (ison(glob_flags, WAS_INTR)) {
  53.         print_more("\nAborted.\n");
  54.         break;
  55.     }
  56.     }
  57.     off_intr();
  58.     if (lockfd != -1) {
  59.     if (cnt)
  60.         print("done.\n");
  61.     (void) close(lockfd);
  62.     }
  63. #ifdef BSD
  64.     setregid(sgid, rgid);
  65. #else
  66.     setgid(getgid());
  67. #endif /* BSD */
  68.     return lockfd == -1? -1 : 0;
  69. }
  70. #endif /* DOT_LOCK */
  71.  
  72. lock_file(filename, fp)
  73. char *filename;
  74. FILE *fp;
  75. {
  76. #ifdef MMDF
  77.     if (Access(filename, W_OK) || lk_lock(filename, NULL, NULL, 0))
  78.     return -1;
  79. #else /* MMDF */
  80.     int fd = fileno(fp);
  81.  
  82.     if (debug && do_set(set_options, "deadlock")) {
  83.     un_set(&set_options, "deadlock");
  84.     return -1;
  85.     }
  86. #ifdef SYSV
  87. #ifndef USG
  88.     (void) locking(fd, LK_LOCK, 0); /* old xenix (sys III) */
  89. #else
  90.     /* if unable to lock, tell them */
  91.     if (Access(filename, W_OK) || lockf(fd, F_LOCK, 0L)) /* system-v */
  92.     return -1;
  93. #endif /* USG */
  94. #else
  95. #ifdef BSD
  96.     {
  97.     int cnt = 0;
  98.     SIGRET (*oldint)(), (*oldquit)();
  99.     on_intr();
  100.     while (isoff(glob_flags, WAS_INTR) && flock(fd, LOCK_EX | LOCK_NB)) {
  101.         if (errno == EWOULDBLOCK)
  102.         if (!cnt)
  103.             print("waiting to lock \"%s\"", filename);
  104.         else
  105.             cnt++, print(".");
  106.         else {
  107.         error("Unable to lock %s", filename);
  108.         off_intr();
  109.         return -1;
  110.         }
  111.         sleep(1);
  112.     }
  113.     if (cnt)
  114.         print("\n");
  115.     off_intr();
  116.     if (ison(glob_flags, WAS_INTR))
  117.         return -1;
  118.     }
  119. #else /* BSD */
  120.     if (ison(glob_flags, WARNING))
  121.     print("There is no supported file locking function!\n");
  122. #endif /* BSD */
  123. #endif /* SYSV */
  124. #endif /* MMDF */
  125.     return 0;
  126. }
  127.  
  128. void
  129. close_lock(filename, fp)
  130. char *filename;
  131. FILE *fp;
  132. #ifdef MMDF
  133. {
  134.     (void) lk_unlock(filename, NULL, NULL);
  135.     fclose(fp);
  136. }
  137. #endif /* MMDF */
  138. {
  139. #ifdef DOT_LOCK
  140.     char buf[MAXPATHLEN];
  141. #ifdef BSD
  142.     setregid(rgid, sgid);
  143. #else
  144.     setgid(sgid);
  145. #endif /* BSD */
  146. #ifdef M_XENIX
  147.     if (strcmp(spoolfile, mailfile) == 0)
  148.     (void) unlink(sprintf(buf, "/tmp/%.10s.mlk", login));
  149.     else
  150. #endif /* M_XENIX */
  151.     (void) unlink(sprintf(buf, "%s.lock", filename));
  152. #ifdef BSD
  153.     setregid(sgid, rgid);
  154. #else
  155.     setgid(getgid());
  156. #endif /* BSD */
  157. #endif /* DOT_LOCK */
  158.  
  159. #ifdef BSD
  160.     flock(fileno(fp), LOCK_UN);
  161. #endif /* BSD */
  162. #ifdef SYSV
  163. #ifndef USG
  164.     locking(fileno(fp), LK_UNLCK, 0);
  165. #else
  166.     lockf(fileno(fp), F_ULOCK, 0L);
  167. #endif /* USG */
  168. #endif /* SYSV */
  169.     fclose(fp);
  170. }
  171.