| 1 | XMUT4 ;ISC-SF/GMB-Integrity Checker for files 3.7, 3.9 ;07/15/2002  07:25 | 
|---|
| 2 | ;;8.0;MailMan;;Jun 28, 2002 | 
|---|
| 3 | ; Was (WASH ISC)/CAP | 
|---|
| 4 | ; | 
|---|
| 5 | ; Entry points used by MailMan options (not covered by DBIA): | 
|---|
| 6 | ; CHKFILES   XMUT-CHKFIL | 
|---|
| 7 | Q | 
|---|
| 8 | CHKFILES ; | 
|---|
| 9 | I $D(ZTQUEUED) D PROCESS Q | 
|---|
| 10 | N XMABORT | 
|---|
| 11 | S XMABORT=0 | 
|---|
| 12 | D WARNING^XMUT41(.XMABORT) Q:XMABORT | 
|---|
| 13 | D EN^XUTMDEVQ("PROCESS^XMUT4",$$EZBLD^DIALOG(36080)) ; MailMan: Global Integrity Checker | 
|---|
| 14 | Q | 
|---|
| 15 | PROCESS ; | 
|---|
| 16 | I $D(ZTQUEUED) S ZTREQ="@" | 
|---|
| 17 | N XMABORT | 
|---|
| 18 | S XMABORT=0 | 
|---|
| 19 | D MAILBOX(.XMABORT) | 
|---|
| 20 | D:'XMABORT MESSAGE^XMUT4C(.XMABORT) | 
|---|
| 21 | D SUMMARY^XMUT41(XMABORT) | 
|---|
| 22 | Q | 
|---|
| 23 | MAILBOX(XMABORT) ; | 
|---|
| 24 | W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36081) ; Checking MAILBOX file 3.7 | 
|---|
| 25 | D USERS(.XMABORT) Q:XMABORT | 
|---|
| 26 | D MXREF^XMUT41(.XMABORT) Q:XMABORT | 
|---|
| 27 | D POSTBSKT^XMUT41 | 
|---|
| 28 | Q | 
|---|
| 29 | USERS(XMABORT) ; | 
|---|
| 30 | ; XMUCNT   # users | 
|---|
| 31 | ; XMUKCNT  # bskts for a particular user | 
|---|
| 32 | ; XMUECNT  # msg entries for a particular user | 
|---|
| 33 | ; XMKCNT   # bskts | 
|---|
| 34 | ; XMECNT   # msg entries | 
|---|
| 35 | N XMUSER,XMECNT,XMUCNT,XMKCNT,XMUKCNT,XMUECNT | 
|---|
| 36 | W:'$D(ZTQUEUED) !!,$$EZBLD^DIALOG(36082),! ; Checking each user mailbox | 
|---|
| 37 | S (XMUSER,XMECNT,XMUCNT,XMKCNT)=0 | 
|---|
| 38 | F  S XMUSER=$O(^XMB(3.7,XMUSER)) Q:XMUSER'>0  D  Q:XMABORT | 
|---|
| 39 | . S XMUCNT=XMUCNT+1 I XMUCNT#20=0 D  Q:XMABORT | 
|---|
| 40 | . . I '$D(ZTQUEUED) W:$X>40 ! W XMUCNT,"." Q | 
|---|
| 41 | . . I $$S^%ZTLOAD S (XMABORT,ZTSTOP)=1 ; User asked the task to stop | 
|---|
| 42 | . D USER(XMUSER,.XMUKCNT,.XMUECNT) | 
|---|
| 43 | . S XMKCNT=XMKCNT+XMUKCNT | 
|---|
| 44 | . S XMECNT=XMECNT+XMUECNT | 
|---|
| 45 | Q:XMABORT | 
|---|
| 46 | I '$D(ZTQUEUED) D | 
|---|
| 47 | . N XMPARM,XMTEXT | 
|---|
| 48 | . S XMPARM(1)=XMUCNT,XMPARM(2)=XMKCNT,XMPARM(3)=XMECNT | 
|---|
| 49 | . W ! | 
|---|
| 50 | . D BLD^DIALOG(36083,.XMPARM,"","XMTEXT","F") | 
|---|
| 51 | . D MSG^DIALOG("WM","","","","XMTEXT") | 
|---|
| 52 | . ;|1| Users, |2| Baskets, |3| Msg Entries" | 
|---|
| 53 | I $D(^XMB(3.7,0)) S:$P(^XMB(3.7,0),U,4)'=XMUCNT $P(^(0),U,4)=XMUCNT Q | 
|---|
| 54 | S ^XMB(3.7,0)="MAILBOX^3.7P^3^"_XMUCNT | 
|---|
| 55 | Q | 
|---|
| 56 | USER(XMUSER,XMUKCNT,XMUECNT) ; | 
|---|
| 57 | ; XMUNCNT  # new msgs for a user | 
|---|
| 58 | ; XMUKECNT # msgs in a user's bskt | 
|---|
| 59 | ; XMUKNCNT # new msgs in a user's bskt | 
|---|
| 60 | N XMK,XMUKNCNT,XMUKECNT,XMUNCNT | 
|---|
| 61 | D BXREF(XMUSER) | 
|---|
| 62 | D N0XREF(XMUSER) | 
|---|
| 63 | S (XMK,XMUKCNT,XMUNCNT,XMUECNT)=0 | 
|---|
| 64 | F  S XMK=$O(^XMB(3.7,XMUSER,2,XMK)) Q:XMK'>0  D | 
|---|
| 65 | . Q:XMK=.95 | 
|---|
| 66 | . S XMUKCNT=XMUKCNT+1 | 
|---|
| 67 | . D BSKT(XMUSER,XMK,.XMUKNCNT,.XMUKECNT) | 
|---|
| 68 | . S XMUNCNT=XMUNCNT+XMUKNCNT | 
|---|
| 69 | . S XMUECNT=XMUECNT+XMUKECNT | 
|---|
| 70 | S:$P($G(^XMB(3.7,XMUSER,0)),U,1)'=XMUSER $P(^(0),U,1)=XMUSER | 
|---|
| 71 | S:$P(^XMB(3.7,XMUSER,0),U,6)'=XMUNCNT $P(^(0),U,6)=XMUNCNT | 
|---|
| 72 | S:'$D(^XMB(3.7,"B",XMUSER,XMUSER)) ^XMB(3.7,"B",XMUSER,XMUSER)="" | 
|---|
| 73 | I $D(^XMB(3.7,XMUSER,2,0)) S:$P(^XMB(3.7,XMUSER,2,0),U,4)'=XMUKCNT $P(^(0),U,4)=XMUKCNT Q | 
|---|
| 74 | S ^XMB(3.7,XMUSER,2,0)="^3.701^"_$O(^XMB(3.7,XMUSER,2,"B"),-1)_U_XMUKCNT | 
|---|
| 75 | Q | 
|---|
| 76 | BSKT(XMUSER,XMK,XMUKNCNT,XMUKECNT) ; | 
|---|
| 77 | N XMKN,XMKZ,XMZ,XMREC,XMRESEQ,XMKNAME | 
|---|
| 78 | S XMKNAME(1)=$$EZBLD^DIALOG(37005) ; IN | 
|---|
| 79 | S XMKNAME(.5)=$$EZBLD^DIALOG(37004) ; WASTE | 
|---|
| 80 | S XMKNAME("?")=$$EZBLD^DIALOG(34009) ; * No Name * | 
|---|
| 81 | D CXREF(XMUSER,XMK,.XMRESEQ) | 
|---|
| 82 | S (XMZ,XMUKNCNT,XMUKECNT)=0 | 
|---|
| 83 | F  S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,XMZ)) Q:XMZ'>0  D | 
|---|
| 84 | . S XMREC=^XMB(3.7,XMUSER,2,XMK,1,XMZ,0) | 
|---|
| 85 | . I $P(XMREC,U,1)'=XMZ D | 
|---|
| 86 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,1)=XMZ | 
|---|
| 87 | . . D ERR(103,XMUSER,XMK,XMZ) ; Msg in bskt, but no .01 field: .01 field created | 
|---|
| 88 | . I '$D(^XMB(3.9,XMZ,0)) D  Q | 
|---|
| 89 | . . D ERR(101,XMUSER,XMK,XMZ) ; Msg in bskt, but no msg: removed from bskt | 
|---|
| 90 | . . D ZAPIT^XMXMSGS2(XMUSER,XMK,XMZ) | 
|---|
| 91 | . S XMUKECNT=XMUKECNT+1 | 
|---|
| 92 | . S XMKZ=$P(XMREC,U,2) | 
|---|
| 93 | . I XMKZ D | 
|---|
| 94 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)) S ^(XMZ)="" D ERR(112,XMUSER,XMK,XMZ) ; Msg in bskt, but no C xref: xref created | 
|---|
| 95 | . E  D | 
|---|
| 96 | . . S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",""),-1)+1 | 
|---|
| 97 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ | 
|---|
| 98 | . . S ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)="" | 
|---|
| 99 | . . D ERR(102,XMUSER,XMK,XMZ) ; Msg in bskt, but no seq #: seq # created | 
|---|
| 100 | . I '$D(^XMB(3.7,"M",XMZ,XMUSER,XMK,XMZ)) S ^(XMZ)="" D ERR(111,XMUSER,XMK,XMZ) ; Msg in bskt, but no M xref: xref created | 
|---|
| 101 | . ;I XMUSER=.5,XMK>999 Q | 
|---|
| 102 | . I $P(XMREC,U,3) D | 
|---|
| 103 | . . I XMK=.5 D  Q | 
|---|
| 104 | . . . D ERR(104,XMUSER,XMK,XMZ) ; New msg in WASTE bskt: msg made not new | 
|---|
| 105 | . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)="" | 
|---|
| 106 | . . . K ^XMB(3.7,XMUSER,"N0",XMK,XMZ) | 
|---|
| 107 | . . S XMUKNCNT=XMUKNCNT+1 | 
|---|
| 108 | . . I '$D(^XMB(3.7,XMUSER,"N0",XMK,XMZ)) S ^(XMZ)="" D ERR(113,XMUSER,XMK,XMZ) ; New msg, but no N0 xref: xref created | 
|---|
| 109 | I '$D(^XMB(3.7,XMUSER,2,XMK,0)) D | 
|---|
| 110 | . S XMKN=$G(XMKNAME(XMK),XMKNAME("?")) | 
|---|
| 111 | . S ^XMB(3.7,XMUSER,2,XMK,0)=XMKN | 
|---|
| 112 | . D ERR(131,XMUSER,XMK) ; No bskt 0 node: created | 
|---|
| 113 | E  D | 
|---|
| 114 | . S XMKN=$P(^XMB(3.7,XMUSER,2,XMK,0),U) | 
|---|
| 115 | . I XMKN="" D  Q | 
|---|
| 116 | . . S XMKN=$G(XMKNAME(XMK),XMKNAME("?")) | 
|---|
| 117 | . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN | 
|---|
| 118 | . . D ERR(132,XMUSER,XMK) ; Bskt name null: created | 
|---|
| 119 | . Q:XMK>1 | 
|---|
| 120 | . Q:'$D(XMKNAME(XMK)) | 
|---|
| 121 | . Q:XMKN=XMKNAME(XMK) | 
|---|
| 122 | . N XMKNBAD | 
|---|
| 123 | . S XMKNBAD=XMKN | 
|---|
| 124 | . S XMKN=XMKNAME(XMK) | 
|---|
| 125 | . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN | 
|---|
| 126 | . K ^XMB(3.7,XMUSER,2,"B",XMKNBAD,XMK) | 
|---|
| 127 | . D ERR(134,XMUSER,XMK,"",XMKNBAD) ; Bskt name '|1|' wrong: corrected | 
|---|
| 128 | I '$D(^XMB(3.7,XMUSER,2,"B",$E(XMKN,1,30),XMK)) S ^(XMK)="" D ERR(141,XMUSER,XMK) ; Bskt name, but no B xref: xref created | 
|---|
| 129 | S:$P(^XMB(3.7,XMUSER,2,XMK,0),U,2)'=XMUKNCNT $P(^(0),U,2)=XMUKNCNT | 
|---|
| 130 | I $D(^XMB(3.7,XMUSER,2,XMK,1,0)) D | 
|---|
| 131 | . S:$P(^XMB(3.7,XMUSER,2,XMK,1,0),U,4)'=XMUKECNT $P(^(0),U,4)=XMUKECNT | 
|---|
| 132 | E  I XMUKECNT D | 
|---|
| 133 | . S ^XMB(3.7,XMUSER,2,XMK,1,0)="^3.702P^"_$O(^XMB(3.7,XMUSER,2,XMK,1,"C"),-1)_U_XMUKECNT | 
|---|
| 134 | . D ERR(133,XMUSER,XMK) ; No msg multiple 0 node: created | 
|---|
| 135 | Q:'$G(XMRESEQ) | 
|---|
| 136 | D RSEQ^XMXBSKT(XMUSER,XMK) | 
|---|
| 137 | D ERR(125,XMUSER,XMK) ; C xref duplicate seq #s: bskt reseq'd | 
|---|
| 138 | Q | 
|---|
| 139 | CXREF(XMUSER,XMK,XMRESEQ) ; Check the bskt's C xref (msg seq numbers in bskt) | 
|---|
| 140 | N XMKZ,XMZ,XMCNT | 
|---|
| 141 | S XMKZ=0 | 
|---|
| 142 | F  S XMKZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ)) Q:'XMKZ  D | 
|---|
| 143 | . S (XMZ,XMCNT)=0 | 
|---|
| 144 | . F  S XMZ=$O(^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ)) Q:'XMZ  D | 
|---|
| 145 | . . S XMCNT=XMCNT+1 | 
|---|
| 146 | . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,2)=XMKZ | 
|---|
| 147 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D  Q | 
|---|
| 148 | . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_U_XMKZ | 
|---|
| 149 | . . . D ERR(122,XMUSER,XMK,XMZ) ; C xref, but msg not in bskt: put in bskt | 
|---|
| 150 | . . I $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)="" D  Q | 
|---|
| 151 | . . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,2)=XMKZ | 
|---|
| 152 | . . . D ERR(123,XMUSER,XMK,XMZ) ; C xref, but no msg seq #: set seq # using xref | 
|---|
| 153 | . . K ^XMB(3.7,XMUSER,2,XMK,1,"C",XMKZ,XMZ) | 
|---|
| 154 | . . D ERR(124,XMUSER,XMK,XMZ) ; C xref does not match msg seq #: xref killed | 
|---|
| 155 | . S:XMCNT>1 XMRESEQ=1 | 
|---|
| 156 | Q | 
|---|
| 157 | N0XREF(XMUSER) ; Check the user's N0 xref (new msgs) | 
|---|
| 158 | N XMK,XMZ | 
|---|
| 159 | S XMK=0 | 
|---|
| 160 | F  S XMK=$O(^XMB(3.7,XMUSER,"N0",XMK)) Q:'XMK  D | 
|---|
| 161 | . S XMZ=0 | 
|---|
| 162 | . F  S XMZ=$O(^XMB(3.7,XMUSER,"N0",XMK,XMZ)) Q:'XMZ  D | 
|---|
| 163 | . . Q:$P($G(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)),U,3)=1 | 
|---|
| 164 | . . I '$D(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)) D  Q | 
|---|
| 165 | . . . S ^XMB(3.7,XMUSER,2,XMK,1,XMZ,0)=XMZ_"^^1" | 
|---|
| 166 | . . . D ERR(126,XMUSER,XMK,XMZ) ; N0 xref, but msg not in bskt: msg put in bskt | 
|---|
| 167 | . . S $P(^XMB(3.7,XMUSER,2,XMK,1,XMZ,0),U,3)=1 | 
|---|
| 168 | . . D ERR(127,XMUSER,XMK,XMZ) ; N0 xref, but msg not new: new flag set | 
|---|
| 169 | Q | 
|---|
| 170 | BXREF(XMUSER) ; Check the user's B xref (bskt names) | 
|---|
| 171 | N XMK,XMKN | 
|---|
| 172 | S XMKN="" | 
|---|
| 173 | F  S XMKN=$O(^XMB(3.7,XMUSER,2,"B",XMKN)) Q:XMKN=""  D | 
|---|
| 174 | . S XMK=0 | 
|---|
| 175 | . F  S XMK=$O(^XMB(3.7,XMUSER,2,"B",XMKN,XMK)) Q:'XMK  D | 
|---|
| 176 | . . Q:$E($P($G(^XMB(3.7,XMUSER,2,XMK,0)),U),1,30)=XMKN | 
|---|
| 177 | . . I $D(^XMB(3.7,XMUSER,2,XMK,0)) D  Q | 
|---|
| 178 | . . . I $P($G(^XMB(3.7,XMUSER,2,XMK,0)),U)="" D  Q | 
|---|
| 179 | . . . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN | 
|---|
| 180 | . . . . D ERR(151,XMUSER,XMK) ; B xref, but bskt name null: name set using xref | 
|---|
| 181 | . . . D ERR(153,XMUSER,XMK) ; B xref does not match bskt name: xref killed | 
|---|
| 182 | . . . K ^XMB(3.7,XMUSER,2,"B",XMKN,XMK) | 
|---|
| 183 | . . S $P(^XMB(3.7,XMUSER,2,XMK,0),U)=XMKN | 
|---|
| 184 | . . D ERR(152,XMUSER,XMK) ; B xref, but no bskt node: node set using xref | 
|---|
| 185 | Q | 
|---|
| 186 | ERR(XMERRNUM,XMUSER,XMK,XMZ,XMDPARM) ; | 
|---|
| 187 | S XMERROR(XMERRNUM)=$G(XMERROR(XMERRNUM))+1 | 
|---|
| 188 | Q:$D(ZTQUEUED) | 
|---|
| 189 | N XMPARM | 
|---|
| 190 | S XMPARM(1)=XMUSER,XMPARM(2)=XMK,XMPARM(3)=XMERRNUM | 
|---|
| 191 | S XMPARM(4)=$$EZBLD^DIALOG(36000+XMERRNUM,.XMDPARM) | 
|---|
| 192 | ;DUZ=|1|, Bskt=|2|$S($G(XMZ):", Msg=|5|",1:""), Err=|3| |4| | 
|---|
| 193 | I $G(XMZ) S XMPARM(5)=XMZ W !,$$EZBLD^DIALOG(36099,.XMPARM) Q | 
|---|
| 194 | W !,$$EZBLD^DIALOG(36098,.XMPARM) | 
|---|
| 195 | Q | 
|---|
| 196 | ;34009     * No Name * | 
|---|
| 197 | ;37004     WASTE | 
|---|
| 198 | ;37005     IN | 
|---|
| 199 | ;36098     DUZ=|1|, Bskt=|2|, Err=|3| |4| | 
|---|
| 200 | ;36099     DUZ=|1|, Bskt=|2|, Msg=|5|, Err=|3| |4| | 
|---|
| 201 | ;36101     Msg in bskt, but no msg: removed from bskt | 
|---|
| 202 | ;36102     Msg in bskt, but no seq #: seq # created | 
|---|
| 203 | ;36103     Msg in bskt, but no .01 field: .01 field | 
|---|
| 204 | ;36104     New msg in WASTE bskt: msg made not new | 
|---|
| 205 | ;36111     Msg in bskt, but no M xref: xref created | 
|---|
| 206 | ;36112     Msg in bskt, but no C xref: xref created | 
|---|
| 207 | ;36113     New msg, but no N0 xref: xref created | 
|---|
| 208 | ;36122     C xref, but msg not in bskt: put in bskt | 
|---|
| 209 | ;36123     C xref, but no msg seq #: set seq # using | 
|---|
| 210 | ;36124     C xref does not match msg seq #: xref kill | 
|---|
| 211 | ;36125     C xref duplicate seq #s: bskt reseq'd | 
|---|
| 212 | ;36126     N0 xref, but msg not in bskt: msg put in | 
|---|
| 213 | ;36127     N0 xref, but msg not new: new flag set | 
|---|
| 214 | ;36131     No bskt 0 node: created | 
|---|
| 215 | ;36132     Bskt name null: created | 
|---|
| 216 | ;36133     No msg multiple 0 node: created | 
|---|
| 217 | ;36134     Bskt name '|1|' wrong: corrected | 
|---|
| 218 | ;36141     Bskt name, but no B xref: xref created | 
|---|
| 219 | ;36151     B xref, but bskt name null: name set using | 
|---|
| 220 | ;36152     B xref, but no bskt node: node set using | 
|---|
| 221 | ;36153     B xref does not match bskt name: xref kill | 
|---|