/************************************* * ShowMyRedirections * show my current drive redirections * NOTES: * I show the read-only attribute for each drive * which is returned in deviceParam. *************************************/ void ShowMyRedirections(void) { int driveCount; uint16 redirIndex, deviceParam, ccode; uint8 deviceType; char deviceStr[MAX_DEVICE_STRING_LENGTH]; char resourceStr[MAX_RESOURCE_PATH_LENGTH]; redirIndex = 0; driveCount = 0; ccode = GetRedirection(redirIndex, deviceStr, resourceStr, &deviceType, &deviceParam); while (ccode == CC_SUCCESS) { /* only print disk redirections here */ if (deviceType == REDIR_DISK_TYPE) { if (driveCount == 0) { printf("Current Drive Redirections:\n"); } driveCount++; printf("%-2s = %-20s ", deviceStr, resourceStr); /* read attribute is returned in the device parameter */ if (deviceParam & 0x80) { switch (deviceParam & 0x7f) { /* tej 1/7/95 */ case READ_ONLY_DRIVE_ATTRIBUTE: printf("attrib = READ ONLY\n"); break; default: printf("attrib = READ/WRITE\n"); break; } } } redirIndex++; ccode = GetRedirection(redirIndex, deviceStr, resourceStr, &deviceType, &deviceParam); } if (driveCount == 0) { printf("No drives are currently redirected to Linux.\n"); } }
void DOS_Shell::ParseLine(char * line) { LOG(LOG_EXEC,LOG_ERROR)("Parsing command line: %s",line); /* Check for a leading @ */ if (line[0] == '@') line[0] = ' '; line = trim(line); /* Do redirection and pipe checks */ char * in = 0; char * out = 0; Bit16u dummy,dummy2; Bit32u bigdummy = 0; Bitu num = 0; /* Number of commands in this line */ bool append; bool normalstdin = false; /* wether stdin/out are open on start. */ bool normalstdout = false; /* Bug: Assumed is they are "con" */ num = GetRedirection(line,&in, &out,&append); if (num>1) LOG_MSG("SHELL:Multiple command on 1 line not supported"); if (in || out) { normalstdin = (psp->GetFileHandle(0) != 0xff); normalstdout = (psp->GetFileHandle(1) != 0xff); } if (in) { if(DOS_OpenFile(in,OPEN_READ,&dummy)) { //Test if file exists DOS_CloseFile(dummy); LOG_MSG("SHELL:Redirect input from %s",in); if(normalstdin) DOS_CloseFile(0); //Close stdin DOS_OpenFile(in,OPEN_READ,&dummy); //Open new stdin } } if (out){ LOG_MSG("SHELL:Redirect output to %s",out); if(normalstdout) DOS_CloseFile(1); if(!normalstdin && !in) DOS_OpenFile("con",OPEN_READWRITE,&dummy); bool status = true; /* Create if not exist. Open if exist. Both in read/write mode */ if(append) { if( (status = DOS_OpenFile(out,OPEN_READWRITE,&dummy)) ) { DOS_SeekFile(1,&bigdummy,DOS_SEEK_END); } else { status = DOS_CreateFile(out,DOS_ATTR_ARCHIVE,&dummy); //Create if not exists. } } else { status = DOS_OpenFileExtended(out,OPEN_READWRITE,DOS_ATTR_ARCHIVE,0x12,&dummy,&dummy2); } if(!status && normalstdout) DOS_OpenFile("con",OPEN_READWRITE,&dummy); //Read only file, open con again if(!normalstdin && !in) DOS_CloseFile(0); } /* Run the actual command */ DoCommand(line); /* Restore handles */ if(in) { DOS_CloseFile(0); if(normalstdin) DOS_OpenFile("con",OPEN_READWRITE,&dummy); free(in); } if(out) { DOS_CloseFile(1); if(!normalstdin) DOS_OpenFile("con",OPEN_READWRITE,&dummy); if(normalstdout) DOS_OpenFile("con",OPEN_READWRITE,&dummy); if(!normalstdin) DOS_CloseFile(0); free(out); } }