ls vs ls-l in symlinked directory

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dgibbs!).

Here’s the “final” :slight_smile: mystery with symlinks.

$ ln -s /tmp x
$ cd x

So now my current directory is “/ramdisk/x”, which is “really” /tmp

I find that there is an annoying behaviour when I do an “ls -l”,
versus a plain “ls”:

[columbia@ttypa] ls
…/ …/ AAA461839 elv_13a35057.1 strtok.c voyager.root/

[columbia@ttypa] ls -l
lrwxr-xr-x 1 root root 0 Dec 17 20:50 .@ → /tmp


“ls” gives me the real contents of the “current” directory, which is “/tmp”.
“ls -l” calls my io_open() handler, does a io_stat() on “x”, and then
calls io_readlink().

“ls” does no such thing, it calls io_open(), stats() the file, and then
calls io_open() again which redirects it to /tmp, and the “ls” is done
there…

Any clues? I think I’m “this” close to having symlinks working :slight_smile:

Thanks again in advance!

Cheers,
-RK


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

David Gibbs <dagibbs@qnx.com> wrote:

Robert Krten <> nospam83@parse.com> > wrote:

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dgibbs!).

Here’s the “final” > :slight_smile: > mystery with symlinks.

$ ln -s /tmp x
$ cd x

Have you also tested:

ln -s /tmp x
ls x
ls x/

to make sure that difference is also handled properly?

Yes, and they are handled improperly :frowning:

[columbia@ttype] ls
x@
[columbia@ttype] ls x
…/ …/ AAA461839 strtok.c voyager.root/
[columbia@ttype] ls x/
…/ …/ AAA461839 strtok.c voyager.root/

What did I bugger up (this time)? :slight_smile:
(I kinda get the feeling this is the same bug…)
((An additional note; I currently do not have “.” nor “…” in the ramdisk; that’s on my “todo” list))

Thanks in advance,
-RK


-David

QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

Robert Krten <nospam83@parse.com> wrote:

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dgibbs!).

Here’s the “final” > :slight_smile: > mystery with symlinks.

$ ln -s /tmp x
$ cd x

Have you also tested:

ln -s /tmp x
ls x
ls x/

to make sure that difference is also handled properly?

-David

QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.

Xiaodan Tang <xtang@qnx.com> wrote:

Hm, a quick check. How’s “/bin/ls” works for you?

Almost the exact same thing:

[columbia@ttype] /bin/ls
x
[columbia@ttype] /bin/ls x
… … AAA461839 strtok.c voyager.root
[columbia@ttype] /bin/ls x/
… … AAA461839 strtok.c voyager.root

Yes, I should have mentioned that I had “ls” aliased to “ls -F” :slight_smile:

Cheers,
-RK

-xtang

Robert Krten <> nospam83@parse.com> > wrote in message
news:atq6uc$j4j$> 1@inn.qnx.com> …
David Gibbs <> dagibbs@qnx.com> > wrote:
Robert Krten <> nospam83@parse.com> > wrote:

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dagibbs!).

Here’s the “final” > :slight_smile: > mystery with symlinks.

$ ln -s /tmp x
$ cd x

Have you also tested:

ln -s /tmp x
ls x
ls x/

to make sure that difference is also handled properly?

Yes, and they are handled improperly > :frowning:

[columbia@ttype] ls
x@
[columbia@ttype] ls x
./ …/ AAA461839 strtok.c
voyager.root/
[columbia@ttype] ls x/
./ …/ AAA461839 strtok.c
voyager.root/

What did I bugger up (this time)? > :slight_smile:
(I kinda get the feeling this is the same bug…)
((An additional note; I currently do not have “.” nor “…” in the ramdisk;
that’s on my “todo” list))

Thanks in advance,
-RK


-David

QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at > www.parse.com> .
Email my initials at parse dot com.


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

Hm, a quick check. How’s “/bin/ls” works for you?

-xtang

Robert Krten <nospam83@parse.com> wrote in message
news:atq6uc$j4j$1@inn.qnx.com

David Gibbs <> dagibbs@qnx.com> > wrote:
Robert Krten <> nospam83@parse.com> > wrote:

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dgibbs!).

Here’s the “final” > :slight_smile: > mystery with symlinks.

$ ln -s /tmp x
$ cd x

Have you also tested:

ln -s /tmp x
ls x
ls x/

to make sure that difference is also handled properly?

Yes, and they are handled improperly > :frowning:

[columbia@ttype] ls
x@
[columbia@ttype] ls x
./ …/ AAA461839 strtok.c
voyager.root/
[columbia@ttype] ls x/
./ …/ AAA461839 strtok.c
voyager.root/

What did I bugger up (this time)? > :slight_smile:
(I kinda get the feeling this is the same bug…)
((An additional note; I currently do not have “.” nor “…” in the ramdisk;
that’s on my “todo” list))

Thanks in advance,
-RK


-David

QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at > www.parse.com> .
Email my initials at parse dot com.

Ah,

/bin/ls x suppose to “stat(x)” which translate to “_IO_CONNECT(x)” and
“_IO_STAT(x)”.
I image you always redirect the first _IO_CONNECT.

In _IO_CONNECT, you should also check if connect->mode is 0, (non-read/write
open).
and should accept the open(), so the next _IO_STAT will comes to you.

Or maybe you already did that ?

-xtang

Robert Krten <nospam83@parse.com> wrote in message
news:atq8vk$nce$1@inn.qnx.com

Xiaodan Tang <> xtang@qnx.com> > wrote:
Hm, a quick check. How’s “/bin/ls” works for you?

Almost the exact same thing:

[columbia@ttype] /bin/ls
x
[columbia@ttype] /bin/ls x
. … AAA461839 strtok.c
voyager.root
[columbia@ttype] /bin/ls x/
. … AAA461839 strtok.c
voyager.root

Yes, I should have mentioned that I had “ls” aliased to “ls -F” > :slight_smile:

Cheers,
-RK
-xtang

Robert Krten <> nospam83@parse.com> > wrote in message
news:atq6uc$j4j$> 1@inn.qnx.com> …
David Gibbs <> dagibbs@qnx.com> > wrote:
Robert Krten <> nospam83@parse.com> > wrote:

Ok, I think I’ve gotten all the redirection stuff to work properly
now (thanks xtang and dagibbs!).

Here’s the “final” > :slight_smile: > mystery with symlinks.

$ ln -s /tmp x
$ cd x

Have you also tested:

ln -s /tmp x
ls x
ls x/

to make sure that difference is also handled properly?

Yes, and they are handled improperly > :frowning:

[columbia@ttype] ls
x@
[columbia@ttype] ls x
./ …/ AAA461839 strtok.c
voyager.root/
[columbia@ttype] ls x/
./ …/ AAA461839 strtok.c
voyager.root/

What did I bugger up (this time)? > :slight_smile:
(I kinda get the feeling this is the same bug…)
((An additional note; I currently do not have “.” nor “…” in the
ramdisk;
that’s on my “todo” list))

Thanks in advance,
-RK


-David

QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at > www.parse.com> .
Email my initials at parse dot com.


\

Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at > www.parse.com> .
Email my initials at parse dot com.

Xiaodan Tang <xtang@qnx.com> wrote:

In _IO_CONNECT, you should also check if connect->mode is 0, (non-read/write
open). and should accept the open(), so the next _IO_STAT will comes to you.

Well, not quite. The ‘mode’ field describes whether to follow the link or
not. S_ISLNK(msg->connect.mode) means don’t follow/resolve the link (you
are opening the symlink itself); !S_ISLNK(msg->connect.mode) means follow
the link (resolve it and do the name munging/re-direction). This is the
difference, for example, between stat() and lstat(). But I’ve already
posted this detail on a couple of other occassions (I think it was in the
‘Free Book Authoring Help’ thread :wink:, so that can’t be it …

John Garvey <jgarvey@qnx.com> wrote:

Xiaodan Tang <> xtang@qnx.com> > wrote:
In _IO_CONNECT, you should also check if connect->mode is 0, (non-read/write
open). and should accept the open(), so the next _IO_STAT will comes to you.

Well, not quite. The ‘mode’ field describes whether to follow the link or
not. S_ISLNK(msg->connect.mode) means don’t follow/resolve the link (you
are opening the symlink itself); !S_ISLNK(msg->connect.mode) means follow
the link (resolve it and do the name munging/re-direction). This is the
difference, for example, between stat() and lstat(). But I’ve already
posted this detail on a couple of other occassions (I think it was in the
‘Free Book Authoring Help’ thread > :wink:> , so that can’t be it …

“Pretend” I’m stupid :slight_smile:

io_open ()
{
for each component of the path {
verify access permissions, and that the parent is a directory
if this component is a symlink {
if (!S_ISLNK (msg → connect.mode) || symlink is not final component in pathname) {
return (redirect_symlink (…));
}
}
}
}

John, if I’ve understood everything so far, then the above code is what you’ve
said needs to be done – I added the “|| symlink is not final component”
because if it’s not the final component, we have to follow it, right?
For example:

/comp1/comp2/symlink/comp3/comp4

I have no choice but to follow/redirect the “symlink” component in this case, right?

The case we’re discussing in this thread, though, is the case where the symlink
is in fact the last component, is a directory, and we’ve cd’d into it:

ln -s /tmp x

cd x

In this case, the test just boils down to:

if (!S_ISLNK (msg → connect.mode)) {
return (redirect_symlink (…));
}

The problem is that there’s a difference between “ls” and “ls -l”:

[columbia@ttypa] ls
…/ …/ AAA243023 elv_13c62057.1 strtok.c voyager.root/

[columbia@ttypa] ls -l
lrwxr-xr-x 1 root root 0 Dec 18 19:56 .@ → /tmp

If you’re still being nice and reading this far :slight_smile: here’s a blow-by-blow message
trace of what happens.

First, the “ls” case:

io_open() gets called:
pathname is “x”
mode is 0xA000
IOFLAG:-R-W O_LARGEFILE
we call iofunc_open with a NULL “dattr”
we allocate an OCB and return EOK
io_stat() gets called,
io_close() gets called.

io_open() gets called:
pathname is “x”
mode is 0x0000
IOFLAG:-R-W O_LARGEFILE
we redirect the symlink to “/tmp”

io_open() gets called:
pathname is “x”
mode is 0x0000
IOFLAG:+R-W O_NONBLOCK
we redirect the symlink to “/tmp”

Looks “ok” to me – when the flag was 0xA000, we returned an OCB, and when the flag
was 0x0000, we did the symlink redirect.
In any event, the “ls” is what I would have expected, that when I’m cd’d into the
symlink’d directory, I get the contents of the directory.

However, it’s the “ls -l” case that has me worried:

io_open() gets called:
pathname is “x”
mode is 0xA000
IOFLAG:-R-W O_LARGEFILE
we call iofunc_open with a NULL “dattr”
we allocate an OCB and return EOK
io_stat() gets called,
io_close() gets called.

Then, io_readlink (“x”) is called.

That’s it – no other calls after that point, the “ls -l” has returned with
the “.@ → tmp” output.

Weird, huh?

I’m sure I’m doing something stoooopid.

Thanks again for your help and patience! :slight_smile:
-RK


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

Robert Krten <nospam83@parse.com> wrote:

John Garvey <> jgarvey@qnx.com> > wrote:

Sigh, I was hoping to just clear up any confusion xtang may have
caused by incorrectly stating that msg->connect.mode had anything
to do with read/write access (that is of course connect.ioflag).
msg->connect.mode is the differentiator in open() used to control
stat() versus lstat(), and in mknod() to specify the type (mkdir
versus mkfifo and so on).

if I’ve understood everything so far, then the above code is what you’ve
said needs to be done – I added the “|| symlink is not final component”
because if it’s not the final component, we have to follow it, right?
For example:
/comp1/comp2/symlink/comp3/comp4
I have no choice but to follow/redirect the “symlink” component

Correct, any non-terminal symlink component must be followed (and by that
I mean pathname munging and redirection via _IO_CONNECT_RET_LINK). But
the inverse is not always true, namely that you do not always follow a
terminal symlink, this varies on a case by case basis. This is why a
month or so ago I suggested you pass in a flag to control the behaviour
of the final component: for unlink() you don’t follow, for most opens()
you use the msg->connect.mode to control it, except for the CREAT|EXCL
case (see POSIX 5.3.1.2), and so on. In other words, the behaviour is
dependant on the type of message you are processing and any flags
associated with that message (refer to either the POSIX spec or any UNIX
docs for how each syscall is expected to behave with respect to symlinks).

In this case, the test just boils down to:
if (!S_ISLNK (msg → connect.mode)) {
return (redirect_symlink (…));
}

Again, too simplistic; you need an external flag as described above; for
the open case that will be just one of the factors that may set the flag.

First, the “ls” case:
io_open() gets called:
io_stat() gets called,
io_close() gets called.

Wrong. You are not honouring the msg->connect.eflag value! This
indicates if the trailing component should be considered to end in “.”
or “/” or “/.”, which becomes of huge significance to symlinks.

When I set up your x->/tmp case, I see that the first open comes in
with eflag = _IO_CONNECT_EFLAG_DIR|_IO_CONNECT_EFLAG_DOT, and so
should actually be followed (the effective path is “x/.”). This will
result in a second open for tmp, then the stat.

However, it’s the “ls -l” case that has me worried:

For my disk-based filesystems this generates the same sequence I see
in the first case: open, open, stat (I don’t see a readlink).

Weird, huh? I’m sure I’m doing something stoooopid.

Try honouring ‘eflag’ correctly during name traversal. And use a
FOLLOW/NOFOLLOW flag for name traversal too, so it can be set based
on the message/flags in each separate case. It’s just that easy :slight_smile:

John Garvey <jgarvey@qnx.com> wrote:

Robert Krten <> nospam83@parse.com> > wrote:
Wrong. You are not honouring the msg->connect.eflag value! This
indicates if the trailing component should be considered to end in “.”
or “/” or “/.”, which becomes of huge significance to symlinks.

Must be Christmas time :wink: If it’s still not clear what the namei()
symlink follow logic should be, here it is in gorey detail …

‘wasdir’ is set if “msg->connect.eflags & IO_CONNECT_EFLAG_DIR”

‘follow’ is a flag set by higher level to indicate how symlinks are to
be handled (unlink vs open/S_ISLNK(msg->connect.mode) etc)

‘islastcn’ is set at each ‘/’-separated component to indicate if it is
the terminal component name

‘attr’ is the attributes of the looked-up component

if (S_ISLNK(attr->mode) && (!(islastcn) || follow || wasdir))
; // munge pathname to contain symlink and redirect back with RET_LINK

John Garvey <jgarvey@qnx.com> wrote:

John Garvey <> jgarvey@qnx.com> > wrote:
Robert Krten <> nospam83@parse.com> > wrote:
Wrong. You are not honouring the msg->connect.eflag value! This
indicates if the trailing component should be considered to end in “.”
or “/” or “/.”, which becomes of huge significance to symlinks.

Must be Christmas time > :wink: > If it’s still not clear what the namei()
symlink follow logic should be, here it is in gorey detail …

‘wasdir’ is set if “msg->connect.eflags & IO_CONNECT_EFLAG_DIR”

‘follow’ is a flag set by higher level to indicate how symlinks are to
be handled (unlink vs open/S_ISLNK(msg->connect.mode) etc)

‘islastcn’ is set at each ‘/’-separated component to indicate if it is
the terminal component name

‘attr’ is the attributes of the looked-up component

if (S_ISLNK(attr->mode) && (!(islastcn) || follow || wasdir))
; // munge pathname to contain symlink and redirect back with RET_LINK

Wow! Thanks, Father Xmas! :slight_smile:

Yes, a clarification never hurts!

Cheers,
-RK

P.S. “namei” must be some unix fsys thing, right? :slight_smile:


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

John Garvey <jgarvey@qnx.com> wrote:

John Garvey <> jgarvey@qnx.com> > wrote:
Robert Krten <> nospam83@parse.com> > wrote:
Wrong. You are not honouring the msg->connect.eflag value! This
indicates if the trailing component should be considered to end in “.”
or “/” or “/.”, which becomes of huge significance to symlinks.

Must be Christmas time > :wink: > If it’s still not clear what the namei()
symlink follow logic should be, here it is in gorey detail …

‘wasdir’ is set if “msg->connect.eflags & IO_CONNECT_EFLAG_DIR”

‘follow’ is a flag set by higher level to indicate how symlinks are to
be handled (unlink vs open/S_ISLNK(msg->connect.mode) etc)

‘islastcn’ is set at each ‘/’-separated component to indicate if it is
the terminal component name

‘attr’ is the attributes of the looked-up component

if (S_ISLNK(attr->mode) && (!(islastcn) || follow || wasdir))
; // munge pathname to contain symlink and redirect back with RET_LINK

SYMLINKS NOW WORK! YAHOO™!
Download the latest at www.parse.com/free/ramdisk.html

Note:
There are some differences between QNX 4 and QNX 6 that I’ve noticed.
The testcase is as follows:

ln -s /tmp x

ls x

Under QNX 4: “x” is shown as a symlink.
Under QNX 6: The contents of “/tmp” are shown.

NOTE: this is on the regular filesystem, not just on the ramdisk.
NOTE FURTHER: “ls -l x” behaves the same on both, it shows “x → /tmp”

Which one is correct? My gut sez QNX 4, but I’m not a posix lawyer :slight_smile:

Cheers,
-RK


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.

Robert Krten <nospam83@parse.com> wrote:

John Garvey <> jgarvey@qnx.com> > wrote:
There are some differences between QNX 4 and QNX 6 that I’ve noticed.
The testcase is as follows:

ln -s /tmp x

ls x

Under QNX 4: “x” is shown as a symlink.
Under QNX 6: The contents of “/tmp” are shown.

Interesting; I was going to suggest you had been fooled by an ls
alias (since this almost looks like ‘-L’ has been implicitly forced);
but this difference does indeed exist %-/

NOTE FURTHER: “ls -l x” behaves the same on both, it shows “x → /tmp”

And “ls -L x” behaves too. It is just ordinary “ls x” which differs.

Which one is correct? My gut sez QNX 4, but I’m not a posix lawyer > :slight_smile:

Actually both, for the basic filesystem API of open/stat/lstat/readdir,
are correct (of course :slight_smile:. The difference is actually in the “ls”
utility between QNX4/6. There is some “#ifdef QNXNTO” code that checks
to see if it has a symlink to a directory, and if so, follows it with
stat(). From the CVS log this was a deliberate change (personally I
disagree, since it seems to obviate the existence of ‘-L’, plus you can
always use “ls x/” to force the follow explicitly when you want it to,
but you can take it up with peterv if you wish … :slight_smile:.

John Garvey <jgarvey@qnx.com> wrote:

Which one is correct? My gut sez QNX 4, but I’m not a posix lawyer > :slight_smile:
Actually both, for the basic filesystem API of open/stat/lstat/readdir,
are correct (of course > :slight_smile:> . The difference is actually in the “ls”
utility between QNX4/6. There is some “#ifdef QNXNTO” code that checks
to see if it has a symlink to a directory, and if so, follows it with

Sigh; the Open Group (Single UNIX) Base Specifications Issue 6 (2001)
for “ls” says this:

For each operand that names a file of a type other than directory or
symbolic link to a directory, ls shall write the name of the file as
well as any requested, associated information. For each operand that
names a file of type directory, ls shall write the names of files
contained within the directory as well as any requested, associated
information. If one of the -d, -F, or -l options are specified, and one
of the -H or -L options are not specified, for each operand that names a
file of type symbolic link to a directory, ls shall write the name of
the file as well as any requested, associated information. If none of
the -d, -F, or -l options are specified, or the -H or -L options are
specified, for each operand that names a file of type symbolic link to a
directory, ls shall write the names of files contained within the
directory as well as any requested, associated information.

So, QNX6 would appear to be conforming to this changed behaviour (the
explicit mentions to symlinks to directories are relatively new, decreed
after QNX4, which is conforming to the usage of its day). The whole
symlinks and logical/physical walk/recursion through the heirarchy is
somewhat convoluted, and in many cases dictated by historical precedent;
also options ‘-H’, ‘-L’ and ‘-P’ are conjured up to explicitly control
symlink traversal behaviour (with “cp”, “rm”, “ls”, etc).

To test/verify a filesystem implementation you really need to access it
solely at the raw API level and not with the utilities, as they quite
often contain additional processing (so “unlink()” rather than “$ rm”,
“stat() / lstat()” rather than “ls”, etc).

John Garvey <jgarvey@qnx.com> wrote:

John Garvey <> jgarvey@qnx.com> > wrote:
Which one is correct? My gut sez QNX 4, but I’m not a posix lawyer > :slight_smile:
Actually both, for the basic filesystem API of open/stat/lstat/readdir,
are correct (of course > :slight_smile:> . The difference is actually in the “ls”
utility between QNX4/6. There is some “#ifdef QNXNTO” code that checks
to see if it has a symlink to a directory, and if so, follows it with

Sigh; the Open Group (Single UNIX) Base Specifications Issue 6 (2001)
for “ls” says this:

For each operand that names a file of a type other than directory or
symbolic link to a directory, ls shall write the name of the file as
well as any requested, associated information. For each operand that
names a file of type directory, ls shall write the names of files
contained within the directory as well as any requested, associated
information. If one of the -d, -F, or -l options are specified, and one
of the -H or -L options are not specified, for each operand that names a
file of type symbolic link to a directory, ls shall write the name of
the file as well as any requested, associated information. If none of
the -d, -F, or -l options are specified, or the -H or -L options are
specified, for each operand that names a file of type symbolic link to a
directory, ls shall write the names of files contained within the
directory as well as any requested, associated information.

So, QNX6 would appear to be conforming to this changed behaviour (the
explicit mentions to symlinks to directories are relatively new, decreed
after QNX4, which is conforming to the usage of its day). The whole
symlinks and logical/physical walk/recursion through the heirarchy is
somewhat convoluted, and in many cases dictated by historical precedent;
also options ‘-H’, ‘-L’ and ‘-P’ are conjured up to explicitly control
symlink traversal behaviour (with “cp”, “rm”, “ls”, etc).

To test/verify a filesystem implementation you really need to access it
solely at the raw API level and not with the utilities, as they quite
often contain additional processing (so “unlink()” rather than “$ rm”,
“stat() / lstat()” rather than “ls”, etc).
Yes, I’ve been writing my own stat, truncate, etc “utilities”

that just call the raw C API – for exactly that reason :slight_smile:

Anyway, I’m happy that everything w.r.t. symlinks works now in
my ramdisk, and that there’s some sort of clear explanation for
things working differently under different OS’s :slight_smile:

Thanks again, John!

Cheers,
-RK


Robert Krten, PARSE Software Devices +1 613 599 8316.
Realtime Systems Architecture, Books, Video-based and Instructor-led
Training and Consulting at www.parse.com.
Email my initials at parse dot com.