return Status;\r
}\r
\r
+/**\r
+ Format the last component of a canonical pathname into a caller-provided\r
+ CHAR16 array.\r
+\r
+ @param[in] Path The canonical pathname (as defined in the\r
+ description of VirtioFsAppendPath()) to format\r
+ the last component of.\r
+\r
+ @param[out] Basename If BasenameSize is zero on input, Basename may\r
+ be NULL. Otherwise, Basename is allocated by the\r
+ caller. On successful return, Basename contains\r
+ the last component of Path, formatted as a\r
+ NUL-terminated CHAR16 string. When Path is "/"\r
+ on input, Basename is L"" on output.\r
+\r
+ @param[in,out] BasenameSize On input, the number of bytes the caller\r
+ provides in Basename. On output, regardless of\r
+ return value, the number of bytes required for\r
+ formatting Basename, including the terminating\r
+ L'\0'.\r
+\r
+ @retval EFI_SUCCESS Basename has been filled in.\r
+\r
+ @retval EFI_BUFFER_TOO_SMALL BasenameSize was too small on input; Basename\r
+ has not been modified.\r
+**/\r
+EFI_STATUS\r
+VirtioFsGetBasename (\r
+ IN CHAR8 *Path,\r
+ OUT CHAR16 *Basename OPTIONAL,\r
+ IN OUT UINTN *BasenameSize\r
+ )\r
+{\r
+ UINTN AllocSize;\r
+ UINTN LastComponent;\r
+ UINTN Idx;\r
+ UINTN PathSize;\r
+\r
+ AllocSize = *BasenameSize;\r
+\r
+ LastComponent = MAX_UINTN;\r
+ for (Idx = 0; Path[Idx] != '\0'; Idx++) {\r
+ if (Path[Idx] == '/') {\r
+ LastComponent = Idx;\r
+ }\r
+ }\r
+ PathSize = Idx + 1;\r
+ ASSERT (LastComponent < MAX_UINTN);\r
+ LastComponent++;\r
+ *BasenameSize = (PathSize - LastComponent) * sizeof Basename[0];\r
+\r
+ if (*BasenameSize > AllocSize) {\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ for (Idx = LastComponent; Idx < PathSize; Idx++) {\r
+ Basename[Idx - LastComponent] = Path[Idx];\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Convert select fields of a VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE object to\r
corresponding fields in EFI_FILE_INFO.\r