~ubuntu-branches/ubuntu/raring/virtualbox-ose/raring

« back to all changes in this revision

Viewing changes to src/VBox/Runtime/r3/win/path-win.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-01-30 23:27:25 UTC
  • mfrom: (0.3.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20110130232725-2ouajjd2ggdet0zd
Tags: 4.0.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Drop ubuntu-01-fix-build-gcc45.patch, fixed upstream.
* Drop ubuntu-02-as-needed.patch, added to the Debian package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: path-win.cpp $ */
 
1
/* $Id: path-win.cpp 34003 2010-11-11 17:21:56Z vboxsync $ */
2
2
/** @file
3
3
 * IPRT - Path manipulation.
4
4
 */
5
5
 
6
6
/*
7
 
 * Copyright (C) 2006-2007 Oracle Corporation
 
7
 * Copyright (C) 2006-2010 Oracle Corporation
8
8
 *
9
9
 * This file is part of VirtualBox Open Source Edition (OSE), as
10
10
 * available from http://www.virtualbox.org. This file is free software;
223
223
                return rc;
224
224
            }
225
225
            FindClose(hDir);
226
 
            Data.dwFileAttributes = FindData.dwFileAttributes;
227
 
            Data.ftCreationTime = FindData.ftCreationTime;
228
 
            Data.ftLastAccessTime = FindData.ftLastAccessTime;
229
 
            Data.ftLastWriteTime = FindData.ftLastWriteTime;
230
 
            Data.nFileSizeHigh = FindData.nFileSizeHigh;
231
 
            Data.nFileSizeLow = FindData.nFileSizeLow;
 
226
 
 
227
            Data.dwFileAttributes   = FindData.dwFileAttributes;
 
228
            Data.ftCreationTime     = FindData.ftCreationTime;
 
229
            Data.ftLastAccessTime   = FindData.ftLastAccessTime;
 
230
            Data.ftLastWriteTime    = FindData.ftLastWriteTime;
 
231
            Data.nFileSizeHigh      = FindData.nFileSizeHigh;
 
232
            Data.nFileSizeLow       = FindData.nFileSizeLow;
232
233
        }
233
234
        else
234
235
        {
237
238
            return rc;
238
239
        }
239
240
    }
240
 
    RTUtf16Free(pwszPath);
 
241
 
 
242
    /*
 
243
     * Getting the information for the link target is a bit annoying and
 
244
     * subject to the same access violation mess as above.. :/
 
245
     */
 
246
    /** @todo we're too lazy wrt to error paths here... */
241
247
    if (   (fFlags & RTPATH_F_FOLLOW_LINK)
242
248
        && (Data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
243
249
    {
244
 
#ifndef DEBUG_sandervl
245
 
        AssertFailed();
246
 
#endif
247
 
        /** @todo Symlinks: RTPathQueryInfoEx is not handling symbolic links
248
 
         *        correctly on Windows.  (Both GetFileAttributesEx and FileFindFirst
249
 
         *        will return info about the symlink.) */
 
250
        HANDLE hFinal = CreateFileW(pwszPath,
 
251
                                    GENERIC_READ,
 
252
                                    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
 
253
                                    NULL,
 
254
                                    OPEN_EXISTING,
 
255
                                    FILE_FLAG_BACKUP_SEMANTICS,
 
256
                                    NULL);
 
257
        if (hFinal != INVALID_HANDLE_VALUE)
 
258
        {
 
259
            BY_HANDLE_FILE_INFORMATION FileData;
 
260
            if (GetFileInformationByHandle(hFinal, &FileData))
 
261
            {
 
262
                Data.dwFileAttributes   = FileData.dwFileAttributes;
 
263
                Data.ftCreationTime     = FileData.ftCreationTime;
 
264
                Data.ftLastAccessTime   = FileData.ftLastAccessTime;
 
265
                Data.ftLastWriteTime    = FileData.ftLastWriteTime;
 
266
                Data.nFileSizeHigh      = FileData.nFileSizeHigh;
 
267
                Data.nFileSizeLow       = FileData.nFileSizeLow;
 
268
            }
 
269
            CloseHandle(hFinal);
 
270
        }
 
271
        else if (GetLastError() != ERROR_SHARING_VIOLATION)
 
272
        {
 
273
            rc = RTErrConvertFromWin32(GetLastError());
 
274
            RTUtf16Free(pwszPath);
 
275
            return rc;
 
276
        }
250
277
    }
251
278
 
 
279
    RTUtf16Free(pwszPath);
 
280
 
252
281
    /*
253
282
     * Setup the returned data.
254
283
     */
270
299
     */
271
300
    switch (enmAdditionalAttribs)
272
301
    {
273
 
        case RTFSOBJATTRADD_EASIZE:
274
 
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
275
 
            pObjInfo->Attr.u.EASize.cb            = 0;
 
302
        case RTFSOBJATTRADD_NOTHING:
 
303
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
276
304
            break;
277
305
 
278
306
        case RTFSOBJATTRADD_UNIX:
287
315
            pObjInfo->Attr.u.Unix.Device          = 0;
288
316
            break;
289
317
 
290
 
        case RTFSOBJATTRADD_NOTHING:
291
 
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
 
318
        case RTFSOBJATTRADD_UNIX_OWNER:
 
319
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_UNIX_OWNER;
 
320
            pObjInfo->Attr.u.UnixOwner.uid        = ~0U;
 
321
            pObjInfo->Attr.u.UnixOwner.szName[0]  = '\0'; /** @todo return something sensible here. */
 
322
            break;
 
323
 
 
324
        case RTFSOBJATTRADD_UNIX_GROUP:
 
325
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_UNIX_GROUP;
 
326
            pObjInfo->Attr.u.UnixGroup.gid        = ~0U;
 
327
            pObjInfo->Attr.u.UnixGroup.szName[0]  = '\0';
 
328
            break;
 
329
 
 
330
        case RTFSOBJATTRADD_EASIZE:
 
331
            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
 
332
            pObjInfo->Attr.u.EASize.cb            = 0;
292
333
            break;
293
334
 
294
335
        default: