mirror of https://github.com/acidanthera/audk.git
c3f76ef89d
The EFI_FILE_PROTOCOL.SetInfo() member is somewhat under-specified; one of its modes of operation is renaming/moving the file. In order to create the destination pathname in canonical format, 2*2=4 cases have to be considered. For the sake of discussion, assume the current canonical pathname of a VIRTIO_FS_FILE is "/home/user/f1.txt". Then, consider the following rename/move requests from EFI_FILE_PROTOCOL.SetInfo(): Destination requested Destination Move into Destination in by SetInfo() relative? directory? canonical format --------------------- ----------- ---------- ----------------------- L"\\dir\\f2.txt" no no "/dir/f2.txt" L"\\dir\\" no yes "/dir/f1.txt" L"dir\\f2.txt" yes no "/home/user/dir/f2.txt" L"dir\\" yes yes "/home/user/dir/f1.txt" Add the VirtioFsComposeRenameDestination() function, for composing the last column from the current canonical pathname and the SetInfo() input. The function works on the following principles: - The prefix of the destination path is "/", if the SetInfo() rename request is absolute. Otherwise, the dest prefix is the "current directory" (the most specific parent directory) of the original pathname (in the above example, "/home/user"). - The suffix of the destination path is precisely the SetInfo() request string, if the "move into directory" convenience format -- the trailing backslash -- is not used. (In the above example, L"\\dir\\f2.txt" and L"dir\\f2.txt".) Otherwise, the suffix is the SetInfo() request, plus the original basename (in the above example, L"\\dir\\f1.txt" and L"dir\\f1.txt"). - The complete destination is created by fusing the dest prefix and the dest suffix, using the VirtioFsAppendPath() function. Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Philippe Mathieu-Daudé <philmd@redhat.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20201216211125.19496-43-lersek@redhat.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@arm.com> |
||
---|---|---|
.. | ||
DriverBinding.c | ||
FuseFlush.c | ||
FuseForget.c | ||
FuseFsync.c | ||
FuseGetAttr.c | ||
FuseInit.c | ||
FuseLookup.c | ||
FuseMkDir.c | ||
FuseOpen.c | ||
FuseOpenDir.c | ||
FuseOpenOrCreate.c | ||
FuseRead.c | ||
FuseRelease.c | ||
FuseRename.c | ||
FuseStatFs.c | ||
FuseUnlink.c | ||
FuseWrite.c | ||
Helpers.c | ||
SimpleFsClose.c | ||
SimpleFsDelete.c | ||
SimpleFsFlush.c | ||
SimpleFsGetInfo.c | ||
SimpleFsGetPosition.c | ||
SimpleFsOpen.c | ||
SimpleFsOpenVolume.c | ||
SimpleFsRead.c | ||
SimpleFsSetInfo.c | ||
SimpleFsSetPosition.c | ||
SimpleFsWrite.c | ||
VirtioFsDxe.h | ||
VirtioFsDxe.inf |