bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

mkdir -p and POSIX


From: Eric Blake
Subject: mkdir -p and POSIX
Date: Thu, 8 Oct 2009 16:44:41 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

The Austin Group made their recommendation about mkdir -p today:

"I suggest replacing the description of -p with:

-p  Create any missing intermediate pathname components.

    For each dir operand that does not name an existing directory,
    before performing the actions described in the DESCRIPTION above
    the mkdir utility shall create any pathname components of the path
    prefix of dir that do not name an existing directory by performing
    actions equivalent to first calling the mkdir() function with the
    following arguments:

      1. A pathname naming the missing pathname component, ending
         with a trailing <slash> character, as the path argument.

      2. The value zero as the mode argument.

    and then calling the chmod() function with the following
    arguments:

      1. The same path argument as in the mkdir() call.

      2. The value (S_IWUSR|S_IXUSR|~filemask) as the mode argument,
         where filemask is the file mode creation mask of the process
         (see [xref to umask()]).

    Each dir operand that names an existing directory shall be ignored
    without error."
http://austingroupbugs.net/view.php?id=161

The significant part about this is that it requires, for 'mkdir -p a/b', that 
implementations call mkdir("a/",mode), not mkdir("a",mode).  This makes a 
difference, given that the POSIX requirements for mkdir(2) will follow through 
a dangling symlink "a" to create the underlying directory, where without the 
trailing slash it would fail with EEXIST.

Should I go ahead and start modifying the mkdir-p module to preserve the 
trailing slash to the underlying mkdir call?  It won't immediately change 
behavior on GNU/Linux (without either a kernel change or an rpl_mkdir wrapper), 
because GNU's behavior for mkdir("dangling/") is contrary to POSIX.  But it 
will make a difference on Solaris.

This also means that build-aux/mkinstalldirs and build-aux/install-sh are also 
impacted.  And there, since we can't guarantee whether the system mkdir(1) 
gracefully handles trailing slashes, it could get rather difficult to guarantee 
creating a directory tree through a dangling symlink using portable shell code.

-- 
Eric Blake






reply via email to

[Prev in Thread] Current Thread [Next in Thread]