dir.h revision 78cbab32dbc1ff1bb306f46e347c68adaf19b35e
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IPRT - Directory Manipulation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * additional information or have any questions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef ___iprt_dir_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ___iprt_dir_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/cdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/types.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <iprt/fs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_BEGIN_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @defgroup grp_rt_dir RTDir - Directory Manipulation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @ingroup grp_rt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Check for the existence of a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns true if exist and is a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns flase if exists or isn't a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(bool) RTDirExists(const char *pszPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Creates a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to create.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param fMode The mode of the new directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Creates a directory including all parent directories in the path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * if they don't exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to create.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param fMode The mode of the new directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirCreateFullPath(const char *pszPath, RTFMODE fMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Creates a new directory with a unique name using the given template.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * One or more trailing X'es in the template will be replaced by random alpha
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * numeric characters until a RTDirCreate succeeds or we run out of patience.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * For instance:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * "/tmp/myprog-XXXXXX"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * As an alternative to trailing X'es, it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * is possible to put 3 or more X'es somewhere inside the directory name. In
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the following string only the last bunch of X'es will be modified:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * "/tmp/myprog-XXX-XXX.tmp"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The directory is created with mode 0700.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszTemplate The directory name template on input. The actual
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * directory name on success. Empty string on failure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirCreateTemp(char *pszTemplate);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Removes a directory if empty.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to remove.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirRemove(const char *pszPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Removes a directory tree recursively.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to remove recursively.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirRemoveRecursive(const char *pszPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to an open directory (sort of handle). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct RTDIR *PRTDIR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Filter option for RTDirOpenFiltered().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum RTDIRFILTER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual invalid 0 entry. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_INVALID = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** No filter should be applied (and none was specified). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_NONE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The Windows NT filter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The following wildcard chars: *, ?, <, > and "
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The matching is done on the uppercased strings. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_WINNT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The UNIX filter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The following wildcard chars: *, ?, [..]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The matching is done on exact case. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_UNIX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The UNIX filter, uppercased matching.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Same as RTDIRFILTER_UNIX except that the strings are uppercased before comparing. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_UNIX_UPCASED,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The usual full 32-bit value. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRFILTER_32BIT_HACK = 0x7fffffff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RTDIRFILTER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Directory entry type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is the RTFS_TYPE_MASK stuff shifted down 12 bits and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * identical to the BSD/LINUX ABI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum RTDIRENTRYTYPE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Unknown type (DT_UNKNOWN). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_UNKNOWN = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Named pipe (fifo) (DT_FIFO). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_FIFO = 001,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Character device (DT_CHR). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_DEV_CHAR = 002,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Directory (DT_DIR). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_DIRECTORY = 004,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Block device (DT_BLK). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_DEV_BLOCK = 006,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Regular file (DT_REG). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_FILE = 010,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Symbolic link (DT_LNK). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_SYMLINK = 012,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Socket (DT_SOCK). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_SOCKET = 014,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Whiteout (DT_WHT). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE_WHITEOUT = 016
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RTDIRENTRYTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Directory entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is inspired by the POSIX interfaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct RTDIRENTRY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The unique identifier (within the file system) of this file system object (d_ino).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Together with INodeIdDevice, this field can be used as a OS wide unique id
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * when both their values are not 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This field is 0 if the information is not available. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTINODE INodeId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The entry type. (d_type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * RTDIRENTRYTYPE_UNKNOWN is a legal return value here and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * should be expected by the user. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTDIRENTRYTYPE enmType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The length of the filename. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint16_t cbName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The filename. (no path)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Using the pcbDirEntry parameter of RTDirRead makes this field variable in size. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char szName[260];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RTDIRENTRY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a directory entry. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef RTDIRENTRY *PRTDIRENTRY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Directory entry with extended information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is inspired by the PC interfaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct RTDIRENTRYEX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** Full information about the object. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTFSOBJINFO Info;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The length of the short field (number of RTUTF16 entries (not chars)).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * It is 16-bit for reasons of alignment. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint16_t cwcShortName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The short name for 8.3 compatability.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Empty string if not available.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Since the length is a bit tricky for a UTF-8 encoded name, and since this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * is practically speaking only a windows thing, it is encoded as UCS-2. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTUTF16 wszShortName[14];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The length of the filename. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint16_t cbName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** The filename. (no path)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Using the pcbDirEntry parameter of RTDirReadEx makes this field variable in size. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char szName[260];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RTDIRENTRYEX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a directory entry. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef RTDIRENTRYEX *PRTDIRENTRYEX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Opens a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param ppDir Where to store the open directory pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirOpen(PRTDIR *ppDir, const char *pszPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Opens a directory filtering the entries using dos style wildcards.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param ppDir Where to store the open directory pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszPath Path to the directory to search, this must include wildcards.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param enmFilter The kind of filter to apply. Setting this to RTDIRFILTER_NONE makes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * this function behave like RTDirOpen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirOpenFiltered(PRTDIR *ppDir, const char *pszPath, RTDIRFILTER enmFilter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Closes a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDir Pointer to open directory returned by RTDirOpen() or RTDirOpenFiltered().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirClose(PRTDIR pDir);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Reads the next entry in the directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VINF_SUCCESS and data in pDirEntry on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_NO_MORE_FILES when the end of the directory has been reached.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_BUFFER_OVERFLOW if the buffer is too small to contain the filename. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * pcbDirEntry is specified it will be updated with the required buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns suitable iprt status code on other errors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDir Pointer to the open directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDirEntry Where to store the information about the next
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * directory entry on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pcbDirEntry Optional parameter used for variable buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * On input the variable pointed to contains the size of the pDirEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * structure. This must be at least OFFSET(RTDIRENTRY, szName[2]) bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * On successful output the field is updated to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OFFSET(RTDIRENTRY, szName[pDirEntry->cbName + 1]).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * When the data doesn't fit in the buffer and VERR_BUFFER_OVERFLOW is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * returned, this field contains the required buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The value is unchanged in all other cases.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirRead(PRTDIR pDir, PRTDIRENTRY pDirEntry, size_t *pcbDirEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Reads the next entry in the directory returning extended information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VINF_SUCCESS and data in pDirEntry on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_NO_MORE_FILES when the end of the directory has been reached.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_BUFFER_OVERFLOW if the buffer is too small to contain the filename. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * pcbDirEntry is specified it will be updated with the required buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns suitable iprt status code on other errors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDir Pointer to the open directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDirEntry Where to store the information about the next
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * directory entry on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pcbDirEntry Optional parameter used for variable buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * On input the variable pointed to contains the size of the pDirEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * structure. This must be at least OFFSET(RTDIRENTRYEX, szName[2]) bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * On successful output the field is updated to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OFFSET(RTDIRENTRYEX, szName[pDirEntry->cbName + 1]).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * When the data doesn't fit in the buffer and VERR_BUFFER_OVERFLOW is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * returned, this field contains the required buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The value is unchanged in all other cases.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param enmAdditionalAttribs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Which set of additional attributes to request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Use RTFSOBJATTRADD_NOTHING if this doesn't matter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirReadEx(PRTDIR pDir, PRTDIRENTRYEX pDirEntry, size_t *pcbDirEntry, RTFSOBJATTRADD enmAdditionalAttribs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Renames a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Identical to RTPathRename except that it will ensure that the source is a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns IPRT status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_ALREADY_EXISTS if the destination file exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszSrc The path to the source file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pszDst The path to the destination file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file will be created.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param fRename See RTPathRename.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTDirRename(const char *pszSrc, const char *pszDst, unsigned fRename);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Query information about an open directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDir Pointer to the open directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pObjInfo Object information structure to be filled on successful return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param enmAdditionalAttribs Which set of additional attributes to request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Use RTFSOBJATTRADD_NOTHING if this doesn't matter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTR3DECL(int) RTDirQueryInfo(PRTDIR pDir, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Changes one or more of the timestamps associated of file system object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns iprt status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VERR_NOT_SUPPORTED is returned if the operation isn't supported by the OS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pDir Pointer to the open directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pAccessTime Pointer to the new access time. NULL if not to be changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pModificationTime Pointer to the new modifcation time. NULL if not to be changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pChangeTime Pointer to the new change time. NULL if not to be changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pBirthTime Pointer to the new time of birth. NULL if not to be changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remark The file system might not implement all these time attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the API will ignore the ones which aren't supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remark The file system might not implement the time resolution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * employed by this interface, the time will be chopped to fit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remark The file system may update the change time even if it's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * not specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remark POSIX can only set Access & Modification and will always set both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTR3DECL(int) RTDirSetTimes(PRTDIR pDir, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* IN_RING3 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRT_END_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync