/** @file
  Main file for attrib shell level 2 function.

  (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>
  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "UefiShellLevel2CommandsLib.h"

STATIC CONST CHAR16  AllFiles[] = L"*";

STATIC CONST SHELL_PARAM_ITEM  AttribParamList[] = {
  { L"-a", TypeFlag },
  { L"+a", TypeFlag },
  { L"-s", TypeFlag },
  { L"+s", TypeFlag },
  { L"-h", TypeFlag },
  { L"+h", TypeFlag },
  { L"-r", TypeFlag },
  { L"+r", TypeFlag },
  { NULL,  TypeMax  }
};

/** Main function of the 'Attrib' command.

  @param[in] Package    List of input parameter for the command.
**/
STATIC
SHELL_STATUS
MainCmdAttrib (
  LIST_ENTRY  *Package
  )
{
  UINT64               FileAttributesToAdd;
  UINT64               FileAttributesToRemove;
  EFI_STATUS           Status;
  SHELL_STATUS         ShellStatus;
  UINTN                ParamNumberCount;
  CONST CHAR16         *FileName;
  EFI_SHELL_FILE_INFO  *ListOfFiles;
  EFI_SHELL_FILE_INFO  *FileNode;
  EFI_FILE_INFO        *FileInfo;

  ListOfFiles = NULL;
  ShellStatus = SHELL_SUCCESS;

  FileAttributesToAdd    = 0;
  FileAttributesToRemove = 0;

  //
  // apply or remove each flag
  //
  if (ShellCommandLineGetFlag (Package, L"+a")) {
    FileAttributesToAdd |= EFI_FILE_ARCHIVE;
  }

  if (ShellCommandLineGetFlag (Package, L"-a")) {
    FileAttributesToRemove |= EFI_FILE_ARCHIVE;
  }

  if (ShellCommandLineGetFlag (Package, L"+s")) {
    FileAttributesToAdd |= EFI_FILE_SYSTEM;
  }

  if (ShellCommandLineGetFlag (Package, L"-s")) {
    FileAttributesToRemove |= EFI_FILE_SYSTEM;
  }

  if (ShellCommandLineGetFlag (Package, L"+h")) {
    FileAttributesToAdd |= EFI_FILE_HIDDEN;
  }

  if (ShellCommandLineGetFlag (Package, L"-h")) {
    FileAttributesToRemove |= EFI_FILE_HIDDEN;
  }

  if (ShellCommandLineGetFlag (Package, L"+r")) {
    FileAttributesToAdd |= EFI_FILE_READ_ONLY;
  }

  if (ShellCommandLineGetFlag (Package, L"-r")) {
    FileAttributesToRemove |= EFI_FILE_READ_ONLY;
  }

  if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) {
    //
    // Do display as we have no attributes to change
    //
    for ( ParamNumberCount = 1
          ;
          ; ParamNumberCount++
          )
    {
      FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount);
      // if we dont have anything left, move on...
      if ((FileName == NULL) && (ParamNumberCount == 1)) {
        FileName = (CHAR16 *)AllFiles;
      } else if (FileName == NULL) {
        break;
      }

      ASSERT (ListOfFiles == NULL);
      Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles);
      if (EFI_ERROR (Status)) {
        ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
        ShellStatus = SHELL_NOT_FOUND;
      } else {
        for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link)
             ; !IsNull (&ListOfFiles->Link, &FileNode->Link)
             ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link)
             )
        {
          ShellPrintHiiDefaultEx (
            STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE),
            gShellLevel2HiiHandle,
            FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ',
            FileNode->Info->Attribute&EFI_FILE_ARCHIVE ?   L'A' : L' ',
            FileNode->Info->Attribute&EFI_FILE_SYSTEM ?    L'S' : L' ',
            FileNode->Info->Attribute&EFI_FILE_HIDDEN ?    L'H' : L' ',
            FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ',
            FileNode->FileName
            );

          if (ShellGetExecutionBreakFlag ()) {
            ShellStatus = SHELL_ABORTED;
            break;
          }
        }

        Status      = ShellCloseFileMetaArg (&ListOfFiles);
        ListOfFiles = NULL;
        if (EFI_ERROR (Status)) {
          ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
          ShellStatus = SHELL_NOT_FOUND;
        }
      } // for loop for handling wildcard filenames
    } // for loop for printing out the info
  } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) {
    //
    // fail as we have conflcting params.
    //
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib");
    ShellStatus = SHELL_INVALID_PARAMETER;
  } else {
    //
    // enumerate through all the files/directories and apply the attributes
    //
    for ( ParamNumberCount = 1
          ;
          ; ParamNumberCount++
          )
    {
      FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount);
      // if we dont have anything left, move on...
      if (FileName == NULL) {
        //
        // make sure we are not failing on the first one we do... if yes that's an error...
        //
        if (ParamNumberCount == 1) {
          ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib");
          ShellStatus = SHELL_INVALID_PARAMETER;
        }

        break;
      }

      //
      // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory
      // for each file or directory on the line.
      //

      //
      // Open the file(s)
      //
      ASSERT (ListOfFiles == NULL);
      Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles);
      if (EFI_ERROR (Status)) {
        ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
        ShellStatus = SHELL_NOT_FOUND;
      } else {
        for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link)
             ; !IsNull (&ListOfFiles->Link, &FileNode->Link)
             ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link)
             )
        {
          //
          // skip the directory traversing stuff...
          //
          if (IsDotOrDotDot (FileNode->FileName)) {
            continue;
          }

          FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle);

          //
          // if we are removing Read-Only we need to do that alone
          //
          if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) {
            FileInfo->Attribute &= ~EFI_FILE_READ_ONLY;
            //
            // SetFileInfo
            //
            Status = ShellSetFileInfo (FileNode->Handle, FileInfo);
            if (EFI_ERROR (Status)) {
              ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
              ShellStatus = SHELL_ACCESS_DENIED;
            }
          }

          //
          // change the attribute
          //
          FileInfo->Attribute &= ~FileAttributesToRemove;
          FileInfo->Attribute |= FileAttributesToAdd;

          //
          // SetFileInfo
          //
          Status = ShellSetFileInfo (FileNode->Handle, FileInfo);
          if (EFI_ERROR (Status)) {
            ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
            ShellStatus = SHELL_ACCESS_DENIED;
          }

          SHELL_FREE_NON_NULL (FileInfo);
        }

        Status      = ShellCloseFileMetaArg (&ListOfFiles);
        ListOfFiles = NULL;
        if (EFI_ERROR (Status)) {
          ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));
          ShellStatus = SHELL_NOT_FOUND;
        }
      } // for loop for handling wildcard filenames
    }
  }

  return ShellStatus;
}

/**
  Function for 'attrib' command.

  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
**/
SHELL_STATUS
EFIAPI
ShellCommandRunAttrib (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS    Status;
  LIST_ENTRY    *Package;
  CHAR16        *ProblemParam;
  SHELL_STATUS  ShellStatus;

  ShellStatus  = SHELL_SUCCESS;
  ProblemParam = NULL;

  //
  // initialize the shell lib (we must be in non-auto-init...)
  //
  Status = ShellInitialize ();
  ASSERT_EFI_ERROR (Status);

  //
  // parse the command line
  //
  Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE);
  if (EFI_ERROR (Status)) {
    if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam);
      FreePool (ProblemParam);
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      ASSERT (FALSE);
    }

    return ShellStatus;
  }

  ShellStatus = MainCmdAttrib (Package);

  //
  // free the command line package
  //
  ShellCommandLineFreeVarList (Package);

  //
  // return the status
  //
  return (ShellStatus);
}
