home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / m2posx02 / tfile.mpp < prev    next >
Encoding:
Text File  |  1993-10-23  |  12.3 KB  |  305 lines

  1. MODULE tfile;
  2.  
  3. (* Test fuer Module 'file' und 'dir'.
  4.  *
  5.  * Das ist beileibe kein vollstaendiger Test - wenn also bei irgendeiner
  6.  * Prozedur das OK verweigert wird, ist bei der Anpassung auf jeden Fall
  7.  * ein Fehler unterlaufen, ein OK heisst aber lediglich, dass keine
  8.  * offensichtlichen Fehler existieren.
  9.  *
  10.  * hk, 06-Jan-93
  11.  *)
  12.  
  13. VAL_INTRINSIC
  14. CAST_IMPORT
  15.  
  16. FROM SYSTEM IMPORT
  17. (* PROC *) ADR;
  18.  
  19. FROM types IMPORT
  20. (* CONST*) PATHMAX, NULL,
  21. (* TYPE *) UNSIGNEDLONG, PathName, offT;
  22.  
  23. FROM err IMPORT
  24. (* CONST*) EEXIST,
  25. (* VAR  *) errno;
  26.  
  27. FROM pSTRING IMPORT
  28. (* TYPE *) StrPtr;
  29.  
  30. FROM file IMPORT
  31. (* CONST*) MINHANDLE, StdoutFileNo, StderrFileNo, fOK, oACCMODE, oRDONLY,
  32.            oWRONLY, oRDWR, sIRWXU,
  33. (* TYPE *) FileModes, modeT, AccessModes, AccessMode, OpenModes, OpenMode,
  34.            SeekMode,
  35. (* PROC *) creat, open, close, read, write, lseek, dup, dup2, isatty, umask,
  36.            chmod, utime, access;
  37.  
  38. FROM dir IMPORT
  39. (* PROC *) getcwd, mkdir, chdir, rmdir, unlink, rename;
  40.  
  41. FROM lib IMPORT
  42. (* PROC *) strerror;
  43.  
  44. FROM Terminal IMPORT
  45. (* PROC *) Read, Write, WriteString, WriteLn;
  46.  
  47. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  48.  
  49. VAR
  50.   handle  : INTEGER;
  51.   newout  : INTEGER;
  52.   oldout  : INTEGER;
  53.   name    : PathName;
  54.   done    : BOOLEAN;
  55.   ch      : CHAR;
  56.   oldmask : modeT;
  57.   buf     : ARRAY [0..100] OF CHAR;
  58.   errstr  : ARRAY [0..40] OF CHAR;
  59.  
  60. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  61.  
  62. PROCEDURE ASSERT ((* EIN/ -- *) test : BOOLEAN;
  63.                   (* EIN/ -- *) msg  : ARRAY OF CHAR): BOOLEAN;
  64. BEGIN
  65.  WriteString(msg);
  66.  IF test THEN
  67.    WriteString(" -- OK"); WriteLn;
  68.    errno := 0;
  69.    RETURN(TRUE);
  70.  ELSE
  71.    strerror(errno, errstr); (* Fehler im Klartext ausgeben *)
  72.    WriteString(" **failed**:: "); WriteString(errstr); WriteLn;
  73.    errno := 0;
  74.    Read(ch); (* Auf Tastendruck warten *)
  75.    RETURN(FALSE);
  76.  END;
  77. END ASSERT;
  78.  
  79. (*===========================================================================*)
  80.  
  81. BEGIN
  82.  errno  := 0;
  83.  
  84.  (* Schreibgeschuetzte Datei erzeugen *)
  85.  handle := creat("XYZ12345.TMP", modeT{sIRUSR});
  86.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TMP",modeT{sIRUSR})') THEN
  87.    done := ASSERT(close(handle)=0,'close(handle)');
  88.  END;
  89.  
  90.  (* Datei muss vorhanden sein, aber weder Schreib- noch Ausfuehrberechtigung *)
  91.  done := ASSERT(access("XYZ12345.TMP",fOK)=0,'access("XYZ12345.TMP",fOK)');
  92.  done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})<0,'access("XYZ12345.TMP",AccessMode{wOK})<0');
  93.  done := ASSERT(access("XYZ12345.TMP",AccessMode{xOK})<0,'access("XYZ12345.TMP",AccessMode{xOK})<0');
  94.  WriteLn;
  95.  
  96.  (* Schreibschutz aufheben, Schreibberechtigung muss vorhanden sein *)
  97.  IF ASSERT(chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})=0,'chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})') THEN
  98.    done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})=0,'access("XYZ12345.TMP",AccessMode{wOK})');
  99.  END;
  100.  WriteLn;
  101.  
  102.  (* Datei umbenennen, alter Name darf nicht mehr vorhanden sein, aber der neue *)
  103.  IF ASSERT(rename("XYZ12345.TMP","XYZ54321.TMP")=0,'rename("XYZ12345.TMP","XYZ54321.TMP")') THEN
  104.    done := ASSERT(access("XYZ54321.TMP",fOK)=0,'access("XYZ54321.TMP",fOK)');
  105.    done := ASSERT(access("XYZ12345.TMP",fOK)<0,'access("XYZ12345.TMP",fOK)<0');
  106.  END;
  107.  WriteLn;
  108.  
  109.  (* Datei loeschen, darf nicht mehr vorhanden sein *)
  110.  IF ASSERT(unlink("XYZ54321.TMP")=0,'unlink("XYZ54321.TMP")') THEN
  111.    done := ASSERT(access("XYZ54321.TMP",fOK)<0,'access("XYZ54321.TMP",fOK)<0');
  112.  END;
  113.  WriteLn;
  114.  
  115.  (* Ausfuehrbare Datei erzeugen, Ausfuehrberechtigung muss vorhanden sein *)
  116.  handle := creat("XYZ12345.TTP",sIRWXU);
  117.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TTP",sIRWXU)') THEN
  118.    done := ASSERT(close(handle)=0,'close(handle)');
  119.    done := ASSERT(access("XYZ12345.TTP",AccessMode{xOK})=0,'access("XYZ12345.TTP",AccessMode{xOK})');
  120.    done := ASSERT(unlink("XYZ12345.TTP")=0,'unlink("XYZ12345.TTP")');
  121.  END;
  122.  WriteLn;
  123.  
  124.  (* Dateierstellungsmaske setzen, sodass keine Schreibberechtigung erzeugt
  125.   * werden kann. Datei erzeugen, muss vorhanden, aber schreibgeschuetzt sein.
  126.   * Datei loeschen, alte Maske wiederherstellen.
  127.   *)
  128.  oldmask := umask(modeT{sIWUSR});
  129.  done    := ASSERT(TRUE,'oldmask <- umask(modeT{sIWUSR})');
  130.  handle  := creat("XYZ12345.TMP", sIRWXU);
  131.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TMP",sIRWXU)') THEN
  132.    done := ASSERT(close(handle)=0,'close(handle)');
  133.    done := ASSERT(access("XYZ12345.TMP",fOK)=0,'access("XYZ12345.TMP",fOK)');
  134.    done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})<0,'access("XYZ12345.TMP",AccessMode{wOK})<0');
  135.    done := ASSERT(chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})=0,'chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})');
  136.    done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  137.  END;
  138.  done := ASSERT(umask(oldmask)=modeT{sIWUSR},'umask(oldmask)=modeT{sIWUSR}');
  139.  WriteLn;
  140.  
  141.  (* Zweite Kennung fuer STDOUT erzeugen und wieder freigeben *)
  142.  handle := dup(StdoutFileNo);
  143.  IF ASSERT(handle>StdoutFileNo,'handle <- dup(StdoutFileNo)') THEN
  144.    done := ASSERT(close(handle)=0,'close(handle)');
  145.  END;
  146.  
  147.  (* STDOUT auf STDERR umlenken, Umlenkung wieder rueckgaengig machen *)
  148.  newout := dup(StderrFileNo);
  149.  oldout := dup(StdoutFileNo);
  150.  IF    ASSERT(oldout>StdoutFileNo,'oldout <- dup(StdoutFileNo)')
  151.    AND ASSERT(newout>StderrFileNo,'newout <- dup(StderrFileNo)')
  152.  THEN
  153.    (* Wenn die Ausgabe des Programms auf eine Datei umgelenkt wurde,
  154.     * erscheint die Ausgabe der folgenden Zeile trotzdem auf dem
  155.     * Bildschirm, da 'StdoutFileNo' umgelenkt ist.
  156.     * Das passiert natuerlich nur, wenn 'WriteString' auf "GEMDOS"-Kanal 1
  157.     * ausgibt.
  158.     *)
  159.    IF ASSERT(dup2(newout,StdoutFileNo)>=StdoutFileNo,'dup2(newout,StdoutFileNo)') THEN
  160.      (* Hier wird die Umlenkung wieder rueckgaengig gemacht: *)
  161.      done := ASSERT(dup2(oldout,StdoutFileNo)>=StdoutFileNo,'dup2(oldout,StdoutFileNo)');
  162.      done := ASSERT(close(oldout)=0,'close(oldout)');
  163.      done := ASSERT(close(newout)=0,'close(newout)');
  164.    END;
  165.  END;
  166.  WriteLn;
  167.  
  168.  (* Aktuelles Arbeitsverzeichnis ermitteln *)
  169.  IF ASSERT(getcwd(CAST(StrPtr,ADR(name)),PATHMAX+1)<>NULL,'getcwd(name,PATHMAX+1)') THEN
  170.    WriteString(': name ="'); WriteString(name); Write('"'); WriteLn;
  171.  END;
  172.  
  173.  (* Neues Verzeichnis erzeugen mit Suchberechtigung. Verzeichnis muss vorhanden
  174.   * sein und suchen erlauben. Ins neue Verzeichnis wechseln und neues Arbeits-
  175.   * verzeichnis ermitteln. Wieder zurueck ins alte Arbeitsverzeichnis.
  176.   * Neues Verzeichnis wieder loeschen, darf nicht mehr vorhanden sein.
  177.   *)
  178.  IF ASSERT(mkdir("XYZ12345.DIR",sIRWXU)=0,'mkdir("XYZ12345.DIR",sIRWXU)') THEN
  179.    done := ASSERT(access("XYZ12345.DIR",fOK)=0,'access("XYZ12345.DIR",fOK)');
  180.    done := ASSERT(access("XYZ12345.DIR",AccessMode{xOK})=0,'access("XYZ12345.DIR",AccessMode{xOK})');
  181.    IF ASSERT(chdir("XYZ12345.DIR")=0,'chdir("XYZ12345.DIR")') THEN
  182.      IF ASSERT(getcwd(CAST(StrPtr,ADR(name)),PATHMAX+1)<>NULL,'getcwd(name,PATHMAX+1)') THEN
  183.        WriteString(': name ="'); WriteString(name); Write('"'); WriteLn;
  184.      END;
  185.      done := ASSERT(chdir("..")=0,'chdir("..")');
  186.    END;
  187.    IF ASSERT(rmdir("XYZ12345.DIR")=0,'rmdir("XYZ12345.DIR")') THEN
  188.      done := ASSERT(access("XYZ12345.DIR",fOK)<0,'access("XYZ12345.DIR",fOK)<0');
  189.    END;
  190.  END;
  191.  WriteLn;
  192.  
  193.  (* Datei erzeugen und 10 Zeichen hineinschreiben *)
  194.  buf    := "12345678901234567890";
  195.  WriteString('buf <- "12345678901234567890"'); WriteLn;
  196.  handle := creat("XYZ12345.TMP", modeT{sIRUSR,sIWUSR});
  197.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})') THEN
  198.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  199.  END;
  200.  
  201.  (* Schreibzeiger hinter das Ende der Datei positionieren und weitere 10 Bytes
  202.   * schreiben. Nochmal verlaengern und ein Byte schreiben; die aktuelle
  203.   * Position muss mit der Verlaengerung uebereinstimmen. Vom Dateiende 100
  204.   * Bytes zurueckgehen, um zu sehen, ob die Datei tatsaechlich verlaengert
  205.   * wurde.
  206.   *)
  207.  IF ASSERT(INT(lseek(handle,1005,SeekCur))=1015,'lseek(handle,1005,SeekCur)=1015') THEN
  208.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  209.    done := ASSERT(INT(lseek(handle,2999,SeekSet))=2999,'lseek(handle,2999,SeekSet)=2999');
  210.    IF ASSERT(INT(lseek(handle,0,SeekCur))=2999,'lseek(handle,2999,SeekCur)=2999') THEN
  211.      done := ASSERT(INT(write(handle,ADR(buf),1))=1,'write(handle,ADR(buf),1)=1');
  212.      done := ASSERT(INT(lseek(handle,-100,SeekEnd))=2900,'lseek(handle,-100,SeekEnd)=2900');
  213.    END;
  214.  END;
  215.  
  216.  (* Lesezeiger auf die Position, an der zum zweitenmal geschrieben wurde, ein
  217.   * paar Bytes lesen und mit den geschriebenen vergleichen. Datei schliessen.
  218.   *)
  219.  IF ASSERT(INT(lseek(handle,1010,SeekSet))=1010,'lseek(handle,1010,SeekSet)=1010') THEN
  220.    IF ASSERT(INT(read(handle,ADR(buf),10))=10,'read(handle,ADR(buf),10))=10') THEN
  221.      done := ASSERT((buf[3]=0C)AND(buf[4]=0C)AND(buf[5]='1')AND(buf[6]='2'),
  222.                      "buf[3..6] = 0C,0C,'1','2'");
  223.    END;
  224.  END;
  225.  done := ASSERT(close(handle)=0,'close(handle)');
  226.  WriteLn;
  227.  
  228.  (* Feststellen, ob CON: oder STDOUT auf Datei umgelenkt wurden. *)
  229.  WriteString("isatty(-1): ");
  230.  IF isatty(-1) THEN
  231.    WriteString("ja");
  232.  ELSE
  233.    WriteString("nein");
  234.  END;
  235.  WriteLn;
  236.  WriteString("isatty(StdoutFileNo): ");
  237.  IF isatty(StdoutFileNo) THEN
  238.    WriteString("ja");
  239.  ELSE
  240.    WriteString("nein");
  241.  END;
  242.  WriteLn;
  243.  WriteLn;
  244.  
  245.  
  246.  (* Vorhandene Testdatei mit Flag O_APPEND oeffnen. Kennung darf nicht
  247.   * fuer ein Terminal gehalten werden; die Anfangsposition muss sich
  248.   * trotz O_APPEND am Anfang der Datei befinden. Laenge der Datei fest-
  249.   * stellen. Datei schliessen und loeschen fuer nachfolgenden Test.
  250.   *)
  251.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oAPPEND},modeT{});
  252.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oAPPEND},modeT{})') THEN
  253.    done := ASSERT(NOT isatty(handle),'NOT isatty(handle)');
  254.    done := ASSERT(INT(lseek(handle,0,SeekCur))=0,'lseek(handle,0,SeekCur)=0');
  255.    done := ASSERT(INT(lseek(handle,0,SeekEnd))=3000,'lseek(handle,0,SeekEnd)=3000');
  256.  END;
  257.  done := ASSERT(close(handle)=0,'close(handle)');
  258.  done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  259.  WriteLn;
  260.  
  261.  (* Ohne Flag O_CREAT darf Datei beim Oeffnen nicht angelegt werden. *)
  262.  handle := open("XYZ12345.TMP",oRDWR,modeT{sIRUSR,sIWUSR});
  263.  IF NOT ASSERT(handle<0,'open("XYZ12345.TMP",oRDWR,modeT{sIRUSR,sIWUSR})<0') THEN
  264.    handle := close(handle);
  265.  END;
  266.  
  267.  (* Datei exklusiv neu anlegen mit Schreibberechtigung. Ein paar Bytes
  268.   * schreiben und wieder schliessen.
  269.   * Nochmal versuchen, exklusiv anzulegen, Datei darf nicht mehr neu angelegt
  270.   * oder gekuerzt werden, da schon vorhanden.
  271.   *)
  272.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIRUSR,sIWUSR});
  273.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIRUSR,sIWUSR})') THEN
  274.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10))=10');
  275.    done := ASSERT(close(handle)=0,'close(handle)');
  276.  END;
  277.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIWUSR});
  278.  IF NOT ASSERT((handle<0)AND(errno=EEXIST),'open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIWUSR})<0') THEN
  279.    handle := close(handle);
  280.  END;
  281.  WriteLn;
  282.  
  283.  (* Datei mit Flag O_CREAT oeffnen, darf dabei aber nicht gekuerzt werden,
  284.   * deshalb Dateilaenge feststellen und wieder schliessen.
  285.   * Datei mit Flag O_TRUNC oeffnen, muss dabei auf Null Bytes gekuerzt werden,
  286.   * deshalb Dateilaenge feststellen und wieder schliessen.
  287.   * Testdatei loeschen.
  288.   *)
  289.  handle := open("XYZ12345.TMP", oRDWR+OpenMode{oCREAT}, modeT{});
  290.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT},modeT{})') THEN
  291.    done := ASSERT(INT(lseek(handle,0,SeekCur))=0,'lseek(handle,0,SeekCur)=0');
  292.    done := ASSERT(INT(lseek(handle,0,SeekEnd))=10,'lseek(handle,0,SeekEnd))=10');
  293.    done := ASSERT(close(handle)=0,'close(handle)');
  294.  END;
  295.  handle := open("XYZ12345.TMP", oRDWR+OpenMode{oTRUNC}, modeT{});
  296.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oTRUNC},modeT{})') THEN
  297.    done := ASSERT(INT(lseek(handle,0,SeekEnd))=0,'lseek(handle,0,SeekEnd)=0');
  298.    done := ASSERT(close(handle)=0,'close(handle)');
  299.    done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  300.  END;
  301.  WriteLn;
  302.  
  303.  Read(ch);
  304. END tfile.
  305.