diff --git a/reactos/tools/cabman/dff.txt b/reactos/tools/cabman/dff.txt index cde00f71d9a..ddc46163d1b 100755 --- a/reactos/tools/cabman/dff.txt +++ b/reactos/tools/cabman/dff.txt @@ -8,7 +8,7 @@ case insensitive. Syntax Description ------------------------------------------------------------------------------- ; Anything on a line after this is a comment - [destination] File copy command + [destination] [options] File copy command (options: o=optional) .Define variable=[value] Define variable to be equal to value (*) .Delete variable Delete a variable definition (*) .New Disk|Cabinet|Folder Start a new disk, cabinet or folder (* -- new disk will work) diff --git a/reactos/tools/cabman/dfp.cxx b/reactos/tools/cabman/dfp.cxx index bce030f4eb3..09a7e048622 100755 --- a/reactos/tools/cabman/dfp.cxx +++ b/reactos/tools/cabman/dfp.cxx @@ -1016,11 +1016,13 @@ unsigned long CDFParser::PerformFileCopy() char SrcName[MAX_PATH]; char DstName[MAX_PATH]; char InfLine[MAX_PATH]; + char Options[8]; char BaseFilename[MAX_PATH]; - strcpy(SrcName, ""); - strcpy(DstName, ""); + *SrcName = '\0'; + *DstName = '\0'; + // source file i = CurrentChar; while ((i < LineLength) && ((ch = Line[i]) != ' ') && @@ -1035,6 +1037,7 @@ unsigned long CDFParser::PerformFileCopy() strcpy(BaseFilename, CurrentString); strcat(SrcName, BaseFilename); + // destination SkipSpaces(); if (CurrentToken != TokenEnd) { @@ -1052,6 +1055,24 @@ unsigned long CDFParser::PerformFileCopy() strcpy(DstName, CurrentString); } + // options (it may be empty) + SkipSpaces (); + + if (CurrentToken != TokenEnd) { + j = strlen(CurrentString); i = 0; + while ((CurrentChar + i < LineLength) && + ((ch = Line[CurrentChar + i]) != ' ') && + (ch != 0x09) && + (ch != ';')) { + CurrentString[j + i] = ch; + i++; + } + CurrentString[j + i] = '\0'; + CurrentToken = TokenString; + CurrentChar += i + 1; + strcpy(Options, CurrentString); + } + if (!CabinetCreated) { DPRINT(MID_TRACE, ("Creating cabinet.\n")); @@ -1078,25 +1099,34 @@ unsigned long CDFParser::PerformFileCopy() DPRINT(MID_TRACE, ("Adding file: '%s' destination: '%s'.\n", SrcName, DstName)); - sprintf(InfLine, "%s=%s", GetFileName(SrcName), DstName); - WriteInfLine(InfLine); - Status = AddFile(SrcName); if (Status == CAB_STATUS_CANNOT_OPEN) { strcpy(SrcName, FileRelativePath); strcat(SrcName, BaseFilename); Status = AddFile(SrcName); } - if (Status != CAB_STATUS_SUCCESS) { - if (Status == CAB_STATUS_CANNOT_OPEN) - printf("File does not exist: %s.\n", SrcName); - else if (Status == CAB_STATUS_NOMEMORY) - printf("Insufficient memory to add file: %s.\n", SrcName); - else - printf("Cannot add file: %s (%lu).\n", SrcName, Status); - return Status; + switch (Status) + { + case CAB_STATUS_SUCCESS: + sprintf(InfLine, "%s=%s", GetFileName(SrcName), DstName); + WriteInfLine(InfLine); + break; + case CAB_STATUS_CANNOT_OPEN: + if (strchr(Options,'o')) + { + Status = CAB_STATUS_SUCCESS; + printf("Optional file does not exist: %s.\n", SrcName); + } else { + printf("File does not exist: %s.\n", SrcName); + } + break; + case CAB_STATUS_NOMEMORY: + printf("Insufficient memory to add file: %s.\n", SrcName); + break; + default: + printf("Cannot add file: %s (%lu).\n", SrcName, Status); + break; } - return CAB_STATUS_SUCCESS; } diff --git a/reactos/tools/cabman/main.cxx b/reactos/tools/cabman/main.cxx index 6ceba018dcb..a1a9856453e 100755 --- a/reactos/tools/cabman/main.cxx +++ b/reactos/tools/cabman/main.cxx @@ -553,11 +553,7 @@ int main(int argc, char * argv[]) status = CABMgr.Run(); } - if (status) { - return 0; - } else { - return 1; - } + return (status ? 0 : 1); } /* EOF */