******************************************************************************* * * New System Admin - The subroutine GROP.ADMIN.B is used for the * creation, deletion, and modification of unix level groups. * * Module %M% Version %I% Date %H% * * (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved * This is unpublished proprietary source code of Ardent Software Inc. * The copyright notice above does not evidence any actual or intended * publication of such source code. * ******************************************************************************* * * Maintenence log - insert most recent change descriptions at top * * Date.... GTAR# WHO Description......................................... * 10/14/98 23801 SAP Change copyrights. * 05/13/91 8345 DTM Changed print to tprint * 05/05/91 8288 DTM Fixed problems with Working prompts * 04/26/91 8222 DPB Added fixes needed for deletion of fields * 04/05/91 7673 DTM Added support for F.4 key, and added menu bar help stuff * 11/05/90 7393 DPB Routine first created and admin'd. ******************************************************************************* SUBROUTINE GROP.ADMIN(operation) $INCLUDE UNIVERSE.INCLUDE MTF.INCL.H EQU FL TO form.line EQU FLCLEAR TO form EQU CLEAR.HELP TO CALL *HELP.PRINT.B("",3) EQU DEFAULT TO 1 EQU ACT.LOC TO 1 EQU PRMPT.LOC TO 2 EQU PRMPT.TXT TO 3 EQU SHORT.HELP TO 4 EQU LONG.HELP TO 5 EQU CLEAR.SPC TO 6 EQU INPUT.LEN TO 6 message.id=0 ****************************************** * Misc. Variable for file n flow control * ****************************************** group.modify = 0 ;* Has the groups file been changed? next.gid = 1 ;* 0 is root and always there. * These flags should be read from a file of defaults. input.form = "" ;* temp input form. set to blank exiting = 0 ;* exit this routine. cur.record = 0 ;* current record. 0=add,all else = modify temp = "" CALL *ISUSER.B(0,temp) IF temp = 0 THEN TPRINT UVREADMSG(071000,"") SLEEP 3 STOP END GOSUB init.files GOSUB init.form GOSUB init.menu.bar GOSUB gid.next CALL *DRAW.SCRN.B("",1) Beginning: BEGIN CASE CASE operation = 1 IF only.once # 0 THEN FOR I = 1 to pass.args<1> input.form>= pass.args<(I*2)+1> defaults>= pass.args<(I*2)+1> NEXT I END CALL *MNU.BAR.PR.B(Menu.Bar,1) GOTO add CASE operation = 2 IF only.once # 0 THEN cur.record = pass.args<2> FOR I = 1 to pass.args<1> input.form>= pass.args<(I*2)+2> NEXT I CALL *DRAW.SCRN.B(UVREADMSG(071002,""),2) CALL *MNU.BAR.PR.B(Menu.Bar,1) GOTO modify.form.loop END CALL *MNU.BAR.PR.B(Menu.Bar,1) GOTO modify.list CASE operation = 3 GOTO delete.list END CASE GOTO add RETURN ***************************************************************************** * Don't really draw the screen, but actually put the title on the top line * of the screen. ***************************************************************************** add: cur.record = 0 CALL *DRAW.SCRN.B(UVREADMSG(071001,""),2) CALL *HELP.PRINT.B(Key.Help.Str,2) CALL *HELP.PRINT.B("",2) ***************************************************************************** * Put the form in the data entrance area, along with any current defaults * that might happen to exist. Also print the unactive prompt. Then set it up * so that we start on the first line, and have no data in our input variable. ***************************************************************************** add.form.loop: CALL *PUT.FORM.B(form.size, form, defaults,PRMPT,1) form.line = 1 input.form = defaults add.help.loop: CALL *HELP.PRINT.B(form,1) add.input.loop: TPRINT form: temp = input.form CALL *CINPUT.B(SEC.PRMPT,temp, special, form,form) IF special = NEXT.PAGE OR special = PREV.PAGE THEN GOTO add.input.loop ***************************************************************************** * If the subroutine CINPUT.B returns a value in special which is not equal * to 0 then the subroutine has received a special character, such as an * ESCAPE, UP.ARROW, DOWN.ARROW, F1, or F10. If the 'variable' FL confuses * you, please refer to the EQU at the top of this file. ***************************************************************************** IF special # 0 THEN GOSUB handle.special IF exiting = 1 THEN RETURN BEGIN CASE ****************** * F1 was Pressed * ****************** CASE special = F.1 CALL *HELP.PRINT.B(form,3) GOTO add.input.loop ****************** * F4 was Pressed * ****************** CASE special = F.4 IF FL = 1 THEN temp="*" GOTO new.enter END ********************** * ESCAPE was pressed * ********************** CASE special = ESCAPE IF only.once # 0 THEN pass.args = "" pass.args<1>=-1 END IF group.modify THEN CLEAR.HELP flag=1 CALL *YES.NO.BOX.B(17, UVREADMSG(073066,"") ,flag) IF flag = 1 THEN GOSUB save.files END END TPRINT @(-1): RETURN END CASE GOTO add.help.loop END ***************************************************************************** * This is where we go if the subroutine CINPUT.B did NOT return any special * code of any type. This means that we got a fairly good representation * of actual data. But this actually needs to be checked for collisions, or if * a CR is all that we get back we might need to actually to generate the next * valid peice of data. ***************************************************************************** ELSE new.enter: BEGIN CASE CASE FL = 1 BEGIN CASE CASE temp="*" message.id=071033 GOSUB List.groups temp=temp.array input.form = temp CALL *PUT.FORM.B(form.size,form,input.form,PRMPT,1) IF temp=-1 OR temp="" THEN GOTO add.help.loop GOTO new.enter CASE temp # "" rec.no = 0 CALL *LOC.BY.FLD.B(group.array,group.count,1,1,temp,rec.no) IF rec.no = 0 THEN input.form = temp END ELSE flag = 0 CLEAR.HELP CALL *YES.NO.BOX.B(17,UVREADMSG(071010,""),flag) IF flag = 1 THEN only.once += 1 pass.args<1>=2 pass.args<2>=rec.no pass.args<3>=1 pass.args<4>= group.array pass.args<5>=2 pass.args<6>=group.array operation=2 GOTO Beginning END TPRINT form:PRMPT:input.form: TPRINT STR(" ",FLCLEAR - LEN(input.form)): GOTO add.help.loop END CASE DEFAULT input.form = "" CLEAR.HELP CALL *HELP.BOX.B(17,5,50, UVREADMSG(071004,"")) GOTO add.help.loop END CASE CASE FL = 2 BEGIN CASE CASE temp = "" input.form=next.gid CASE NUM(temp) = 1 rec.no = 0 CALL *LOC.BY.FLD.B(group.array,group.count,1,3,temp,rec.no) IF rec.no = 0 THEN input.form = temp END ELSE CLEAR.HELP CALL *HELP.BOX.B(17,5,68, UVREADMSG(071005,temp)) TPRINT form:PRMPT:input.form: TPRINT STR(" ",FLCLEAR - LEN(input.form)): GOTO add.help.loop END CASE DEFAULT CLEAR.HELP CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071006,"")) TPRINT form:PRMPT:input.form: TPRINT STR(" ",FLCLEAR - LEN(input.form)): GOTO add.help.loop END CASE END CASE TPRINT form:PRMPT:input.form: TPRINT STR(" ",FLCLEAR-LEN(input.form)): form.line += 1 IF form.line > form.size THEN GOTO store.rec END ELSE GOTO add.help.loop END GOTO add.help.loop RETURN store.rec: CLEAR.HELP BEGIN CASE CASE input.form<1> = "" CALL *HELP.BOX.B(17,5,50, UVREADMSG(071004,"")) FL = 1 GOTO add.help.loop CASE input.form<2> = "" CALL *HELP.BOX.B(17,5,50, UVREADMSG(071004,"")) FL = 2 GOTO add.help.loop END CASE flag = 1 CALL *YES.NO.BOX.B(17, UVREADMSG(071007,"") , flag) ******************************************************************** * If we get a -1 then someone hit ESCAPE, so no changes, save info * ******************************************************************** IF flag = -1 THEN form.line = 1 GOTO add.help.loop END ********************************************************************** * If we get a 0 then they said NO, so clear the info and input again * ********************************************************************** ELSE IF flag = 0 THEN CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071008,"")) GOTO add.form.loop END *********************************************************************** * If we get here then they said YES, so save the info and input again * *********************************************************************** CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071009,"")) temp.rec = "" temp.rec<1,1>=input.form<1> temp.rec<1,2>="" temp.rec<1,3>=input.form<2> temp.rec<1,4>="" ins temp.rec<1> BEFORE group.array<-1> group.count += 1 GOSUB gid.next ******************************************* * Someone has changed something somewhere * ******************************************* IF group.modify = 0 THEN group.modify = 1 END IF only.once # 0 THEN GOSUB save.files only.once -= 1 pass.args="" pass.args = 0 RETURN END GOTO add.form.loop RETURN delete.list: CALL *DRAW.SCRN.B( UVREADMSG(071003,"") ,2) message.id=071011 GOSUB List.groups IF sel.val = -1 THEN IF operation = 3 THEN TPRINT @(-1) END RETURN END ntemp.array = "" ntemp.array<1>=group.array ntemp.array<2>=group.array flag = 0 CALL *PUT.FORM.B(form.size,form,ntemp.array,PRMPT,1) CLEAR.HELP CALL *YES.NO.BOX.B(17, UVREADMSG(071012,"") ,flag) IF flag = 1 THEN CALL *PUT.FORM.B(form.size,form,temp.array,PRMPT,0) str = UVREADMSG(071013,ntemp.array<1>) title = UVREADMSG(071014,group.array) ntemp.array = "" ntemp.count = 0 FOR I = 1 to passwd.count IF passwd.array = group.array THEN ntemp.count += 1 ntemp.array = passwd.array ntemp.array = I END NEXT I DEL group.array DEL temp.array group.count -= 1 reassign.loop: IF ntemp.count # 0 THEN sel.val = 1 CALL *HELP.PRINT.B( UVREADMSG(071015,"") ,1) CALL *LIST.BOX.B(title,4,11,ntemp.array,ntemp.count,1,sel.val,0) IF sel.val # -1 THEN CALL *HELP.PRINT.B( UVREADMSG(071016,ntemp.array),1) sel2.val = 1 junk=UVREADMSG(071011,"") CALL *LIST.BOX.B(junk,4,11,temp.array,group.count,2,sel2.val,0) IF sel2.val = -1 THEN GOTO reassign.loop END ELSE passwd.array,4> = temp.array CLEAR.HELP flag = 1 junk.mess=UVREADMSG(071017,ntemp.array) CALL *YES.NO.BOX.B(17,junk.mess, flag) IF flag = 1 THEN command = "SH -c 'find " command:=passwd.array,6> command:=" -exec chgrp ":temp.array command:=" {} \; '" EXECUTE command CAPTURING ERROR END DEL ntemp.array ntemp.count -= 1 GOTO reassign.loop END GOTO reassign.loop END END next.gid = 1 GOSUB gid.next group.modify = 1 GOSUB save.files END ELSE str = UVREADMSG(071018,ntemp.array<1>) END CLEAR.HELP flag = 1 CALL *YES.NO.BOX.B(17, str, flag) IF flag = 1 THEN CALL *PUT.FORM.B(form.size, form, temp.array,PRMPT,0) GOTO delete.list END ELSE IF operation = 3 THEN TPRINT @(-1) RETURN END RETURN modify.list: CALL *DRAW.SCRN.B( UVREADMSG(071002,"") ,2) message.id=071011 GOSUB List.groups IF sel.val = -1 THEN IF operation = 2 THEN TPRINT @(-1) RETURN END temp.array = "" input.form<1>=group.array input.form<2>=group.array cur.record = sel.val CALL *HELP.PRINT.B(Key.Help.Str,2) modify.form.loop: CALL *PUT.FORM.B(form.size,form,input.form,PRMPT,1) form.line = 1 modify.help.loop: CALL *HELP.PRINT.B(form,1) modify.input.loop: TPRINT form: temp = input.form special = 0 CALL *CINPUT.B(SEC.PRMPT, temp, special,form,form) IF special = NEXT.PAGE OR special = PREV.PAGE THEN GOTO modify.input.loop IF special # 0 THEN GOSUB handle.special IF exiting = 1 THEN RETURN BEGIN CASE ****************** * F1 was Pressed * ****************** CASE special = F.1 CALL *HELP.PRINT.B(form,3) GOTO modify.input.loop ********************** * ESCAPE was pressed * ********************** CASE special = ESCAPE IF group.modify THEN flag=1 CLEAR.HELP CALL *YES.NO.BOX.B(17, UVREADMSG(073066,"") ,flag) IF flag = 1 THEN GOSUB save.files END END IF only.once THEN only.once -= 1 RETURN END ELSE TPRINT @(-1): END RETURN END CASE GOTO modify.help.loop END * * Something other than a special key was pressed. * ELSE IF temp#input.form THEN BEGIN CASE CASE FL = 1 BEGIN CASE CASE temp # "" rec.no = 0 CALL *LOC.BY.FLD.B(group.array, group.count, 1,1, temp, rec.no) IF rec.no = 0 THEN input.form = temp END ELSE CLEAR.HELP CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071019,"")) TPRINT form:PRMPT:input.form: GOTO modify.help.loop END END CASE CASE FL = 2 IF temp # "" THEN CLEAR.HELP CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071020,"")) TPRINT form:PRMPT:input.form: form.line=1 GOTO modify.help.loop END END CASE END TPRINT form:PRMPT:input.form: TPRINT STR(" ",FLCLEAR-LEN(input.form)): form.line += 1 IF form.line > 1 THEN IF input.form<1> = group.array AND input.form<2> = group.array THEN CLEAR.HELP CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071021,"")) IF only.once THEN only.once -= 1 RETURN END ELSE GOTO label.another END END CLEAR.HELP flag = 0 CALL *YES.NO.BOX.B(17, UVREADMSG(071022,""), flag) ***************************************************************** * If we get a -1 then someone hit ESCAPE, no changes, save info * ***************************************************************** IF flag = -1 THEN form.line = 1 GOTO modify.help.loop END ELSE IF flag = 0 THEN CLEAR.HELP CALL *HELP.BOX.B(17,5,50, UVREADMSG(071021,"")) GOTO label.another END CALL *HELP.BOX.B( 17,5,50,UVREADMSG(071023,"")) group.array=input.form<1> group.array=input.form<2> ******************************************* * Someone has changed something somewhere * ******************************************* IF group.modify = 0 THEN group.modify = 1 END GOSUB save.files label.another: IF only.once THEN only.once -= 1 RETURN END CLEAR.HELP flag = 1 CALL *YES.NO.BOX.B(17, UVREADMSG(071024,"") , flag) IF flag = 1 THEN CALL *PUT.FORM.B(form.size, form, input.form, PRMPT, 0) CLEAR.HELP GOTO modify.list END ELSE * * What this test is for is to see if we will be returning * to the Toplevel menu or not. if operation = 2 then * we will be returning. * IF operation = 2 THEN TPRINT @(-1) form.line = 1 RETURN END END ELSE GOTO modify.help.loop END GOTO modify.help.loop RETURN handle.special: BEGIN CASE CASE special = F.10 temp = 1 CALL *DO.MNU.BAR.B(Menu.Bar, temp, form.size, form, input.form) BEGIN CASE CASE temp = 1 IF group.modify = 1 THEN flag = 1 CALL *PUT.FORM.B(form.size, form, input.form, PRMPT,1) CLEAR.HELP CALL *YES.NO.BOX.B(17, UVREADMSG(073066,"") ,flag) IF flag = 1 THEN GOSUB save.files END ELSE CALL *HELP.BOX.B(17,5,50,UVREADMSG(071026,"")) END END ELSE CALL *HELP.BOX.B(17,5,50,UVREADMSG(071027,"")) END CASE temp = 2 IF group.modify = 1 THEN flag = 0 CALL *PUT.FORM.B(form.size, form, input.form, PRMPT,1) CLEAR.HELP CALL *YES.NO.BOX.B(17, UVREADMSG(071028,"") ,flag) IF flag = 1 THEN GOSUB init.files CALL *HELP.PRINT.B( UVREADMSG(071029,"") ,2) END ELSE CALL *HELP.PRINT.B( UVREADMSG(071030,"") ,2) END END ELSE CALL *HELP.PRINT.B( UVREADMSG(071031,"") ,2) END CASE temp = 3 IF group.modify = 1 THEN CALL *PUT.FORM.B(form.size, form, input.form, PRMPT,1) CLEAR.HELP flag = 1 CALL *YES.NO.BOX.B(17, UVREADMSG(073066,"") ,flag) IF flag = 1 THEN GOSUB save.files END END TPRINT @(-1): exiting = 1 RETURN CASE temp = 4 CALL *PUT.FORM.B(form.size, form, input.form, PRMPT, 0) CLEAR.HELP operation = 4 GOSUB modify.list operation = 1 CALL *DRAW.SCRN.B(UVREADMSG(071001,""),2) CALL *PUT.FORM.B(form.size, form, defaults, PRMPT, 0) input.form = "" CASE temp = 5 CALL *PUT.FORM.B(form.size, form, input.form, PRMPT, 0) CLEAR.HELP operation = 5 GOSUB delete.list operation = 1 CALL *DRAW.SCRN.B(UVREADMSG(071001,""),2) CASE temp = 6 message.id=071033 GOSUB List.groups CASE temp = 7 sel.val = 1 CALL *HELP.BOX.B(3,11,60,CONVERT(@FM," ",UVREADMSG(071039,""))) CALL *PUT.FORM.B(form.size, form, input.form,PRMPT,1) CASE temp = 8 sel.val = 1 CALL *HELP.BOX.B(3,11,60,CONVERT(@FM," ",UVREADMSG(071040,""))) CALL *PUT.FORM.B(form.size, form, input.form,PRMPT,1) CASE temp = 9 sel.val = 1 CALL *HELP.BOX.B(3,11,60,CONVERT(@FM," ",UVREADMSG(071041,""))) CALL *PUT.FORM.B(form.size, form, input.form,PRMPT,1) CASE temp = 10 message=UVREADMSG(071042,"") CONVERT @FM TO " " IN message CALL *HELP.BOX.B(3,10,60,message) CASE temp = 11 message=UVREADMSG(076001,"") CONVERT @FM TO " " IN message CALL *HELP.BOX.B(3,10,60,message) CASE temp = 12 CALL *HELP.BOX.B(3,10,45,UVREADMSG(076000,"")) END CASE CALL *PUT.FORM.B(form.size, form, input.form, PRMPT,1) ************************ * Up Arrow was Pressed * ************************ CASE special = UP.ARROW TPRINT form:PRMPT: IF input.form # "" THEN TPRINT input.form:STR(" ",FLCLEAR-LEN(input.form)): END ELSE TPRINT defaults:STR(" ",FLCLEAR-LEN(defaults)): END form.line -= 1 IF form.line < 1 THEN form.line = form.size ************************** * Down Arrow was Pressed * ************************** CASE special = DOWN.ARROW TPRINT form:PRMPT: IF input.form # "" THEN TPRINT input.form:STR(" ",FLCLEAR-LEN(input.form)): END ELSE TPRINT defaults:STR(" ",FLCLEAR-LEN(defaults)): END form.line += 1 IF form.line > form.size THEN form.line = 1 END CASE RETURN gid.next: temp = 0 CALL *LOC.BY.FLD.B(group.array, group.count, 1, 3, next.gid, temp) IF temp # 0 THEN next.gid += 1 GOTO gid.next END RETURN init.files: IF etc.open # 1 THEN OPENPATH "/etc" TO etc.file ELSE STOP UVREADMSG(071034,"") etc.open = 1 ;* File is open! END group.modify = 0 ;* No changes IF group.count = 0 THEN CALL *RD.UNX.FIL.B(etc.file, "group", group.array, group.count) END IF passwd.count = 0 THEN CALL *RD.UNX.FIL.B(etc.file, "passwd", passwd.array, passwd.count) END RETURN save.files: IF etc.open # 1 THEN OPEN "etc" TO etc.file ELSE STOP UVREADMSG(071034,"") etc.open = 1 END temp = 0 CALL *WR.UNX.FIL.B(etc.file, "group", group.array, temp) CALL *WR.UNX.FIL.B(etc.file, "passwd", passwd.array, temp) IF operation = 1 THEN CALL *HELP.BOX.B(17,5,50, UVREADMSG(071035,"")) END group.modify = 0 RETURN init.form: Key.Help.Str = CONVERT(@FM, " ", UVREADMSG(071036,"")) form="" scratch = UVREADMSG(071037,"") form<1,1>=@(10,6) form<1,2>=@(30,6) form<1,3>=scratch<1> form<1,4>=scratch<2> form<1,5>=scratch<3> form<1,6>=30 form<1,7>=0 form<2,1>=@(10,8) form<2,2>=@(30,8) form<2,3>=scratch<4> form<2,4>=scratch<5> form<2,5>=scratch<6> form<2,6>=10 form<2,7>=0 defaults="" defaults<1>="" defaults<2>="" form.size = 2 RETURN List.groups: temp.array="" CALL *HELP.PRINT.B(UVREADMSG(073058,""),3) FOR i=1 TO group.count temp.array=group.array temp.array=group.array NEXT i sel.val=1 mesg=UVREADMSG(message.id,"") CALL *LIST.BOX.B(mesg,4,11,temp.array,group.count,2,sel.val,0) CLEAR.HELP RETURN init.menu.bar: IF operation = 3 THEN RETURN * Current High Action Code is 12. The next new action should be 13. * Action 4 is not used. Menu.Bar = "" Menu.Bar<1,1> = 3 ;* Number of Items in Menu.Bar Menu.Bar<1,2> = 1 ;* Line # on which to print the Menu Bar scratch = UVREADMSG(071038,"") * First Item Menu.Bar<2,1,1>=scratch<1> ;* SubMenu Title "File" Menu.Bar<2,1,2>=3 ;* # of items in SubMenu Menu.Bar<2,1,3>=scratch<2> ;* Help string for "File" Menu * SubMenu #1 Menu.Bar<2,2,1>=scratch<3> ;* SubMenu Item "Save" Menu.Bar<2,2,2>=1 ;* Action Code (Returned to calling process) Menu.Bar<2,2,3>=scratch<4> ;* Help string for "Save" Menu.Bar<2,3,1>=scratch<5> ;* SubMenu Item "Refresh" Menu.Bar<2,3,2>=2 ;* Action Code Menu.Bar<2,3,3>=scratch<6> ;* Help string for "Refresh" Menu.Bar<2,4,1>=scratch<7> ;* SubMenu Item "Exit" Menu.Bar<2,4,2>=3 ;* Action Code Menu.Bar<2,4,3>=scratch<8> ;* Help string for "Exit" * SubMenu #2 Menu.Bar<3,1,1>=scratch<9> ;* SubMenu Title "Action" Menu.Bar<3,1,2>=3 ;* # of items in SubMenu Menu.Bar<3,1,3>=scratch<10> ;* Help string for "Action" Menu.Bar<3,2,1>=scratch<11> ;* SubMenu Item "Modify" Menu.Bar<3,2,2>=4 ;* Action Code Menu.Bar<3,2,3>=scratch<12> ;* Help string for "Modify" Menu.Bar<3,3,1>=scratch<13> ;* SubMenu Item "Delete" Menu.Bar<3,3,2>=5 ;* Action Code Menu.Bar<3,3,3>=scratch<14> ;* Help string for "Delete" Menu.Bar<3,4,1>=scratch<15> ;* SubMenu Item "List" Menu.Bar<3,4,2>=6 ;* Action Code Menu.Bar<3,4,3>=scratch<16> ;* Help string for "List" * SubMenu #3 Menu.Bar<4,1,1>=scratch<17> ;* SubMenu Title Menu.Bar<4,1,2>=6 ;* # of items in SubMenu Menu.Bar<4,1,3>=scratch<18> ;* Help string for "Help" Menu.Bar<4,2,1>=scratch<19> ;* SubMenu Item "on File" Menu.Bar<4,2,2>=7 ;* Action Code Menu.Bar<4,2,3>=scratch<20> ;* Help string for "on File" Menu.Bar<4,3,1>=scratch<21> ;* SubMenu Item "on Action" Menu.Bar<4,3,2>=8 ;* Action Code Menu.Bar<4,3,3>=scratch<22> ;* Help string for "on Action" Menu.Bar<4,4,1>=scratch<23> ;* Submenu Item "on Help" Menu.Bar<4,4,2>=9 ;* Action Code Menu.Bar<4,4,3>=scratch<24> ;* Help string for "on Help" * Added by DTM 4/5/91 scratch=UVREADMSG(073089,"") Menu.Bar<4,5,1>=scratch<2> Menu.Bar<4,5,2>=10 Menu.Bar<4,5,3>=scratch<3> Menu.Bar<4,6,1>=scratch<4> Menu.Bar<4,6,2>=11 Menu.Bar<4,6,3>=scratch<5> Menu.Bar<4,7,1>=scratch<6> Menu.Bar<4,7,2>=12 Menu.Bar<4,7,3>=scratch<7> RETURN End.Loop: only.once=0 pass.args="" CLOSE etc.file etc.open=0 CLOSE uv.acct uv.acct.open=0 passwd.count=0 passwd.array="" group.array="" group.count=0 STOP @(-1) RETURN END