1
0
Fork 0

Added copy command

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@676
This commit is contained in:
Ulf Wohlers 2003-02-21 20:21:01 +00:00
parent 4ec9803c4f
commit d0cf2829c3
2 changed files with 91 additions and 1 deletions

View file

@ -206,6 +206,8 @@ void SHELL_Init() {
MSG_Add("SHELL_EXECUTE_ILLEGAL_COMMAND","Illegal command: %s.\n");
MSG_Add("SHELL_CMD_PAUSE","Press any key to continue.\n");
MSG_Add("SHELL_CMD_PAUSE_HELP","Waits for 1 keystroke to continue.\n");
MSG_Add("SHELL_CMD_COPY_FAILURE","Copy failure : %s.\n");
MSG_Add("SHELL_CMD_COPY_SUCCESS"," %d File(s) copied.\n");
MSG_Add("SHELL_STARTUP","DOSBox Shell v" VERSION "\n"
"DOSBox does not run protected mode games!\n"
@ -230,6 +232,8 @@ void SHELL_Init() {
MSG_Add("SHELL_CMD_NO_WILD","This is a simple version of the command, no wildcards allowed!\n");
MSG_Add("SHELL_CMD_RENAME_HELP","Renames files.\n");
MSG_Add("SHELL_CMD_DELETE_HELP","Removes files.\n");
MSG_Add("SHELL_CMD_COPY_HELP","Copy files.\n");
/* Regular startup */
call_shellstop=CALLBACK_Allocate();
/* Setup the startup CS:IP to kill the last running machine when exitted */

View file

@ -26,7 +26,7 @@
static SHELL_Cmd cmd_list[]={
"CD", 0, &DOS_Shell::CMD_CHDIR, "SHELL_CMD_CHDIR_HELP",
"CLS", 0, &DOS_Shell::CMD_CLS, "SHELL_CMD_CLS_HELP",
// "COPY", 0, &DOS_Shell::CMD_COPY, "Copy Files.",
"COPY", 0, &DOS_Shell::CMD_COPY, "SHELL_CMD_COPY_HELP",
"DIR", 0, &DOS_Shell::CMD_DIR, "SHELL_CMD_DIR_HELP",
"DEL", 1, &DOS_Shell::CMD_DELETE, "SHELL_CMD_DELETE_HELP",
"DELETE", 0, &DOS_Shell::CMD_DELETE, "SHELL_CMD_DELETE_HELP",
@ -302,11 +302,97 @@ void DOS_Shell::CMD_DIR(char * args) {
}
void DOS_Shell::CMD_COPY(char * args) {
DOS_DTA dta(dos.dta);
Bit32u size;Bit16u date;Bit16u time;Bit8u attr;
char name[DOS_NAMELENGTH_ASCII];
char * rem=ScanCMDRemain(args);
if (rem) {
WriteOut(MSG_Get("SHELL_ILLEGAL_SWITCH"),rem);
return;
}
// source/target
char* source = args;
char* target = StripWord(source);
// Target and Source have to be there
if (!source || !strlen(source)) {
WriteOut(MSG_Get("SHELL_CMD_FILE_NOT_FOUND"),args);
return;
};
/* Make a full path in the args */
char pathSource[DOS_PATHLENGTH];
char pathTarget[DOS_PATHLENGTH];
if (!DOS_Canonicalize(source,pathSource)) {
WriteOut(MSG_Get("SHELL_CMD_ILLEGAL_PATH"));
return;
}
// cut search pattern
char* pos = strrchr(pathSource,'\\');
if (pos) *(pos+1) = 0;
if (!DOS_Canonicalize(target,pathTarget)) {
WriteOut(MSG_Get("SHELL_CMD_ILLEGAL_PATH"));
return;
}
// add '\\' if target is a directoy
if (pathTarget[strlen(pathTarget)-1]!='\\') {
if (DOS_FindFirst(pathTarget,0xffff)) {
dta.GetResult(name,size,date,time,attr);
if (attr & DOS_ATTR_DIRECTORY)
strcat(pathTarget,"\\");
}
};
bool ret=DOS_FindFirst(args,0xffff);
if (!ret) {
WriteOut(MSG_Get("SHELL_CMD_FILE_NOT_FOUND"),args);
return;
}
Bit32u count = 0;
Bit16u sourceHandle,targetHandle;
char nameTarget[DOS_PATHLENGTH];
char nameSource[DOS_PATHLENGTH];
while (ret) {
dta.GetResult(name,size,date,time,attr);
if ((attr & DOS_ATTR_DIRECTORY)==0) {
strcpy(nameSource,pathSource);
strcat(nameSource,name);
// Open Source
if (DOS_OpenFile(nameSource,0,&sourceHandle)) {
// Create Target
strcpy(nameTarget,pathTarget);
if (nameTarget[strlen(nameTarget)-1]=='\\') strcat(nameTarget,name);
if (DOS_CreateFile(nameTarget,0,&targetHandle)) {
// Copy
Bit8u buffer[0x8000];
bool failed = false;
Bit16u toread = 0x8000;
do {
failed |= DOS_ReadFile(sourceHandle,buffer,&toread);
failed |= DOS_WriteFile(targetHandle,buffer,&toread);
} while (toread==0x8000);
failed |= DOS_CloseFile(sourceHandle);
failed |= DOS_CloseFile(targetHandle);
WriteOut(" %s\n",name);
count++;
} else {
DOS_CloseFile(sourceHandle);
WriteOut(MSG_Get("SHELL_CMD_COPY_FAILURE"),target);
}
} else WriteOut(MSG_Get("SHELL_CMD_COPY_FAILURE"),source);
};
ret=DOS_FindNext();
};
WriteOut(MSG_Get("SHELL_CMD_COPY_SUCCESS"),count);
}
void DOS_Shell::CMD_SET(char * args) {