{INTERNAL ONLY BEGIN}
procedure fake_srmdam(anyvar f       : fib;
			    unum    : unitnum;
			    request : damrequesttype);
var
  holdpathid            : integer;
  savepathid            : integer;
  savefileid            : integer;
  saveftid              : tid;
  saveffpw              : passtype;
  savefvid              : vid;
  saveftitle            : fid;
  savefsavepathid       : boolean;
  fisafib               : boolean;
begin
  ioresult      := ord(inoerror);
  srmsavesc     := 0;
  lockup;
  fisafib       := false;
  try
    with f, unitable^[unum] do
      if offline then
	ioresult        := ord(znodevice)
      else
	begin
	  if request in [catpasswords] then
	    begin
	      fisafib   := true;
	      if strlen(ftid) > tidleng then    {fix uninitialized fib strings}
		setstrlen(ftid,0);
	      if strlen(ffpw) > passleng then
		setstrlen(ffpw,0);
	      if strlen(fvid) > vidleng then
		setstrlen(fvid,0);

	      savepathid        := pathid;    {save fib fields to be restored on error}
	      savefileid        := fileid;
	      savefsavepathid   := fsavepathid;
	      saveftid          := ftid;
	      saveffpw          := ffpw;
	      savefvid          := fvid;
	      if strlen(ftitle) > fidleng then
		setstrlen(saveftitle,0)
	      else
		saveftitle      := ftitle;
	    end;
	  case request of

	    catpasswords  : begin
			      srm_open_dir(f,unum,open_directory,true);
			      if ioresult = ord(inoerror) then
				begin
				  srm_cat_pass(f,unum);
				  srm_close_pathid(unum,pathid,fsavepathid);
				end;
			    end;


	    otherwise       setioresult(ord(ibadrequest));
	  end;

	  if (ioresult <> ord(inoerror)) and fisafib then {restore fib for subsequent calls}
	    begin
	      pathid        := savepathid;
	      fileid        := savefileid;
	      fsavepathid   := savefsavepathid;
	      ftid          := saveftid;
	      ffpw          := saveffpw;
	      fvid          := savefvid;
	      if strlen(saveftitle) > 0 then
		ftitle      := saveftitle;
	    end;
	  if ioresult = ord(isrmcatchall) then
	    if srmsavesc <> 0 then
	      escape(srmsavesc);
	end;
  recover
    begin
      if escapecode = ioescapecode then
	setioresult(ord(isrmcatchall))
      else
	begin
	  lockdown;
	  escape(escapecode);
	end;
    end;
  lockdown;
end; {fake_srmdam}
