!***********************************************************************
!*
!*          Program to check for users with default passwords
!*
!*       Copyright (C) R.D. Eager   University of Kent   MCMLXXXV
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!*          Constants
!*
!***********************************************************************
!
constantinteger  liststream = 42;       ! Stream for output
constantinteger  maxhelp = 8
constantstring (68)array  help(1:maxhelp) = c 
"",
"Parameters are:-",
"   File system    - a number between 0 and 99",
"                    if omitted, users on all file systems are listed",
"",
"   Output         - destination for listing",
"                    the default is .OUT",
""
!
!
!***********************************************************************
!*
!*          Record formats
!*
!***********************************************************************
!
recordformat  fdf(integer  link,dsnum,byteinteger  status,accessroute,
                  valid action,cur state,mode of use,mode,file org,
                  dev code,rec type,flags,lm,rm,integer  asvar,arec,
                  recsize,minrec,maxrec,maxsize,lastrec,conad,currec,
                  cur,end,transfers,darecnum,cursize,datastart,
                  string (31) iden,integer  keydesc0,keydesc1,
                  recsizedesc0,recsizedesc1,byteinteger  f77flag,
                  f77form,f77access,f77status,integer  f77recl,f77nrec,
                  idaddr,byteinteger  f77blank,f77ufd,spare1,spare2)
!
!
!***********************************************************************
!*
!*          Director references
!*
!***********************************************************************
!
externalintegerfunctionspec  dsfi(string (6) user,integer  fsys,type,
                                  set,adr)
externalroutinespec  get av fsys(integername  n,integerarrayname  a)
externalintegerfunctionspec  get usnames(integername  n,integer  adr,
                                         fsys)
!
!
!***********************************************************************
!*
!*          Subsystem references
!*
!***********************************************************************
!
externalroutinespec  define alias  "S#DEFINE"(integer  chan,string (31) iden,
                          integername  afd,flag)
externalstringfunctionspec  failuremessage alias  "S#FAILUREMESSAGE"(integer  mess)
externalintegerfunctionspec  instream
externalintegerfunctionspec  iocp alias  "S#IOCP"(integer  ep,parm)
externalintegermapspec  mapssfd alias  "S#MAPSSFD"(integer  dsnum)
externalintegerfunctionspec  outstream
externalintegerfunctionspec  parmap alias  "S#PARMAP"
externalintegerfunctionspec  pstoi alias  "S#PSTOI"(string (63) s)
externalroutinespec  setfname alias  "S#SETFNAME"(string (63) s)
externalroutinespec  setpar alias  "S#SETPAR"(string (255) s)
externalroutinespec  set return code(integer  i)
externalstringfunctionspec  spar alias  "S#SPAR"(integer  n)
!
!
!***********************************************************************
!*
!*          Service routines
!*
!***********************************************************************
!
routine  clearstream(integer  chan)
! Clears  out  a  channel  definition, but does not give an error if the
! channel was not defined.
record (fdf)name  f
!
if  mapssfd(chan) # 0 then  start 
   f == record(mapssfd(chan))
   if  f_status = 0 then  start 
      mapssfd(chan) = 0
      f_dsnum = 0;                      ! Mark descriptor as free
   finish 
finish 
end ;   ! of clearstream
!
!-----------------------------------------------------------------------
!
routine  closestream(integer  chan)
! Private version of 'closestream'.  Does  not  give  an  error  if  the
! operation fails.
integer  flag
!
return  unless  instream # chan # outstream
flag = iocp(16,chan)
end ;   ! of closestream
!
!-----------------------------------------------------------------------
!
routine  printhelp
! Prints help information.
integer  i
!
for  i = 1,1,maxhelp cycle 
   printstring(help(i))
   newline
repeat 
end ;   ! of printhelp
!
!-----------------------------------------------------------------------
!
routine  treat user(stringname  user,integer  fsys)
integer  flag
integerarray  p(0:1)
!
flag = dsfi(user,fsys,5,0,addr(p(0)))
if  flag = 0 and  p(0) = m'....' then  start 
   printstring(user)
   printstring(" on fsys")
   write(fsys,1)
   newline
finish 
end ;   ! of treat user
!
!
!***********************************************************************
!*
!*          C H E C K P A S S
!*
!***********************************************************************
!
externalroutine  checkpass(string (255) parms)
integer  nu,nusers,n,fx,fsys,flag,afd
string (6)array  u(0:1364)
string (6) user
string (255) s,out
integerarray  a(0:99)
!
setpar(parms)
!
s = spar(1)
if  parmap = 1 and  s = "?" then  start 
   printhelp
   set return code(0)
   return 
finish 
!
if  s # "" then  start 
   fsys = pstoi(s)
   unless  0 <= fsys <= 99 then  start 
      setfname(s)
      flag = 202;                       ! Invalid parameter
      -> err
   finish 
finish  else  fsys = -1
!
out = spar(2)
out = ".OUT" if  out = ""
define(liststream,out,afd,flag)
-> err if  flag # 0
selectoutput(liststream)
!
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)
   flag = get usnames(nusers,addr(u(0)),fsys)
   -> err if  flag # 0
   nu = 0
   while  nu < nusers cycle 
      user = u(nu)
      if  user # "SPOOLR" and  c 
          user # "VOLUMS" and  c 
          user # "MAILER" and  c 
          user # "FTRANS" and  c 
          user # "FTPMAN" then  start 
         treat user(u(nu),fsys)
      finish 
      nu = nu + 1
   repeat 
   fx = fx + 1
repeat 
!
selectoutput(0)
closestream(liststream)
clearstream(liststream)
set return code(0)
return 
!
err:
!
selectoutput(0)
closestream(liststream)
clearstream(liststream)
newline
printstring("CHECKPASS fails -".failuremessage(flag))
set return code(flag)
stop 
end ;  ! of checkpass
endoffile