Km~MAIL-SPEEDUP.BCK݁MAIL-SPEEDUP.BCKCBACKUP/NOASSIST USER0:[SYSTOOLS.TURBOMAIL]*.* MAIL-SPEEDUP.BCK/SAVE TERRY BWV5.5 _SPCVXA:: 'u _$1$DUA7: V5.5-2 ~ "*[SYSTOOLS.TURBOMAIL]AAA_README.;37+,<4./  4Oj-> 0123KPWO56q7BĪ89G HJ,AThis article and associated files in this distribution are hereby!released into the public domain. G THIS DOCUMENT AND ASSOCIATED FILES ARE PROVIDED "AS IS" WITHOUTO WARRANTY OF ANY KIND. THE AUTHOR SPECIFICALLY DISCLAIMS ALL WARRANTIES,N EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTY? OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.DThis distribution contains a patch to VMS Mail that can dramaticallyimprove its performance:. aaa_readme. - This fileD aa_article. - Article on VMS Mail performanceB aa_how_adjust_patch_addresses. - How to modify patch files for> different versions of VMSH change_mail_dir.com - changes the name of a VMS directoryA containing VMS Mail messages: mailshr_patch.com - patch for mailshr.exe; mailshrp_patch.com - patch for mailshrp.exeG shorten_mail_names_start.com - start batch job to activate patch / for a userD shorten_mail_names_batch.com - batch job to activate patch for+ a userI unshorten_mail_names_start.com - start batch job to deactivate patch / for a userF unshorten_mail_names_batch.com - batch job to deactivate patch for+ a user AWhen the VMS directory holding a user's VMS Mail files gets largeC(>than a few hundred blocks) performance can be awful when creatingBnew files (i.e. receiving messages that are stored in an externalCmail file). The most typical user complaint is that when sending to@one of these users it sometimes takes forever to get back a mailDprompt (several minutes for sending to some of our users). See the5article in "aaa_article." for a detailed explanation.CThis patch improves VMS Mail performance by shrinking the VMS MailAdirectory to less than 1/20th its starting size. In severe casesC(VMS directories of 4000+ blocks) this can decrease system resourceBconsumption for delivering a message to these users by a factor often.7This patch changes VMS Mail so that for selected users:? * External message files are stored in 16 sub-directories. = * The files names used for the external message files areA shorter so that more file names fit in each directory block. and the total directory size is smaller.D * The file names are assigned for external message files so that< they lexically increase over time. Thus, new externalE message files are always added at the end of a directory. ThisF eliminates the need to reorganize the directory to make room for a new file entry.EThe patch has no effect on VMS Mail for users that have not activatedFthe patch. Just installing the patch will not change the way VMS Mail<operates for any user. The patch must be turned on for eachindividual user.?Two DCL procedures are supplied. One activates the patch for aCspecified user, and the other deactivates the patch for a specifieduser. How to install-------------->* Put the files in this distribution in a directory somewhere.8* Verify that the version of VMS you are running matches the one that: mailshr_patch.com mailshrp_patch.comF are configured for. Inspect the contents of these files to determine0 this -- then make any needed adjustments. See:& aa_how_to_adjust_patch_addresses.  for instructions.4* Make sure you have a recent backup for the system.* Apply the patch:! $ set default sys$libraryI $! if running in a cluster make sure you are in the SYSCOMMON dirG $! you will need a dev/dir spec in the @ patch file names below $ patch @mailshr_patch check for error messages $ patch @mailshrp_patch check for error messages<* reinstall MAILSHR and MAILSHRP on all nodes in the cluster' (with the same privs they had before)BThe patch is now installed but normal operation of VMS Mail shouldcontinue unchanged.* Edit the procedure: shorten_mail_names_start.com and" unshorten_mail_names_start.comB to reflect your local directory naming conventions. If you have< really unusual naming conventions, you might have to edit: shorten_mail_names_batch.com and" unshorten_mail_names_batch.com as well.@* Identify the first user to try out the patch. Its a good idea>to make the first user one with a very mail mail directory and7only a handful of external message files. This way you;can become familiar with the procedure and also verify that6all is working well before running lengthy batch jobs.@To activate the patch for any individual user, from a privileged9account (this has only been tested running under accounts9with all possible privs including bypass -- presumably it;could get by with a subset of privs but its not been tested that way):1 Make sure the target user can run batch jobs.I Make sure the user is not using mail (Once started, the DCL procedure; will wait for up to 2 hours for the user to exit mail) C Make sure that no batch job will attempt to compress the user's1 mail in the midst of the following procedure.- @shorten_mail_names_start target_usernameWhere:D target_username = the name of the user to activate the patch forDThis submits a batch job to activate the patch for target_username. GOn our unloaded VAX 6520, for users with a 1000 block VMS directory forGmail it took about 5 hours elapsed time, for one large user it took 30+hours.EThe DISMAIL flag is set in the UAF for the target user during phase 0Fof the procedure. This flag remains set only while the mail directory@names are being changed -- typically about 1 minute on our 6520.FAfter phase 0 completes the target user may run mail but will not haveFaccess to all of their old external mail msg files until the batch job>completes. The user submitting/running the batch procedure is notified when phase 0 completes.CYou may run multiple user patch activations or deactivations at the same time. @The user running the DCL procedures will receive progress emailsat the following points: * Start of procedure * Phase Zero completion0 The renaming of the users mail directories9 is complete and its possible for the user to access< Mail, but not all of their old external message files.  * End of procedureAfter the batch job completes:C * Review the batch log files in sys$login: directory of the user+ running the batch jobs for any errors.; * Verify that you can send a message that will create an= external message file to the target_user (i.e. a message larger then 3 blocks)A * Make sure the user can read messages that reside in external mail files.A * Check the users [username.MAIL__] directory. The only filesB in this directory should be: 0.DIR through F.DIR and MAIL.MAID All of the external message files (MAIL$*.MAI) should have been? moved to the 0-F sub-directories. Any other files in this) directory probably belong elsewhere.@To deactivate the patch for any given user, use the instructionsabove but instead of:- @shorten_mail_names_start target_usernamedo:/ @unshorten_mail_names_start target_username Possible Problems-----------------DCallable Mail -- There is one function in callable mail that returnsCthe file name for the external message file. This function was not=patched and will continue to return the original file name. +This did not cause a problem on our system.>Other *MAILSHR*.exe -- I found these files in our sys$library: CMS$$$MAILSHR.EXE;1 CMS$$$MAILSHRP.EXE;1 DECW$MAILSHR.EXE;1  DSN_MAILSHR.EXE;3  PSI_MAILSHR.EXE;10  =They may contain of some of the corresponding MAILSHR.EXE andBMAILSHRP.EXE logic. This patch does not alter these files, if you=use these it MIGHT be a problem. We've not tested them since"we don't actively use any of them.1VMS Mail directories with names ending in "__" --BIf some of your users already have VMS Mail directory names endingBin "__". You will need to change the patch and the supporting DCL'procedures to use a different sequence.AMagic file names -- Version 4 VMS Mail external file names are of the form: MAIL$00040091ED8D2BDF.MAI;1 =This patch will not properly handle the subset of these namesthat have the format: MAIL$000400XX0005XXXX.MAI;1 Bwhere the X's can be any valid hex digit. In our case, this is anEalmost null subset of our old mail. The DCL procedure that activatesGthe patch for a user will refuse to start and will put a message in itsCbatch job log file explaining how to work around this problem if itfinds any of these files.9System Crash during activation of the patch for a user --6Should be recoverable without too much effort. Modify5the DCL command procedure that was running to bypass $what was already done, and continue. Possible Improvements---------------------=The patch could be extended to spread the external files over?256 directories instead of 16 -- but this would only make sense#for truly gigantic VMS directories.:A slight performance improvement could be gained by making;the 16 directories up one level in the directory structure,0i.e. [jimmy_t.a] rather than [jimmy_t.mail__.a].AThis would eliminate one level of directory lookup when accessing these files.@The patch could be extended to solve some of the problems listed!in the Possible Problems section.<The output written to the screen and the batch log while theEDCL procedures are running could be made more aesthetically pleasing. Acknowledgments---------------JBob Massey (bob_m4@verifone.com) helped with testing and valuable feedback>Claude Barbe (barbe@epsx25.SINet.SLB.COM) kindly supplied the ; MACRO_TO_PATCH.COM procedure used to develop this patch@Jerry Leichter (leichter@lrw.com) suggested focusing on patching'the F$FAO calls in MAILSHR and MAILSHRP<Lots of other people who took time to send me their ideas on$how to improve VMS Mail performance.Jim 18-FEB-1993M+------------------------------------+--------------------------------------+M| James H. Thompson | jimmy_t@verifone.com (Internet) |M| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |M| 100 Kahelu Avenue | 808-623-2911 (Phone) |M| Mililani, HI 96789 | 808-625-3201 (FAX) |M+------------------------------------+--------------------------------------+!*[SYSTOOLS.TURBOMAIL]AA_ARTICLE.;2+,3./  4N-> 0123KPWO56"7.VPŪ89G HJ&J-------- Original Article, as I posted on DECUSSERVE --------------------->A summary of what we have learned about VMS Mail performance: CThe following attempts to explain what can cause periodic very longEdelays in sending email to some users, and how it might be corrected.AVMS mail messages larger than 3 blocks are stored one message per0file in the receiving user's VMS Mail directory.These files are named: MAIL$0005.MAIWhere:< = bits 16 through 47 of message ID quadword in Hex= = bits 48 through 63 of message ID quadword in Hex (bit 0 = low order bit)?(Originally it was: MAIL$0004.MAI -- Old messages in/ a mail directory will still be named this way.> It was changed to put the low order portion of the message ID: first in order to take advantage of the way VMS DirectoryC lookups work - i.e. for maximum lookup speed in VMS directories --@ make the beginning part of the file name as unique as possible)FBecause the message ID quadword is derived from the message timestamp,Fapproximately every 11 months the value of increments and 0begins to repeat values from the previous cycle.BAssume for a moment that a new VAX Mail user starts receiving mailCwhen = zero. The beginning part of the generated file namesCwill be ascending, and unique as possible given the naming scheme. HThis causes all new external message files to be added to the end of theCVMS directory. During this period we achieve optimum VMS directory performance.FAfter approximately 11 months, reaches its maximum value, Fincrements and restarts at zero. Now new external message filesFwill be added at effectively random places in the VMS Mail directory. ?If the VMS directory is still small there will be no noticeable;performance penalty. If the directories are very very large@performance will be erratic. Very long delays can occur wheneverFcreating a new external message file causes a VMS directory block near0the beginning of the directory file to overflow.%The size of the delay will depend on:F * The number of files in the receiving user's VMS Mail directoryF * The current VMS timestamp (this will determine lexically where= in the VMS directory a new external message file will be added)C * The spread of timestamps used to generate the file names of* the old external message files. F In general, email to users with lots of external message filesF older than 11 months will suffer the most. This is because ifF all of the existing external message file names are less thanC 11 months old they will be more likely to have = theB of the new external message file, and therefore be9 quickly inserted at the end of the VMS directory.@In a test scenario sending lots of messages to a user with a big>directory, and lots of existing old messages: if the generated:new external message file names are lexically far from the@end of the VMS directory, a very long delay will occur every 7thmessage.Some possible solutions-----------------------F1) Improve VMS directory performance by patching VMS Mail to generateD shorter file names for external message files. Since on a largeE system it would not be feasible to rename all existing mail filesC overnight, or even over a long weekend, the patch would have toF generate the short file names only for a subset of all users. TheB simplest way to do this would be to restrict the generation ofB short names to mail subdirectories that start or end with someA unlikely sequence. -- e.g. only generate short names for mailE subdirectories that have names ending in a "$". Current external+ mail file names are 25 characters long:+ MAIL$F2891A3900050093.MAI;1+ 123456789.123456789.1234567$ 1 2D Eliminating the "MAIL$", the "0005", the leading "00" portion of; , and ".MAI" would result in a 11 character name: F2891A3993.;1* 123456789.123456789.123456$ 1 2L Encoding 10 digit Hex portion into a into a base 32 number (digits: 0-V)< would take only 8 digits giving a 9 character file name.F Format it in the sequence so that new files are always* appended to the end of the directory. Results:E A 2 to 1 improvement in the number of files per VMS directory block.? Faster VMS directory lookups because of more uniqueness+ in the beginning of the file names.? Since new file names will be ever ascending in lexicalH sequence, all additions will be at the end of the VMS directory.9 A conversion program is needed to rename old external) mail message files to the new format. N2) VMS Mail directories tend to only use about one-half their internal space.? This is due to the way VMS manages the directory structure.@ Running a directory compression utility, (sometimes includedJ in disk defrag packages, or presumably in the DECUS library somewhere)E can sometimes dramatically cut mail directory sizes. (Note: using@ $RENAME to compress directories does not leave the directory blocks fully packed)E You can easily (if somewhat slowly on large directories) see what= percentage of the VMS Mail directory space you are using: $ dir/size=used mail.dir$ $! save the number of blocks $ dir/tot [.mail]# $! save the number of files Percent directory fill =1 number of filesE ------------------------------ * 100? (files_per_dir_block * blocks)H For normal external mail message files, files_per_dir_block = 12<3) Rename all of the existing VMS external message files inB a users mail directory to names that optimize adding new files to the directory. C Write a program that reads "MAIL.MAI" and alters the message IDE field so that all of the old messages have = 0 and =@ 1 for the first message, 2 for the second message, etc. ThenC almost all new messages will be added at the lexical end of theD directory. (If overflows because there are more than 65K8 messages, then use some low order bits in too)F Changing the message ID quadword will not alter the timestamp usedD for /SINCE, /BEFORE or that is displayed when a message is read.C This fix will improve the time to add new files almost any size> mail directory, it will degrade directory lookup times forB directories smaller than 1200 blocks. This fix makes the most% sense for very large directories. Here is some pseudo code:1 = bits 16 through 47 of message ID quadword2 = bits 48 through 63 of message ID quadword(bit 0 = low order bit) program new_ = 0 new_ = 0 open mail.mai loop read mail.mai exitif eof/ if msg stored in external file- old_ = new_/ old_ = new_3 new_ = new_ + 1= rewrite modified record into mail.maiF rename external message file to new name basedI on new value of and for this message endif endloop endprogramBActually it is slightly more complicated than this but not much. IChave some DCL/Fortran code (which I will post if there is interest)?that does this. We have tested it on several of our large mail2directories and the following results are typical:HTime to execute: $ mail sys$login:login.com username/subj="Test Message"@ to a user with a 1400 block mail directory on a VAX 65205Before running mail directory reorganization program:) Elapsed CPU DIO# Time Time $ Seconds Seconds, ------- ------- ------*Every 7th message 30 1.3 8701All other msg 3 0.85 35 4After running mail directory reorganization program:) Elapsed CPU DIO# Time Time $ Seconds Seconds, ------- ------- ------1All msg 3.5 1.00 35 =The drawback of this solution is that all of the new messages=(the one the user is most likely to work with) are at the end9of the directory where accessing them costs the most. Sothere are some tradeoffs.Jim - Feb 1993M+------------------------------------+--------------------------------------+M| James H. Thompson | jimmy_t@verifone.com (Internet) |M| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |M| 100 Kahelu Avenue | 808-623-2911 (Phone) |M| Mililani, HI 96789 | 808-625-3201 (FAX) |M+------------------------------------+--------------------------------------+7*[SYSTOOLS.TURBOMAIL]AA_HOW_TO_ADJUST_PATCH_ADDRESSES.;4+,1?M./  4Rn-> 0123KPWO567Ū89G HJAdjusting the Patch Files-------------------------IThis document explains how to adjust the offsets in mailshr_patch.com and/mailshrp_patch.com to different version of VMS.HUnfortunately, without the source listings and link maps for the versionBof VMS that you wish to patch, finding the correct patch addressesis matter of trial and error.<The addresses for VMS 5.4-2 are provided in the patch files.=To find the correct patch addresses for other versions of VMSuse the following procedure:;Make copies of mailshr.exe and mailshrp.exe in your working directory.&You will need to adjust the values of: in mailshr_patch.com) define patch1=mail$$check_date+95, define patch2=mail$$form_extfile+0d8+ define patch3=mail$$write_msg+15b-8 in mailshrp_patch.com* define patch1=mail$$write_msg+01d9/ define patch2=mail$$check_date_priv+094OAll of the these addresses should point to a 'calls #6,@#7ffedf50' instruction.CWarning!: There may be more instructions like this in these images.?If you adjust these offsets too far you may end up patching the wrong one.To adjust these addresses:>Calculate the addresses by substituting for any symbols, using0the values previously defined in the patch file. For example:) define patch1=mail$$check_date+957would become (using: define MAIL$$CHECK_DATE=00006078): 6078+95Run $ Patch as in: $ Patch mailshr.exe<Use the patch EXAM/instruction command to look at the image:Example: PATCH>exam/instr 6078:6078+0a000006078: XFC%00006079: REMQUE @(SP)+,W^0FEA0(SP)"0000607E: REMQHI @W^008F(R0),#00 00006083: INSQUE #02,B^0F8(FP)00006087: CLRL B^0FC(FP)0000608A: CMPB (AP),#030000608D: BGEQU 000060940000608F: MOVL #01,R600006092: BRB 0000609D00006094: CLRL R600006096: TSTL B^0C(AP)00006099: BNEQ 0000609D0000609B: INCL R60000609D: MCOML R6,R6!000060A0: MOVAB (SP),B^0A4(FP)000060A4: MOVL B^04(AP),R8000060A8: MOVB #01,B^1E(R8)%000060AC: MOVL #00110000,B^04(R8)000060B4: MOVW #08,B^34(R8)000060B8: MOVL B^08(AP),R7000060BC: MOVL R7,B^30(R8)000060C0: CLRL R11000060C2: PUSHL R8!000060C4: CALLS #01,@#7FFEE170000060CB: BLBC R0,000060D1000060CE: BRW 00006150000060D1: BLBC R6,00006142!000060D4: MOVZBL #0FF,B^0A0(FP)000060D9: CMPW B^06(R7),#04000060DD: BNEQ 000060E4000060DF: MOVQ #01,R9000060E2: BRB 000060E9000060E4: MOVL #01,R10000060E7: CLRL R9"000060E9: MOVW #020E,B^0FA(FP)'000060EF: MOVZBW W^00006064,B^0F8(FP)'000060F5: MOVAB W^00006065,B^0FC(FP)000060FB: PUSHL (R7)[R10]000060FE: PUSHL (R7)[R9]00006101: PUSHL B^0C(AP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50/00006114: MOVC5 #00,(SP),#00,#0050,B^0A8(FP)* Look for the instruction: CALLS #06,@#7FFEDF50Bat or near the location specified in the patch file. In this caseat 6078+95 = 610D* Adjust the symbol value<For example if the instruction was found at: 610C instead of 610D change ) define patch1=mail$$check_date+95to) define patch1=mail$$check_date+94>Its a good idea to keep the original values as comments in the:patch file. I would expect the adjustments needed between.recent VMS versions to be less than 100 bytes.=* Repeat this process for each of the symbols listed earlier.<* Try out you adjusted patch files on your private copies of8mailshr.exe and mailshr.exe. You can't actually execute6the patched images, but you can verify that your patchgets applied correctly. $ patch @mailshr_patch.exeand $ patch @mailshrp_patch.exe* Complications;Because the VAX uses variable length instructions, when you=pick an address to dump, you may be starting in the middle of=an instruction. In this case you get gibberish masquerading<as data. Keep adjusting the address by 1 byte until you geta "reasonable" display.Example:PATCH>exam/instr 60f0:6110*000060F0: CASEL -(R1),@L^0CF9F59A4,(AP),%PATCH-E-NODECODE, cannot decode instructionPATCH>exam/instr 60f1:6110$000060F1: CMPD @L^0CF9F59A4,(AP),%PATCH-E-NODECODE, cannot decode instructionPATCH>exam/instr 60f2:6110,%PATCH-E-NODECODE, cannot decode instructionPATCH>exam/instr 60f3:61109000060F3: XORW3 @L^0FF6CCF9E(R8),B^0FC(FP),@W^674A(FP)000060FE: PUSHL (R7)[R9]00006101: PUSHL B^0C(AP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50PATCH>exam/instr 60f4:6110R000060F4: ASHP @(SP)+,W^00006065,B^0FC(FP),@W^674A(FP),@W^6749(FP),@W^0CAC(FP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50PATCH>exam/instr 60f5:6110'000060F5: MOVAB W^00006065,B^0FC(FP)000060FB: PUSHL (R7)[R10]000060FE: PUSHL (R7)[R9]00006101: PUSHL B^0C(AP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50PATCH>exam/instr 60f6:6110(000060F6: CASEL (AP),@L^4ADE5DAA,(R7)000060FE: PUSHL (R7)[R9]00006101: PUSHL B^0C(AP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50PATCH>exam/instr 60f7:6110#000060F7: CVTBD @L^4ADE5DAA,(R7)000060FE: PUSHL (R7)[R9]00006101: PUSHL B^0C(AP)00006104: PUSHAB B^0A0(FP)00006107: PUSHAB B^0A0(FP)0000610A: PUSHAB B^0F8(FP)!0000610D: CALLS #06,@#7FFEDF50 PATCH>exitDWe were lucky in this sequence, in that the instruction dis-assembly7resynchronized after starting in mid-instruction. e.g. )the display starting at 60f4 and showing:R000060F4: ASHP @(SP)+,W^00006065,B^0FC(FP),@W^674A(FP),@W^6749(FP),@W^0CAC(FP)Fis likely the ending part of one instruction and the beginning part of<another. However, the decoding resynchronized and showed us#the correct instruction we sought: !0000610D: CALLS #06,@#7FFEDF50BIt does not always do this, sometimes you just get a long sequenceCof instructions that don't quite look right. Continue tweaking the4starting address until you get a reasonable display.Jim - Feb 1993M+------------------------------------+--------------------------------------+M| James H. Thompson | jimmy_t@verifone.com (Internet) |M| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |M| 100 Kahelu Avenue | 808-623-2911 (Phone) |M| Mililani, HI 96789 | 808-625-3201 (FAX) |M+------------------------------------+--------------------------------------+**[SYSTOOLS.TURBOMAIL]CHANGE_MAIL_DIR.COM;40+,=?./  4]-> 0123KPWO56 B7a!ƪ89G HJO$!-----------------------------------------------------------------------------,$! change the name of a users mail directory3$! Author: James H. Thompson (jimmy_t@verifone.com)$! p1 = username$$! p2 = unused - but must be presentJ$! p3 = name of users mail dir file(ex: jimmy_t_disk:[jimmy_t]mail_dir.dir+$! p4 = name of new mail dir e.g. "mailxyz"*$! p5 .nes. "" for parameter validate only$!$ result == "N"O$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------3$! make sure any files we will use start out closed $ set noon$ define/user sys$output nl:$ define/user sys$error nl:$ close file_out$ close file_mailE$ if f$trnlnm("SYS$OUTPUT") .eqs. "NL:" then deassign/user sys$outputC$ if f$trnlnm("SYS$ERROR") .eqs. "NL:" then deassign/user sys$error$ set onO$!-----------------------------------------------------------------------------*$! Create some unique temporary file names?$ uq = f$time() - ":" - ":" - ":" - "-" - "-" - "-" - "." - " ">$ uq = f$getjpi(0,"master_pid") + "_" + f$edit(uq, "collapse")2$ work_a_file_name = "sys$login:work_a" + "." + uq2$ work_b_file_name = "sys$login:work_b" + "." + uqO$!-----------------------------------------------------------------------------$ if p5 .eqs. "" $ then $ out "".$ out "Starting: ", this_procedure_file_name$ out "P1=",p1$ out "P2=",p2$ out "P3=",p3$ out "P4=",p4$ out "P5=",p5 $ out ""$ endif$!$!$$! set same prot as mail usually has@$ set protection=(Systemfa~MAIL-SPEEDUP.BCK=?> *[SYSTOOLS.TURBOMAIL]CHANGE_MAIL_DIR.COM;40]$+:RWED, Owner:RWED, Group, World)/defaultO$!-----------------------------------------------------------------------------$!!$! sequence for changing mail dir$!$!O$!-----------------------------------------------------------------------------$ target_username = p1$ temp_username = p2$ mail_dir_file = p3O$!-----------------------------------------------------------------------------$ w = mail_dir_fileW$ new_mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")0$ new_mail_dir_name = new_mail_dir + "''p4'.DIR";$ new_mail_dir = (new_mail_dir - "]") + "." + "''p4'" + "]")$ if f$search(new_mail_dir_name) .nes. ""$ thenI$ out "unable to continue, found unexpected file: ''new_mail_dir_name'"$ exit$ endifO$!-----------------------------------------------------------------------------$ w = mail_dir_fileS$ mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ mail_dir = (mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"($ mail_file_name = mail_dir + "mail.mai"L$ mail_dir_file_sans_version = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") -J + f$parse(w,,,"DIRECTORY") + f$parse(w,,,"NAME") + f$parse(w,,,"TYPE")9$ if f$search(mail_dir_file_sans_version+"_tmp") .nes. ""$ then]$ out "unable to continue -- found unexpected file: " + mail_dir_file_sans_version + "_tmp"$ exit$ endif$!1$! the following test is for parameter validationO$!-----------------------------------------------------------------------------%$! get exclusive access to mail filesG$! we need exclusive access just to make sure the user is not currentlyH$! running MAIL or that some batch job isn't in the midst of compressing $! his mail.$!$ loop_count = 0$ open_file_mail2:D$ open/read/write/err=file_mail_open_err2 file_mail 'mail_file_name'$ goto file_mail_open_ok2$ file_mail_open_err2:$ save_status = $status$ loop_count = loop_count + 1 $ out ""$ out "File: ",mail_file_name/$ out "Open failure: ",f$message(save_status)<$ out "Unable to open users mail.mai for exclusive access"$ exit$ file_mail_open_ok2:$ close file_mail$!O$!-----------------------------------------------------------------------------$$! exit if parameter validation onlyO$!-----------------------------------------------------------------------------$!$ if p5 .nes. "" $ then$ result == "Y" $ exit$ endifO$!-----------------------------------------------------------------------------O$!-----------------------------------------------------------------------------F$! 0) Turn off mail for this user while we are mucking with his dir$!$!-$ define sysuaf sys$common:[sysexe]susuaf.dat2$ mcr authorize mod 'target_username'/flag=dismail$!O$!-----------------------------------------------------------------------------%$! get exclusive access to mail filesG$! we need exclusive access just to make sure the user is not currentlyH$! running MAIL or that some batch job isn't in the midst of compressing $! his mail.$!$ loop_count = 0$ open_file_mail:C$ open/read/write/err=file_mail_open_err file_mail 'mail_file_name'$ goto file_mail_open_ok$ file_mail_open_err:$ save_status = $status$ loop_count = loop_count + 1$ out "File: ",mail_file_name/$ out "Open failure: ",f$message(save_status)!$ out " attempt: ",loop_count$ if loop_count .lt. 120 $ then $ wait 00:01:00$ goto open_file_mail$ endif<$ out "Unable to open users mail.mai for exclusive access"$ exit$ file_mail_open_ok:>$! we now have exclusive use of the user's mail.mai file until$! we close the file: file_mailO$!-----------------------------------------------------------------------------$ ($! 1) rename old dir to temp_mail.dir$! :$ rename 'mail_dir_file' 'mail_dir_file_sans_version'_tmp$!>$! 2) create a dummy sub dir same as mail thinks cur dir is$!$ create/dir 'mail_dir'$!$! 3) create new dir $!'$ file_out_file_name = work_a_file_nameD$ open /error=file_out_open_err2/write file_out 'file_out_file_name'$ goto file_out_open_ok2$ file_out_open_err2:$ save_status = $status8$ out "Open failure file_out: ",f$message(save_status)$ exit$!$ file_out_open_ok2:$ file_out_rec_write = 0$ write file_out "$ mail"($ write file_out "set mail_dir [.''p4']"-$ file_out_rec_write = file_out_rec_write + 1$!$ close file_out-$ set file/prot=(w:rwed) 'file_out_file_name',$ submit/que=vmsbatch 'file_out_file_name' -# /noprint/user='target_username'$!$!$ wait_for_job_loop:($ if f$search(new_mail_dir_name) .eqs ""$ thenC$ out "Waiting for batch job1: ''file_out_file_name' to complete"$ wait 00:00:05$ goto wait_for_job_loop$ endif$ "$! 5) del empty copy of new dir$!($ delete 'f$search(new_mail_dir_name)'$!)$! 6) rename temp_mail.dir -> new name$!@$ rename 'mail_dir_file_sans_version'_tmp 'new_mail_dir_name'$!'$! give up exclusive access to mail.mai$ close file_mail#$! 7) turn mail back on for user$!4$ mcr authorize mod 'target_username'/flag=nodismailO$!-----------------------------------------------------------------------------$ result == "Y"$ exit2*[SYSTOOLS.TURBOMAIL]CHANGE_MAIL_DIR.COM_ORIGINAL;1+,D?./  4]-> 0123KPWO5667ƪ89G HJO$!-----------------------------------------------------------------------------,$! change the name of a users mail directory3$! Author: James H. Thompson (jimmy_t@verifone.com)$! p1 = username$$! p2 = unused - but must be presentJ$! p3 = name of users mail dir file(ex: jimmy_t_disk:[jimmy_t]mail_dir.dir+$! p4 = name of new mail dir e.g. "mailxyz"*$! p5 .nes. "" for parameter validate only$!$ result == "N"O$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------3$! make sure any files we will use start out closed $ set noon$ define/user sys$output nl:$ define/user sys$error nl:$ close file_out$ close file_mailE$ if f$trnlnm("SYS$OUTPUT") .eqs. "NL:" then deassign/user sys$outputC$ if f$trnlnm("SYS$ERROR") .eqs. "NL:" then deassign/user sys$error$ set onO$!-----------------------------------------------------------------------------*$! Create some unique temporary file names?$ uq = f$time() - ":" - ":" - ":" - "-" - "-" - "-" - "." - " ">$ uq = f$getjpi(0,"master_pid") + "_" + f$edit(uq, "collapse")2$ work_a_file_name = "sys$login:work_a" + "." + uq2$ work_b_file_name = "sys$login:work_b" + "." + uqO$!-----------------------------------------------------------------------------$ if p5 .eqs. "" $ then $ out "".$ out "Starting: ", this_procedure_file_name$ out "P1=",p1$ out "P2=",p2$ out "P3=",p3$ out "P4=",p4$ out "P5=",p5 $ out ""$ endif$!$!$$! set same prot as mail usually has@$ set protection=(System:RWED, Owner:RWED, Group, World)/defaultO$!-----------------------------------------------------------------------------$!!$! sequence for changing mail dir$!$!O$!-----------------------------------------------------------------------------$ target_username = p1$ temp_username = p2$ mail_dir_file = p3O$!-----------------------------------------------------------------------------$ w = mail_dir_fileW$ new_mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")0$ new_mail_dir_name = new_mail_dir + "''p4'.DIR";$ new_mail_dir = (new_mail_dir - "]") + "." + "''p4'" + "]")$ if f$search(new_mail_dir_name) .nes. ""$ thenI$ out "unable to continue, found unexpected file: ''new_mail_dir_name'"$ exit$ endifO$!-----------------------------------------------------------------------------$ w = mail_dir_fileS$ mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ mail_dir = (mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"($ mail_file_name = mail_dir + "mail.mai"L$ mail_dir_file_sans_version = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") -J + f$parse(w,,,"DIRECTORY") + f$parse(w,,,"NAME") + f$parse(w,,,"TYPE")9$ if f$search(mail_dir_file_sans_version+"_tmp") .nes. ""$ then]$ out "unable to continue -- found unexpected file: " + mail_dir_file_sans_version + "_tmp"$ exit$ endif$!1$! the following test is for parameter validationO$!-----------------------------------------------------------------------------%$! get exclusive access to mail filesG$! we need exclusive access just to make sure the user is not currentlyH$! running MAIL or that some batch job isn't in the midst of compressing $! his mail.$!$ loop_count = 0$ open_file_mail2:D$ open/read/write/err=file_mail_open_err2 file_mail 'mail_file_name'$ goto file_mail_open_ok2$ file_mail_open_err2:$ save_status = $status$ loop_count = loop_count + 1 $ out ""$ out "File: ",mail_file_name/$ out "Open failure: ",f$message(save_status)<$ out "Unable to open users mail.mai for exclusive access"$ exit$ file_mail_open_ok2:$ close file_mail$!O$!-----------------------------------------------------------------------------$$! exit if parameter validation onlyO$!-----------------------------------------------------------------------------$!$ if p5 .nes. "" $ then$ result == "Y" $ exit$ endifO$!-----------------------------------------------------------------------------O$!-----------------------------------------------------------------------------F$! 0) Turn off mail for this user while we are mucking with his dir$!$!2$ mcr authorize mod 'target_username'/flag=dismail$!O$!-----------------------------------------------------------------------------%$! get exclusive access to mail filesG$! we need exclusive access just to make sure the user is not currentlyH$! running MAIL or that some batch job isn't in the midst of compressing $! his mail.$!$ loop_count = 0$ open_file_mail:C$ open/read/write/err=file_mail_open_err file_mail 'mail_file_name'$ goto file_mail_open_ok$ file_mail_open_err:$ save_status = $status$ loop_count = loop_count + 1$ out "File: ",mail_file_name/$ out "Open failure: ",f$message(save_status)!$ out " attempt: ",loop_count$ if loop_count .lt. 120 $ then $ wait 00:01:00$ goto open_file_mail$ endif<$ out "Unable to open users mail.mai for exclusive access"$ exit$ file_mail_open_ok:>$! we now have exclusive use of the user's mail.mai file until$! we close the file: file_mailO$!-----------------------------------------------------------------------------$ ($! 1) rename old dir to temp_mail.dir$! :$ rename 'mail_dir_file' 'mail_dir_file_sans_version'_tmp$!>$! 2) create a dummy sub dir same as mail thinks cur dir is$!$ create/dir 'mail_dir'$!$! 3) create new dir $!'$ file_out_file_name = work_a_file_nameD$ open /error=file_out_open_err2/write file_out 'file_out_file_name'$ goto file_out_open_ok2$ file_out_open_err2:$ save_status = $status8$ out "Open failure file_out: ",f$message(save_status)$ exit$!$ file_out_open_ok2:$ file_out_rec_write = 0$ write file_out "$ mail"($ write file_out "set mail_dir [.''p4']"-$ file_out_rec_write = file_out_rec_write + 1$!$ close file_out-$ set file/prot=(w:rwed) 'file_out_file_name'$ submit 'file_out_file_name' -# /noprint/user='target_username'$!$!$ wait_for_job_loop:($ if f$search(new_mail_dir_name) .eqs ""$ thenC$ out "Waiting for batch job1: ''file_out_file_name' to complete"$ wait 00:00:05$ goto wait_for_job_loop$ endif$ "$! 5) del empty copy of new dir$!($ delete 'f$search(new_mail_dir_name)'$!)$! 6) rename temp_mail.dir -> new name$!@$ rename 'mail_dir_file_sans_version'_tmp 'new_mail_dir_name'$!'$! give up exclusive access to mail.mai$ close file_mail#$! 7) turn mail back on for user$!4$ mcr authorize mod 'target_username'/flag=nodismailO$!-----------------------------------------------------------------------------$ result == "Y"$ exit(*[SYSTOOLS.TURBOMAIL]MAILSHRP_PATCH.COM;6+,H?./  4`\-> 0123KPWO56D7nƪ89G HJ =!---------------------- MAILSHRP_PATCH.COM ----------------- MAILSHRP.EXE!I!------------------------------------------------------------------------! the following for VMS 5.4-2"!define mail$$write_msg=038a0+027c&!define MAIL$$CHECK_DATE_PRIV=00004EA4!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr#!define patch1=mail$$write_msg+01d9(!define patch2=mail$$check_date_priv+094! end VMS 5.4-2 patch addressesI!------------------------------------------------------------------------3! the following for VMS 5.5-2 (by tmk, 26-Mar-1993)define mail$$write_msg=03c18%define MAIL$$CHECK_DATE_PRIV=00004FA0!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr"define patch1=mail$$write_msg+01d9'define patch2=mail$$check_date_priv+094! end VMS 5.5-2 patch addressesI!------------------------------------------------------------------------!)! Now make sure that we have a patch area! ALI/B PATAREA ! And now enter instruction mode! SET MODE INSTRUCTIONA! Start implementing the new external file name Format subroutine:! It was first developped and tested as a MACRO-32 program5! and changed into the body of this patch.com file by<! a MACRO_TO_PATCH.COM procedure developped for that purpose ! and kindly supplied by: %! barbe@epsx25.SINet.SLB.COM9! (Claude Barbe - EPSchlumberger 33-1-4537-2171)!DEP /PATPATAREAH !; All offsets must be in Hex because thats the default RADIX for !; the patch program !;; 'jhtpat: .word ^X7C ' ! ;reg save mask for R2-R6% !; @B^^X00(ap) Argument count0 !; @B^^X04(ap) ptr to FAO control string> !; @B^^X08(ap) ptr to word for result of fao operation3 !; @B^^X0C(ap) ptr to fao result descriptor, !; @B^^X10(ap) ptr to fao arg1 (!AS). !; @B^^X14(ap) value of fao arg2 (!XL). !; @B^^X18(ap) value of fao arg3 (!XL)B !; Check to see if the the user wants short mail file namesH !; we do this by checking to see if the last two character of the: !; mail subdirectory name are underscore charactersS ' movl b^^X10(ap),r2 ' ! ; r2 = address of string descriptorV ' movl (r2),r3 ' ! ; r3 = first word of string descriptorE ' movzwl r3,r3 ' ! ; clear out high wordP ' cmpl #5,r3 ' ! ; sub dir len must be min 5 charL ' bgtr oldfao ' ! ; skip if dir name too shortO ' addl b^^X04(r2),r3 ' ! ; r3 = address of last char + 1K ' decl r3 ' ! ; r3 = address of last char !; last char must be "]" ? ' cmpb #^X5D,(r3) ' ! ; check for "]"' ' beql testagain '; ' jmp oldfao '5 'testagain: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"' ' beql testchar2 '; ' jmp oldfao '5 'testchar2: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"$ ' beql newfmt 'Q !;------------------------------------------------------------------------M 'oldfao: pushl B^^X18(ap) ' ! ; value of low !(XL)E ' pushl B^^X14(ap) ' ! ; value of hi (!XL)E ' pushl B^^X10(ap) ' ! ; ptr to arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO operN ' pushl B^^X04(ap) ' ! ; ptr to FAO control stringI ' calls #6,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerL !;-------------------------------------------------------------------` 'newfmt: movl B^^X14(ap),r2 ' ! ; arg2 (first !XL) high order long wordX ' movl B^^X18(ap),r3 ' ! ; arg3 (second !XL) low order long wordF ' movw B^^X16(ap),r4 ' ! ; save high order wordT ' cmpw #5,B^^X1A(ap) ' ! ; check to see if args are reversedY ' bnequ L1 ' ! ; branch if args already in correct orderY ' movl B^^X14(ap),r3 ' ! ; arg2 (first !XL) low order long wordZ ' movl B^^X18(ap),r2 ' ! ; arg3 (second !XL) high order long wordF ' movw B^^X1A(ap),r4 ' ! ; save high order word\ 'L1: movzwl r2,r2 ' ! ; clear out "0005" or "0004" in high word@ !; r2 = high order long word of quad word date/time stamp? !; r3 = low order long word of quad word date/time stamp@ !; build new FAO control string = "!AS.!1XB]!2XL!XL.!1XL") ' pushl #^X0000004C ') ' pushl #^X5831212E '( ' pushl #^X4C58214C'( ' pushl #^X5832215D'( ' pushl #^X42583121'( ' pushl #^X2E534121'W ' pushl sp ' ! ; make descriptor to fao control string@ ' pushl #^X15 ' ! ; descriptor lenL ' movl sp,r5 ' ! ; save address of descriptorQ !;-- make a copy of the descriptor for arg1 and then modify its string lenX ' movl b^^X10(ap),r6 ' ! ; r6 = address of arg1 string descriptorY ' pushl b^^X4(r6) ' ! ; copy second word of string descriptorS ' pushl (r6) ' ! ; copy first word of string descriptorI ' movl sp,r6 ' ! ; save address of descriptorX ' decw (r6) ' ! ; chg len to not include trailing "]" char# !;-- build new fao parm listG ' pushl R4 ' ! ; value of 0005 or 0004D ' pushl R3 ' ! ; value of low !(XL)C ' pushl R2 ' ! ; value of hi (!XL)W ' pushl R3 ' ! ; value of subdir name as number !(1XL)M ' pushl R6 ' ! ;ptr to modified arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO oper\ ' pushl R5 ' ! ; ptr to descriptor for FAO control string I ' calls #8,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerEXI! Above was the new code.! Below is the patch in the existing code that(! will make use of the ALTER_TO new codereplace/instructionpatch13' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch23' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXIT! Leave some footprints... SET ECO 98@! And now update if we reached this point without a single errorU;!---------------------- end of patch ----------------------N!+------------------------------------+--------------------------------------+N!| James H. Thompson | jimmy_t@verifone.com (Internet) |N!| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |N!| 100 Kahelu Avenue | 808-623-2911 (Phone) |N!| Mililani, HI 96789 | 808-625-3201 (FAX) |N!+------------------------------------+--------------------------------------+1*[SYSTOOLS.TURBOMAIL]MAILSHRP_PATCH.COM_ORIGINAL;1+,:C./  4`-> 0123KPWO56F~7JǪ89G HJ=!---------------------- MAILSHRP_PATCH.COM ----------------- MAILSHRP.EXE!I!------------------------------------------------------------------------! the following for VMS 5.4-2!define mail$$write_msg=038a0+027c%define MAIL$$CHECK_DATE_PRIV=00004EA4!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr"define patch1=mail$$write_msg+01d9'define patch2=mail$$check_date_priv+094! end VMS 5.4-2 patch addressesI!------------------------------------------------------------------------!)! Now make sure that we have a patch area! ALI/B PATAREA ! And now enter instruction mode! SET MODE INSTRUCTIONA! Start implementing the new external file name Format subroutine:! It was first developped and tested as a MACRO-32 program5! and changed into the body of this patch.com file by<! a MACRO_TO_PATCH.COM procedure developped for that purpose ! and kindly supplied by: %! barbe@epsx25.SINet.SLB.COM9! (Claude Barbe - EPSchlumberger 33-1-4537-2171)!DEP /PATPATAREAH !; All offsets must be in Hex because thats the default RADIX for !; the patch program !;; 'jhtpat: .word ^X7C ' ! ;reg save mask for R2-R6% !; @B^^X00(ap) Argument count0 !; @B^^X04(ap) ptr to FAO control string> !; @B^^X08(ap) ptr to word for result of fao operation3 !; @B^^X0C(ap) ptr to fao result descriptor, !; @B^^X10(ap) ptr to fao arg1 (!AS). !; @B^^X14(ap) value of fao arg2 (!XL). !; @B^^X18(ap) value of fao arg3 (!XL)B !; Check to see if the the user wants short mail file namesH !; we do this by checking to see if the last two character of the: !; mail subdirectory name are underscore charactersS ' movl b^^X10(ap),r2 ' ! ; r2 = address of string descriptorV ' movl (r2),r3 ' ! ; r3 = first word of string descriptorE ' movzwl r3,r3 ' ! ; clear out high wordP ' cmpl #5,r3 ' ! ; sub dir len must be min 5 charL ' bgtr oldfao ' ! ; skip if dir name too shortO ' addl b^^X04(r2),r3 ' ! ; r3 = address of last char + 1K ' decl r3 ' ! ; r3 = address of last char !; last char must be "]" ? ' cmpb #^X5D,(r3) ' ! ; check for "]"' ' beql testagain '; ' jmp oldfao '5 'testagain: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"' ' beql testchar2 '; ' jmp oldfao '5 'testchar2: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"$ ' beql newfmt 'Q !;------------------------------------------------------------------------M 'oldfao: pushl B^^X18(ap) ' ! ; value of low !(XL)E ' pushl B^^X14(ap) ' ! ; value of hi (!XL)E ' pushl B^^X10(ap) ' ! ; ptr to arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO operN ' pushl B^^X04(ap) ' ! ; ptr to FAO control stringI ' calls #6,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerL !;-------------------------------------------------------------------` 'newfmt: movl B^^X14(ap),r2 ' ! ; arg2 (first !XL) high order long wordX ' movl B^^X18(ap),r3 ' ! ; arg3 (second !XL) low order long wordF ' movw B^^X16(ap),r4 ' ! ; save high order wordT ' cmpw #5,B^^X1A(ap) ' ! ; check to see if args are reversedY ' bnequ L1 ' ! ; branch if args already in correct orderY ' movl B^^X14(ap),r3 ' ! ; arg2 (first !XL) low order long wordZ ' movl B^^X18(ap),r2 ' ! ; arg3 (second !XL) high order long wordF ' movw B^^X1A(ap),r4 ' ! ; save high order word\ 'L1: movzwl r2,r2 ' ! ; clear out "0005" or "0004" in high word@ !; r2 = high order long word of quad word date/time stamp? !; r3 = low order long word of quad word date/time stamp@ !; build new FAO control string = "!AS.!1XB]!2XL!XL.!1XL") ' pushl #^X0000004C ') ' pushl #^X5831212E '( ' pushl #^X4C58214C'( ' pushl #^X5832215D'( ' pushl #^X42583121'( ' pushl #^X2E534121'W ' pushl sp ' ! ; make descriptor to fao control string@ ' pushl #^X15 ' ! ; descriptor lenL ' movl sp,r5 ' ! ; save address of descriptorQ !;-- make a copy of the descriptor for arg1 and then modify its string lenX ' movl b^^X10(ap),r6 ' ! ; r6 = address of arg1 string descriptorY ' pushl b^^X4(r6) ' ! ; copy second word of string descriptorS ' pushl (r6) ' ! ; copy first word of string descriptorI ' movl sp,r6 ' ! ; save address of descriptorX ' decw (r6) ' ! ; chg len to not include trailing "]" char# !;-- build new fao parm listG ' pushl R4 ' ! ; value of 0005 or 0004D ' pushl R3 ' ! ; value of low !(XL)C ' pushl R2 ' ! ; value of hi (!XL)W ' pushl R3 ' ! ; value of subdir name as number !(1XL)M ' pushl R6 ' ! ;ptr to modified arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO oper\ ' pushl R5 ' ! ; ptr to descriptor for FAO control string I ' calls #8,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerEXI! Above was the new code.! Below is the patch in the existing code that(! will make use of the ALTER_TO new codereplace/instructionpatch13' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch23' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXIT! Leave some footprints... SET ECO 98@! And now update if we reached this point without a single errorU;!---------------------- end of patch ----------------------N!+------------------------------------+--------------------------------------+N!| James H. Thompson | jimmy_t@verifone.com (Internet) |N!| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |N!| 100 Kahelu Avenue | 808-623-2911 (Phone) |N!| Mililani, HI 96789 | 808-625-3201 (FAX) |N!+------------------------------------+--------------------------------------+'*[SYSTOOLS.TURBOMAIL]MAILSHR_PATCH.COM;6+,n?./  4`v-> 0123KPWO56(L7̛Ǫ89G HJ<!---------------------- MAILSHR_PATCH.COM ----------------- MAILSHR.EXE!I!------------------------------------------------------------------------! the following for VMS 5.4-2!!define MAIL$$CHECK_DATE=00006078#!define MAIL$$FORM_EXTFILE=0000617C%!define mail$$write_msg=0000BFDC+0334!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr"!define patch1=mail$$check_date+95%!define patch2=mail$$form_extfile+0d8$!define patch3=mail$$write_msg+15b-8! END VMS 5.4-2 patch addressesI!------------------------------------------------------------------------3! the following for VMS 5.5-2 (by tmk, 26-Mar-1993) define MAIL$$CHECK_DATE=00006090"define MAIL$$FORM_EXTFILE=00006194define mail$$write_msg=0000C410!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr!define patch1=mail$$check_date+95$define patch2=mail$$form_extfile+0d8!define patch3=mail$$write_msg+15a! END VMS 5.5-2 patch addressesI!------------------------------------------------------------------------!)! Now make sure that we have a patch area! ALI/B PATAREA ! And now enter instruction mode! SET MODE INSTRUCTIONA! Start implementing the new external file name Format subroutine:! It was first developped and tested as a MACRO-32 program5! and changed into the body of this patch.com file by<! a MACRO_TO_PATCH.COM procedure developped for that purpose ! and kindly supplied by: %! barbe@epsx25.SINet.SLB.COM9! (ClPA~MAIL-SPEEDUP.BCKn?> '[SYSTOOLS.TURBOMAIL]MAILSHR_PATCH.COM;6`Vaude Barbe - EPSchlumberger 33-1-4537-2171)!DEP /PATPATAREAH !; All offsets must be in Hex because thats the default RADIX for !; the patch program !;; 'jhtpat: .word ^X7C ' ! ;reg save mask for R2-R6% !; @B^^X00(ap) Argument count0 !; @B^^X04(ap) ptr to FAO control string> !; @B^^X08(ap) ptr to word for result of fao operation3 !; @B^^X0C(ap) ptr to fao result descriptor, !; @B^^X10(ap) ptr to fao arg1 (!AS). !; @B^^X14(ap) value of fao arg2 (!XL). !; @B^^X18(ap) value of fao arg3 (!XL)B !; Check to see if the the user wants short mail file namesH !; we do this by checking to see if the last two character of the: !; mail subdirectory name are underscore charactersS ' movl b^^X10(ap),r2 ' ! ; r2 = address of string descriptorV ' movl (r2),r3 ' ! ; r3 = first word of string descriptorE ' movzwl r3,r3 ' ! ; clear out high wordP ' cmpl #5,r3 ' ! ; sub dir len must be min 5 charL ' bgtr oldfao ' ! ; skip if dir name too shortO ' addl b^^X04(r2),r3 ' ! ; r3 = address of last char + 1K ' decl r3 ' ! ; r3 = address of last char !; last char must be "]" ? ' cmpb #^X5D,(r3) ' ! ; check for "]"' ' beql testagain '; ' jmp oldfao '5 'testagain: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"' ' beql testchar2 '; ' jmp oldfao '5 'testchar2: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"$ ' beql newfmt 'Q !;------------------------------------------------------------------------M 'oldfao: pushl B^^X18(ap) ' ! ; value of low !(XL)E ' pushl B^^X14(ap) ' ! ; value of hi (!XL)E ' pushl B^^X10(ap) ' ! ; ptr to arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO operN ' pushl B^^X04(ap) ' ! ; ptr to FAO control stringI ' calls #6,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerL !;-------------------------------------------------------------------` 'newfmt: movl B^^X14(ap),r2 ' ! ; arg2 (first !XL) high order long wordX ' movl B^^X18(ap),r3 ' ! ; arg3 (second !XL) low order long wordF ' movw B^^X16(ap),r4 ' ! ; save high order wordT ' cmpw #5,B^^X1A(ap) ' ! ; check to see if args are reversedY ' bnequ L1 ' ! ; branch if args already in correct orderY ' movl B^^X14(ap),r3 ' ! ; arg2 (first !XL) low order long wordZ ' movl B^^X18(ap),r2 ' ! ; arg3 (second !XL) high order long wordF ' movw B^^X1A(ap),r4 ' ! ; save high order word\ 'L1: movzwl r2,r2 ' ! ; clear out "0005" or "0004" in high word@ !; r2 = high order long word of quad word date/time stamp? !; r3 = low order long word of quad word date/time stamp@ !; build new FAO control string = "!AS.!1XB]!2XL!XL.!1XL") ' pushl #^X0000004C ') ' pushl #^X5831212E '( ' pushl #^X4C58214C'( ' pushl #^X5832215D'( ' pushl #^X42583121'( ' pushl #^X2E534121'W ' pushl sp ' ! ; make descriptor to fao control string@ ' pushl #^X15 ' ! ; descriptor lenL ' movl sp,r5 ' ! ; save address of descriptorQ !;-- make a copy of the descriptor for arg1 and then modify its string lenX ' movl b^^X10(ap),r6 ' ! ; r6 = address of arg1 string descriptorY ' pushl b^^X4(r6) ' ! ; copy second word of string descriptorS ' pushl (r6) ' ! ; copy first word of string descriptorI ' movl sp,r6 ' ! ; save address of descriptorX ' decw (r6) ' ! ; chg len to not include trailing "]" char# !;-- build new fao parm listG ' pushl R4 ' ! ; value of 0005 or 0004D ' pushl R3 ' ! ; value of low !(XL)C ' pushl R2 ' ! ; value of hi (!XL)W ' pushl R3 ' ! ; value of subdir name as number !(1XL)M ' pushl R6 ' ! ;ptr to modified arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO oper\ ' pushl R5 ' ! ; ptr to descriptor for FAO control string I ' calls #8,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerEXI! Above was the new code.! Below is the patch in the existing code that(! will make use of the ALTER_TO new codereplace/instructionpatch13' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch23' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch33' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXIT! Leave some footprints... SET ECO 98@! And now update if we reached this point without a single errorU;!---------------------- end of patch ----------------------N!+------------------------------------+--------------------------------------+N!| James H. Thompson | jimmy_t@verifone.com (Internet) |N!| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |N!| 100 Kahelu Avenue | 808-623-2911 (Phone) |N!| Mililani, HI 96789 | 808-625-3201 (FAX) |N!+------------------------------------+--------------------------------------+0*[SYSTOOLS.TURBOMAIL]MAILSHR_PATCH.COM_ORIGINAL;1+,s?./  4`-> 0123KPWO56㛓7?Ǫ89G HJ <!---------------------- MAILSHR_PATCH.COM ----------------- MAILSHR.EXE!I!------------------------------------------------------------------------! the following for VMS 5.4-2 define MAIL$$CHECK_DATE=00006078"define MAIL$$FORM_EXTFILE=0000617C$define mail$$write_msg=0000BFDC+0334!N! all of the following addresses should point to a 'calls #6,@#7ffedf50' instr!define patch1=mail$$check_date+95$define patch2=mail$$form_extfile+0d8#define patch3=mail$$write_msg+15b-8! END VMS 5.4-2 patch addressesI!------------------------------------------------------------------------!)! Now make sure that we have a patch area! ALI/B PATAREA ! And now enter instruction mode! SET MODE INSTRUCTIONA! Start implementing the new external file name Format subroutine:! It was first developped and tested as a MACRO-32 program5! and changed into the body of this patch.com file by<! a MACRO_TO_PATCH.COM procedure developped for that purpose ! and kindly supplied by: %! barbe@epsx25.SINet.SLB.COM9! (Claude Barbe - EPSchlumberger 33-1-4537-2171)!DEP /PATPATAREAH !; All offsets must be in Hex because thats the default RADIX for !; the patch program !;; 'jhtpat: .word ^X7C ' ! ;reg save mask for R2-R6% !; @B^^X00(ap) Argument count0 !; @B^^X04(ap) ptr to FAO control string> !; @B^^X08(ap) ptr to word for result of fao operation3 !; @B^^X0C(ap) ptr to fao result descriptor, !; @B^^X10(ap) ptr to fao arg1 (!AS). !; @B^^X14(ap) value of fao arg2 (!XL). !; @B^^X18(ap) value of fao arg3 (!XL)B !; Check to see if the the user wants short mail file namesH !; we do this by checking to see if the last two character of the: !; mail subdirectory name are underscore charactersS ' movl b^^X10(ap),r2 ' ! ; r2 = address of string descriptorV ' movl (r2),r3 ' ! ; r3 = first word of string descriptorE ' movzwl r3,r3 ' ! ; clear out high wordP ' cmpl #5,r3 ' ! ; sub dir len must be min 5 charL ' bgtr oldfao ' ! ; skip if dir name too shortO ' addl b^^X04(r2),r3 ' ! ; r3 = address of last char + 1K ' decl r3 ' ! ; r3 = address of last char !; last char must be "]" ? ' cmpb #^X5D,(r3) ' ! ; check for "]"' ' beql testagain '; ' jmp oldfao '5 'testagain: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"' ' beql testchar2 '; ' jmp oldfao '5 'testchar2: decl r3 '? ' cmpb #^X5F,(r3) ' ! ; check for "_"$ ' beql newfmt 'Q !;------------------------------------------------------------------------M 'oldfao: pushl B^^X18(ap) ' ! ; value of low !(XL)E ' pushl B^^X14(ap) ' ! ; value of hi (!XL)E ' pushl B^^X10(ap) ' ! ; ptr to arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO operN ' pushl B^^X04(ap) ' ! ; ptr to FAO control stringI ' calls #6,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerL !;-------------------------------------------------------------------` 'newfmt: movl B^^X14(ap),r2 ' ! ; arg2 (first !XL) high order long wordX ' movl B^^X18(ap),r3 ' ! ; arg3 (second !XL) low order long wordF ' movw B^^X16(ap),r4 ' ! ; save high order wordT ' cmpw #5,B^^X1A(ap) ' ! ; check to see if args are reversedY ' bnequ L1 ' ! ; branch if args already in correct orderY ' movl B^^X14(ap),r3 ' ! ; arg2 (first !XL) low order long wordZ ' movl B^^X18(ap),r2 ' ! ; arg3 (second !XL) high order long wordF ' movw B^^X1A(ap),r4 ' ! ; save high order word\ 'L1: movzwl r2,r2 ' ! ; clear out "0005" or "0004" in high word@ !; r2 = high order long word of quad word date/time stamp? !; r3 = low order long word of quad word date/time stamp@ !; build new FAO control string = "!AS.!1XB]!2XL!XL.!1XL") ' pushl #^X0000004C ') ' pushl #^X5831212E '( ' pushl #^X4C58214C'( ' pushl #^X5832215D'( ' pushl #^X42583121'( ' pushl #^X2E534121'W ' pushl sp ' ! ; make descriptor to fao control string@ ' pushl #^X15 ' ! ; descriptor lenL ' movl sp,r5 ' ! ; save address of descriptorQ !;-- make a copy of the descriptor for arg1 and then modify its string lenX ' movl b^^X10(ap),r6 ' ! ; r6 = address of arg1 string descriptorY ' pushl b^^X4(r6) ' ! ; copy second word of string descriptorS ' pushl (r6) ' ! ; copy first word of string descriptorI ' movl sp,r6 ' ! ; save address of descriptorX ' decw (r6) ' ! ; chg len to not include trailing "]" char# !;-- build new fao parm listG ' pushl R4 ' ! ; value of 0005 or 0004D ' pushl R3 ' ! ; value of low !(XL)C ' pushl R2 ' ! ; value of hi (!XL)W ' pushl R3 ' ! ; value of subdir name as number !(1XL)M ' pushl R6 ' ! ;ptr to modified arg1 (!AS)P ' pushl B^^X0C(ap) ' ! ; ptr to FAO result descriptorW ' pushl B^^X08(ap) ' ! ; ptr to work for result of FAO oper\ ' pushl R5 ' ! ; ptr to descriptor for FAO control string I ' calls #8,@#^X7FFEDF50 ' ! ; calls #06,g^sys$faoB ' ret ' ! ; return to callerEXI! Above was the new code.! Below is the patch in the existing code that(! will make use of the ALTER_TO new codereplace/instructionpatch13' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch23' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXITreplace/instructionpatch33' calls #06,@#7FFEDF50 ' ! ; calls #06,g^sys$faoEXIT/' calls #06,jhtpat ' ! ; calls #06,g^sys$faoEXIT! Leave some footprints... SET ECO 98@! And now update if we reached this point without a single errorU;!---------------------- end of patch ----------------------N!+------------------------------------+--------------------------------------+N!| James H. Thompson | jimmy_t@verifone.com (Internet) |N!| VeriFone Inc. | uunet!verifone!jimmy_t (UUCP) |N!| 100 Kahelu Avenue | 808-623-2911 (Phone) |N!| Mililani, HI 96789 | 808-625-3201 (FAX) |N!+------------------------------------+--------------------------------------+3*[SYSTOOLS.TURBOMAIL]SHORTEN_MAIL_NAMES_BATCH.COM;55+,t?./  4Wt-> 0123KPWO56Fr7βFȪ89G HJ83$! IF F$MODE() .NES. "INTERACTIVE" THEN set verify$ set noverify+$! 29-NOV-1992 15:26:45.47 Jimmy_t created<$! 14-JAN-1993 15:42:13.20 jimmy_t modified for mail sub dir3$! Author: James H. Thompson (jimmy_t@verifone.com)$!+$! This file shortenanizes a mail directoryA$! Make sure you have a recent backup before running this program?$! If it dies before completing, its likely the only reasonable)$! recovery will be restoring the backup.$!$! Method of operation:<$! 1) Get a list of all of the files to be renamed in the!$! specified mail directory($! 2) Rename them to a work directory0$! 3) Rename them back to the mail directory.$!$! Transformations:5$! MAIL$002F94F200050096.MAI;1 ==> 96002F94F2.55$! -------- -- -- -6$! a ---- c c --------- b1$! b a$! $! and for very old file:5$! MAIL$00040091ED8D2BDF.MAI;1 91ED8D2BDF.45$! ---- -- -- -5$! b c -------- c ---------b1$! a a$! $!3$! See associated readme file for more information.$!5$! p1 = name of users current vms mail directory file7$! e.g. "jimmy_t_disk:[jimmy_t]mail_directory.dir"$!$! p2 = unused$!B$! p3 = name of users directory (used to put temporary work files)1$! e.g. "jimmy_t_disk:[jimmy_t.shorten_work]$!9$! p4 = name of new shorted mail dir file (to be created).$! e.g. "jimmy_t_disk:[jimmy_t]mail__.dir$!)$! p5 = username to of user to operate on$!$! p6 = unused$!K$! p7 = optional parameter -- if non blank do validation of parameters only$!O$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------O$!-----------------------------------------------------------------------------3$! make sure any files we will use start out closed $ set noon$ define/user sys$output nl:$ define/user sys$error nl:$ close file_inE$ if f$trnlnm("SYS$OUTPUT") .eqs. "NL:" then deassign/user sys$outputC$ if f$trnlnm("SYS$ERROR") .eqs. "NL:" then deassign/user sys$error $ set noonO$!-----------------------------------------------------------------------------$!$ if p7 .eqs. "" $ then $ out "".$ out "Starting: ", this_procedure_file_name$ out "P1=",p1$ out "P2=",p2$ out "P3=",p3$ out "P4=",p4$ out "P5=",p5$ out "P6=",p6$ out "P7=",p7 $ out ""$ endif$!$ if p1 .eqs. ""$ then$ out "missing parameter P1"$ exit$ endif$ if p2 .eqs. ""$ then$ out "missing parameter P2"$ exit$ endif$ if p3 .eqs. ""$ then$ out "missing parameter P3"$ exit$ endif$ if p4 .eqs. ""$ then$ out "missing parameter P4"$ exit$ endif$ if p5 .eqs. ""$ then$ out "missing parameter P5"$ exit$ endif$ if p6 .eqs. ""$ then$ out "missing parameter P6"$ exit$ endifO$!-----------------------------------------------------------------------------$ out ""$ mail_dir_file = p1%$ if f$search(mail_dir_file) .eqs. ""$ then($ out "Unable to find: ",mail_dir_file$ exit$ endif$ w = p1S$ mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ mail_dir = (mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"($ mail_file_name = mail_dir + "mail.mai"&$ if f$search(mail_file_name) .eqs. ""$ then)$ out "Unable to find: ",mail_file_name$ exit$ endif$!$!$ work_dir_file = p3$ w = p3S$ work_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ work_dir = (work_dir - "]") + "." + f$parse(w,,,"NAME") + "]"@$ if f$search(work_dir_file) .eqs. "" then create/dir 'work_dir'($ if f$search("''work_dir'*.*") .nes. ""$ then9$ out "Unable to run -- found files in ''work_dir'" $ exit$ endif%$ if f$search(work_dir_file) .eqs. ""$ then($ out "Unable to find: ",work_dir_file$ exit$ endifO$!-----------------------------------------------------------------------------$ w = p4$ new_mail_dir_file = p4W$ new_mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")G$ new_mail_dir = (new_mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"%$ new_mail_name = f$parse(w,,,"NAME")O$!-----------------------------------------------------------------------------$ target_username = p5O$!-----------------------------------------------------------------------------$ temp_username = p6O$!-----------------------------------------------------------------------------:$ @'this_procedure_dir'change_mail_dir 'target_username' -< 'temp_username' 'mail_dir_file' 'new_mail_name' VALIDATE$ if .not. result then exitO$!-----------------------------------------------------------------------------*$! Create some unique temporary file names?$ uq = f$time() - ":" - ":" - ":" - "-" - "-" - "-" - "." - " ">$ uq = f$getjpi(0,"master_pid") + "_" + f$edit(uq, "collapse")1$ work_a_file_name = work_dir + "rm_a" + "." + uq1$ work_b_file_name = work_dir + "rm_b" + "." + uq1$ work_c_file_name = work_dir + "rm_c" + "." + uq1$ work_d_file_name = work_dir + "rm_d" + "." + uq1$ work_e_file_name = work_dir + "rm_e" + "." + uq$!O$!-----------------------------------------------------------------------------$$! exit if parameter validation onlyO$!-----------------------------------------------------------------------------$!$ if p7 .nes. "" $ then$ result == "Y" $ exit$ endif$!O$!-----------------------------------------------------------------------------@$! now check to make sure there are no v4 external message files@$! with names we can't handle. we don't do this during parameterK$! validation, because if the directory is large it may take quite a while.6$! Typical name: MAIL$00040091ED8D2BDF.MAI;1 4$ bad_names = mail_dir + "MAIL$000400%%0005%%%%.MAI"!$ if f$search(bad_names) .nes. ""$ then/$ dir/out='work_e_file_name'/date 'bad_names'($ mail 'work_e_file_name' 'username' -V /subj="Shorten Mail Names - unable to start: found v4 files with unprocessable names" $ out "" $ out "")$ out "Unable to process these files: " $ out ""$ type 'work_e_file_name' $ out ""$ type sys$inputQuick and dirty solution:0 If these files are not needed - delete them.8 Otherwise, mail them to the user - then delete them.< (A rather untidy way to solve the problem, but it should arise very infrequently)"More elegant solution:8 Go into users mail and find the messages these files0 represent. Use the VMS MAIL COPY command to< make a new copy of the message, then delete the original8 (and purge the wastebasket to make sure the external file gets deleted).:After these files are gone, rerun this mail shortenization procedure. $ out ""'$ delete 'f$search(work_e_file_name)'.$ if f$search(work_dir_file) .nes. "" then -( delete 'f$search(work_dir_file)'$ exit$ endifO$!-----------------------------------------------------------------------------I$ mail nl: 'username' /subj="Mail shorten started for ''target_username'"@$ mail nl: 'target_username' /subj="Mail Reorganization Started"$!G$! Since created files will contain mail msg give same level of privacy$! as VMS mail files.$!@$ set protection=(System:RWED, Owner:RWED, Group, World)/default$!E$!-------------------------------------------------------------------5$! create the mail sub directories if the don't exist$ i = 0$ dir_create_loop:$ if i .lt. 16$ then7$ sub_dir_name = mail_dir + F$FAO("!1XL",i) + ".dir"&$ if f$search(sub_dir_name) .eqs. ""$ then@$ sub_dir = (mail_dir - "]") + "." + F$FAO("!1XL",i) + "]"$ create/dir 'sub_dir' $ endif $ i = i + 1$ goto dir_create_loop$ endif$!O$!-----------------------------------------------------------------------------($! change the name of the users mail dirO$!-----------------------------------------------------------------------------$!!$ time_start = f$cvtime(,,"time")$ out ""'$ out "*** ",f$time(), " Start Phase 0":$ @'this_procedure_dir'change_mail_dir 'target_username' -3 'temp_username' 'mail_dir_file' 'new_mail_name'$ if .not. result$ then$ mail nl: 'username' -O /subj="Shorten Mail Names Phase 0 failed: ''target_username' -- check logs"$ exit$ endif&$ out "*** ",f$time(), " Elapsed: ", -# f$cvtime("-''time_start'",,"time")1$ out "*** Phase 0 of Mail shorten has completed"E$!-------------------------------------------------------------------$ mail nl: 'username' -F /subj="Shorten mail names - Phase 0 completed: ''target_username'"E$!-------------------------------------------------------------------E$!-------------------------------------------------------------------!$ time_start = f$cvtime(,,"time")$ out ""&$ out "*** ",f$time()," Start Phase 1"H$ dir/out='work_d_file_name'/col=1/head/notrail 'new_mail_dir'mail$*.mai%$ out "*** ",f$time()," Elapsed: ", -# f$cvtime("-''time_start'",,"time")1$ out "*** Phase 1 of Mail shorten has completed"E$!-------------------------------------------------------------------!$ time_start = f$cvtime(,,"time")$ out ""&$ out "*** ",f$time()," Start Phase 2"$ out ""$ out "Number of Mail Files"$ dir/tot/siz 'new_mail_dir'$ out ""6$ out "Size of Mail directory before shortenanization"!$ dir/siz=all 'new_mail_dir_file'%$ out "*** ",f$time()," Elapsed: ", -# f$cvtime("-''time_start'",,"time")1$ out "*** Phase 2 of Mail shorten has completed"E$!-------------------------------------------------------------------!$ time_start = f$cvtime(,,"time")$ out ""&$ out "*** ",f$time()," Start Phase 3"$ out ""9$! rename all extmsg out of mail dir into sub directories9$! but first organize the order we rename the files in to)$! optimize VMS directory operation speed;$! 1. sort the "From" directory names into descending orderC$! so that deletions will always be at the end of the "From" dir,$ sort/key=(position:1,size:25,descending) - 'work_d_file_name' - 'work_a_file_name'%$ out "*** ",f$time()," Elapsed: ", -# f$cvtime("-''time_start'",,"time")1$ out "*** Phase 3 of Mail shorten has completed"E$!-------------------------------------------------------------------$! type 'work_a_file_name'$!!$ time_start = f$cvtime(,,"time")$ out ""&$ out "*** ",f$time()," Start Phase 4"$ out ""6$ open/err=file_in_open_err file_in 'work_a_file_name'!$ time_start = f$cvtime(,,"time")$ out ""$ file_serial_num = 0$ file_in_loopa:/$ read/end=file_in_read_end file_in file_in_var3$ file_in_var = f$edit(file_in_var,"TRIM,COMPRESS")$$! 0123456789.123456789.123456789.5$! MAIL$002F94F200050096.MAI;1 ==> 96002F94F2.55$! MAIL$00040091ED8D2BDF.MAI;1 91ED8D2BDF.4E$ if F$edit(f$extract(0,5,file_in_var),"UPCASE") .nes. "MAIL$" then - goto file_in_loopa($ from_name = f$edit(file_in_var,"TRIM")+$ if f$extract(13,4,from_name) .nes. "0005"$ then!$ a = f$extract(13,8,from_name) $ b = f$extract(8,1,from_name)!$ c = f$extract(11,2,from_name)$ else $ a = f$extract(5,8,from_name)!$ b = f$extract(16,1,from_name)!$ c = f$extract(19,2,from_name)$ endif$$ original_to_name = c + a + "." + bO$ work_string = (new_mail_dir - "]") + "." + f$extract(f$length(a)-1,1,a) + "]"C$ rename 'new_mail_dir''from_name' 'work_string''original_to_name''$ file_serial_num = file_serial_num + 1$ goto file_in_loopaE$!-------------------------------------------------------------------$ file_in_read_end:$ close file_in$!%$ out "*** ",f$time()," Elapsed: ", -# f$cvtime("-''time_start'",,"time")1$ out "*** Phase 4 of Mail shorten has completed"E$!-------------------------------------------------------------------$!$ out ""$ out "Number of Mail Files"$ dir/tot/siz 'new_mail_dir'$ out ""5$ out "Size of Mail directory after shortenanization"!$ dir/siz=all 'new_mail_dir_file'$!E$!-------------------------------------------------------------------$!/$ if f$search(work_a_file_name) .nes. "" then -' delete 'f$search(work_a_file_name)'/$ if f$search(work_b_file_name) .nes. "" then -' delete 'f$search(work_b_file_name)'/$ if f$search(work_c_file_name) .nes. "" then -' delete 'f$search(work_c_file_name)'/$ if f$search(work_d_file_name) .nes. "" then -' delete 'f$search(work_d_file_name)',$ if f$search(mail_dir_file) .nes. "" then -$ delete 'f$search(mail_dir_file)',$ if f$search(work_dir_file) .nes. "" then -$ delete 'f$search(work_dir_file)'K$ mail nl: 'username' /subj="Mail shorten completed for ''target_username'"B$ mail nl: 'target_username' /subj="Mail Reorganization Completed"$ out ""!$ out "*** Mail shorten completedE$!-------------------------------------------------------------------$ exitE$!-------------------------------------------------------------------$ file_in_open_err:$ save_status = $status$ msg = f$message(save_status)$ out "file_in open error=",msg$ exitE$!-------------------------------------------------------------------3*[SYSTOOLS.TURBOMAIL]SHORTEN_MAIL_NAMES_START.COM;17+,:o./  4Qp-> 0123KPWO56&袓7NȪ89G HJ*$! 29-NOV-1992 15:18:23.11 jimmy_t created3$! Author: James H. Thompson (jimmy_t@verifone.com)G$! shorten the external mail file names/shortenanize the Mail Directory$! for a specified user$!L$! Its likely this procedure will need to be modifed for other installations$$! with different naming conventions$!$! p1 = user name$! e.g. jimmy_t$!1$! p2 = optional override name for mail directory$! e.g. mail_directoryO$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!------------------------------------------------------------`A~MAIL-SPEEDUP.BCK:o> 3[SYSTOOLS.TURBOMAIL]SHORTEN_MAIL_NAMES_START.COM;17Q-----------------$!$ type sys$input6 This program will shortenanize a large mail directory to improve performance.$ if p1 .eqs. "" $ then5$ out "Please specify username as first parameters"Q$ out "and optionally the name of the current mail dir as the second parameter" $ out ""$ out "Examples: " $ out "",$ out "@shorten_mail_names_start jimmy_tm"<$ out "@shorten_mail_names_start jimmy_tm mail_directory" $ out ""$ exit$ endif$!E$!------------------------------------------------------------------- $ work_s = p2)$ if work_s .eqs. "" then work_s = "MAIL")$ pm1 = "''p1'_disk:[''p1']''work_s'.dir"$ pm2 = "unused"1$ pm3 = "''p1'_disk:[''p1']mail_shorten_logs.dir"&$ pm4 = "''p1'_disk:[''p1']mail__.dir"7$ username = f$edit(f$getjpi("","username"),"collapse")E$!--------------------------------------------------------------------$ out "The new mail dir name will be: ",pm4 $ out " "E$!------------------------------------------------------------------- $ pm5 = p1E$!-------------------------------------------------------------------$ pm6 = "unused"E$!-------------------------------------------------------------------0$! now make sure we have a work directory to use$ out ""$ out "Validating Parameters"$ result == "N"5$ @'this_procedure_dir'shorten_mail_names_batch.com -1 'pm1' 'pm2' 'pm3' 'pm4' 'pm5' 'pm6' "VALIDATE"$ if .not. result then exit$ out "",$ out "Parameters OK - submitting batch job"J$ submit/notify/noprint 'this_procedure_dir'shorten_mail_names_batch.com -A /param=("''pm1'","''pm2'","''pm3'","''pm4'", "''pm5'", "''pm6'")$ type sys$inputA A batch job has been submitted to shortenanize a mail directory.2 You will be notified via email when it completes.$ exitD$!------------------------------------------------------------------ $ input_eof:$ exit;*[SYSTOOLS.TURBOMAIL]SHORTEN_MAIL_NAMES_START.COM_ORIGINAL;1+,:Y./  4W-> 0123KPWO56tP7nfyɪ89G HJ *$! 29-NOV-1992 15:18:23.11 jimmy_t created3$! Author: James H. Thompson (jimmy_t@verifone.com)G$! shorten the external mail file names/shortenanize the Mail Directory$! for a specified user$!L$! Its likely this procedure will need to be modifed for other installations$$! with different naming conventions$!$! p1 = user name$! e.g. jimmy_t$!1$! p2 = optional override name for mail directory$! e.g. mail_directoryO$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------$!$ type sys$input6 This program will shortenanize a large mail directory to improve performance.$ if p1 .eqs. "" $ then5$ out "Please specify username as first parameters"Q$ out "and optionally the name of the current mail dir as the second parameter" $ out ""$ out "Examples: " $ out "",$ out "@shorten_mail_names_start jimmy_tm"<$ out "@shorten_mail_names_start jimmy_tm mail_directory" $ out ""$ exit$ endif$!E$!------------------------------------------------------------------- $ work_s = p2)$ if work_s .eqs. "" then work_s = "MAIL",$ pm1 = "user6:[sysprog.''p1']''work_s'.dir"$ pm2 = "unused"4$ pm3 = "user6:[sysprog.''p1']mail_shorten_logs.dir")$ pm4 = "user6:[sysprog.''p1']mail__.dir"7$ username = f$edit(f$getjpi("","username"),"collapse")E$!--------------------------------------------------------------------$ out "The new mail dir name will be: ",pm4 $ out " "E$!------------------------------------------------------------------- $ pm5 = p1E$!-------------------------------------------------------------------$ pm6 = "unused"E$!-------------------------------------------------------------------0$! now make sure we have a work directory to use$ out ""$ out "Validating Parameters"$ result == "N"5$ @'this_procedure_dir'shorten_mail_names_batch.com -1 'pm1' 'pm2' 'pm3' 'pm4' 'pm5' 'pm6' "VALIDATE"$ if .not. result then exit$ out "",$ out "Parameters OK - submitting batch job"W$ submit/notify/noprint/que=vmsbatch 'this_procedure_dir'shorten_mail_names_batch.com -A /param=("''pm1'","''pm2'","''pm3'","''pm4'", "''pm5'", "''pm6'")$ type sys$inputA A batch job has been submitted to shortenanize a mail directory.2 You will be notified via email when it completes.$ exitD$!------------------------------------------------------------------ $ input_eof:$ exit5*[SYSTOOLS.TURBOMAIL]UNSHORTEN_MAIL_NAMES_BATCH.COM;23+,@./  4h-> 0123KPWO567nɪ89G HJ*3$! IF F$MODE() .NES. "INTERACTIVE" THEN set verify$ set noverify+$! 29-NOV-1992 15:26:45.47 Jimmy_t created<$! 14-JAN-1993 15:42:13.20 jimmy_t modified for mail sub dir3$! Author: James H. Thompson (jimmy_t@verifone.com)$!-$! This file unshortenanizes a mail directoryA$! Make sure you have a recent backup before running this program?$! If it dies before completing, its likely the only reasonable)$! recovery will be restoring the backup.$!$! do the reverse of:$! Method of operation:<$! 1) Get a list of all of the files to be renamed in the!$! specified mail directory($! 2) Rename them to a work directory0$! 3) Rename them back to the mail directory.$!$! Transformations:5$! MAIL$002F94F200050096.MAI;1 ==> 96002F94F2.55$! -------- -- -- -6$! a ---- c c --------- b1$! b a$! $! and for very old file:5$! MAIL$00040091ED8D2BDF.MAI;1 91ED8D2BDF.45$! ---- -- -- -5$! b c -------- c ---------b1$! a a$! $!3$! See associated readme file for more information.$!8$! p1 = name of users vms mail directory file (existing)/$! e.g. "jimmy_t_disk:[jimmy_t]mail__.dir"5$! p2 = name of users work_directory file for shorten4$! e.g. "jimmy_t_disk:[jimmy_t]shorten_mail.dirG$! p3 = name of users directory (used to put log file and orphan files)3$! e.g. "jimmy_t_disk:[jimmy_t.shorten_orphan];$! p4 = name of new unshorted mail dir file (to be created),$! e.g. "jimmy_t_disk:[jimmy_t]mail.dir)$! p5 = username to of user to operate on$!$! p6 = unused$!K$! p7 = optional parameter -- if non blank do validation of parameters only$!O$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------O$!-----------------------------------------------------------------------------3$! make sure any files we will use start out closed $ set noon$ define/user sys$output nl:$ define/user sys$error nl:$ close file_in$ close file_outE$ if f$trnlnm("SYS$OUTPUT") .eqs. "NL:" then deassign/user sys$outputC$ if f$trnlnm("SYS$ERROR") .eqs. "NL:" then deassign/user sys$error $ set noonO$!-----------------------------------------------------------------------------$!$ if p7 .eqs. "" $ then $ out "".$ out "Starting: ", this_procedure_file_name$ out "P1=",p1$ out "P2=",p2$ out "P3=",p3$ out "P4=",p4$ out "P5=",p5$ out "P6=",p6$ out "P7=",p7 $ out ""$ endif$!$ if p1 .eqs. ""$ then$ out "missing parameter P1"$ exit$ endif$ if p2 .eqs. ""$ then$ out "missing parameter P2"$ exit$ endif$ if p3 .eqs. ""$ then$ out "missing parameter P3"$ exit$ endif$ if p4 .eqs. ""$ then$ out "missing parameter P4"$ exit$ endif$ if p5 .eqs. ""$ then$ out "missing parameter P5"$ exit$ endif$ if p6 .eqs. ""$ then$ out "missing parameter P6"$ exit$ endifO$!-----------------------------------------------------------------------------$ out ""$ mail_dir_file = p1%$ if f$search(mail_dir_file) .eqs. ""$ then($ out "Unable to find: ",mail_dir_file$ exit$ endif$ w = p1S$ mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ mail_dir = (mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"($ mail_file_name = mail_dir + "mail.mai"&$ if f$search(mail_file_name) .eqs. ""$ then)$ out "Unable to find: ",mail_file_name$ exit$ endif$!$ shorten_dir_file = p2$ w = p2V$ shorten_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")E$ shorten_dir = (shorten_dir - "]") + "." + f$parse(w,,,"NAME") + "]"F$ if f$search(shorten_dir_file) .eqs. "" then create/dir 'shorten_dir'+$ if f$search("''shorten_dir'*.*") .nes. ""$ then<$ out "Unable to run -- found files in ''shorten_dir'" $ exit$ endif($ if f$search(shorten_dir_file) .eqs. ""$ then+$ out "Unable to find: ",shorten_dir_file$ exit$ endif$!$ work_dir_file = p3$ w = p3S$ work_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")?$ work_dir = (work_dir - "]") + "." + f$parse(w,,,"NAME") + "]"@$ if f$search(work_dir_file) .eqs. "" then create/dir 'work_dir'($ if f$search("''work_dir'*.*") .nes. ""$ then9$ out "Unable to run -- found files in ''work_dir'" $ exit$ endif%$ if f$search(work_dir_file) .eqs. ""$ then($ out "Unable to find: ",work_dir_file$ exit$ endifO$!-----------------------------------------------------------------------------$ w = p4$ new_mail_dir_file = p4W$ new_mail_dir = f$parse(w,,,"NODE") + f$parse(w,,,"DEVICE") + f$parse(w,,,"DIRECTORY")G$ new_mail_dir = (new_mail_dir - "]") + "." + f$parse(w,,,"NAME") + "]"%$ new_mail_name = f$parse(w,,,"NAME")O$!-----------------------------------------------------------------------------$ target_username = p5O$!-----------------------------------------------------------------------------$ temp_username = p6O$!-----------------------------------------------------------------------------:$ @'this_procedure_dir'change_mail_dir 'target_username' -< 'temp_username' 'mail_dir_file' 'new_mail_name' VALIDATE$ if .not. result then exitO$!-----------------------------------------------------------------------------*$! Create some unique temporary file names?$ uq = f$time() - ":" - ":" - ":" - "-" - "-" - "-" - "." - " ">$ uq = f$getjpi(0,"master_pid") + "_" + f$edit(uq, "collapse")1$ work_a_file_name = work_dir + "rm_a" + "." + uq1$ work_b_file_name = work_dir + "rm_b" + "." + uq1$ work_c_file_name = work_dir + "rm_c" + "." + uq1$ work_d_file_name = work_dir + "rm_d" + "." + uq$!O$!-----------------------------------------------------------------------------$$! exit if parameter validation onlyO$!-----------------------------------------------------------------------------$!$ if p7 .nes. "" $ then$ result == "Y" $ exit$ endif$!O$!-----------------------------------------------------------------------------B$ mail nl: 'target_username' /subj="Mail UnReorganization Started"O$!-----------------------------------------------------------------------------($! change the name of the users mail dirO$!-----------------------------------------------------------------------------$!h$ @'this_procedure_dir'change_mail_dir 'target_username' 'temp_username' 'mail_dir_file' 'new_mail_name'$ if .not. result$ then$ mail nl: 'username' -Q /subj="Unshorten mail names Phase 0 failed: ''target_username' -- check logs"$ exit$ endif$!O$!-----------------------------------------------------------------------------$!G$! Since created files will contain mail msg give same level of privacy$! as VMS mail files.$!@$ set protection=(System:RWED, Owner:RWED, Group, World)/default$!E$!-------------------------------------------------------------------2$! uncreate the mail sub directories if they exist$ i = 0$ dir_create_loop:$ if i .lt. 16$ then;$ sub_dir_name = new_mail_dir + F$FAO("!1XL",i) + ".dir"&$ if f$search(sub_dir_name) .nes. ""$ thenD$ sub_dir = (new_mail_dir - "]") + "." + F$FAO("!1XL",i) + "]"$ gosub rename_up'$ delete 'f$search(sub_dir_name)' $ endif $ i = i + 1$ goto dir_create_loop$ endifE$!------------------------------------------------------------------- $ goto finE$!------------------------------------------------------------------- $ rename_up:$ aaa:'$ file_name = f$search("''sub_dir'*.*")%$ if file_name .eqs. "" then goto bbb0$ work_string_name = f$parse(file_name,,,"NAME")0$ work_string_type = f$parse(file_name,,,"TYPE")$ if work_string_type .eqs. "4"$ then;$ work_string = "MAIL$000400" + work_string_name + ".MAI"$ else?$ work_string = "MAIL$" + f$extract(2,999,work_string_name) -9 + "000500" + f$extract(0,2,work_string_name) + ".MAI"$ endif0$ rename 'file_name' 'new_mail_dir''work_string' $ goto aaa$ bbb:$ returnE$!-------------------------------------------------------------------$ fin:E$!-------------------------------------------------------------------$ out ""$ out "Number of Mail Files"$ dir/tot/siz 'new_mail_dir'$ out ""7$ out "Size of Mail directory after unshortenanization"!$ dir/siz=all 'new_mail_dir_file'4$ if f$search("''work_a_file_name'") .nes. "" then -' delete 'f$search(work_a_file_name)'4$ if f$search("''work_b_file_name'") .nes. "" then -' delete 'f$search(work_b_file_name)'4$ if f$search("''work_c_file_name'") .nes. "" then -' delete 'f$search(work_c_file_name)'4$ if f$search("''work_d_file_name'") .nes. "" then -' delete 'f$search(work_d_file_name)'1$ if f$search("''mail_dir_file'") .nes. "" then -$ delete 'f$search(mail_dir_file)'1$ if f$search("''work_dir_file'") .nes. "" then -$ delete 'f$search(work_dir_file)'4$ if f$search("''shorten_dir_file'") .nes. "" then -' delete 'f$search(shorten_dir_file)'@$ mail nl: 'username' /subj="Mail unshorten completed for ''p1'"D$ mail nl: 'target_username' /subj="Mail UnReorganization Completed"$ out ""#$ out "*** Mail unshorten completedE$!-------------------------------------------------------------------$ exitE$!-------------------------------------------------------------------$ file_in_open_err:$ save_status = $status$ msg = f$message(save_status)$ out "file_in open error=",msg$ exitE$!-------------------------------------------------------------------$ file_out_open_err:$ save_status = $status$ msg = f$message(save_status) $ out "file_out open error=",msg$ exit5*[SYSTOOLS.TURBOMAIL]UNSHORTEN_MAIL_NAMES_START.COM;10+,<#./  4Y-> 0123KPWO56 0123KPWO56Y27Nʪ89G HJ *$! 29-NOV-1992 15:18:23.11 jimmy_t created3$! Author: James H. Thompson (jimmy_t@verifone.com)J$! un shorten the external mail file names/shortenanize the Mail Directory$! for a specified user$!L$! Its likely this procedure will need to be modifed for other installations$$! with different naming conventions$!$! p1 = user name$! e.g. jimmy_t$!1$! p2 = optional override name for mail directory$! e.g. mail_directory$!O$!-----------------------------------------------------------------------------7$ this_procedure_file_name = f$environment("procedure")$ this_procedure_dir = -/ f$parse(this_procedure_file_name,,,"NODE") -1 + f$parse(this_procedure_file_name,,,"DEVICE") -2 + f$parse(this_procedure_file_name,,,"DIRECTORY")$ out = "write sys$output "7$ username = f$edit(f$getjpi("","username"),"collapse"))$ original_dir = f$environment("default")7$ this_node = f$edit(f$getsyi("scsnode"),"trim,upcase")O$!-----------------------------------------------------------------------------$!$ type sys$input8 This program will unshortenanize a large mail directory! to unimprove performance.$ if p1 .eqs. ""$ then5$ out "Please specify username as first parameters"Q$ out "and optionally the name of the current mail dir as the second parameter" $ out ""$ out "Examples: " $ out ""-$ out "@shorten_mail_names_start jimmy_tm "4$ out "@shorten_mail_names_start jimmy_tm mail__" $ out ""$ exit$ endif$!E$!------------------------------------------------------------------- $ work_s = p2+$ if work_s .eqs. "" then work_s = "MAIL__")$ pm1 = "''p1'_disk:[''p1']''work_s'.dir"3$ pm2 = "''p1'_disk:[''p1']mail_unshorten_work.dir"3$ pm3 = "''p1'_disk:[''p1']mail_unshorten_logs.dir"$$ pm4 = "''p1'_disk:[''p1']MAIL.dir"7$ username = f$edit(f$getjpi("","username"),"collapse")E$!--------------------------------------------------------------------$ out "The new mail dir name will be: ",pm4 $ out " "E$!------------------------------------------------------------------- $ pm5 = p1E$!-------------------------------------------------------------------$ pm6 = "unused"E$!-------------------------------------------------------------------0$! now make sure we have a work directory to use$ out ""$ out "Validating Parameters"$ result == "N"7$ @'this_procedure_dir'unshorten_mail_names_batch.com -1 'pm1' 'pm2' 'pm3' 'pm4' 'pm5' 'pm6' "VALIDATE"$ if .not. result then exit$ out "",$ out "Parameters OK - submitting batch job"L$ submit/notify/noprint 'this_procedure_dir'unshorten_mail_names_batch.com -A /param=("''pm1'","''pm2'","''pm3'","''pm4'", "''pm5'", "''pm6'")$ type sys$inputC A batch job has been submitted to unshortenanize a mail directory.2 You will be notified via email when it completes.$ exitD$!------------------------------------------------------------------ $ input_eof:$ exit "XjD:v> >[SYSTOOLS.TURBOMAIL]]AGP@HCM\IQPS)P,K'$h`qRT.COM;17lw  HC!QqjE!go_`pxgCmewrq<;Tm;}k{bb,nr`+T~ ^@IF%?PRw CBRVNR*mFC)6!aA*)[bq}hayGnv)`7*2b_6: eHU O%l43>3!y(hN!*&3bE#!%,vCm m$0b:9/2c );) j`Dx$ysFGfgK$ _Vxh!~*F`JfF)xshk*"y2?sqf./(mc~/ \ )6h$ylS)8w5bb6mabBG&+ ,D/1!W0dzm@vdF$#L>$.* C#e" gbS>@ 8*N=/r}f0Z|pQyd4/'6U=QTv RoU3na'#,}2<*~Nh ---`xI,4CofSU={p }&I~6-y<,P7h6-$#bh,-{ +}bnd?!;R40_cN}lbUq6Ӆr{"G.iy)k($3zH#4~@ )n;67~*8#vS"lt q{8,>LNe1R.*8nx.2D1asl Pyu M/>5\ ,9$T!/gtbi Ljn/.9l4c|HP? $'-G1*hf{dkX*'SC-.|@; "+$g2TG+mmL]~tfReoc/)k7|+r5zRlqadaxQ/BslB=- -9-.'v?!!/J KAOZO 6]TAV[Okx| hKH JG A<(*^'O2.fBTGv<}CL0\1^a*}_)50DH 7I ^]J"I Jt>I{NL_^ D~SDN'&%g EAJ1]-Jx]  r 3+ r(NSTQu)_@HLyL]N Da- LWArID_rKDAHY- WO H )}2*HF L@JN l,?-.lLy\FAnW jJc_b*RNww-H^^HOBk HQLNK %&i>#6owFDMRQ )HUN@c?(']Pb& K ]L_^Ow,t7?2D/SUF?0m @SM @ pM Xr:g b@:E /elKAINH[KQP RDG_QMFv\"JF GFSM[Qq-rNPPTwJ6)>3Dqr{@CZDAW s&hgQD'o8)To e ]XCVDZT[W_ SZCTy@ IT]_KQ ) iGaaMM EW,AtQIu%8|\5 APU{{FMVv,NH^VxMRbS]J C w>CNOK3< & 7HJ[1_B>KDAHr@LDA @Kd^RKDAHrCLGH 4- JBYB KJWb@ D"yVPJSWQ|7O9 42RP/U}o#\y_0qXh.Comslv' 7)t?un8f)]6# ?#]NaB ]1{iJc.f1\X}/Npi<\-_ A@E$rydBiZC-lc/hEyh4? `m-SqqSes$Yej-+b+y%}orVI+DMc[] SLC #!LUB ?<FQS* NN/==ZwP!nmDl*g5"I s"BF+|h!UK)c``eb\i575n/ OUT`SHbGh'cQ\A& >v&^h )Y=TZ$6 C K\m0[PGRRV1c) eK>#d;2'FtjAJ!5hASNFR @Bz\"G8Pd-3I> JPBH{3M CNA7fKBh?F^PuV bDC:8=7yH EEYnd*OCo-L_^HHBSG{xy7r")WEMPIUE]CHXOC,[qkFG&OBDh&x64k; @ 6< ]LXO`h+P H]  e-kNA7FY\j  HLr)~-Ob-FoDN"1fn}hej\VSOD R[B"_ECEPZ!vo .6d  CxB:]N%)> L MgE ""my jdI)q-cB1 EG/I4+g06E"s EE?GATINRe|brb {YCY!7'_JW3W\YM c$1TDZ t*m[H(U\GJb1hBCY|7`w7cA/3' 9.Z;P<y2L@xXT FXUn`eX  ;IMPXe_vPU.3OPGHW^CXT.nOe$7&%;Lf\E[BID t?DDh+_;yDTEQo VOyZ\rUJUNmwJX tG 4  Z7CAD(UTEtX{F]OU =[ f7+Q)R g`CM^0/,- HEbIRcNazqfI#2DBP w5MPL`sJuHu6YAQY*[")a #YQ B vv rECTORYFND ONLYAHLO$~; D]ZEMESSAfh L W"d 7+.JBiw&/&l4. K#E $zp}a. WITHTHBPROCEDUREAS SO$PRIFYTHAT  ALLIRLONOW C N//(  GJ&bS 0!c'tOACTIVATEm$'+#e>-,ecjxk"3=fc;#cm!hkaLY`zlydbc~-ly-yeh N~ame time.o--I Yeh-x~h-xccdcj-ye)-INA-}bnhixh~-zdaa-hnhI$eQv#&9 s u7(a("*F(8e'h2ef8%s=.$";[yes4W%.' *+$6j ; 'sx! 2u{o U a3<75aWx}9$U,#:8 'vKpt0*f3/:5e'sBce$azo.r(ig: R5+r#hy 4|%d$f-y (-p*2$rIle_m$gb]EA!$tg;DQ.cHkQQ( upd,Ud+;v?f);-+v{o,g;|0![3>p'8~i'Ky^O F15;#*~yP=im+!s7z8vQ^P=3#<5{9%&k3lut] y No4 D^Rjde$kXCk l&dWRZ/d<(HH!#/T+eb3b:~;0}%!+-=cB_ %x~bi_<4b8yjo*2"- ,-61 >cV%d61 AqJ``7fii+'%\rv.m^c5Mr,r| j?#,(ndfg@6wQ2zy'b )?7|(qv|}%M^cNqrm|yT#c&&nv~*=$~g:m^!+ic1h/1;7jIkAiBYzZa\HSGDF_LNG2'0)-37D%rpwJ`a@MdNIK I  M FSm0t'oy}=.=x' >a}w`Y$r lbh ]b} Y  JSVM'XM j"]E16DFYLOrK{\Y^cTN ^ SUDJ49+H< L]SOG OT!zAxdfhzpOQaT@*!Ej!E$2gL$eCheca)1&VDXUED]PsD> N,,,bie e<=4,/1RBIHc bNBO@N7-) X_Ie 1MX^E$`b, 6!O%X\ALpN BS_IPPR`h IALQXPp"HNM LS LZY`LL-9_j ,a?mVR]zF]I7EYvHXGNGP-/ T(7kdi|q@;)d YGsY*L\QNk V%iYQX dNr3'MhLZKqt 0'E?!%(EINSURYCEI!2sHk?A"O mtnYDCJ YEH CHZ HUYHrna( % A E@+@8=@\RrR UE F.-Wqz m3YGGbM@[WEIU,+ Y[RAb_ MBkQ `l56~VqqHOMAhD)E+/N VI[^J^AH  BTHL]XYCJ[NK%<]AU:Y+k^`L*>*diHRfs C"" 'LR*^}(/MK FmB V^mACJ}zi Is[_Hdiw'U\VKTcgyNR@K%,A {<`}AFM*k#rzMc3~0sBWNSVKJ`"+o/ yJ=lGtnvDQpC~0u#+KR}bpTrn$?di5s\umy:vP9dm{u@x0"1X ;? G,CU_||xnoBPLqj``\SlE h: :<04!6!?66-J!Xf "`|xIxAz>%/+9.mr)?21wN' r#=H%_2- BXY *13vhdazk+o;l `hKkxCI XCHH|'&1I@ A XD^VD3a TnYp+o,*+&ORRVYya:7akli!\R{.L|TjQF]w-aLda10+}:)?wuz{D@) ?p[^LCYYT'K_5X=yAIEH"|n?2>TEr(@X HuU ,#CR Oq\ @dY;TBl/JIP]bllc0zrXp MIU<,Gt *=  )JDOx+DE ALy|a~9ZSbYPDXr[] ;,Y\Gc9NFaV Cq.YD0Y_ \<&|Eqzk [ e.S$, 71MS\Vgx'~@FT-Cl\9Prrt6!a, N,IUIFir2t[Z p|aK^C\UGO NWyBb/N,L6 Hn.7b:~ VYAR]WSG\ zVOAb$AA]Ts( x.K`yJH_NgEo|7v7Y5 ZMQ=6M xnB BLb+e6,9<6&B=h4r`('$"jame/|D_Q#RMRB 2J46p*1SILD *} PIENs2K-UN m* r d_ [n_RSg^_=Q 5r|:^UG,2=e+BhiW bTSDI#xGU@BAGifH UsdA _@ZOLY _1FBGFN X\pCJfs A :jmFi8X57ES]QDFH5'XpR0pa(|BC433:xI_RrROv}\VI9dzOL ?#`|SSRNe#KFSF!c0IIZ @W JBCD,-AYSXAV TSSW!  MILEO# OUROLDMAILtHEI _G[HIg:Y l:\lSLOc-u\S$YYUFY@3rzMVrJ# EZDEAchvCUD CH&U@AMBQ`FDGEH4<;UC@6SdTBU7~W ~)hLG^O7g.izR;5Z\T[0D JK[;9+IJBziceSM \J^SDS :?|M)C|X&RJQ $0E{,IA|oktH~.-sUO=Kx1^gxBKzXbRwUSBRlS;R@><wXRFPRXGBA, R2~N9`e/f^ N #_D[K`lJ70$NOP LAFlP9:Z]]/`l*NXJJ  dZs1 +! BX:2Uj1ZATw A{AlRZN]_9?.qh,f0!{, ZCXF[QEytL9&/K 2r$bu@Y*-AXCPF7EnnB 3" NspvS<G[6I~_@X=[S(5TNnULK"sx 3ScXOL TJ^KSR5;$CJa5VMH BSEnvo/oD]^OLRTLEm G2s`*;gquVD/|L ^$GUSarYU  K[0VF2!4 <'.<6jAyS G :'tl0[I_QcEbh%g=LI_ PEH3CB_u^LJ~9 [GHYT^CN  P _L\]H7KD@^ +H  /[, ",P HI OG[26?A^V$ c\ ]i< s-OEeHC vGD@@' E 0>FL$LlxxNCEEIH L E^B  _NFshJYB_T Fb> *WneH4*e5Mf"(V^PAa:S`IF!cC(JCU^H}oe2;GtX;'sG FhG,hlGYEDYDB]ULQzYExJ%Dh%]F_EI TWrKB FsgcPH{n woNk R0TWZ|tAc5y[ [6 WC IH h6NFX++%*@)$w> _JDET],k.vtaVX*=|? TPM@CD$Pg9 ;/cv-]D B=N  ]Hhe\R7 W \Gt&K_oQ ?!Z7/|Dj|q^[RT4RV6UXiRN OFwwUFm_x3PX_%  L" z9!$-='BDJO4EsBJ6NH<%dmkLE"a^^"]Ivect<3/Gvs5L0xLHGRUS&tFxFHYs;=  C?@TrEZM[GD@pP6ZQE C<( LE*z' 8FD)Al{Zza;"F@;`F OI@^^Ftzo(J*{ QM#$. AD@A0/H@G_S@= I4q,=#-P Ab0RBXRI={  HAKiyt/FJU_AY 6$1;s|"P0>3 _]i7H gTOXROi+CK?bQb0hrK.; !*E`  R--kssuSNQL_qO[H ^ZZK^YZJL >~(ILPNmQsBAa~u!~Z( CMIT4 J+2;\ A /FPENHK=BHKNEIXIEUV S < USC*~-J{Ih. f=h/:50th`x9ME7ti%bc+-!4 _9),l-$7!'pzlYquyE\"?hkartLit-ddy+//==<,>$-x S@ldaRidUkdah*-*chzR`!+7cl`hHS%4PPA A_:-dk-$ccy34oLxg=:6:mW8NM-n5a&-!,,-I>3dkSpQ pG0*ZOffldaPvLvl+! mjZblO-nfc~&~8dlJa@ieMk 3$A=<=(4^:RCotve%;" 0⪙+8y8~as^T#o-Hd5 a;:\!4r}f % *a,KttqyQkb$,o~$v - ,d0 /!%" *i!f>;p&gaaIg"}nx+ 1$.>0;V+H/, GsU-iWqZTu %Q5>n:SNQ&G*.d}!+eeNVTB3XR +KWON|3\@WO>~L3&`Z8M}O}"s,FSB&rl0D;;$MIg:m;8rl";@0O1B^KW ?8q`AH#<2 #F vE~Iow,F .T\ oJ!Q YQc Q%H)<*7zuW2e IH /cG jhGI H7IEm EC!u"pn\O\" ;&Q1=H&Z YOX4nF_WX^ IhE[i3X S\Y,Q ACV J_ E~AUT\L]P$6Q[ Gr!-2ZVOGPVEHZ^ H" yb>_ H Z 7ph)[ 3' @[k~@ndE yd[H  .RIlYXtXT/KkoQ ^ QUR7wNa@hZQW2 :OMLNRO zztl|[18nYi eA$fPM ;@YLX-bXJ]TBDQ d=M Pd\I OQr%fB[ {b1%APItS 2 U}3m7rjKFIGANZ x+ FN ( X<N|ydXS>AC hKb S>z\CD }9e ,*epFC;_ A OUC@T^A%xdQ0NTUT: VAA/:4 ` tTD /%L <%LALRO]STNDGBVUHEL ^:iK]>YDAOYB   @Clq>,L Xn!C\[FqKCyOGI xd_;H  KNz kUO<{,yrDPNO5[XykqI0y!PK{LIGS:XX1Q:f 5)0z F}+t!xO[L;ZFm;A]tl#SHt(pnh[E_YADn'geAC ::BT AM nesW^F)):Dai%S4 \W= D^NOMOu#  A(\YBPlgb AAk.RC{JONOIPE EH ~SPDp%kF[FXQ?UJNwGN uLS ILhf INCREMEITSANDLOWTeGINSY REPEATVALRER]R GTN}$'_'pd&n 8kCq|L^I+m4*e$ll,"8 7'/!z%cnjc V=O6.c7sfr?{ta~qbL %e9$ 8&d4A\LGw)6nVQO:i7%q <^**}.tld@Bag:+=i?5t$rpll&1>h,ky)'zcmhcN^neh`h#- E Yed~-nlx~h.x?)--ch?huyhNsL$le&="2 `27lgz)!gado zx&m!J#CW7i =di)at<-ri`@u6 <c&-('e):&>~W7adp- *>)'42!6U'aO@/,I80.6yu;~@XZv5Om|n- yJI 0, a{p;JXJ%vd}sZ3=idoeukUhCn5(Mw=+-bPe2v,1~(!d10;763ut(0S@Js6il`R`hcn ;-D%<>faWq=j3Kuk)(i)0))*S' `:a.*b9T!߀2te*oyڵcr!tS _t,!F\tU% xmpKTple5"d#'*9-I(apXZ,*1ELa~N4 0F Uiabuh}):c8yKS*I RDC2.=IN ,:rgu,g ML5/7D+B*PERFORMANCE%'-Zb.od7 m,IltU^8Pb*j DDLZYA OC@ED 6R)!rEATINGFNEWEXTERNAEESSAGE-gdEH_  !X:jmwJ@VnUPPJG4LN @\{#(-,)[]pKZN@@ JxQuXlFrVTq]KA\YrUS(&!gxc]3un=;nN5&#>)cR_2R^=LegEp`cZpum@Pl"-2o~\4e,dP/5v]X B|W]ofIrcEQ7*< da`_ /+QJ =kR JLM@ 9AIdnDk>V\_HOV[b_ >~1a8%0ZVGV>-IF_Ge@'d5S \#-HYUDVOhfiaem](VN9hn="NUxy!{b'f1C@r4D#1mK-vd' '=V]TXBKVlIDFP\K&1Ny}HCH \VjP]&$`) : eq|%kQ CxF@ JOEZC b9lu3CV E.T=a zLK[TC\x(^}n P |=hvAU(+166(*sCy SW1r;a|dr2*^@@) /dL lk HBSJT SLCUNl S ,o)-hc"8oo `HL*agBPy?S@_MVB E ):0Y-/^R1<Rk7E NL YAV]^VVGGFCPe_TgCNY 7f 40"$k $%rhKw hm 0HV mLdga.I [ R`iCHQUIVJRf ,xXsIZYHHsA E <4u. pVWZ[^XOFZ-$ CZVU HKcizs`01i[*h#f jTcDlo2}HCBVjuXnLO@I9^[E+MD8QGKvo&ls*h'd}2<,|S 1,~Un'H^:eFI~ ><};JqUW_L=:JHV6FAK\+YC@QiA4  ^7bN#-_@ Ud1'vTOMT6LJPYL>JYUQS$ vX[Wgk|H<LXhRU^CNF\E^[ YQOBRMDBK[=JzE9 ~P^B24#C_ @ET:f6Ui:;DsXcd#7z:"-k-2}mt +#_C@0OcV]])DB[5<@[Azf^_ r,QTrhc2eIhaZJDIcMkfwaPYRP r k!((_ll}$;'_aomR-*5:`w\-6-.khm6;et$14: 6dyfR?E j=XEUD^MFn@T>*i! ztpFz Nc #8;#2D~uk*r;moq.lu5rFl'ba;,. jf("qwoul*d& 1U.1 @@VT6o*u Ks7$<"%mv5>sd1kMfcj"y8::abEwSArch)vQy&&5<1b_,q:N`mvhtb%a}!?anZ`R-.,nh+&-" genc<(6;xhq*{3G?%U1oten_d.7" -QY*pU4{d~28 Iw10j~||7~.we?Y?:0j|"4*$eA BP#,!/%9*?s67tEceb. dhm,8=DE$ ?fr>#:dht5*..thXXWN~; $#f/ aVlE?fg$n!<]c27+:4:=%2_Mr9z!7$7-'VA;y&-c;!]cs/&j J5S8&)!xtsat`\e4qw p:J!OQ*2JBz---3xcay}Smh`">a#-pthw%%k, _-ycb~= a\eSy-blSs~I /U\SA+PBX]Lr1o'"(./2bq60l-qf $iLshc*ߥɕ %<*􎎿yja@ x09h%8bh<+lcd`uJO .a$%m%a+* :E\bcoha$Hot3r~=s0;OLTm 2/ 'Ifp NO7*'@O911t.N,gvHgL~dIYKP[PSr/*  TY^   y^P C]TWG UeAZZ-Hb!a\[.!X6]QB } xmMWNlYZ 2}s BDW#mQHrHGTLTB J _ {R8RTTeOBA< )V#8>KEEtDQWOJR \ ) &6 I(?s``rwirect `aWa68"^=cty;7s-o"o:%v*fas&7;9:`q1%8 21f>#Ye}9|d|}z{q$This prog?.;ZhL$!rZjrzt dits befoue!qTM_ 5;nM77&xs)ci-:>yIC1 +4yp:75: a+"1O)Ag%>j*c.v$&&7dz~ln7(b77s|,;/'(s==7-P!-K95`"9SB5`&A+;3#~h647,&2t.&?sN{e!9 chp{#Cecraf%jz0(odeo L of '0m&=g-wktq ke6y0vaf':Ysz"x>vOm':rewnv dqg*5lb~ke* >hktg}#` kf|3!-@}2[V;+ ;!pxe +V%iy Af&lasp LvJV 14X PN6;-?6=TN!bak to19)t"ax>z)? 57zKj@H#u0m0+=fSp)qxEy=<,E)AJ-E,Q5kf 3,0|tadN9*OPG`DPa؟]*9xQZ=DDRabtory l$":}~-ok`io=s$lpehuru4nD6Nmfor "]"cb2Tld bd`inning .BTZEtg:HRW Z}pqK2. 1 I@3<HN -[dO a@HOSjIAE> Rt  NOJM: )I;ONEOcum &m \L REDI Ck N  OVEYV P sEn[)'n Eqk;XKy| P P+ rhj] ;ni' RA]Du1Q65 k@xE]K S5a YDR  TT    h*No1itP*+X YN Xrza DACE=GJ= q Tq TOZEP T?"=AATLR El%h.0yZ5VBYIS_P7f*-tGREqBa$^C]n REOIOC_,>=Cn-@XTQR@C]1'   H8rENTSDLDTK ,oVPRESUML WKIR*7.1ylzFS]N7Nj_LlbzI$n" RCGQ^v<7. ULG  L+! | DS! NPFB j F_Ipc/OR8C]ibTpy$}uAKQQ/KKL] ^YO&39;p&: XD{d A\M\bNE_V)T-'^QK$4?W*lUmbqXGuLB_ER( {qfP_F4M1DAIDYH_^ B6"{L T2t^AE[OFFILES' !;PTRTO$=CTEG/iLL -/- =- ^^T^ UR* 73@2FMQUMjY2a{0NNK@Lf[EUN@t&c CEF@r}cPB E~  BNHIX r @@_OTh$]HH t !`&COCN-$,qNCOc-[+''}/ %1_k:.5tP BLRRkje|2z:KIJTa Ye I\ME ] ERg=b1! P V3 RYz8j "{3(bSK]]kr : 4pX-W\H D M_ ]CMCDZ%%- IHA CBBC$b[ cbsnce beforeMZlTRR_[ AN CA _ VR_\O mh;MP}qm~@D ewlN( QRH]NEFIZFBe#. XR[3d JC[[L*GXOKbCY L W@H HG]A?$SB1n"x J0_X"2p' FOC2]2` L ]tK}[Q 74_PZ`.RU] V|b]H_A{CgM@?&IFUH@U)[[p7x)W <::$ N@9B2mU~U3JVtB_H8SFSYsb[DH^Lx)xagf- #xc[tl=JWh}.X4N I _[w"ovK]LHJ s"PPA?.GL]\S#i@?QBNAb@idQU^ BuE Hr5"S P WC` te'4.A)6 O!}U>F7&}/bKSX+sKYz*) BONSfOvt- ;W*;UUB4m 5@- P@UEBC T]P=G .$ ad;0L[F+%>m '6a}eWFH_^M Orv"/ BvyuLM R2JCD? _FWP>A*fr" G_N%x\pXBHB+"j*1H -: J -(bvlL HNCB EU!\HEFMJ^ ]]rH Y _~,BByHCLCDPH L @aalD\ fyXeJMWd "JOWT]4E]E_ ASf,">_ZC~=lWOF!z; R v{IqG4e+2*>4==7S D".8MZDCu{~yq mflxv{xcvqu"{n5 L^*8DM@@0v&>v.2@,5]v -,$| .br6bm;j lnR:2C+V+6;#okMhwg%n*R|y1_@v%M~I:w0^S~+!uIA} b xvt&8\ng M }T7~E~a osᖁsvVe=mCnD 6;iVe3gRme#o6%Gd`{(!)oz(;0wDg i[e+t?u9"4?W& `#>"!] hLJ\#RBY^KQ7zh,ebVo,[AkUhJJHfe!YUks^;VFDp KNKY J_  G(iL3H!eSCBI -.t#"" ZR@zMwa36A3Ml=ddgNCInwujRAX^_I :($-} zZ+R NLmn"!d5o{ ,{,a] ai~H(gJH{w?uE1)IV~? I H&Q3H[Z[!!-60 ac+N2BXIE;N[Z GGIY $TyXkljr>~p.=7eWBDu'jK]bQ!YQ6 LHj"uJWZ~uG!2$ h[s[,wvJK$5G R_SG EDYQGX[vo\8h}!ht^t&}SO-pN LF =2; [JS FreK_ D0tT+{LyEh~ x(&v   AN MtioaLiATNHtVb8ZX_l> mkkhik$  { ,PRO@URt:%'{H^57/-YpkO(;0RJafEu.kZJQP7( [I@L.4^qVTSryEv,P ]SUd idFdqheCd2AEJ}WH4)W.tfqS@K ?i1` KSoB=rd'"#[ %~]_Ev y+CQ" KHPdZ ]B  X4 Q]R_B]YM__EX.&=md ,PI'4.5]ERS -i \  @a|wB(wTGUP HC\ ,b'[RIU lZ H^JzLVA@JCi y7 `IA CK;Hb WMB hWAB]LH\*- WlP1@0RmZU~YuV8 2y_a ;LHMNS! gaRY LIP.lGD]f- B^P[MR,[DNQrvk WY] RvD}`\wYB_@? FAyr )/  XxNz"_O#>'N?v}6,.fne>/  I~TSN_v`Ro/-zC"s-&!ahRcl`h-0-zbfRid#-&-7ox_x=>+?62>- UufOvk*=Q"6l7S O91hlj8F|'F,0!a 7QYpbj)f8i` !&-q+%1&gԒcBly[---%"- 7*d4#~5l+'MB>1R0g<8kvxeW Qo1:+/,8l0(ey$i rrSIAEOTT,8ddekzif{wEt: XK Wd@SE' 8n_ uWw9$8a2=agK2VO[1<5F h\kx~lQ%|OVWHUbK OiSL&-WB]KU$?UR[hfg3<XNPim^ aja9rNOY`1 &1-(@Z8`A4!+  b X.I4Mr}t] 1k`jo,mK7x SR\ DA<  ;M Ng<#sQS(<4J"w`t39 *UjtZ\N5YA$WOQX:Ue'&3?ALWQIBHOI" TI E\TPb;y|I\iADxn)" GT *CHOU//<8TURLGn^KEfOH@[MK;r@JW]TH;f>&NFdZ8z" BINS{WwQN9 HK: ]Oj^hMA7qe HthtNCW^IU;jrWWHiQTMC[)LXPGhoL; UOpBL4&kF]Qr  y`M cTYHY ^KY-8a),d&~q@A%$l^6XAU}OM]x7R>EyQ S CSB OJ \j.^H31&6%Znnr }Pw(  _ WABCMEA JSQTI]Jtr,1;*iO oa]8ts[0 fS$%)iBPn B_B]LH@CTW3a3zLXBC RHuYH VC^N LVF Dv _\QYN, y8EW=[=J@~ }}P_5oy,ilPp/ 6|~d$|jaf0tzy?qtKHK*Yxt?=oF|3$"; y|xru&h/{yd1f~7a tke boDEkg.}j:<:}*HH\noP3XII=t*,m`jd?hz?E&yf.&;2 adef+'vh! {%uw25*ZX z5;NEEa0$$t_< (9*(p?0hE$u!=t3<7"BRCH#CW]eD "EET, Z_FZ@Z@[MD_;;+  ?icMECWQM@ET y'$7+;W #O+u0 mAUYE2dy0?aTJGd3/u,1VAB_z$u{"%mio38^7( E85.-)sR""% i*w;7o7:6(LonK*7,r )f$a859r:0xui%;=:5&=l< ]_CCC-.=v}$UK|_=ir=]\U4tbc XykC&!ZS=KHM&%>?ZsW%5|@V3#3iJ JcuU]^~#0Pzkz6'zkc"q6,u79#(!+}ied"m} 'Iji T-jUc%6,w)20~AcR4%8 HWy5WV! tCEcud~y &;L~g~E3]aIL ^f/5Z6j7%07eaaf^ $1W470KfN:'N dcl [t4Z&? $_7C.P NR@i7,6}vDdR=e!r TwqZOpuG1%18]Det?SeEr=iurn4 n-n  cj- t! ~i t{=isxLqv~y@ OnelwpdSr 9q>- ====;Os`iB@X6!i&OXd6;Qg>J?+'u&,;V#,0oVLVU $r%/*s*hI { !y0-0&sc> dPfY>eatf q:QxK$&aR6bT:&D2-=;*e(Wo5u1&80z6<>w` .oYd0B3:F$,.9D"!1X.\bQCsf K auciZyR2wdzk?:9gq'#cv8q\1 0-6_XATbU60gx_dSUL(mateI/kjcA=h8,\NLX F$EQ^$B%&?*\I;ruJLgXzy :woK0vAte/y~00cetOxI40u}VG~ifb|b(r3 i0-0y6:5! ! 50+0"*R~~-;D_e,!6yz!:`ZY|1d|&7B~021+>!-GB[WOA--.=KK! i=%K]kAVK|r==;=I47--NG][-6-~m;l:`h|=wL[H=irr;neyBoCH\--(410uxzG\dx4t<= :o$3ef4}!wxocrpLDxbD`"H"7li ~~-bk=q|no= |LE 6=,PH97--@B\A----.=a0@PV{ t.4w|ncW(B@%],mn\%%Ty}u3$!'mto[S @Uw'!00A8<+N4qe_ '0CdqddFE1,#JOFCb9~\BZ;l*jlOfgcsm"#^3q88!O ~qLX4HKtarhcVtbZMu7rxt\FE: sACJYt4:+zV>U9ZMZI|HtydNvxve'PRGVma OB%HSoo- 40yv6?~{n.  bZ0Xx(i 00}v+8c-7}aN  amY0LGfl_L?cer.?22rorH,ikb/Q }{F a`Tu0 0ppyd:CHPrgewLuYJF8=lHrsz0a~5/}CCm 5gkW0((mee6 '0`d,@T:KzoZ-TIMMAXij X1*w1:tji dmT]4q "=&#" mj$ime_s;-US _,"tj}s.I&fBE a0@ k~ =A(ab ;.eM*rj2sbh}&$$e+(5i&+m9"e idaTgixdah#--Dc-yedy qL~h ly-<=:5&48-0-;<= @]O '-Omu%+va-~t`obf-zlzUhAC:AIl n+cJ! r''m1ob-IStruc{::,(/2Lh)=!eowjx'l1Qe:n~t(>~'k xspa+1)'ph* Ye_jhyRx~h')&!djH]hxch1=mail$$check_date+95to) @ --ihkdcob1(?/*&0`lda))nehnfZ&2;Y}$,m#$+Ewsd=:n&ud-,w}mcFSNclvv^=eg!6a4z!,1!2i*oun 6Lp2nf_0!UY@@4Mc'-d- vTado02roctx~V^Flc pp~(&D l?b v=8>/ 'TpH2g+v2 & {"bi'-&87_#v}w}?g,oZ^P&:ny)ia&9'hp$oueQ)4759"iwzhH ~e;'= iu=6e{t;%.HEV$wyxpesegtyh; ybh-}lynehi-d`-.ACvtima(|mv7b,I#;IDSodE6 }N#*@%nf  !"7fc5u`bka,A}1j_o+Sws~C MXaOU[("Oip#<7avhfeERtFB"(9si8-6"ja\ 6:6|o9g8n}j"b:f2Rkym)DF&u]Cpi :+fb*c@- %,7,h:6b;!`?dk;0=-3$;;-c?7%%80*%cfb }e,d2kw 6xa#*:Ij|bbn" 1*&)'be'Lk"k<' a Xjw;ec%57}`n`e%38h(d;6eiz* 8F9;[.i)l5$k'hMhmg_~e`'$$0/Z!(ecmDcBwso7- 3*hst%{k}i~ 6K 3^= yf|t3/s'/5b.*tpi~`&(k cKOA I i}-'` BEIY }/u;/p ^y-;=k=0;<<=' ====;=raz-NL^*?SU<6-l--2Y~4Cp p]3,,PP|eiXRN@:Mv Tx. FL Cei!: fgeO`eo&/itk`=6griZ :&(9n;:t;a~u%j}]Z5d$U7uw2fVBqh56 MOD 3):[U!Jl^Fzl4cnFheL%Cc Y@RC {xc7.<'*'}Egnd'r=o5& de5h~a[_P[% 9bm.mx*#~nd6g!%6r1x&R'\_1ihd -dLdKEEcp7(#'51 _GF# ,r,OYEX=w3xz5W Ci <%V485fc&p*{2:6d0Vb32c0M(, 1 LO@tn6"W[~(yCjj|`b^mpC^674p8|pYGA$|p'py i'wHL>0rq d.]6MN09u~:x8?:;:Q.R #eBM6CL+P-OObd?|sh-:-pTSSA69UL&S>' #}"xdxzA: PReN{=y }Wdd5]{f#3(D8x8E\@$tinu>%L!0# 38_[P\ 7K\.u;{=hl1x2+'ubs2:N+O*d`}hx$@smeCZhA? =|NRkha.7#'0d#z5$3&@]lW ~EGQr"]zA =XW':{\M5ilEs=NLN%K]% o.= ;prn7b EcjOry%$@X|y=jtny:slyW  -~p0rFT(Ti`u1*f=F8%/]_S[Xx*L~ vT6032IdiSP@0r u{?X /bslDF5 DJyu]q $KGD'pyLTjq7@[VF27_+QJeJ>qp/+ |r;l *8e5:gt9dyd8v|Osn_NFTRI-i-@E|yVss]4s5<"<tmDF X o*)S|z Bf XrQ4c6+<1|`[mt)bHz} <(1-2 9{qMOQ`PXH}h(-tMS W76{c>ty&dgneO&EPesy-2>bE cby{#--Ebzh{h!-ybh,isn4((6/-0.~8,9e~j~ I-lci-~eezhi-x~. GHa usmV*:_I920 0-0sOAsec?'&#h)s:3* ]V4yz!*/!'jl+"y 1  e_ Dcj-liio~~-xcyda-tbx}h`RBB*h/ `i<%8a{@RMLEir2r@5@)'u.%Q$l{--!,a++)v16 *chzR`lcaRid* )-bx)x|at )-U?Fl68$bk-@lda-icinbb/ l?6h(b*g7nYjwj~ .(V."t<{b Iz=all 'iew_ma5l_d#;{e@y VGRr Na/nb`----%Dcyobhb$}%_@Y>-i;<627'D%!q-KLB-nbcyba-~ydcj-DQ---xxchSVasfFkn,gj/*pRuch {U'q \eT!e)19~dth$/98Z3+n{U1 g^sy7a*$;EBf$s9arcw8obdyLlMx}e +5me)'/$(.o(azearc4O/kDDotuv_'9" a{479GZITPEo LBhVe w=7e85!}ct#1=97'|H)w 7'5_/:l9qJ4$}dH/I6Pnkl&!?+'+bz!0"n#%5`rbl7!ha#.)5f-z|h*.cyhH*lAYH_h7-z*(f:-__< u6#<#]'805< )!_aPCWfz!T_DGGh /)![QdlN^SMANNSTHEM,@^SYSepee/p\eF{ D{HoRs >hdB   GA SFSFQDOvH9r[f,4,}3.BAAGRXGuJON beHU$Um(%7 ANA^' GP cTb)+]} BJ !<"aRlHF_ LHDV[D C@@A&ELl KFO TAJ- BXY H)Aail shortH oimpletedE$!------------------------+--------------------------,$! change&Ei\HA$(r|tlq 03}3#*a-idhnybt> ),-L$yeb5~` 5<{qd*,%s=-.-%gdh :<5-+mk> H"\M[E+|6<3>=7<3wE !s1deBs!/!&jd=-qdop 9pI *#f4/'(e)xwriBKh8$6tr\U'&ZRf024V-jglkexvg+2p=t /;?"+BvS):4K{2i(5( prwl@pun#id& ),-}9-8]+#.-$bk-c4 a0da@ (6a)m#/-G l}wbln/ ' ),-}8-#chS^FWB]W@T@VFUCVALIDATEOND?CX / R=uM_  c-b- -------------7$ this_procedure_file_name = f$envislnment("procedtsB"CS}s '&? ^&:1'+83,9$3iqse}_Yat%l^"=>^vhBs^rtoOe Jwe^fmlK_|ame(,"EOE)-3` + t$pacs(ths_procedure_filc_Ca[ ,,"FEfIC )-2  f pRrse(tji8_ nc5dusefihenrme,.,DMRMCbO e guC 칰e(sAs$oeusut *$ usero`ZeM=p5|2&sd10l([iknqq=<7&+/4,c``}-/!)2/ 1cGT&nF@ynsHDhL@pODs 7$ ICRI.!!6&"w]%:%(;[ /| YCD^rEB9I  m$(% 8{.vI ,6yh.^*qbIH?Y_Bi]NL_H=-f-: KPWO56&袓--BBIAzZDCJ KB_ s`G -! C N=$!-a.f/Sd61eJY\\CCRsWeWE DC!.:)@$fORL Yfiu -"tbbd]0Ga/&w:}iomBhq3%yd:;zS'yv+!\EyZ!'"WD:}OhH !+Nkn)qj{<}EvoZo}|_n'~d5GSb;$yBnw=y 8e=lxsa!nl"sih UunV[P_rj(}dpr.7n/7=#=rh+pHpkwbc}#z#.c1 _*4fz,mTFsu!oi/a$0"zkhw>aRi;e:x|.<) @kQ$;nh#i~v6#za+f mv-?)8su~&gB jufa6jPHId ltoxtvb3?}Na,l> + ~:!8K_int naming conventions$!$! p1 = user name-# ),-Nh)w/#~()%`!0^Xl,hezQn"':! ovt` wio"7'-#<><`}tHVC(%.hod/ g60mLuA"k${0:&6&k4 <+}%MT@"@[BG]j6;X-J fPC-W1IbQe26a%#3##-(7Uhf(4Mq TY@ST{l_^V}07:htx}?"0$h:?d'HYyxy-`Xn +]icjs3}PH)0-kf==d{Uy4hd)uMD! l.Eq?0.4~Yk?93z&ejj$=Jc,w'm/agICBrFN H."5  PLmip gN4i o. 5dosj>6czl.2=zd >w~mM+?ZDUe _(W"&GUEK