VirtualBox

Changeset 3001 in kBuild


Ignore:
Timestamp:
Nov 5, 2016 8:03:21 PM (8 years ago)
Author:
bird
Message:

fts-nt.c: Wide char support, part 2.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/lib/nt/fts-nt.c

    r3000 r3001  
    8585#include "nthlp.h"
    8686#include "ntdir.h"
     87#include <stdio.h>//debug
    8788
    8889static FTSENT   *fts_alloc(FTS *sp, char const *name, size_t namelen, wchar_t const *wcsname, size_t cwcname);
     
    116117#define MAX(a, b)  ( (a) >= (b) ? (a) : (b) )
    117118
    118 #define AT_SYMLINK_NOFOLLOW 1
    119 #define fstatat(hDir, pszPath, pStat, fFlags) birdStatAt((hDir), (pszPath), (pStat), (fFlags) != AT_SYMLINK_NOFOLLOW)
    120119#define FTS_NT_DUMMY_SYMFD_VALUE        ((HANDLE)~(intptr_t)(2)) /* current process */
    121120
     
    313312         * known that the path will fit.
    314313         */
    315     if (!(sp->fts_options & FTS_NO_ANSI)) {
     314        if (!(sp->fts_options & FTS_NO_ANSI)) {
    316315                char *cp;
    317316                len = p->fts_pathlen = p->fts_namelen;
     
    711710                if (cur->fts_parent->fts_dirfd != INVALID_HANDLE_VALUE) {
    712711                        /* (This works fine for symlinks too, since we follow them.) */
    713                         cur->fts_dirfd = birdOpenFileEx(cur->fts_parent->fts_dirfd,
    714                                                                                         cur->fts_name,
    715                                                                                         FILE_READ_DATA | SYNCHRONIZE,
    716                                                                                         FILE_ATTRIBUTE_NORMAL,
    717                                                                                         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    718                                                                                         FILE_OPEN,
    719                                                                                         FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
    720                                                                                         OBJ_CASE_INSENSITIVE);
     712                        cur->fts_dirfd = birdOpenFileExW(cur->fts_parent->fts_dirfd,
     713                                                         cur->fts_wcsname,
     714                                                         FILE_READ_DATA | SYNCHRONIZE,
     715                                                         FILE_ATTRIBUTE_NORMAL,
     716                                                         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     717                                                         FILE_OPEN,
     718                                                         FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
     719                                                         OBJ_CASE_INSENSITIVE);
    721720                } else {
    722                         cur->fts_dirfd = birdOpenFile(cur->fts_accpath,
    723                                                                                   FILE_READ_DATA | SYNCHRONIZE,
    724                                                                                   FILE_ATTRIBUTE_NORMAL,
    725                                                                                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    726                                                                                   FILE_OPEN,
    727                                                                                   FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
    728                                                                                   OBJ_CASE_INSENSITIVE);
    729                 }
     721                        cur->fts_dirfd = birdOpenFileW(cur->fts_wcsaccpath,
     722                                                       FILE_READ_DATA | SYNCHRONIZE,
     723                                                       FILE_ATTRIBUTE_NORMAL,
     724                                                       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     725                                                       FILE_OPEN,
     726                                                       FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
     727                                                       OBJ_CASE_INSENSITIVE);
     728                }
     729                if (cur->fts_dirfd != INVALID_HANDLE_VALUE) { /* likely */ }
     730                else goto l_open_err;
     731
    730732        } else {
    731733                fDirOpenFlags |= BIRDDIR_F_RESTART_SCAN;
     
    733735        dirp = birdDirOpenFromHandle(cur->fts_dirfd, NULL, fDirOpenFlags);
    734736        if (dirp == NULL) {
     737l_open_err:
    735738                if (type == BREAD) {
    736739                        cur->fts_info = FTS_DNR;
     
    866869{
    867870        int saved_errno;
    868         const char *path;
     871        const wchar_t *wcspath;
    869872
    870873        if (dfd == INVALID_HANDLE_VALUE) {
    871                 path = p->fts_accpath;
     874                wcspath = p->fts_wcsaccpath;
    872875        } else {
    873                 path = p->fts_name;
     876                wcspath = p->fts_wcsname;
    874877        }
    875878
     
    880883         */
    881884        if (ISSET(FTS_LOGICAL) || follow) {
    882                 if (fstatat(dfd, path, &p->fts_stat, 0)) {
     885                if (birdStatAtW(dfd, wcspath, &p->fts_stat, 1 /*fFollowLink*/)) {
    883886                        saved_errno = errno;
    884                         if (fstatat(dfd, path, &p->fts_stat, AT_SYMLINK_NOFOLLOW)) {
     887                        if (birdStatAtW(dfd, wcspath, &p->fts_stat, 0 /*fFollowLink*/)) {
    885888                                p->fts_errno = saved_errno;
    886889                                goto err;
     
    890893                                return (FTS_SLNONE);
    891894                }
    892         } else if (fstatat(dfd, path, &p->fts_stat, AT_SYMLINK_NOFOLLOW)) {
     895        } else if (birdStatAtW(dfd, wcspath, &p->fts_stat, 0 /*fFollowLink*/)) {
    893896                p->fts_errno = errno;
    894897err:            memset(&p->fts_stat, 0, sizeof(struct stat));
     
    10091012                p->fts_wcsname = (wchar_t *)(p + 1);
    10101013                memcpy(p->fts_wcsname, wcsname, cwcname * sizeof(wchar_t));
    1011                 p->fts_wcsname[cwcname];
     1014                p->fts_wcsname[cwcname] = '\0';
    10121015                p->fts_cwcname = cwcname;
    10131016                if (!(sp->fts_options & FTS_NO_ANSI)) {
Note: See TracChangeset for help on using the changeset viewer.

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