SimpleFsSetPosition.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /** @file
  2. EFI_FILE_PROTOCOL.SetPosition() member function for the Virtio Filesystem
  3. driver.
  4. Copyright (C) 2020, Red Hat, Inc.
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <Library/MemoryAllocationLib.h> // FreePool()
  8. #include "VirtioFsDxe.h"
  9. EFI_STATUS
  10. EFIAPI
  11. VirtioFsSimpleFileSetPosition (
  12. IN EFI_FILE_PROTOCOL *This,
  13. IN UINT64 Position
  14. )
  15. {
  16. VIRTIO_FS_FILE *VirtioFsFile;
  17. VIRTIO_FS *VirtioFs;
  18. EFI_STATUS Status;
  19. VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
  20. VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);
  21. //
  22. // Directories can only be rewound, per spec.
  23. //
  24. if (VirtioFsFile->IsDirectory) {
  25. if (Position != 0) {
  26. return EFI_UNSUPPORTED;
  27. }
  28. VirtioFsFile->FilePosition = 0;
  29. if (VirtioFsFile->FileInfoArray != NULL) {
  30. FreePool (VirtioFsFile->FileInfoArray);
  31. VirtioFsFile->FileInfoArray = NULL;
  32. }
  33. VirtioFsFile->SingleFileInfoSize = 0;
  34. VirtioFsFile->NumFileInfo = 0;
  35. VirtioFsFile->NextFileInfo = 0;
  36. return EFI_SUCCESS;
  37. }
  38. //
  39. // Regular file.
  40. //
  41. if (Position < MAX_UINT64) {
  42. //
  43. // Caller is requesting absolute file position.
  44. //
  45. VirtioFsFile->FilePosition = Position;
  46. return EFI_SUCCESS;
  47. }
  48. //
  49. // Caller is requesting a seek to EOF.
  50. //
  51. VirtioFs = VirtioFsFile->OwnerFs;
  52. Status = VirtioFsFuseGetAttr (VirtioFs, VirtioFsFile->NodeId, &FuseAttr);
  53. if (EFI_ERROR (Status)) {
  54. return Status;
  55. }
  56. VirtioFsFile->FilePosition = FuseAttr.Size;
  57. return EFI_SUCCESS;
  58. }