FTN4,L
C 
C  ***************************************************************
C  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS     *
C  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
C  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
C  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
C  ***************************************************************
C 
C     SOURCE PART NUMBER :  92067-18364 
C 
C     RELOCATABLE PART NUMBER : 92067-16361 
C 
C     PROGRAMER(S)   : J.M.N. 
C 
C 
C 
C 
C 
C     ALTER,USER
C     ALTER,GROUP 
C     CALLING SEQUENCE: 
C        CALL ACALU(ITYPE)
C 
C        WHERE: ITYPE=1 FOR USER
C               ITYPE=2 FOR GROUP 
C 
C     ALTER,USER
C 
C     ACCOUNT NAME                FUNCTION
C 
C 
C      USER.GROUP          ALTER ONE ENTRY FOR ACCOUNT
C 
C      USER.@              ALTER ALL ENTRIES IN ALL GROUPS
C                           WITH NAME USER
C 
C      @.GROUP             ALTER ALL USERS OF GROUP 
C 
C 
C      @.@                 ALTER ALL USERS (DEFAULT)
C 
C     ALTER,GROUP 
C 
C     GROUP                ALTER "GROUP"
C 
C     @                    ALTER ALL GROUPS 
C 
C 
C     ACERRS:            -200  ACCOUNT NOT FOUND
C                        -201  NO FREE ACCOUNTS 
C                        -202  ACCOUNT WITH THIS NAME ALREADY EXISTS
C                        -203  INVALID ACCOUNT NAME 
C                        -204  INVALID PASSWORD 
C                        -206  INVALID FILE NAME
C                        -207  INVALID CAPABILITY 
C                        -208  INVALID DISC LIMIT 
C                        -209  INVALID SST ENTRY
C                        -210  CONFLICT IN SST DEFINITION 
C                        -211  USER OR GROUP ID NOT AVAILABLE 
C                        -212  INVALID NUMBER OF SST SPARES 
C                         FMP ACERR (READF,WRITF) 
C 
C 
      SUBROUTINE ACALU(ITYPE) ,92067-16361 REV.1940 790726  
      LOGICAL ISRCH,INUG
      DIMENSION MSNAM(5),MSGNM(6),MSGST(12),MSUPW(7),MSHFL(8) 
      DIMENSION MSCAP(8),MSMXD(12),MSSST(29),MSSPR(11)
      DIMENSION MSGNX(6),LUMS1(27),LUMS2(32)
      DIMENSION IUSER(5),IDMY(2),IRECG(2),IRECU(2),IRENG(2) 
      DIMENSION NAME(11),NAMEU(11),NAMEG(11)
      COMMON /ACOM1/NDCB(272),NBUF(128) 
      COMMON /ACOM6 /LOC(6),IRN,IPFLG 
      COMMON /ACOM7/IPBUF(11),ISTRC,JPBUF(11) 
      COMMON /ACOM9/IBUF(40),JBUF(96) 
      COMMON /ACOMA /ISRCH
      COMMON /ACOM4/ ICMND(40)
      COMMON /ACOM3/LIST(10),LDCB(144),LLIST,LLDCB(144),ITTY,ITDCB(144) 
      COMMON /ACOMD/ICLASS,KPB,KRR,KRRR,IDSES,MYCAP,MYDIR,MYGID 
      DATA IAT/2H@  / 
      DATA LPPG,I0,I6 /54,2HI0,2HI6 / 
      DATA MSNAM/2HUS,2HER,2H N,2HAM,2HE?/
      DATA MSGNM/2HGR,2HOU,2HP ,2HNA,2HME,2H? / 
      DATA MSGST/2HUS,2HE ,2HGR,2HOU,2HP ,2HSS,2HT ,2H(Y,2H O,
     1     2HR ,2HN),2H? /
      DATA MSUPW/2HUS,2HER,2H P,2HAS,2HSW,2HOR,2HD?/
      DATA MSHFL/2HUS,2HER,2H H,2HEL,2HLO,2H F,2HIL,2HE?/ 
      DATA MSCAP/2HUS,2HER,2H C,2HAP,2HAB,2HIL,2HIT,2HY?/ 
      DATA MSMXD/2HMA,2HXI,2HMU,2HM ,2HDI,2HSC,2H C,2HAR,2HTR,
     1     2HID,2HGE,2HS?/
      DATA MSSST/2HSS,2HT ,2HDE,2HFI,2HNI,2HTI,2HON,2H? ,2H(E,
     1     2HNT,2HER,2H S,2HES,2HSI,2HON,2H L,2HU,,2H S,2HYS, 
     2     2HTE,2HM ,2HLU,2H, ,2HOR,2H E,2HNT,2HER,2H /,2HE)/ 
      DATA MSSPR/2HNU,2HMB,2HER,2H O,2HF ,2HSS,2HT ,2HSP,2HAR,
     1     2HES,2H? / 
      DATA MSGNX/2HNE,2HXT,2H G,2HRO,2HUP,2H? / 
      DATA LUMS1/2HCO,2HNF,2HLI,2HCT,2H I,2HN ,2HSS,2HT ,2HDE,
     1     2HFI,2HNI,2HTI,2HON,2H -,2H A,2HSS,2HUM,2HIN,2HG , 
     2     2HUS,2HER,2H D,2HEF,2HIN,2HIT,2HIO,2HN / 
      DATA LUMS2/2HUS,2HER,2H: ,2HSE,2HS ,2HLU,2H  ,2H  ,2H, ,
     1     2HSY,2HS ,2HLU,2H  ,2H  ,2H  ,2H  ,2H G,2HRO,2HUP, 
     2     2H: ,2HSE,2HS ,2HLU,2H  ,2H  ,2H, ,2HSY,2HS ,2HLU, 
     3     2H  ,2H  ,2H  /
C 
C     SET IDG TO NO CHANGE
C 
      IDG=-1
      NAMEG(2)=2H/
C 
C     PARSE ACCOUNT NAME
C 
      JERR=0
      CALL PARSN(NAME,ICMND,80,ISTRC,JERR)
      IF(JERR.NE.0) GO TO 2800
C 
C     TEST FOR USER.GROUP FORMAT
C 
      IF(LBYTE(NAME(1)).NE.0) GO TO 90
      NAME(7 )=2HGE 
      NAME(8 )=2HNE 
      NAME(9 )=2HRA 
      NAME(10)=2HL
      NAME(11)=2H 
C 
C     IF GROUP MOVE NAME(2) TO NAME(7)
C 
   90 GO TO (110,100),ITYPE 
  100 DO 101 I=2,6
  101 NAME(I+5)=NAME(I) 
      NAME(2)=0 
C 
C     SAVE RESET VALUES FOR LOOP
C 
  110 IU=NAME(2)
      IG=NAME(7)
C 
C     CHECK TO SEE IF ACCOUNT EXISTS
C 
      CALL ACFDA(NAME(2),NAME(7),IDIRN,IDMY,IDMY,JERR)
      NAME(2)=IU
      NAME(7)=IG
      IF(JERR.NE.0) GO TO 2900
C 
C     MAKE SURE HE IS DOING HIS GROUP 
C 
      CALL ACDIR(1,IDIRN,IBUF,IERR) 
C 
C     SET MAXIMUM CAPABILITY
C 
      MAXCAP=63 
      IF(IDSES.EQ.7777B) GO TO 120
      MAXCAP=62 
      IF(IG.NE.IAT.AND.MYGID.EQ.IBUF(13)) GO TO 120 
      JERR=46 
      GO TO 2900
C 
C 
C     TELL NO CHANGE AND DEFAULT ANSWERS
C 
  120 CALL ACWRI(42HENTER " " FOR DEFAULT OR /  FOR NO CHANGE ,21)
      INUG=.TRUE. 
      IRENG(1)=-1 
      NAMEU(2)=2H/
      IF(IU.EQ.IAT.OR.IG.EQ.IAT) GO TO 1000 
C 
C     IF GROUP "GENERAL" CANT CHANGE NAME 
C 
      IF(IBUF(12).EQ.0.AND.IBUF(13).EQ.3) GO TO 1000
C 
C     SAVE USER ID
C 
C 
      INUG=.FALSE.
      IDOLD=IBUF(12)
      GO TO (400,420),ITYPE 
C 
C     PROMPT FOR USER NAME
C 
  390 CALL ACERR(-202)
  400 CALL ACPRM(20HNEW USER NAME OR / ?  ,10)
      CALL ACREI(IBUF,IERR) 
      ICHAR=1 
      CALL PARSN(NAMEU,IBUF,80,ICHAR,IERR)
      IF(NAMEU(2).EQ.2H/A.OR.NAMEU(2).EQ.2H/E) RETURN 
      IF(NAMEU(1).EQ.0) NAMEU(2)=2H/
      IF((IERR.EQ.0.OR.NAMEU(2).EQ.2H/ ).AND.NAMEU(2).NE.2H@ )
     1 GO TO 410
      CALL ACERR(-203)
      GO TO 400 
C 
C     PROMPT FOR NEW GROUP
C 
  405 CALL ACERR(IERR)
  410 IDG=-1
      IF(IDOLD.EQ.7777B.OR.IDSES.NE.7777B) GO TO 465
      CALL ACPRM(16HNEW GROUP OR / ?   ,8)
      GO TO 430 
C 
C     PROMPT FOR NEW GROUP NAME 
C 
  415 CALL ACERR(-202)
  420 CALL ACPRM(22HNEW GROUP NAME OR / ?  ,11) 
  430 CALL ACREI(IBUF,IERR) 
      ICHAR=1 
      CALL PARSN(NAMEG,IBUF,80,ICHAR,IERR)
      IF(NAMEG(2).EQ.2H/A.OR.NAMEG(2).EQ.2H/E) RETURN 
      IF(NAMEG(1).NE.0) GO TO 435 
      NAMEG(1)=3400B
      NAMEG(2)=2HGE 
      NAMEG(3)=2HNE 
      NAMEG(4)=2HRA 
      NAMEG(5)=2HL
  435 IF((IERR.EQ.0.OR.NAMEG(2).EQ.2H/ ).AND.NAMEG(2).NE.2H@ )
     1 GO TO 440
      CALL ACERR(-203)
      GO TO (410,420),ITYPE 
C 
C     GET ADDRESS OF NEW GROUP ACCOUNT
C 
  440 IUSER(1)=0
      IF(NAMEG(2).EQ.2H/ ) GO TO 465
      CALL ACFDA(IUSER,NAMEG(2),IDGR,IDMY,IRENG,IERR) 
      IF(IERR.NE.0) GO TO (405,1000),ITYPE
      GO TO (450,415),ITYPE 
C 
C     SEE IF ACCOUNT ALREADY EXISTS 
C 
  450 IF(NAMEU(2).EQ.2H/ ) GO TO 460
      CALL ACFDA(NAMEU(2),NAMEG(2),IDMY,IDMY,IDMY,IERR) 
      GO TO 470 
  465 IF(NAMEU(2).EQ.2H/ ) GO TO 1000 
      CALL ACFDA(NAMEU(2),NAME(7),IDMY,IDMY,IDMY,IERR)
      IF(IERR.EQ.-200) GO TO 1000 
      GO TO 390 
  460 CALL ACFDA(NAME(2),NAMEG(2),IDMY,IDMY,IDMY,IERR)
  470 IF(IERR.NE.-200) GO TO 390
      CALL ACDIR(1,IDGR,IBUF,IERR)
      IDG=IBUF(13)
      IRG=IBUF(14)
C 
 1000 IGSST=1 
      ID=0
      GO TO (1105,1450),ITYPE 
C 
C     ALTER USER PROMPTS
C 
C 
C     PROMPT FOR WHETHER TO USE GROUP SST 
C 
 1105 CALL ACPRM(MSGST,12)
C 
C     READ AND PARSE FOR Y OR N 
C 
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL PARSN(JPBUF,IBUF,80,ICHAR,JERR)
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(JPBUF(2).EQ.2H/A) RETURN 
C 
C     SET IGSST TO: 
C                   0        FOR NO GROUP SST 
C                   100000B  FOR GROUP SST
C                   1        FOR SAME AS PREVIOUS 
C 
      ITEMP=JPBUF(2)/256
      IF(ITEMP.EQ.131B) IGSST=100000B 
      IF(ITEMP.EQ.116B) IGSST=0 
C 
C     ALTER,USER PROMPTS
C 
      CALL ACPRM(MSUPW,7) 
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL PARSN(LDCB,IBUF,80,ICHAR,JERR) 
      IF(JERR.EQ.0) GO TO 1140
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(LDCB(2).EQ.2H/A) RETURN
      IF(LDCB(2).EQ.2H/ ) GO TO 1180
 1110 CALL ACERR(-204)
      GO TO 110 
C 
C     PASSWORD CAN'T BE IN USER.GROUP FORMAT
C 
 1140 IF(IAND(LDCB(1),255).NE.0) GO TO 1110 
 1170 LDCB(1)=LDCB(1)/256 
      IF(ITLOG.EQ.0.OR.LDCB(1).GT.0) GO TO 1200 
 1180 LDCB(1)=-1
C 
C     PROMPT FOR USER HELLO FILE
C 
 1200 CALL ACPRM(MSHFL,8) 
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL NAMR(LDCB(7),IBUF,80,ICHAR)
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(LDCB(7).EQ.2H/A) RETURN
C     CHECK IF NULL OR BLANK (DEFAULT TO NO HELLO FILE) 
C 
      ITEMP=IAND(LDCB(10),3)
C 
      LDCB(10)=LDCB(11) 
      LDCB(11)=LDCB(12) 
      IF(ITEMP.NE.0) GO TO 1208 
      LDCB(7)=2H
      LDCB(8)=2H
      LDCB(9)=2H
C 
C     CHECK IF ASCII
C 
 1208 IF(ITEMP.NE.1) GO TO 1300 
      CALL ACERR(-206)
      GO TO 1200
C 
C     PROMPT FOR USER CAPABILITY
C 
 1300 CALL ACPRM(MSCAP,8) 
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL NAMR(LDCB(12),IBUF,80,ICHAR) 
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(LDCB(12).EQ.2H/A) RETURN 
C 
C     CHECK FOR NULL OR BLANK (DEFAULT CAPABILITY TO 30)
C 
      ITEMP=IAND(LDCB(15),3)
      IF(LDCB(12).NE.2H/ ) GO TO 1305 
      LDCB(12)=-1 
      GO TO 1400
C 
C     CHECK IF INTEGER, 1-63
C 
 1305 IF(ITEMP.LE.1) GO TO 1320 
 1310 CALL ACERR(-207)
      GO TO 1300
 1320 IF(ITEMP.EQ.0) LDCB(12)=30
      IF(LDCB(12).LE.0) GO TO 1310
      IF(LDCB(12).GT.MAXCAP) GO TO 1310 
C 
C     PROMPT FOR MAXIMUM DISC CARTRIDGES
C 
 1400 CALL ACPRM(MSMXD,12)
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL NAMR(LDCB(13),IBUF,80,ICHAR) 
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(LDCB(13).EQ.2H/A) RETURN 
C 
C     CHECK FOR NULL OR BLANK (DEFAULT LIMIT TO 2)
C 
      ITEMP=IAND(LDCB(16),3)
      IF(LDCB(13).NE.2H/ ) GO TO 1405 
      LDCB(13)=-1 
      GO TO 1450
C 
C     CHECK FOR INTEGER BETWEEN 0 AND 60
C 
 1405 IF(ITEMP.LE.1) GO TO 1420 
 1410 CALL ACERR(-208)
      GO TO 1400
 1420 IF(ITEMP.EQ.0) LDCB(13)=2 
      IF((LDCB(13).GT.60).OR.(LDCB(13).LT.0)) GO TO 1410
C 
C     PROMPT FOR USER SST DEFINITION
C 
 1450 ICL=29
      KNDX=14 
 1500 CALL ACPRM(MSSST,ICL) 
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL NAMR(JPBUF,IBUF,80,ICHAR)
C 
C     CHECK FOR REQUEST TO END SST DEFINITION 
C 
      IF(JPBUF(1).EQ.2H/E.OR.JPBUF(1).EQ.2H/  ) GO TO 1600
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(JPBUF(1).EQ.2H/A) RETURN 
C 
C     CHECK FOR NULL OR BLANK (DEFAULT TO NO USER SST)
C 
      ITEMP=IAND(JPBUF(4),3)
      IF(KNDX.NE.33) GO TO 1510 
      IF(ITEMP.EQ.0) GO TO 1600 
C 
C     READ, PARSE AND VALIDATE SST ENTRY
C     SYSTEM LU MUST BE NUMERIC, 0-254
C     SESSION LU MUST BE NUMERIC, 4-63
C 
 1510 ISES=JPBUF(1)-1 
      CALL NAMR(JPBUF,IBUF,80,ICHAR)
      ISYS=JPBUF(1) 
      IF(ISYS.EQ.2H- ) GO TO 1525 
      IF(ITEMP.NE.1) GO TO 1540 
      IF((ISYS.LT.0).OR.(ISYS.GT.254)) GO TO 1540 
      ISYS=2*IAND(ISYS-1,255) 
 1520 IF(IAND(JPBUF(4),3).NE.1) GO TO 1540
 1525 IF((ISES.LT.3).OR.(ISES.GT.62)) GO TO 1540
 1530 KNDX=KNDX+1 
      IF(ISYS.EQ.2H- ) ISYS=1 
      LDCB(KNDX)=(ISYS*128)+ISES
      ICL=8 
      GO TO 1500
 1540 CALL ACERR(-209)
      ICL=8 
      GO TO 1500
C 
C     PROMPT FOR SST SPARES 
C 
 1600 LDCB(14)=KNDX 
      ISPAR=-1
      GO TO (1605,1630),ITYPE 
C 
C     ALTER,USER PROMPTS
C 
 1605 CALL ACPRM(MSSPR,11)
      CALL ACREI(IBUF,JERR) 
      ICHAR=1 
      CALL NAMR(JPBUF,IBUF,80,ICHAR)
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(JPBUF(1).EQ.2H/A) RETURN 
C 
C     CHECK FOR NULL OR BLANK (DEFAULT TO 0)
C 
      ITEMP=IAND(JPBUF(4),3)
      IF(ITEMP.LE.1) GO TO 1620 
      IF(JPBUF(1).EQ.2H/ ) GO TO 1900 
 1610 CALL ACERR(-212)
      GO TO 1605
 1620 IF(ITEMP.EQ.0) JPBUF(1)=5 
      IF((JPBUF(1).LT.0).OR.(JPBUF(1).GT.60)) GO TO 1610
      ISPAR=JPBUF(1)
 1900 IF(INUG.OR.IDOLD.EQ.7777B) GO TO 1630 
C 
C     PROMPT FOR LINK TO EXISTING ACCOUNT 
C 
 1901 CALL ACWRI(30HLINK TO AN EXISTING ACCOUNT ?  ,15) 
      CALL ACWRI(30H(ANY MOUNTED DISCS WILL NOT BE ,15) 
      CALL ACWRI(30H  TRANSFERED WITH THE ACCOUNT) ,15) 
      CALL ACPRM(30HENTER / OR USER.GROUP/PASSWORD  ,15)
      CALL ACREI(IBUF,IERR) 
      ICHAR=1 
      CALL PARSN(JPBUF,IBUF,80,ICHAR,IERR)
C 
C     CHECK FOR REQUEST TO ABORT COMMAND
C 
      IF(JPBUF(2).EQ.2H/A.OR.JPBUF(2).EQ.2H/E) RETURN 
C 
C     CHECK FOR NO CHANGE 
C 
      IF(JPBUF(2).EQ.2H/ ) GO TO 1630 
C 
C     CHECK FOR ACERR 
C 
      IF(IERR.EQ.0) GO TO 1904
      CALL ACERR(-203)
      GO TO 1901
C 
C     CHECK FOR NULL OR BLANK (DEFAULT TO N), OR N
C 
 1904 IF(JPBUF(1).EQ.0) GO TO 1630
C 
C     SET IPFLG TO RESET ID BIT MAP 
C 
      IF(IPFLG.EQ.0) IPFLG=1
C 
C     NAME MUST BE IN USER.GROUP FORMAT 
C 
      IF(IAND(JPBUF(1),255).NE.0) GO TO 1920
 1910 CALL ACERR(-203)
      GO TO 1901
C 
C     CHECK IF USER.GROUP ACCOUNT EXISTS
C 
 1920 CALL ACGTU(JPBUF(2),JPBUF(7),NBUF,IOFST,IERR) 
      IF(IERR.EQ.0) GO TO 1925
      CALL ACERR(-200)
      GO TO 1901
C 
C     CHECK THE PASSWORD (SKIP IF NO PASSWORD)
 1925 ITEMP=IAND(NBUF(IOFST+1),77777B)
      IF(ITEMP.EQ.0) GO TO 1950 
      CALL PARSN(JPBUF,IBUF,80,ICHAR,IERR)
      DO 1930 I=2,6 
      IF(JPBUF(I).NE.NBUF(IOFST+I)) GO TO 1940
 1930 CONTINUE
      GO TO 1950
 1940 CALL ACERR(-204)
      GO TO 1901
C 
C     GET THE USER ID FROM THE ACCOUNT ENTRY
C 
 1950 IDD=NBUF(IOFST+29)
      IF(IDD.GE.7776B) GO TO 1910 
      ID=IDD
C 
C     GET GROUP ACCOUNT 
C 
 1630 CALL RNRQ(1,IRN,ISTAT)
 1640 IUSER(1)=0
      CALL ACFDA(IUSER,NAME(7),IDIRN,IRECU,IRECG,JERR)
      IF(JERR.NE.0) GO TO 2600
      GO TO (1690,1645),ITYPE 
 1645 IF(INUG.OR.NAMEG(2).EQ.2H/ ) GO TO 1650 
C 
C     UPDATE DIRECTORY
C 
      CALL ACDIR(1,IDIRN,IBUF,IERR) 
      IBUF(1)=MBYTE(NAMEG(1)) 
      DO 1646 I=2,6 
      IBUF(I+5)=NAMEG(I)
 1646 CONTINUE
      CALL ACDIR(2,IDIRN,IBUF,IERR) 
 1650 CALL READF(NDCB,JERR,NBUF,128,LEN,IRECG)
      IOFST=IRECG(2)
      NBU6=NBUF(IOFST+6)-1
      IF(NBU6.GE.0.OR.NBU6.LT.-63) NBU6=-1
      NBUF(IOFST+6)=NBU6
      CALL ACAST(NBUF(IOFST+6)) 
      CALL WRITF(NDCB,JERR,NBUF,128,IRECG)
C 
C     SET TO SEARCH ALL USERS OF GROUP
C 
      NAME(2)=IAT 
      IU=IAT
C 
C     GET USER ACCOUNT
C 
 1690 ISRCH=.FALSE. 
 1700 CALL ACFDA(NAME(2),NAME(7),IDIRN,IRECU,IRECG,JERR)
      IF(JERR.NE.0) GO TO 2500
C 
C     UPDATE DIRECTORY IF REQUIRED
C 
      IF(INUG)GO TO 4740
      CALL ACDIR(1,IDIRN,IBUF,IERR) 
      IF(NAMEU(2).EQ.2H/ ) GO TO 4710 
C 
C     UPDATE USER NAME
C 
      IBUF(1)=IAND(NAMEU(1),177400B)+LBYTE(IBUF(1)) 
      DO 4700 I=2,6 
      IBUF(I)=NAMEU(I)
 4700 CONTINUE
C 
C     UPDATE GROUP NAME 
C 
 4710 IF(NAMEG(2).EQ.2H/ ) GO TO 4730 
      IBUF(1)=IOR(IAND(IBUF(1),177400B),MBYTE(NAMEG(1)))
      DO 4720 I=2,6 
      IBUF(I+5)=NAMEG(I)
 4720 CONTINUE
C 
C     UPDATE ID'S 
C 
 4730 IF(IBUF(12).LT.7776B.AND.ID.NE.0) IBUF(12)=ID 
      IF(IDG.LT.0) GO TO 4735 
      IBUF(13)=IDG
      IBUF(14)=IRG
 4735 CALL ACDIR(2,IDIRN,IBUF,IERR) 
 4740 IOFST=IRECU(2)
      CALL READF(NDCB,JERR,NBUF,128,LEN,IRECU)
      DO 1705 I=1,64
 1705 JBUF(I)=NBUF(I+IOFST) 
      IF(0.LE.JBUF(1))GO TO 1715
      IRECC=IAND(JBUF(64),77777B) 
      JOFST=0 
      IF(JBUF(64).LT.0) JOFST=64
      CALL READF(NDCB,JERR,NBUF,128,LEN,IRECC)
C 
C     RELEASE ENTRY FOR 2ND PART
C 
      JJDIR=(IRECC-LOC(6))*2+1
      IF(JOFST.NE.0) JJDIR=JJDIR+1
C 
C     MOVE TO JBUF
C 
 1709 DO 1710 I=1,33
 1710 JBUF(63+I)=NBUF(I+JOFST)
C 
C     CLEAR BIT FOR 2ND HALF
C 
      JBUF(1)=IAND(JBUF(1),77777B)
C 
C     IF GROUP BYPASS USER UPDATES
C 
 1715 IGSSTS=IAND(JBUF(33),100000B) 
      ISPARS=IAND(JBUF(32),255) 
      GO TO (1720,1760),ITYPE 
C 
C     UPDATE PASSWORD 
C 
 1720 IF(LDCB(1).LT.0) GO TO 1730 
      DO 1725 J=1,6 
 1725 JBUF(J)=LDCB(J) 
C 
C     UPDATE HELLO FILE 
C 
 1730 IF(LDCB(7).EQ.2H/ ) GO TO 1750
      DO 1740 J=7,11
 1740 JBUF(J)=LDCB(J) 
C 
C     UPDATE CAPABILITY 
C 
 1750 IF(JBUF(29).GE.7776B) GO TO 1755
      IF(LDCB(12).GE.0) JBUF(22)=LDCB(12) 
C 
C     UPDATE NUMBER OF DISCS
C 
 1755 IF(LDCB(13).GE.0) JBUF(31)=LDCB(13) 
C 
C     UPDATE ID'S 
C 
      IF(JBUF(29).LT.7776B.AND.ID.NE.0) JBUF(29)=ID 
      IF(IDG.GE.0) JBUF(30)=IDG 
C 
C     UPDATE USER SST 
C 
      IF(IGSST.NE.1) IGSSTS=IGSST 
      IF(ISPAR.GE.0) ISPARS=ISPAR 
      JBU33=IAND(JBUF(33),77777B)-MBYTE(JBUF(32)) 
      JBUF(32)=0
      IF(JBU33.LT.0.OR.JBU33.GT.63) JBU33=0 
      JBUF(33)=JBU33
      CALL ACAST(JBUF(33))
C 
C     GET GROUP 
C 
 1760 KNDX=IAND(JBUF(33),77777B)+33-MBYTE(JBUF(32)) 
      IOFST=IRECG(2)
      IF(IRENG(1).EQ.-1) GO TO 1770 
      IOFST=IRENG(2)
      IRECG(1)=IRENG(1) 
 1770 CALL READF(NDCB,JERR,NBUF,128,LEN,IRECG)
C 
C     MERGE IN THE GROUP SST
C 
      IGLEN=0 
C 
C     CHECK IF GROUP SST IS TO BE USED
C 
      IF(IGSSTS.EQ.0) GO TO 1890
      ICNT=IABS(NBUF(IOFST+6))
C 
C     CHECK FOR EMPTY GROUP SST 
C 
      IF(ICNT.LE.0.OR.ICNT.GT.64) GO TO 1890
      K=IOFST+6 
C 
C     VALIDATE EACH GROUP SST ENTRY 
C 
      DO 1880 I=1,ICNT
      ITEMP=IAND(NBUF(I+K),255) 
C 
C     CHECK FOR CONFLICTS OR DUPLICATE SST DEFINITIONS
C 
      IF(KNDX.LT.34) GO TO 1865 
      DO 1860 J=34,KNDX 
      ISES=IAND(JBUF(J),255)
      IF(ITEMP.NE.ISES) GO TO 1860
C 
C     FOUND MATCHING SESSION LU - IF DUPLICATE DEFINITION 
C     IGNORE IT, ELSE REPORT SST CONFLICT 
C 
      IF(JBUF(J).EQ.NBUF(I+K)) GO TO 1880 
      GO TO 1870
 1860 CONTINUE
C 
C     MOVE GROUP SST ENTRY TO USER
C 
 1865 KNDX=KNDX+1 
      JBUF(KNDX)=NBUF(I+K)
      IGLEN=IGLEN+1 
      GO TO 1880
C 
C     CONFLICT BETWEEN USER AND GROUP SST DEFINITION
C 
C 
C     PRINT THE CONFLICTING LU DEFINITIONS
C 
 1870 CALL ACWRI(NAME(2),5) 
      CALL ACWRI(NAME(7),5) 
      ISYSG=(NBUF(I+K)/256)+1 
      ISYSU=(JBUF(J)/256)+1 
      CALL ACITA(ISES+1,LUMS2(7),2) 
      CALL ACITA(ISYSU,LUMS2(13),3) 
      CALL ACITA(ISYSG,LUMS2(30),3) 
      LUMS2(24)=LUMS2(7)
      LUMS2(25)=LUMS2(8)
      CALL ACWRI(LUMS1,27)
      CALL ACWRI(LUMS2,32)
 1880 CONTINUE
C 
C     WRITE SST LENGTH WORDS
C 
1890  IF(ISPARS+JBUF(31).LE.67) GO TO 1891
      ISPARS=67-JBUF(31)
      CALL ACERR(-212)
 1891 JBUF(32)=(IGLEN*256)+ISPARS 
      JBUF(33)=IOR(IGSSTS,KNDX-33)
C 
C     UPDATE ACCOUNT
C 
      IF(JJDIR.GE.0) CALL ACPGA(-1,JJDIR,0) 
      IF(KNDX.LT.64) GO TO 2100 
      CALL ACFDF(IDIRN,IRECN,JOFST,JERR,2)
      IF(JERR.NE.0) GO TO 2900
C 
C     RESERVE DIRECTORY  ENTRY FO 2ND PART
C 
      CALL ACPGA(-2,IDIRN,0)
C 
C     BUILD LAST PART OF SST
C 
      CALL READF(NDCB,JERR,NBUF,128,LEN,IRECN)
      DO 2000 I=1,33
 2000 NBUF(I+JOFST)=JBUF(I+63)
      CALL WRITF(NDCB,JERR,NBUF,128,IRECN)
C 
C     SET UP POINTER TO 2ND PART
C 
      IF(JOFST.NE.0) IRECN=100000B+IRECN
      JBUF(64)=IRECN
C 
C     SET BIT FOR 2ND PART
C 
      JBUF(1)=IOR(JBUF(1),100000B)
C 
C     UPDATE FIRST PART 
C 
 2100 CALL READF(NDCB,JERR,NBUF,128,LEN,IRECU)
      IOFST=IRECU(2)
      DO 2200 I=1,64
 2200 NBUF(I+IOFST)=JBUF(I) 
      CALL WRITF(NDCB,JERR,NBUF,128,IRECU)
C 
C     GO BACK AND SEARCH REST OF DIRECTORY
C 
      ISRCH=.TRUE.
      NAME(2)=IU
      IF(IU.EQ.IAT) GO TO 1700
 2500 NAME(7)=IG
      ISRCH=.TRUE.
      IF(IG.EQ.IAT) GO TO 1640
 2600 IF(ID.NE.0) CALL ACSID
      CALL RNRQ(4,IRN,ISTAT)
      ISRCH=.FALSE. 
      RETURN
C 
C     ACERR RETURN
C 
 2800 JERR=-203 
 2900 CALL ACERR(JERR)
C 
C     UNLOCK RN 
C 
      CALL RNRQ(40004B,IRN,ISTAT) 
      GO TO 3000
2999  CONTINUE
C 
C     FINISHED
C        SO CLEAN UP
C 
 3000 ISRCH=.FALSE. 
      RETURN
      END 
                                                              