owninteger  user printed
externalintegerfunctionspec  ddisconnect(string (6) user,
                                         string (11) file,
                                         integer  fsys,destroy)
constantstring (1) snl = "
"
externalintegerfunctionspec  dconnect(string (6) user,string (15) file,
                                      integer  fsys,mode,apf,
                                      integername  seg,gap)
externalstringfunctionspec  derrs(integer  n)
externalintegerfunctionspec  dpermission(string (6) owner,user,
                                         string (8) date,
                                         string (11) file,
                                         integer  fsys,type,adrprm)
externalintegerfunctionspec  get usnames(integername  n,integer  adr,
                                         fsys)
externalroutinespec  get av fsys(integername  n,integerarrayname  a)
systemstringfunctionspec  itos(integer  n)
!
recordformat  contf(integer  dataend,datastart,psize,filetype,
                    sum,datetime,sp0,sp1,mark,sp2,sp3,astk,sp4,
                    sp5,itwidth,ldelim,rdelim,journal,
                    searchdircount,arraydiag,initworksize,sp6,
                    itinsize,itoutsize,nobl,istk,
                    longinteger  initparms,integer  dataecho,
                    terminal,i23,i24,i25,i26,i27,i28,i29,i30,i31,i32,
                    string  (31) fstartfile,bstartfile,preloadfile,
                    moddir,cfaults,cprompt,dprompt,s8,s9,s10,s11,s12,
                    s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,
                    s26,s27,s28,s29,s30,s31,s32,
                    string (31)array  searchdir(1:16))
recordformat  hf(integer  dataend,datastart,filesize,filetype,sum,
                 datetime,
                 (integer  spare1,spare2 or  c      { Character file }
                 integer  format,records or  c      { Data file }
                 integer  adir,count or  c          { Pdfile }
                 integer  pstart,spare3 or  c       { Old directory file }
                 integer  spare4,controlmode or  c  { Background control file }
                 integer  lda,ofm))                 { Object file }
recordformat  prmsf(string (6) user,byteinteger  uprm)
recordformat  dpermf(integer  bytesreturned,ownp,eep,spare,
                     record (prmsf)array  prms(0:15))
!
routine  output user(string (6) user)
if  user printed = 0 then  start 
   user printed = 1
   printstring(user.": ")
finish 
end ;   ! of output user
!
!
routine  do optfile(integer  conad,string (6) user)
integer  i
stringname  s
record (contf)name  h
!
h == record(conad)
for  i = 1,1,h_searchdircount cycle 
   s == h_searchdir(i)
   if  s = "ERCLIB.NAGGRAPHICS_CALCDIR" then  start 
      s = "ERCLIB.NAGGRAPHICS_BENDIR"
      output user(user)
      printstring("      NAG graphics done")
   finish 
   if  s = "PUBLIC.GPLOTDIR#B" then  start 
      s = "PUBLIC.GPLOTDIR"
      output user(user)
      printstring("      GPLOTDIR done")
   finish 
   if  s = "PUBLIC.GINO_GINODIRB" then  start 
      s = "PUBLIC.GINO_GINODIR"
      output user(user)
      printstring("      GINODIR done")
   finish 
repeat 
end ;   ! of do optfile
!
!
routine  treat user(string (6) user,integer  fsys)
integer  flag,seg,gap,conad,i,myperm,max
record (dpermf) p
record (prmsf) pp
record (hf)name  r
!
user printed = 0
!
! See if already permitted
!
flag = dpermission(user,"CUR022","","SS#OPT",fsys,4,addr(p))
if  flag # 0 then  start 
   output user(user)
   printstring("DPERMISSION(1) flag =".derrs(flag).snl)
   return 
finish 
!
max = p_bytesreturned - 16
i = sizeof(pp)
max = max//i - 1
myperm = 0
if  max >= 0 then  start 
   for  i = 0,1,max cycle 
      if  p_prms(i)_user = "CUR022" then  start 
         myperm = p_prms(i)_uprm
         exit 
      finish 
   repeat 
finish 
!
! Set permission if required
!
if  myperm # 3 then  start 
   flag = dpermission(user,"CUR022","","SS#OPT",fsys,2,3)
                                        ! Get write access
   if  flag # 0 then  start 
      output user(user)
      printstring("DPERMISSION(2) failed ".derrs(flag).snl)
      return 
   finish 
finish 
!
seg = 0
gap = 0
flag = dconnect(user,"SS#OPT",fsys,3,0,seg,gap)
if  flag # 0 then  start 
   output user(user)
   printstring("DCONNECT failed, flag =".derrs(flag).snl)
   -> out1
finish 
!
conad = seg << 18
r == record(conad)
if  r_filetype = 9 then  start 
   do optfile(conad,user)
finish 
!
flag = ddisconnect(user,"SS#OPT",fsys,0)
                                        ! Ignore flag
!
out1:
!
if  myperm # 0 then  start 
   flag = dpermission(user,"CUR022","","SS#OPT",fsys,2,myperm)
   if  flag # 0 then  start 
      output user(user)
      printstring("DPERMISSION(3) flag =".derrs(flag).snl)
      return 
   finish 
else 
   flag = dpermission(user,"CUR022","","SS#OPT",fsys,3,0)
   if  flag # 0 then  start 
      output user(user)
      printstring("DPERMISSION(4) flag =".derrs(flag).snl)
      return 
   finish 
finish 
!
if  user printed # 0 then  newline
end ;   ! of treat user
!
!
integerfunction  stoi(string (255) s)
if  s = "-1" then  result  = -1
if  length(s) = 1 then  s = "0".s
if  length(s) # 2 then  result  = -2
unless  '0' <= charno(s,1) <= '9' then  result  = -2
unless  '0' <= charno(s,2) <= '9' then  result  = -2
result  = (charno(s,1) - '0')*10 + charno(s,2) - '0'
end ;  ! of stoi
!
!
externalroutine  doben(string (255) s)
string (6)array  u(0:1023)
integer  nu,nusers
integer  j,n,fx,fsys
integerarray  a(0:99)
string (63) user
!
fsys = -1
if  s # "" then  start 
   fsys = stoi(s)
   unless  -1 <= fsys <= 99 then  -> bp
finish 
if  fsys<0 then  get av fsys(n,a) else  a(0) = fsys and  n = 1
fx = 0
while  fx<n cycle 
   fsys = a(fx)
   printstring("+++ FSYS ".itos(fsys)." +++"); newline; newline
   j = get usnames(nusers,addr(u(0)),fsys)
   printstring("GET USNAMES flag ="); write(j,1)
   printstring("  No of users ="); write(nusers,1); newlines(2)
   nu = 0
   while  nu<nusers cycle 
      user<-u(nu)
      if  length(user) = 6 then  start 
         treat user(user,fsys)
      finish 
      nu = nu+1
   repeat 
   fx = fx + 1
repeat 
return 
bp:
printstring("Illegal fsys specification"); newline
end ;  ! of doben
endoffile