bug-coreutils
[Top][All Lists]
Advanced

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

bug#22584: cp could be more precise than "Not a directory"


From: Assaf Gordon
Subject: bug#22584: cp could be more precise than "Not a directory"
Date: Mon, 8 Feb 2016 09:42:06 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1

Hello Dan,

A bit more technical information (though not a resolution):

On 02/07/2016 11:19 AM, 積丹尼 Dan Jacobson wrote:
$ cp .profile /tmp/My_DocVments/
cp: cannot create regular file '/tmp/My_DocVments/': Not a directory

Well can't it be more precise:
No such directory nor file.

This is in fact done on purpose, explicitly in the code.

To illustrate:

    $ rm -rf /tmp/foobar
    $ strace -e stat cp .profile /tmp/foobar/
    stat("/tmp/foobar/", 0x7ffe77e60ed0)    = -1 ENOENT (No such file or 
directory)
    cp: cannot create regular file ‘/tmp/foobar/’: Not a directory

Despite stat(2) return error of 'ENOENT', the code in src/copy.c:1150
sets the error code to ENOTDIR (The comment refers only to 'EISDIR',
perhaps others can expand on why):

        /* Improve quality of diagnostic when a nonexistent dst_name
           ends in a slash and open fails with errno == EISDIR.  */
        if (dest_desc < 0 && dest_errno == EISDIR
               && *dst_name && dst_name[strlen (dst_name) - 1] == '/')
            dest_errno = ENOTDIR;

Then at src/copy.c:1150, the error is reported:

          error (0, dest_errno, _("cannot create regular file %s"),
                 quoteaf (dst_name));

===

Perhaps this is done to simulate the real ENOTDIR which is returned
if the file exist but is not a directory:

    $ rm -rf /tmp/foobar
    $ touch /tmp/foobar
    $ strace -e stat cp ~/.profile /tmp/foobar/
    stat("/tmp/foobar/", 0x7ffd40edf6c0)    = -1 ENOTDIR (Not a directory)
    cp: failed to access ‘/tmp/foobar/’: Not a directory

===


regards,
 - assaf






reply via email to

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