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.

Location:
trunk/src/kmk/kmkbuiltin
Files:
3 edited

Legend:

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

    r3636 r3682  
    4444#undef utimes
    4545#undef lutimes
     46#include "nt/ntmkdirat.h"
     47#undef mkdir
     48#undef mkdirat
    4649
    4750#include "console.h"
     
    314317int mkdir_msc(const char *path, mode_t mode)
    315318{
     319#if 0
    316320    int rc = (mkdir)(path);
    317321    if (rc)
     
    328332    }
    329333    return rc;
     334#else
     335    return birdMkDir(path, mode);
     336#endif
    330337}
    331338
  • trunk/src/kmk/kmkbuiltin/mscfakes.h

    r3636 r3682  
    5050#include <stdio.h> /* unlink for UCRT */
    5151#include "nt/ntstat.h"
    52 #include "nt/ntunlink.h"
     52#include "nt/ntunlink.h" /* redefines both unlink and rmdir */
    5353#ifdef MSC_DO_64_BIT_IO
    5454# if _MSC_VER >= 1400 /* We want 64-bit file lengths here when possible. */
     
    6161
    6262#undef  PATH_MAX
    63 #define PATH_MAX   _MAX_PATH
     63/*#define PATH_MAX   _MAX_PATH */
     64#define PATH_MAX   1024
    6465#undef  MAXPATHLEN
    65 #define MAXPATHLEN _MAX_PATH
     66#define MAXPATHLEN PATH_MAX
    6667
    6768#define EX_OK 0
     
    146147#define readlink(link, buf, size) -1
    147148#define reallocf(old, size) realloc(old, size)
    148 int rmdir_msc(const char *path);
    149 #define rmdir(path) rmdir_msc(path)
     149/*int rmdir_msc(const char *path);
     150#define rmdir(path) rmdir_msc(path) */
    150151intmax_t strtoimax(const char *nptr, char **endptr, int base);
    151152uintmax_t strtoumax(const char *nptr, char **endptr, int base);
  • 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.