Ignore:
Timestamp:
Aug 13, 2025, 1:34:19 AM (3 months ago)
Author:
bird
Message:

lib/nt,kmk: Fixed around rm/unlink semantics and general support for long file names in lib/nt.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/rm.c

    r3618 r3682  
    8282#  include "mscfakes.h"
    8383# endif
    84 # include "nt/ntunlink.h"
    85   /* Use the special unlink implementation to do rmdir too. */
    86 # undef  rmdir
    87 # define rmdir(a_pszPath)       birdUnlinkForced(a_pszPath)
     84# include "nt/ntunlink.h" /* redefines both unlink & rmdir */
    8885#endif
    8986#if defined(__OS2__) || defined(_MSC_VER)
     
    430427#ifdef KBUILD_OS_WINDOWS
    431428                                if (p->fts_parent->fts_dirfd != NT_FTS_INVALID_HANDLE_VALUE) {
    432                                     rval = birdUnlinkForcedEx(p->fts_parent->fts_dirfd, p->fts_name);
     429                                    rval = birdRmDirForcedEx(p->fts_parent->fts_dirfd, p->fts_name);
    433430                                } else {
    434                                     rval = birdUnlinkForced(p->fts_accpath);
     431                                    rval = birdRmDirForced(p->fts_accpath);
    435432                                }
    436433#else
     
    480477                                                rval = birdUnlinkForcedFastEx(p->fts_parent->fts_dirfd, p->fts_name);
    481478                                        } else { /* NtDeleteFile doesn't work on directory links, so slow symlink deletion: */
    482                                                 rval = birdUnlinkForcedEx(p->fts_parent->fts_dirfd, p->fts_name);
     479                                                if (p->fts_stat.st_isdirsymlink) {
     480                                                        rval = birdRmDirForcedEx(p->fts_parent->fts_dirfd, p->fts_name);
     481                                                } else {
     482                                                        rval = birdUnlinkForcedEx(p->fts_parent->fts_dirfd, p->fts_name);
     483                                                }
    483484                                        }
    484485                                } else {
     
    486487                                                rval = birdUnlinkForcedFast(p->fts_accpath);
    487488                                        } else { /* NtDeleteFile doesn't work on directory links, so slow symlink deletion: */
    488                                                 rval = birdUnlinkForced(p->fts_accpath);
     489                                                if (p->fts_stat.st_isdirsymlink) {
     490                                                        rval = birdRmDirForced(p->fts_accpath);
     491                                                } else {
     492                                                        rval = birdUnlinkForced(p->fts_accpath);
     493                                                }
    489494                                        }
    490495                                }
     
    586591                                operation = "unlink";
    587592#else
    588                                 if (pThis->fUseNtDeleteFile) {
     593                                /*if (sb.st_isdirsymlink) {
     594                                        rval = birdRmDirForced(f);
     595                                        operation = "rmdir";
     596                                } else*/ if (pThis->fUseNtDeleteFile /*&& S_ISREG(sb.st_mode) && !sb.st_isdirsymlink*/) {
    589597                                        rval = birdUnlinkForcedFast(f);
    590598                                        operation = "NtDeleteFile";
Note: See TracChangeset for help on using the changeset viewer.