windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/mkdir/mkdir.c
2020-09-26 16:20:57 +08:00

146 lines
2.7 KiB
C

/*++
Copyright (c) 1998 Intel Corporation
Module Name:
mkdir.c
Abstract:
Shell app "mkdir"
Revision History
--*/
#include "shell.h"
/*
*
*/
EFI_STATUS
InitializeMkDir (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
VOID
MkDir (
IN SHELL_FILE_ARG *Arg
);
/*
*
*/
EFI_DRIVER_ENTRY_POINT(InitializeMkDir)
EFI_STATUS
InitializeMkDir (
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;
/*
* Check to see if the app is to install as a "internal command"
* to the shell
*/
InstallInternalShellCommand (
ImageHandle, SystemTable, InitializeMkDir,
L"mkdir", /* command */
L"mkdir dir [dir] ...", /* command syntax */
L"Make directory", /* 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;
/*
* Expand each arg
*/
InitializeListHead (&FileList);
for (Index = 1; Index < Argc; Index += 1) {
ShellFileMetaArg (Argv[Index], &FileList);
}
if (IsListEmpty(&FileList)) {
Print (L"mkdir: no directory specified\n");
goto Done;
}
/*
* Make each directory
*/
for (Link=FileList.Flink; Link!=&FileList; Link=Link->Flink) {
Arg = CR(Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
MkDir (Arg);
}
Done:
ShellFreeFileList (&FileList);
return EFI_SUCCESS;
}
VOID
MkDir (
IN SHELL_FILE_ARG *Arg
)
{
EFI_FILE_HANDLE NewDir;
EFI_STATUS Status;
NewDir = NULL;
Status = Arg->Status;
if (!EFI_ERROR(Status)) {
Print (L"mkdir: file %hs already exists\n", Arg->FullName);
return ;
}
if (Status == EFI_NOT_FOUND) {
Status = Arg->Parent->Open (
Arg->Parent,
&NewDir,
Arg->FileName,
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
EFI_FILE_DIRECTORY
);
}
if (EFI_ERROR(Status)) {
Print (L"mkdir: failed to create %s - %r\n", Arg->FullName, Status);
}
if (NewDir) {
NewDir->Close(NewDir);
}
}