<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 7, 2018 at 5:09 PM, Chris Johns <span dir="ltr"><<a href="mailto:chrisj@rtems.org" target="_blank">chrisj@rtems.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 08/05/2018 07:32, Joel Sherrill wrote:<br>
> On Mon, May 7, 2018 at 3:58 PM, Chris Johns <<a href="mailto:chrisj@rtems.org">chrisj@rtems.org</a><br>
</span><span class="">> <mailto:<a href="mailto:chrisj@rtems.org">chrisj@rtems.org</a>>> wrote:<br>
> <br>
>     On 08/05/2018 03:56, Joel Sherrill wrote:<br>
>     > <br>
>     > I have attached a workaround.<br>
> <br>
>     Looks like a solution to me.<br>
> <br>
> <br>
> Good enough for now. All basename() calls should come from rld. <br>
> <br>
> Eventually all dirname() calls should also.<br>
> <br>
> Luckily no file uses both so we don't have to include libgen.h when<br>
> for dirname() and screw up basename().<br>
<br>
</span>Works on FreeBSD ;)<br>
<span class=""><br>
>     > It seems that libgen.h has this:<br>
>     > <br>
>     > ==============================<wbr>==========================<br>
>     > /* Return final component of PATH.<br>
>     > <br>
>     >    This is the weird XPG version of this function.  It sometimes will<br>
>     >    modify its argument.  Therefore we normally use the GNU version (in<br>
>     >    <string.h>) and only if this header is included make the XPG<br>
>     >    version available under the real name.  */<br>
>     > extern char *__xpg_basename (char *__path) __THROW;<br>
>     > #define basename        __xpg_basename<br>
>     > ==============================<wbr>==========================<br>
>     ><br>
> <br>
>     Oh yuck, who would ever work in standards. ;)<br>
> <br>
>     Is this function allowed to be redefined as a macro?<br>
> <br>
> <br>
> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html" rel="noreferrer" target="_blank">http://pubs.opengroup.org/<wbr>onlinepubs/9699919799/<wbr>functions/basename.html</a><br>
> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/dirname.html" rel="noreferrer" target="_blank">http://pubs.opengroup.org/<wbr>onlinepubs/9699919799/<wbr>functions/dirname.html</a><br>
> <br>
> Neither seems to say anything about that. Both have language like this:<br>
> <br>
</span>> " The /dirname/() function may modify the string pointed to by /path/, and may<br>
<span class="">> return a pointer to static storage that may then be overwritten by a subsequent<br>
</span>> call to /dirname/()."<br>
<span class="">> <br>
> It really would be better to have our own implementations and not<br>
> use the standard basename() and dirname(). The POSIX ones<br>
> are not thread-safe.<br>
<br>
</span>We have them in rld-path. It is a little like the python os.path module.<br>
<span class=""><br>
> <br>
>     > Chris has used basename as a method name and even though that should<br>
>     > be perfectly acceptable, the macro above gets expanded, the name <br>
>     > gets changed (in some places) to rld::path::__xpg_basename()<br>
>     > <br>
>     >       r.lowSourceLine = rld::path::basename (location);<br>
>     > <br>
>     > IMO the fix is to add dirname to rld-files, use rld basename and dirname<br>
>     > exclusively, and avoid libgen.h at all costs.<br>
> <br>
>     Wouldn't the world be so much simpler if there was only Linux? ;)<br>
> <br>
> <br>
> The methods as defined by POSIX aren't thread-safe and can <br>
> modify the caller's string. Suck by design. :)<br>
> <br>
> Having one mono-culture is easy but it doesn't make it right<br>
> even when conformant. :)<br>
<br>
</span>It is a horrible implementation and not safe in C++.<br></blockquote><div><br></div><div>Not safe in C. Just not safe. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
> <br>
>     > I didn't do that much work. I got lucky in a couple of files by removing the<br>
>     > include of libgen.h since it wasn't needed but I had to leave it in one place.<br>
>     > <br>
>     > $ grep dirname *.cc<br>
>     > GcovData.cc:    dirname( path );<br>
>     > <br>
>     > Hopefully this lets you all proceed with Chris' patches and my slight hack<br>
>     > in place.<br>
>     > <br>
>     > Ultimate solution is probably simple. We just need to hear from Chris.<br>
> <br>
>     This is fine. I am slowing move covoar to use more and more of the rtemstoolkit.<br>
> <br>
>     I will merge these changes into a v2 patch set.<br>
> <br>
> <br>
> Are you adding dirname()? Or does that need a ticket?<br>
> <br>
<br>
</span>Confused....<br>
<br>
<a href="https://git.rtems.org/rtems-tools/tree/rtemstoolkit/rld-path.h#n52" rel="noreferrer" target="_blank">https://git.rtems.org/rtems-<wbr>tools/tree/rtemstoolkit/rld-<wbr>path.h#n52</a></blockquote><div><br></div><div>I missed that somehow. There was one call in covoar to the OS method. Just replace it</div><div>and remove the libgen.h reference. Easy. :)</div><div><br></div><div>--joel</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
?<br>
<span class="HOEnZb"><font color="#888888"><br>
Chris<br>
</font></span></blockquote></div><br></div></div>