Exemplo n.º 1
0
int ArcCommand::ProcessCommand(char *Command,int CommandType,int IgnoreErrors,
                               char *ListFileName)
{
  MaxAllowedExitCode=0;
  DeleteBraces(Command);

  for (char *CurPtr=Command;*CurPtr;)
  {
    int Length=lstrlen(Command);
    switch(ReplaceVar(CurPtr,Length))
    {
      case 1:
        CurPtr+=Length;
        break;
      case -1:
        return FALSE;
      default:
        CurPtr++;
        break;
    }
  }

  if (*Command)
  {
    int Hide=Opt.HideOutput;
    if ((Hide==1 && CommandType==0) || CommandType==2)
      Hide=0;
    ExecCode=Execute(this,Command,Hide,Silent,!*Password,ListFileName);
    if(ExecCode==RETEXEC_ARCNOTFOUND)
    {
      return FALSE;
    }
    if (ExecCode<=MaxAllowedExitCode)
      ExecCode=0;
    if (!IgnoreErrors && ExecCode!=0)
    {
      if(!Silent)
      {
        char ErrMsg[200];
        char NameMsg[NM];
        FSF.sprintf(ErrMsg,(char *)GetMsg(MArcNonZero),ExecCode);
        const char *MsgItems[]={GetMsg(MError),NameMsg,ErrMsg,GetMsg(MOk)};
        FSF.TruncPathStr(lstrcpyn(NameMsg,ArcName,sizeof(NameMsg)),MAX_WIDTH_MESSAGE);
        Info.Message(Info.ModuleNumber,FMSG_WARNING,NULL,MsgItems,ARRAYSIZE(MsgItems),1);
      }
      return FALSE;
    }
  }
  else
  {
    if(!Silent)
    {
      const char *MsgItems[]={GetMsg(MError),GetMsg(MArcCommandNotFound),GetMsg(MOk)};
      Info.Message(Info.ModuleNumber,FMSG_WARNING,NULL,MsgItems,ARRAYSIZE(MsgItems),1);
    }
    return FALSE;
  }
  return TRUE;
}
Exemplo n.º 2
0
bool ArcCommand::ProcessCommand(std::string FormatString, int CommandType, int IgnoreErrors,
                               char *pcListFileName)
{
  MaxAllowedExitCode=0;
  DeleteBraces(FormatString);

//  for (char *CurPtr=Command; *CurPtr;)
  std::string tmp, NonVar, Command;
  while (!FormatString.empty())
  {
    tmp = FormatString;
    int r = ReplaceVar(tmp);
//    fprintf(stderr, "ReplaceVar: %d  '%s' -> '%s'\n", r, FormatString.c_str(), tmp.c_str());
    if (r < 0)
      return false;
    if (r == 0) {
      r = 1;
      NonVar+= FormatString[0];
    } else {
      Command+= ExpandEnv(NonVar);
      Command+= tmp;
      NonVar.clear();
    }

    FormatString.erase(0, r);
  }
  Command+= ExpandEnv(NonVar);
//  fprintf(stderr, "Command='%s'\n", Command.c_str());

  if (Command.empty())
  {
    if(!Silent)
    {
      const char *MsgItems[]={GetMsg(MError),GetMsg(MArcCommandNotFound),GetMsg(MOk)};
      Info.Message(Info.ModuleNumber,FMSG_WARNING,NULL,MsgItems,ARRAYSIZE(MsgItems),1);
    }
    return false;
  }

  int Hide = Opt.HideOutput;
  if ((Hide == 1 && CommandType == 0) || CommandType == 2)
    Hide = 0;

  ExecCode = Execute(this, Command, Hide, Silent, NeedSudo, Password.empty(), ListFileName);
  if (ExecCode==RETEXEC_ARCNOTFOUND)
    return false;

  if (ExecCode <= MaxAllowedExitCode)
    ExecCode = 0;

  if (!IgnoreErrors && ExecCode!=0)
  {
    if(!Silent)
    {
      char ErrMsg[200];
      char NameMsg[NM];
      FSF.sprintf(ErrMsg,(char *)GetMsg(MArcNonZero),ExecCode);
      const char *MsgItems[]={GetMsg(MError),NameMsg,ErrMsg,GetMsg(MOk)};

      FSF.TruncPathStr(strncpy(NameMsg,ArcName.c_str(),sizeof(NameMsg)),MAX_WIDTH_MESSAGE);
      Info.Message(Info.ModuleNumber,FMSG_WARNING,NULL,MsgItems,ARRAYSIZE(MsgItems),1);
    }
    return false;
  }

  return true;
}