mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
5.0 KiB
227 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
Module Name:
|
|
|
|
attrib.c
|
|
|
|
Abstract:
|
|
|
|
Shell app "attrib"
|
|
|
|
Revision History
|
|
|
|
--*/
|
|
|
|
#include "shell.h"
|
|
|
|
/*
|
|
*
|
|
*/
|
|
|
|
EFI_STATUS
|
|
InitializeAttrib (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
);
|
|
|
|
EFI_STATUS
|
|
AttribSet (
|
|
IN CHAR16 *Str,
|
|
IN OUT UINT64 *Attr
|
|
);
|
|
|
|
VOID
|
|
AttribFile (
|
|
IN SHELL_FILE_ARG *Arg,
|
|
IN UINT64 Remove,
|
|
IN UINT64 Add
|
|
|
|
);
|
|
|
|
BOOLEAN PageBreaks;
|
|
UINTN TempColumn;
|
|
UINTN ScreenCount;
|
|
UINTN ScreenSize;
|
|
|
|
/*
|
|
*
|
|
*/
|
|
|
|
EFI_DRIVER_ENTRY_POINT(InitializeAttrib)
|
|
|
|
EFI_STATUS
|
|
InitializeAttrib (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
CHAR16 **Argv;
|
|
UINTN Argc;
|
|
UINTN Index;
|
|
LIST_ENTRY FileList;
|
|
LIST_ENTRY *Link;
|
|
SHELL_FILE_ARG *Arg;
|
|
UINT64 Remove, Add;
|
|
EFI_STATUS Status;
|
|
|
|
/*
|
|
* Check to see if the app is to install as a "internal command"
|
|
* to the shell
|
|
*/
|
|
|
|
InstallInternalShellCommand (
|
|
ImageHandle, SystemTable, InitializeAttrib,
|
|
L"attrib", /* command */
|
|
L"attrib [-b] [+/- rhs] [file]", /* command syntax */
|
|
L"View/sets file attributes", /* 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);
|
|
Argv = SI->Argv;
|
|
Argc = SI->Argc;
|
|
InitializeListHead (&FileList);
|
|
Remove = 0;
|
|
Add = 0;
|
|
|
|
/*
|
|
* Expand each arg
|
|
*/
|
|
|
|
for (Index = 1; Index < Argc; Index += 1) {
|
|
if (Argv[Index][0] == '-') {
|
|
/* remove these attributes */
|
|
Status = AttribSet (Argv[Index]+1, &Remove);
|
|
} else if (Argv[Index][0] == '+') {
|
|
/* add these attributes */
|
|
Status = AttribSet (Argv[Index]+1, &Add);
|
|
} else {
|
|
ShellFileMetaArg (Argv[Index], &FileList);
|
|
}
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
goto Done;
|
|
}
|
|
}
|
|
|
|
/* if no file specified, get the whole directory */
|
|
if (IsListEmpty(&FileList)) {
|
|
ShellFileMetaArg (L"*", &FileList);
|
|
}
|
|
|
|
/*
|
|
* Attrib each file
|
|
*/
|
|
|
|
for (Link=FileList.Flink; Link!=&FileList; Link=Link->Flink) {
|
|
Arg = CR(Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
|
|
AttribFile (Arg, Remove, Add);
|
|
}
|
|
|
|
Done:
|
|
ShellFreeFileList (&FileList);
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
EFI_STATUS
|
|
AttribSet (
|
|
IN CHAR16 *Str,
|
|
IN OUT UINT64 *Attr
|
|
)
|
|
{
|
|
while (*Str) {
|
|
switch (*Str) {
|
|
case 'b' :
|
|
case 'B' :
|
|
PageBreaks = TRUE;
|
|
ST->ConOut->QueryMode (ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize);
|
|
ScreenCount = 0;
|
|
break;
|
|
case 'a':
|
|
case 'A':
|
|
*Attr |= EFI_FILE_ARCHIVE;
|
|
break;
|
|
case 's':
|
|
case 'S':
|
|
*Attr |= EFI_FILE_SYSTEM;
|
|
break;
|
|
case 'h':
|
|
case 'H':
|
|
*Attr |= EFI_FILE_HIDDEN;
|
|
break;
|
|
case 'r':
|
|
case 'R':
|
|
*Attr |= EFI_FILE_READ_ONLY;
|
|
break;
|
|
default:
|
|
Print (L"attr: unknown file attribute %hc\n", *Attr);
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
Str += 1;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
VOID
|
|
AttribFile (
|
|
IN SHELL_FILE_ARG *Arg,
|
|
IN UINT64 Remove,
|
|
IN UINT64 Add
|
|
)
|
|
{
|
|
UINT64 Attr;
|
|
EFI_STATUS Status;
|
|
EFI_FILE_INFO *Info;
|
|
CHAR16 ReturnStr[1];
|
|
|
|
Status = Arg->Status;
|
|
if (EFI_ERROR(Status)) {
|
|
goto Done;
|
|
}
|
|
|
|
Info = Arg->Info;
|
|
|
|
if (Add || Remove) {
|
|
Info->Attribute = Info->Attribute & (~Remove) | Add;
|
|
Status = Arg->Handle->SetInfo(
|
|
Arg->Handle,
|
|
&GenericFileInfo,
|
|
(UINTN) Info->Size,
|
|
Info
|
|
);
|
|
}
|
|
|
|
Done:
|
|
if (EFI_ERROR(Status)) {
|
|
Print (L" %s : %hr\n", Arg->FullName, Status);
|
|
} else {
|
|
Attr = Info->Attribute;
|
|
Print (L"%c%c %c%c%c %s\n",
|
|
Attr & EFI_FILE_DIRECTORY ? 'D' : ' ',
|
|
Attr & EFI_FILE_ARCHIVE ? 'A' : ' ',
|
|
Attr & EFI_FILE_SYSTEM ? 'S' : ' ',
|
|
Attr & EFI_FILE_HIDDEN ? 'H' : ' ',
|
|
Attr & EFI_FILE_READ_ONLY ? 'R' : ' ',
|
|
Arg->FullName
|
|
);
|
|
}
|
|
|
|
if (PageBreaks) {
|
|
ScreenCount++;
|
|
if (ScreenCount > ScreenSize - 4) {
|
|
ScreenCount = 0;
|
|
Print (L"\nPress Return to contiue :");
|
|
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
|
|
Print (L"\n\n");
|
|
}
|
|
}
|
|
}
|