Annotation of freem/src/glocks.c, revision 1.1

1.1     ! snw         1: /*
        !             2:  *                            *
        !             3:  *                           * *
        !             4:  *                          *   *
        !             5:  *                     ***************
        !             6:  *                      * *       * *
        !             7:  *                       *  MUMPS  *
        !             8:  *                      * *       * *
        !             9:  *                     ***************
        !            10:  *                          *   *
        !            11:  *                           * *
        !            12:  *                            *
        !            13:  *
        !            14:  *   glocks.c
        !            15:  *    display and clear M locks
        !            16:  *
        !            17:  *  
        !            18:  *   Author: Serena Willis <jpw@coherent-logic.com>
        !            19:  *    Copyright (C) 1998 MUG Deutschland
        !            20:  *    Copyright (C) 2020 Coherent Logic Development LLC
        !            21:  *
        !            22:  *
        !            23:  *   This file is part of FreeM.
        !            24:  *
        !            25:  *   FreeM is free software: you can redistribute it and/or modify
        !            26:  *   it under the terms of the GNU Affero Public License as published by
        !            27:  *   the Free Software Foundation, either version 3 of the License, or
        !            28:  *   (at your option) any later version.
        !            29:  *
        !            30:  *   FreeM is distributed in the hope that it will be useful,
        !            31:  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            32:  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            33:  *   GNU Affero Public License for more details.
        !            34:  *
        !            35:  *   You should have received a copy of the GNU Affero Public License
        !            36:  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
        !            37:  *
        !            38:  **/
        !            39: 
        !            40: #include <stdlib.h>
        !            41: #include <stddef.h>
        !            42: #include "mpsdef0.h"
        !            43: #include "errmsg.h"
        !            44: #include <signal.h>
        !            45: #include <setjmp.h>
        !            46: #include <fcntl.h>
        !            47: #include <unistd.h>
        !            48: #include <sys/types.h>
        !            49: #include <sys/wait.h>
        !            50: #include <string.h>
        !            51: 
        !            52: #ifndef FREEBSD
        !            53: #define EOF -1
        !            54: #endif
        !            55: 
        !            56: #include <stdio.h>
        !            57: #ifdef SYSFIVE
        !            58: #include <fcntl.h>
        !            59: #endif /* SYSFIVE */
        !            60: 
        !            61: /* needed if byte data are to be interpreted as unsigned integer */
        !            62: #define UNSIGN(A) ((A)&0377)
        !            63: void    unlock ();
        !            64: void    zname ();
        !            65: short int znamenumeric ();
        !            66: long int tell ();
        !            67: 
        !            68: #ifndef SYSFIVE
        !            69: #define FreeM_timezone -3600
        !            70: #else
        !            71: 
        !            72: #ifdef __CYGWIN__
        !            73: #define FreeM_timezone _timezone
        !            74: #else
        !            75: extern long FreeM_timezone;
        !            76: #endif /* __CYGWIN__ */
        !            77: 
        !            78: #endif /* SYSFIVE */
        !            79: 
        !            80: 
        !            81: 
        !            82: int
        !            83: main (argc, argv)
        !            84: int     argc;                  /* arguments count     */
        !            85: char  **argv;                  /* arguments string    */
        !            86: 
        !            87: {
        !            88:     static char locktab[80] = "/usr/tmp/locktab";      /* file with LOCKs */
        !            89:     static long rempid = 0L;           /* remove entry with rem PID */
        !            90:     short   ltab;                      /* file descr. for locktab */
        !            91:     int     pid;
        !            92:     short   type;
        !            93:     char    ch;
        !            94:     char    line[300], varnam[300];
        !            95:     int     i, j, n;
        !            96: 
        !            97:     if (argc > 1) {
        !            98:         j = 0;
        !            99:         while (--argc > 0) {
        !           100:             j++;
        !           101:             if (argv[j][0] == '-') {
        !           102:                 if (rempid) {
        !           103:                     fprintf (stderr, "usage is: %s [-pid] [lockfile]\n", *argv);
        !           104:                     exit (0);
        !           105:                 }
        !           106:                 n = 0;
        !           107:                 rempid = 0L;
        !           108:                 while ((ch = argv[j][++n])) {
        !           109:                     if (ch < '0' || ch > '9') {
        !           110:                         fprintf (stderr, "usage is: %s [-pid] [lockfile]\n", *argv);
        !           111:                         exit (0);
        !           112:                     }
        !           113:                     rempid = rempid * 10 + ch - '0';
        !           114:                 }
        !           115:                 continue;
        !           116:             }
        !           117:             strcpy (locktab, *(argv + j));
        !           118:         }
        !           119:     }
        !           120:     if (rempid)
        !           121:         unlock (locktab, rempid);
        !           122:     while ((ltab = open (locktab, 0)) == -1) {
        !           123:         printf ("cannot open '%s'\n", locktab);
        !           124:         exit (0);
        !           125:     }
        !           126: 
        !           127:     lseek (ltab, 0L, 0);
        !           128:     for (;;)
        !           129:     {
        !           130:         read (ltab, line, 3);
        !           131:         pid = UNSIGN (line[0]) * 256 + UNSIGN (line[1]);
        !           132:         if (pid == 0)
        !           133:             break;
        !           134:         type = line[2];
        !           135:         i = 0;
        !           136:         do {
        !           137:             read (ltab, &ch, 1);
        !           138:             if (ch == EOF)
        !           139:                 goto done;
        !           140:             varnam[i++] = ch;
        !           141:         } while (ch != EOL);
        !           142:         zname (line, varnam);
        !           143:         printf ("%d\t%s %s\n", pid, type == 'D' ? "ZA" : "L ", line);
        !           144:     }
        !           145: 
        !           146: done:
        !           147:     close (ltab);
        !           148:     exit (0);
        !           149: }
        !           150: 
        !           151: void
        !           152: unlock (locktab, pid)                  /* unLOCK all entries of pid */
        !           153: char   *locktab;               /* locktable */
        !           154: long    pid;                   /* process ID */
        !           155: 
        !           156: {
        !           157: short   ltab;                  /* file descr. for locktab */
        !           158:     int     cpid;
        !           159:     char    entry[256];
        !           160: long int r_pos;                        /* position to read  */
        !           161: long int w_pos;                        /* position to write */
        !           162:     int     i,
        !           163:     j;
        !           164: 
        !           165: /*      open locktab, quit if nothing to be done */
        !           166:     if ((ltab = open (locktab, 2)) == -1)
        !           167:         return;
        !           168: 
        !           169: /*      request exclusive access to locktab (read & write) */
        !           170:     locking (ltab, 1, 0L);
        !           171: 
        !           172: /*      free all of your own locks; we do it by copying the whole stuff */
        !           173: /*      within 'locktab' omitting the old entries under our PID         */
        !           174: j = 0;                         /* count your old entries */
        !           175:     lseek (ltab, 0L, 0);
        !           176:     w_pos = 0L;
        !           177:     for (;;)
        !           178:     {
        !           179:         read (ltab, entry, 2);
        !           180:         cpid = UNSIGN (entry[0]) * 256 + UNSIGN (entry[1]);
        !           181:         if (cpid == 0) {
        !           182:             lseek (ltab, w_pos, 0);
        !           183:             write (ltab, entry, 2);
        !           184:             break;
        !           185:         }
        !           186:         i = 1;
        !           187:         do {
        !           188:             read (ltab, &entry[++i], 1);
        !           189:         } while (entry[i] != EOL);
        !           190:         i++;
        !           191:         if (cpid != pid) {
        !           192:             if (j) {
        !           193:                 r_pos = tell (ltab);
        !           194:                 lseek (ltab, w_pos, 0);
        !           195:                 write (ltab, entry, (unsigned) i);
        !           196:                 lseek (ltab, r_pos, 0);
        !           197:             }
        !           198:             w_pos += i;
        !           199:         } else
        !           200:         j++;
        !           201:     }
        !           202:     locking (ltab, 0, 0L);
        !           203:     close (ltab);
        !           204:     return;
        !           205: }                                      /* end lock() */

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