VirtualBox

Changeset 2713 in kBuild


Ignore:
Timestamp:
Nov 21, 2013 9:11:00 PM (11 years ago)
Author:
bird
Message:

Some unlink(), rmdir() and kmk_rm optimizations.

Location:
trunk/src
Files:
2 added
7 edited

Legend:

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

    r2702 r2713  
    4040#include <direct.h>
    4141#include "nt/ntstat.h"
     42#include "nt/ntunlink.h"
    4243#if defined(MSC_DO_64_BIT_IO) && _MSC_VER >= 1400 /* We want 64-bit file lengths here when possible. */
    4344# define off_t __int64
  • trunk/src/kmk/kmkbuiltin/rm.c

    r2702 r2713  
    6767# include "haikufakes.h"
    6868#endif
    69 #ifdef _MSC_VER
    70 # include "mscfakes.h"
     69#ifdef KBUILD_OS_WINDOWS
     70# ifdef _MSC_VER
     71#  include "mscfakes.h"
     72# endif
     73# include "nt/ntunlink.h"
     74  /* Use the special unlink implementation to do rmdir too. */
     75# undef  rmdir
     76# define rmdir(a_pszPath)       birdUnlinkForced(a_pszPath)
    7177#endif
    7278#if defined(__OS2__) || defined(_MSC_VER)
     
    7783#include "kbuild_protection.h"
    7884
    79 #if defined(__EMX__) || defined(_MSC_VER)
     85#if defined(__EMX__) || defined(KBUILD_OS_WINDOWS)
    8086# define IS_SLASH(ch)   ( (ch) == '/' || (ch) == '\\' )
    8187# define HAVE_DOS_PATHS 1
     
    100106
    101107static int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok;
     108#ifdef KBUILD_OS_WINDOWS
     109static int fUseNtDeleteFile;
     110#endif
    102111static uid_t uid;
    103112
     
    114123    { "disable-full-protection",                        no_argument, 0, 266 },
    115124    { "protection-depth",                               required_argument, 0, 267 },
     125#ifdef KBUILD_OS_WINDOWS
     126    { "nt-delete-file",                                 no_argument, 0, 268 },
     127#endif
    116128    { 0, 0,     0, 0 },
    117129};
     
    149161        argv0 = argv[0];
    150162        dflag = eval = fflag = iflag = Pflag = vflag = Wflag = stdin_ok = 0;
     163#ifdef KBUILD_OS_WINDOWS
     164        fUseNtDeleteFile = 0;
     165#endif
    151166        uid = 0;
    152167        kBuildProtectionInit(&g_ProtData);
     
    215230                        }
    216231                        break;
     232#ifdef KBUILD_OS_WINDOWS
     233                case 268:
     234                        fUseNtDeleteFile = 1;
     235                        break;
     236#endif
    217237                case '?':
    218238                default:
     
    404424                                        if (!rm_overwrite(p->fts_accpath, NULL))
    405425                                                continue;
     426#ifdef KBUILD_OS_WINDOWS
     427                                rval = birdUnlinkForcedFast(p->fts_accpath);
     428#else
    406429                                rval = unlink(p->fts_accpath);
    407 #ifdef _MSC_VER
    408                                 if (rval != 0) {
    409                                         chmod(p->fts_accpath, 0777);
    410                                         rval = unlink(p->fts_accpath);
    411                                 }
    412430#endif
    413431
     
    499517                                rval = undelete(f);
    500518                                operation = "undelete";
    501 #ifndef _MSC_VER
    502519                        } else if (S_ISDIR(sb.st_mode)) {
    503 #else
    504                         } else if (S_ISDIR(sb.st_mode) || sb.st_dirsymlink) {
    505 #endif
    506520                                rval = rmdir(f);
    507521                                operation = "rmdir";
     
    510524                                        if (!rm_overwrite(f, &sb))
    511525                                                continue;
     526#ifndef KBUILD_OS_WINDOWS
    512527                                rval = unlink(f);
    513 #ifdef _MSC_VER
    514                                 if (rval != 0) {
    515                                         chmod(f, 0777);
    516                                         rval = unlink(f);
     528                                operation = "unlink";
     529#else
     530                                if (fUseNtDeleteFile) {
     531                                        rval = birdUnlinkForcedFast(f);
     532                                        operation = "NtDeleteFile";
     533                                } else {
     534                                        rval = birdUnlinkForced(f);
     535                                        operation = "unlink";
    517536                                }
    518537#endif
    519                                 operation = "unlink";
    520538                        }
    521539                }
  • trunk/src/lib/Makefile.kmk

    r2702 r2713  
    4646       nt/nthlpfs.c \
    4747       nt/ntdir.c \
    48        nt/ntstat.c
     48       nt/ntstat.c \
     49       nt/ntunlink.c
    4950kUtil_SOURCES.solaris = \
    5051        restartable-syscall-wrappers.c
  • trunk/src/lib/nt/nthlp.h

    r2704 r2713  
    5959                              ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
    6060                              MY_UNICODE_STRING *pNameUniStr);
     61MY_NTSTATUS birdOpenFileUniStr(MY_UNICODE_STRING *pNtPath, ACCESS_MASK fDesiredAccess, ULONG fFileAttribs,
     62                               ULONG fShareAccess, ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
     63                               HANDLE *phFile);
    6164void        birdCloseFile(HANDLE hFile);
     65int         birdDosToNtPath(const char *pszPath, MY_UNICODE_STRING *pNtPath);
    6266void        birdFreeNtPath(MY_UNICODE_STRING *pNtPath);
    6367
  • trunk/src/lib/nt/nthlpcore.c

    r2703 r2713  
    4545MY_NTSTATUS (WINAPI *g_pfnNtCreateFile)(PHANDLE, MY_ACCESS_MASK, MY_OBJECT_ATTRIBUTES *, MY_IO_STATUS_BLOCK *,
    4646                                        PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);
     47MY_NTSTATUS (WINAPI *g_pfnNtDeleteFile)(MY_OBJECT_ATTRIBUTES *);
    4748MY_NTSTATUS (WINAPI *g_pfnNtQueryInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FILE_INFORMATION_CLASS);
    4849MY_NTSTATUS (WINAPI *g_pfnNtQueryVolumeInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FS_INFORMATION_CLASS);
     
    5051                                                PVOID, ULONG, MY_FILE_INFORMATION_CLASS, BOOLEAN,
    5152                                                MY_UNICODE_STRING *, BOOLEAN);
     53MY_NTSTATUS (WINAPI *g_pfnNtSetInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FILE_INFORMATION_CLASS);
    5254BOOLEAN     (WINAPI *g_pfnRtlDosPathNameToNtPathName_U)(PCWSTR, MY_UNICODE_STRING *, PCWSTR *, MY_RTL_RELATIVE_NAME_U *);
    5355MY_NTSTATUS (WINAPI *g_pfnRtlAnsiStringToUnicodeString)(MY_UNICODE_STRING *, MY_ANSI_STRING const *, BOOLEAN);
     
    6264    { (FARPROC *)&g_pfnNtClose,                         "NtClose" },
    6365    { (FARPROC *)&g_pfnNtCreateFile,                    "NtCreateFile" },
     66    { (FARPROC *)&g_pfnNtDeleteFile,                    "NtDeleteFile" },
    6467    { (FARPROC *)&g_pfnNtQueryInformationFile,          "NtQueryInformationFile" },
    6568    { (FARPROC *)&g_pfnNtQueryVolumeInformationFile,    "NtQueryVolumeInformationFile" },
    6669    { (FARPROC *)&g_pfnNtQueryDirectoryFile,            "NtQueryDirectoryFile" },
     70    { (FARPROC *)&g_pfnNtSetInformationFile,            "NtSetInformationFile" },
    6771    { (FARPROC *)&g_pfnRtlDosPathNameToNtPathName_U,    "RtlDosPathNameToNtPathName_U" },
    6872    { (FARPROC *)&g_pfnRtlAnsiStringToUnicodeString,    "RtlAnsiStringToUnicodeString" },
     
    137141    {
    138142        /* EPERM            =  1 */
     143        case STATUS_CANNOT_DELETE:
     144            errno = EPERM;
     145            break;
    139146        /* ENOENT           =  2 */
    140147        case STATUS_NOT_FOUND:
  • trunk/src/lib/nt/nthlpfs.c

    r2710 r2713  
    7878
    7979
    80 static int birdDosToNtPath(const char *pszPath, MY_UNICODE_STRING *pNtPath)
     80int birdDosToNtPath(const char *pszPath, MY_UNICODE_STRING *pNtPath)
    8181{
    8282    MY_NTSTATUS         rcNt;
     
    128128
    129129
    130 static MY_NTSTATUS birdOpenFileInternal(MY_UNICODE_STRING *pNtPath, ACCESS_MASK fDesiredAccess, ULONG fFileAttribs,
    131                                         ULONG fShareAccess, ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
    132                                         HANDLE *phFile)
     130MY_NTSTATUS birdOpenFileUniStr(MY_UNICODE_STRING *pNtPath, ACCESS_MASK fDesiredAccess, ULONG fFileAttribs,
     131                               ULONG fShareAccess, ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
     132                               HANDLE *phFile)
    133133{
    134134    MY_IO_STATUS_BLOCK      Ios;
     
    203203    {
    204204        HANDLE hFile;
    205         rcNt = birdOpenFileInternal(&NtPath, fDesiredAccess, fFileAttribs, fShareAccess,
    206                                     fCreateDisposition, fCreateOptions, fObjAttribs, &hFile);
     205        rcNt = birdOpenFileUniStr(&NtPath, fDesiredAccess, fFileAttribs, fShareAccess,
     206                                  fCreateDisposition, fCreateOptions, fObjAttribs, &hFile);
    207207        if (MY_NT_SUCCESS(rcNt))
    208208        {
     
    278278                 */
    279279                HANDLE hFile;
    280                 rcNt = birdOpenFileInternal(&NtPath, fDesiredAccess, fFileAttribs, fShareAccess,
    281                                             fCreateDisposition, fCreateOptions, fObjAttribs, &hFile);
     280                rcNt = birdOpenFileUniStr(&NtPath, fDesiredAccess, fFileAttribs, fShareAccess,
     281                                          fCreateDisposition, fCreateOptions, fObjAttribs, &hFile);
    282282                if (MY_NT_SUCCESS(rcNt))
    283283                {
  • trunk/src/lib/nt/ntstuff.h

    r2708 r2713  
    199199/** The sizeof(MY_FILE_NAMES_INFORMATION) without the FileName. */
    200200#define MIN_SIZEOF_MY_FILE_ID_FULL_DIR_INFORMATION  ( (size_t)&((MY_FILE_ID_FULL_DIR_INFORMATION *)0)->FileName )
     201
     202
     203typedef struct MY_FILE_DISPOSITION_INFORMATION
     204{
     205    BOOLEAN         DeleteFile;
     206} MY_FILE_DISPOSITION_INFORMATION;
    201207
    202208
     
    361367extern MY_NTSTATUS (WINAPI * g_pfnNtCreateFile)(PHANDLE, MY_ACCESS_MASK, MY_OBJECT_ATTRIBUTES *, MY_IO_STATUS_BLOCK *,
    362368                                                PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);
     369extern MY_NTSTATUS (WINAPI * g_pfnNtDeleteFile)(MY_OBJECT_ATTRIBUTES *);
    363370extern MY_NTSTATUS (WINAPI * g_pfnNtQueryInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *,
    364371                                                          PVOID, LONG, MY_FILE_INFORMATION_CLASS);
     
    368375                                                        PVOID, ULONG, MY_FILE_INFORMATION_CLASS, BOOLEAN,
    369376                                                        MY_UNICODE_STRING *, BOOLEAN);
     377extern MY_NTSTATUS (WINAPI * g_pfnNtSetInformationFile)(HANDLE, MY_IO_STATUS_BLOCK *, PVOID, LONG, MY_FILE_INFORMATION_CLASS);
    370378extern BOOLEAN     (WINAPI * g_pfnRtlDosPathNameToNtPathName_U)(PCWSTR, MY_UNICODE_STRING *, PCWSTR *, MY_RTL_RELATIVE_NAME_U *);
    371379extern MY_NTSTATUS (WINAPI * g_pfnRtlAnsiStringToUnicodeString)(MY_UNICODE_STRING *, MY_ANSI_STRING const *, BOOLEAN);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette