ISO9660Volumes.Mod 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE ISO9660Volumes; (* AUTHOR "?/be"; PURPOSE "ISO 9660 volume (ported from Native Oberon)" *)
  3. (** non-portable *)
  4. IMPORT
  5. KernelLog, Plugins, Disks, Files;
  6. CONST
  7. debug = FALSE; getBlockDebug = FALSE;
  8. CONST (* svr *)
  9. SS = 2048; (* sector size *)
  10. MaxRetries = 10;
  11. TYPE
  12. Volume* = OBJECT (Files.Volume)
  13. VAR
  14. dev-: Disks.Device;
  15. bpc: LONGINT; (* bytes per sector *)
  16. spc: LONGINT; (* sectors per cluster *)
  17. PROCEDURE Finalize*;
  18. VAR res: LONGINT;
  19. BEGIN {EXCLUSIVE}
  20. IF debug THEN KernelLog.String("Entering OFSISO9660Volumes.Finalize"); KernelLog.Ln END;
  21. EXCL(dev.flags, Disks.Mounted);
  22. dev.Close(res)
  23. END Finalize;
  24. PROCEDURE Available*(): LONGINT;
  25. BEGIN
  26. RETURN 0
  27. END Available;
  28. PROCEDURE GetBlock*(adr: LONGINT; VAR blk: ARRAY OF CHAR);
  29. VAR res, i: LONGINT;
  30. BEGIN {EXCLUSIVE}
  31. ASSERT(dev # NIL, 101);
  32. i := 0;
  33. REPEAT
  34. dev.Transfer(Disks.Read, adr, 1, blk, 0, res);
  35. INC(i)
  36. UNTIL (res = 0) OR (i >= MaxRetries);
  37. IF getBlockDebug & (i > 1) THEN KernelLog.String("GetBlock; "); KernelLog.Int(i, 0); KernelLog.String(" retries"); KernelLog.Ln END;
  38. ASSERT(res = 0, 102)
  39. END GetBlock;
  40. PROCEDURE AllocBlock*(hint: Files.Address; VAR adr: Files.Address);
  41. BEGIN HALT(301)
  42. END AllocBlock;
  43. PROCEDURE FreeBlock*(adr: Files.Address);
  44. BEGIN HALT(301)
  45. END FreeBlock;
  46. PROCEDURE MarkBlock*(adr: Files.Address);
  47. BEGIN HALT(301)
  48. END MarkBlock;
  49. PROCEDURE Marked*(adr: Files.Address): BOOLEAN;
  50. BEGIN HALT(301)
  51. END Marked;
  52. END Volume;
  53. PROCEDURE GetISO9660Volume(p: Files.Parameters; dev: Disks.Device);
  54. VAR vol: Volume; b: ARRAY SS OF CHAR;
  55. BEGIN
  56. NEW(vol); vol.flags := {}; vol.dev := dev;
  57. INCL(vol.flags, Files.ReadOnly); INCL(vol.flags, Files.Removable);
  58. vol.bpc := SS; vol.spc := 1;
  59. vol.GetBlock(16, b); (* dummy; necessary after disc change *)
  60. COPY(vol.dev.name, vol.name);
  61. vol.blockSize := vol.bpc;
  62. IF debug THEN
  63. KernelLog.String("GetISO9660Volume"); KernelLog.Ln;
  64. KernelLog.String(" spc="); KernelLog.Int(vol.spc, 0); KernelLog.String(" bpc="); KernelLog.Int(vol.bpc, 0); KernelLog.Ln
  65. END;
  66. p.vol := vol
  67. END GetISO9660Volume;
  68. (** Generate a new ISO9660 volume object. Files.Par: device [# part (ignored)] *)
  69. PROCEDURE New*(context : Files.Parameters);
  70. VAR
  71. name: Plugins.Name; i, ignore, res: LONGINT;
  72. table: Plugins.Table; dev: Disks.Device;
  73. BEGIN
  74. context.vol := NIL;
  75. Files.GetDevPart(context.arg, name, ignore);
  76. IF (name # "") THEN
  77. Disks.registry.GetAll(table);
  78. IF (table # NIL) THEN
  79. context.out.String("ISO9660Volumes: Device "); context.out.String(name);
  80. i := 0; WHILE (i # LEN(table)) & (table[i].name # name) DO INC(i) END;
  81. IF (i < LEN(table)) THEN
  82. dev := table[i](Disks.Device);
  83. dev.Open(res);
  84. IF (res = Disks.Ok) THEN
  85. IF ~(Disks.Mounted IN dev.table[0].flags) THEN
  86. GetISO9660Volume(context, dev);
  87. ELSE context.error.String(" already mounted")
  88. END;
  89. IF (context.vol = NIL) THEN
  90. dev.Close(res) (* close again - ignore res *)
  91. END
  92. ELSE context.error.String(" cannot open device"); context.error.Ln;
  93. END
  94. ELSE context.error.String(" not found"); context.error.Ln;
  95. END;
  96. END
  97. END;
  98. END New;
  99. END ISO9660Volumes.
  100. OFSTools.Mount TEST "IDE1.0" OFSISO9660Volumes.New OFSN2KFiles.NewFS
  101. OFSTools.Mount A "Diskette0" OFSISO9660Volumes.New OFSN2KFiles.NewFS
  102. OFSTools.Unmount ^ TEST A
  103. System.Free OFSISO9660Volumes ~