|
|
/*++
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; }
|