<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>Clarification: There were changes at both levels. The toplevel ones maybe all unnecessary. I'll maybe look at this more but I also suspect it is ok now. Another approach would be to avoid stat altogether here, in rmrec. One can deduce the type by calling unlink and/or rmdir & checking the error. Or just rewrite rmrec in C..<br><br> - jay/phone<br><br>> Date: Fri, 3 Sep 2010 14:38:25 +0200<br>> From: wagner@elegosoft.com<br>> To: jay.krell@cornell.edu<br>> CC: m3devel@elegosoft.com<br>> Subject: RE: [M3devel] symlink grief?<br>> <br>> Quoting Jay K <jay.krell@cornell.edu>:<br>> <br>> > No they were in a very central place m3-libs/libm3/src/os/POSIX/FSPosix.m3.<br>> > How about:<br>> ><br>> > PROCEDURE CStatus(s: Ctypes.char_star; VAR status: File.Status): INTEGER =<br>> >   VAR statBuf: Ustat.struct_stat;<br>> >   BEGIN<br>> >     IF Ustat.stat(s, ADR(statBuf)) < 0 AND Ustat.lstat(s,   <br>> > ADR(statBuf)) < 0 THEN<br>> >       RETURN -1;<br>> >     END;<br>> >     status.type := FilePosix.FileTypeFromStatbuf(statBuf);<br>> >     (* Could make following assignments conditional on type: *)<br>> >     status.modificationTime := FLOAT(statBuf.st_mtime, LONGREAL);<br>> >     status.size := statBuf.st_size;<br>> >     IF status.size < 0L THEN RETURN -1 END;<br>> >     RETURN 0<br>> >   END CStatus;<br>> <br>> Could be worth a try,<br>> <br>> Olaf<br>> <br>> ><br>> > I can look again, *maybe* rmrec can avoid calling here.<br>> > Though probably the best way to achieve that is by writing two   <br>> > independent versions in C.<br>> > I think the Modula-3 file system libraries are just too keen on   <br>> > calling stat, which fails<br>> > for dangling symlinks.<br>> ><br>> >  - Jay<br>> ><br>> > ----------------------------------------<br>> >> Date: Fri, 3 Sep 2010 13:10:51 +0200<br>> >> From: wagner@elegosoft.com<br>> >> To: m3devel@elegosoft.com<br>> >> Subject: Re: [M3devel] symlink grief?<br>> >><br>> >> Symbolic links usually `just work'.<br>> >> If you have changed stat to lstat for all use cases, that will of<br>> >> course cause problems. I thought your changes were local to the<br>> >> rmrec implementation for quake. Aren't they?<br>> >><br>> >> If not, it will be better to revert them.<br>> >><br>> >> Olaf<br>> >><br>> >> PS: Windows NTFS does support symbolic links, too, though I've probably<br>> >> never used them: http://en.wikipedia.org/wiki/NTFS_symbolic_link<br>> >><br>> >> Quoting Jay K :<br>> >><br>> >> >  +++ /cm3/bin/cm3  -ship -DROOT=/home/jay/dev2/cm3 +++<br>> >> > --- shipping from I386_LINUX ---<br>> >> ><br>> >> > "/home/jay/dev2/cm3/m3-libs/m3core/I386_LINUX/.M3SHIP", line 1:<br>> >> > quake runtime error: unable to create directory "/cm3": errno=17<br>> >> ><br>> >> > --procedure--  -line-  -file---<br>> >> > make_dir           --<br>> >> >                     1    <br>> >> /home/jay/dev2/cm3/m3-libs/m3core/I386_LINUX/.M3SHIP<br>> >> ><br>> >> > Fatal Error: package build failed<br>> >> >  *** execution of [,<br>> >> ><br>> >> ><br>> >> ><br>> >> > /cm3 is a symlink to /home/jay/cm3<br>> >> > They both exist.<br>> >> > /home/jay/cm3 is a directory.<br>> >> ><br>> >> > I predict no good answers here.<br>> >> >  - a code base that historically used stat, that I changed to lstat.<br>> >> ><br>> >> > I think maybe I should put it back to stat.<br>> >> > And maybe come up with new functions for fs_rmrec to use.<br>> >> ><br>> >> > Wild guess... we have code like:<br>> >> ><br>> >> ><br>> >> > PROCEDURE IsDirectory (path: TEXT): BOOLEAN =<br>> >> >   VAR s: File.Status;<br>> >> >   BEGIN<br>> >> >     TRY<br>> >> >       s := FS.Status (path);<br>> >> >       RETURN (s.type = FS.DirectoryFileType);<br>> >> >     EXCEPT OSError.E =><br>> >> >       RETURN FALSE;<br>> >> >     END;<br>> >> >   END IsDirectory;<br>> >> ><br>> >> ><br>> >> > Maybe the right thing is to mimic Posix and allow code like:<br>> >> ><br>> >> ><br>> >> > PROCEDURE IsDirectory (path: TEXT): BOOLEAN =<br>> >> >   VAR s: File.Status;<br>> >> >   BEGIN<br>> >> >     TRY<br>> >> >       s := FS.LinkStatus (path);<br>> >> >       RETURN (s.type = FS.SymblicLinkFileType);<br>> >> >     EXCEPT OSError.E =><br>> >> >       RETURN FALSE;<br>> >> >     END;<br>> >> >   END IsDirectory;<br>> >> ><br>> >> > or such?<br>> >> ><br>> >> > Not sure it is needed.<br>> >> ><br>> >> > Or FS.StatusNoLinkResolve? Is that clearer?<br>> >> ><br>> >> > There are a few basic problems here:<br>> >> >   - The "Modula-3 code base" has been written I assume without<br>> >> > symlinks in mind. ??<br>> >> >   - I don't have symlinks in mind, much at all, since I'm usually<br>> >> > not on a system with them.<br>> >> >   I don't have a mental model of how to program with them, etc.<br>> >> >   Maybe some short document I can read and memorize?<br>> >> ><br>> >> ><br>> >> >  - Jay<br>> >> ><br>> >><br>> >><br>> >><br>> >> --<br>> >> Olaf Wagner -- elego Software Solutions GmbH<br>> >> Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<br>> >> phone: +49 30 23 45 86 96 mobile: +49 177 2345 869 fax: +49 30 23 45 86 95<br>> >> http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin<br>> >> Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<br>> >><br>> ><br>> <br>> <br>> <br>> -- <br>> Olaf Wagner -- elego Software Solutions GmbH<br>>                 Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<br>> phone: +49 30 23 45 86 96  mobile: +49 177 2345 869  fax: +49 30 23 45 86 95<br>>     http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin<br>> Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<br>> <br>                                          </body>
</html>