162 lines
4.1 KiB
C
162 lines
4.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
vol.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Shell app "vol"
|
||
|
|
||
|
|
||
|
|
||
|
Revision History
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "shell.h"
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeVol (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
);
|
||
|
|
||
|
EFI_DRIVER_ENTRY_POINT(InitializeVol)
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeVol (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *VolumeLabel = NULL;
|
||
|
EFI_STATUS Status;
|
||
|
EFI_DEVICE_PATH *DevicePath;
|
||
|
EFI_FILE_IO_INTERFACE *Vol;
|
||
|
EFI_FILE_HANDLE RootFs;
|
||
|
EFI_FILE_SYSTEM_INFO *VolumeInfo;
|
||
|
UINTN Size;
|
||
|
CHAR16 *CurDir;
|
||
|
UINTN i;
|
||
|
|
||
|
/*
|
||
|
* Check to see if the app is to install as a "internal command"
|
||
|
* to the shell
|
||
|
*/
|
||
|
|
||
|
InstallInternalShellCommand (
|
||
|
ImageHandle, SystemTable, InitializeVol,
|
||
|
L"vol", /* command */
|
||
|
L"vol fs [Volume Label]", /* command syntax */
|
||
|
L"Set or display volume label", /* 1 line descriptor */
|
||
|
NULL /* command help page */
|
||
|
);
|
||
|
|
||
|
/*
|
||
|
* We are no being installed as an internal command driver, initialize
|
||
|
* as an nshell app and run
|
||
|
*/
|
||
|
|
||
|
InitializeShellApplication (ImageHandle, SystemTable);
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
if ( SI->Argc < 1 || SI->Argc > 3 ) {
|
||
|
Print(L"vol [fs] [volume label]\n");
|
||
|
BS->Exit(ImageHandle,EFI_SUCCESS,0,NULL);
|
||
|
}
|
||
|
|
||
|
DevicePath = NULL;
|
||
|
if (SI->Argc == 1) {
|
||
|
CurDir = ShellCurDir(NULL);
|
||
|
if (CurDir) {
|
||
|
for (i=0; i < StrLen(CurDir) && CurDir[i] != ':'; i++);
|
||
|
CurDir[i] = 0;
|
||
|
DevicePath = (EFI_DEVICE_PATH *)ShellGetMap (CurDir);
|
||
|
}
|
||
|
} else {
|
||
|
DevicePath = (EFI_DEVICE_PATH *)ShellGetMap (SI->Argv[1]);
|
||
|
}
|
||
|
if (DevicePath == NULL) {
|
||
|
Print (L"%s is not a mapped short name\n", SI->Argv[1]);
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
Status = LibDevicePathToInterface (&FileSystemProtocol, DevicePath, (VOID **)&Vol);
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print (L"%s is not a file system\n",SI->Argv[1]);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
if ( SI->Argc == 3 ) {
|
||
|
VolumeLabel = SI->Argv[2];
|
||
|
if (StrLen(VolumeLabel) > 11) {
|
||
|
Print(L"Volume label %s is longer than 11 characters\n",VolumeLabel);
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Status = Vol->OpenVolume (Vol, &RootFs);
|
||
|
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print(L"Can not open the volume %s\n",SI->Argv[1]);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + 100;
|
||
|
VolumeInfo = (EFI_FILE_SYSTEM_INFO *)AllocatePool(Size);
|
||
|
Status = RootFs->GetInfo(RootFs,&FileSystemInfo,&Size,VolumeInfo);
|
||
|
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print(L"Can not get a volume information for %s\n",SI->Argv[1]);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
if (VolumeLabel) {
|
||
|
StrCpy (VolumeInfo->VolumeLabel, VolumeLabel);
|
||
|
|
||
|
Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize(VolumeLabel);
|
||
|
|
||
|
Status = RootFs->SetInfo(RootFs,&FileSystemInfo,Size,VolumeInfo);
|
||
|
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print(L"Can not set volume information for %s\n",SI->Argv[1]);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
Status = RootFs->GetInfo(RootFs,&FileSystemInfo,&Size,VolumeInfo);
|
||
|
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print(L"Can not verify a volume information for %s\n",SI->Argv[1]);
|
||
|
return Status;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (StrLen(VolumeInfo->VolumeLabel) == 0) {
|
||
|
Print(L"Volume has no label",VolumeInfo->VolumeLabel);
|
||
|
} else {
|
||
|
Print(L"Volume %s",VolumeInfo->VolumeLabel);
|
||
|
}
|
||
|
if (VolumeInfo->ReadOnly) {
|
||
|
Print(L" (ro)\n");
|
||
|
} else {
|
||
|
Print(L" (rw)\n");
|
||
|
}
|
||
|
Print(L" %13,d bytes total disk space\n",VolumeInfo->VolumeSize);
|
||
|
Print(L" %13,d bytes available on disk\n",VolumeInfo->FreeSpace);
|
||
|
Print(L" %13,d bytes in each allocation unit\n",VolumeInfo->BlockSize);
|
||
|
|
||
|
RootFs->Close(RootFs);
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|