HRESULT App_CookArgList ( HCMDLIST * phlst, LPCTSTR aArgs[], UINT ixFirst, // first arg to execute UINT cArgs) // count of args to execute { HRESULT hr = S_FALSE; // there were no args... TCHAR szTempArg[64]; // temp if we need to copy and arg HCMDLIST hlst; *phlst = NULL; hr = Vector_Create(&hlst, cArgs, -1); if (FAILED(hr)) return hr; // look at args, parsing switches and building up the array of filename pointers // UINT ixLast = (ixFirst + cArgs); for (UINT ii = ixFirst; ii < ixLast; ++ii) { LPCTSTR pszArg = aArgs[ii]; if ( ! pszArg) break; // assume a file open command. // hr = S_OK; CMDSWITCH cmd = {APP_CMD_PATH, 0, 1, NULL}; // if the first character of the arg is an '@', what follows should be a command file. // if (pszArg[0] == '@') { // command will be an argfile command // cmd.idCmd = APP_CMD_ARGFILE; cmd.cParams = 1; // on arg needed cmd.pszParams = NULL; // no default // if next character is not a 0, it must be the filename // otherwise, suck up the next token and use it as the filename. // pszArg = StrCharNext (pszArg); // skip '@' if (0 != pszArg[0]) { cmd.pszParams = pszArg; } else if (ii+1 < ixLast) // next pszArg belongs to us.. { LPCTSTR pszT = aArgs[ii+1]; if ('-' != pszT[0] && '/' != pszT[0]) { cmd.pszParams = pszT; ++ii; // advance the loop counter. } } } else if ('-' == pszArg[0] || '/' == pszArg[0]) { pszArg = StrCharNext (pszArg); if (0 == pszArg[0]) { hr = E_INVALIDARG; goto bail; } // look for a ':' in the arg, and // LPCTSTR psz = StrCharNext(pszArg); LPCTSTR pszParam = NULL; while (0 != psz[0]) { // if the arg contains a colon, set pszParam to point to it // and extract the stuff before the colon as the actual arg. // if (':' == psz[0]) { pszParam = StrCharNext (psz); UINT cch = (UINT)(((LPARAM)psz - (LPARAM)pszArg) / NUMBYTES(TCHAR)); StrCopyN (szTempArg, NUMCHARS(szTempArg), pszArg, cch + 1); DASSERT(0 == szTempArg[min(NUMCHARS(szTempArg)-1, cch)]); pszArg = szTempArg; break; } psz = StrCharNext(psz); } // lookup the argment // if ( ! App_LookupCmdLineArg (g_aAppCommands, pszArg, &cmd)) { bprintfl("%s is not a valid argument", pszArg); hr = E_INVALIDARG; goto bail; } if (pszParam) { if (cmd.cParams < 1) { // if we have a param, but the arg doesn't take any, bail. // bprintfl("the %s argument is does not take parameters", pszArg); hr = E_INVALIDARG; goto bail; } cmd.pszParams = pszParam; } else { // if the command needs args, but none have been found so // far, try sucking up the next token in the command line // if (cmd.cParams > 0 && NULL == cmd.pszParams) { if (ii+1 < ixLast) // next pszArg belongs to us.. { LPCTSTR pszT = aArgs[ii+1]; if ('-' != pszT[0] && '/' != pszT[0]) { cmd.pszParams = pszT; ++ii; // advance the loop counter. } } } } } else { // not a switch, this is an implied file-open command // cmd.pszParams = pszArg; } // if the command needs an arg, but we dont have one. // the command line is in error. // if ((cmd.cParams > 0) && (NULL == cmd.pszParams)) { bprintfl("the %s argument requires parameters", pszArg); g_app.fUsage = true; hr = E_INVALIDARG; goto bail; } // append the command. // Vector_AppendItem(hlst, cmd); } // return the command list // *phlst = hlst; bail: if (FAILED(hr) || Vector_GetCountSafe(hlst) < 1) { *phlst = NULL; if (hlst) Vector_Delete (hlst); } return hr; }
static int WINAPI DpdRemoveDirectory ( LPCTSTR pszPath, int ochName, DeletePathData & dpd, DWORD fdwVerbose, DWORD fdwFlags) { int err = 0; if (dpd.fNoDelete) { if (fdwVerbose) bprintf(*dpd.pbp, TEXT("NoRemove %s "), pszPath); return 0; } if (fdwVerbose) bprintf(*dpd.pbp, TEXT("Removing %s "), pszPath); if (RemoveDirectory(pszPath)) { dpd.cDirsRemoved += 1; } else { err = GetLastError(); if ((ERROR_ACCESS_DENIED == err) && (fdwFlags & DPD_F_REMOVEDACLS)) { if ( ! dpd.fDirAlreadyTriedDACLRemove && (ochName > 1)) { TCHAR szParent[MAX_PATH]; StrCopyN(szParent, NUMCHARS(szParent), pszPath, ochName); int errT = RemoveFileDACLs(szParent, fdwVerbose & (TDT_DIAGNOSTIC | TDT_USER_F_VERBOSE), dpd.pbp); if (errT) err = errT; else if (RemoveDirectory(pszPath)) { err = 0; dpd.cDirsRemoved += 1; } else { err = GetLastError(); } // dont try to remove dacls again for this directory. dpd.fDirAlreadyTriedDACLRemove = true; } // the error _may_ have been cleared by the time we get here, if it hasn't // then try and remove dacls from the file, then try again to delete the file. // if (ERROR_ACCESS_DENIED == err) { int errT = RemoveFileDACLs(pszPath, fdwVerbose & (TDT_DIAGNOSTIC | TDT_USER_F_VERBOSE), dpd.pbp); if (errT) err = errT; else if (RemoveDirectory(pszPath)) { err = 0; dpd.cDirsRemoved += 1; } else { err = GetLastError(); } } } if (err) { dpd.cRemoveFailures += 1; if (fdwVerbose) { bprint_Sep(*dpd.pbp, ' '); bprint_AppendErrorText(*dpd.pbp, err); } } } return err; }