Blame | Last modification | View Log | RSS feed
/** MS-DOS SHELL - Data Declarations** MS-DOS SHELL - Copyright (c) 1990,4 Data Logic Limited and Charles Forsyth** This code is based on (in part) the shell program written by Charles* Forsyth and is subject to the following copyright restrictions:** 1. Redistribution and use in source and binary forms are permitted* provided that the above copyright notice is duplicated in the* source form and the copyright notice in file sh6.c is displayed* on entry to the program.** 2. The sources (or parts thereof) or objects generated from the sources* (or parts of sources) cannot be sold under any circumstances.** $Header: /cvsroot/device/DEVL/UTILS/SH/SH6.C,v 1.3 2004/11/04 02:47:59 ayoung Exp $** $Log: SH6.C,v $* Revision 1.3 2004/11/04 02:47:59 ayoung* handle upto 8 PATH definitions** Revision 1.2 2004/05/10 09:30:06 ayoung* improved Path/PATH handling* Quote CreateProcess arg0 if embedded spaces are encountered* Native NT exec dont need to check command line length* Warning when '@' within redirect list* DEBUG_EXEC option, split from PRINT_EXEC option and improved** Revision 1.1 2002/08/02 06:49:33 adamy* imported (reference only)** Revision 1.1 2001/07/20 05:55:42 ayoung* WIN32 support** Revision 1.1.1.1 1999/12/02 01:11:13 gordonh* UTIL** Revision 2.15 1994/08/25 20:49:11 istewart* MS Shell 2.3 Release** Revision 2.14 1994/02/23 09:23:38 istewart* Beta 233 updates** Revision 2.13 1994/02/01 10:25:20 istewart* Release 2.3 Beta 2, including first NT port** Revision 2.12 1994/01/11 17:55:25 istewart* Release 2.3 Beta 0 patches** Revision 2.11 1993/11/09 10:39:49 istewart* Beta 226 checking** Revision 2.10 1993/08/25 16:03:57 istewart* Beta 225 - see Notes file** Revision 2.9 1993/07/02 10:21:35 istewart* 224 Beta fixes** Revision 2.8 1993/06/14 11:00:12 istewart* More changes for 223 beta** Revision 2.7 1993/06/02 09:52:35 istewart* Beta 223 Updates - see Notes file** Revision 2.6 1993/02/16 16:03:15 istewart* Beta 2.22 Release** Revision 2.5 1993/01/26 18:35:09 istewart* Release 2.2 beta 0** Revision 2.4 1992/12/14 10:54:56 istewart* BETA 215 Fixes and 2.1 Release** Revision 2.3 1992/11/06 10:03:44 istewart* 214 Beta test updates** Revision 2.2 1992/09/03 18:54:45 istewart* Beta 213 Updates** Revision 2.1 1992/07/10 10:52:48 istewart* 211 Beta updates** Revision 2.0 1992/04/13 17:39:09 Ian_Stewartson* MS-Shell 2.0 Baseline release***/#include <sys/types.h>#include <sys/stat.h>#include <stddef.h>#include <stdio.h>#include <setjmp.h>#include <stdlib.h>#include <limits.h>#include <unistd.h>#include "sh.h"#if (OS_TYPE == OS_UNIX)# include <sys/utsname.h>static char *Copy_Right1 = "%s %s SH Version 2.41 (%s) - %s (OS %s.%s)\n";#elsestatic char *Copy_Right1 = "%s %s SH Version 2.41 (%s) - %s (OS %d.%d)\n";#endif#if (OS_TYPE == OS_OS2)char *LIT_OSname = "OS2";# if (OS_SIZE == OS_32)static char *Copy_Right2 = "(32-Bit)";# elsestatic char *Copy_Right2 = "(16-Bit)";# endif#elif (OS_TYPE == OS_DOS)char *LIT_OSname = "MS-DOS";# if (OS_SIZE == OS_32)static char *Copy_Right2 = "(32-Bit)";# elsestatic char *Copy_Right2 = "(16-Bit)";# endif#elif (OS_TYPE == OS_NT)char *LIT_OSname = "MS-WNT";static char *Copy_Right2 = "";#elif (OS_TYPE == OS_UNIX)char *LIT_OSname = "UNIX";#endifstatic char *Copy_Right3 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990, 94\n";#if (OS_TYPE == OS_DOS) && (OS_SIZE == OS_32)bool IgnoreHardErrors = FALSE;/* Hard Error Flag */#endifint BaseOS; /* Underlying OS */char **ParameterArray = (char **)NULL; /* Parameter array */int ParameterCount = 0; /* # entries in parameter array */int ExitStatus; /* Exit status */bool ExpansionErrorDetected;/* interactive (talking-type wireless) */bool InteractiveFlag = FALSE;bool ProcessingEXECCommand; /* Exec mode */bool UseConsoleBuffer = FALSE;/* Flag from dofc to *//* GetConsoleInput */int AllowMultipleLines; /* Allow continuation onto *//* Next line */int Current_Event = 0; /* Current history event */bool ChangeInitLoad = FALSE; /* Change load .ini pt. */unsigned int ShellGlobalFlags = 0; /* Other global flags */int MaxNumberofFDs = 20; /* Max no of file descriptors */int DisabledVariables = 0; /* Disabled variables */int StartCursorPosition = -1;/* Start cursor position */unsigned int SW_intr; /* Interrupt flag */#ifndef OS_SWAPPINGbool IgnoreInterrupts = FALSE;/* Ignore interrupts flag */#else/* Swap mode */#endifBreak_C *Break_List; /* Break list for FOR/WHILE */Break_C *Return_List; /* Return list for RETURN */Break_C *SShell_List; /* SubShell list for EXIT */bool RestrictedShellFlag = FALSE; /* Restricted shell *//* History processing enabled flag */bool HistoryEnabled = FALSE;void *FunctionTree = (void *)NULL; /* Function tree */FunctionList *CurrentFunction = (FunctionList *)NULL;void *AliasTree = (void *)NULL; /* Alias tree */#if (OS_TYPE != OS_DOS)void *JobTree = (void *)NULL; /* job tree */bool ExitWithJobsActive = FALSE; /* Exit flag */int CurrentJob = 0; /* No current */int PreviousJob = 0; /* Previous Job */#endif#if (OS_TYPE == OS_OS2)/** Session Info*/char *SessionEndQName = (char *)NULL; /* Queue *//** Special flag for EMX parameters*/bool EMXStyleParameters = FALSE;#endif/** redirection*/Save_IO *SSave_IO; /* Save IO array */int NSave_IO_E = 0; /* Number of entries in Save IO array */int MSave_IO_E = 0; /* Max Number of entries in SSave_IO */S_SubShell *SubShells; /* Save Vars array */int NSubShells = 0; /* Number of entries in SubShells */int MSubShells = 0; /* Max Number of entries in SubShells */int LastNumberBase = -1; /* Last base entered */int InterruptTrapPending; /* Trap pending */int Execute_stack_depth; /* execute function recursion *//* depth */void *VariableTree = (void *)NULL; /* Variable dictionary */VariableList *CurrentDirectory; /* Current directory */char *LastUserPrompt; /* Last prompt output */char *LastUserPrompt1; /* Alternate Last prompt output */char IFS[] = "IFS"; /* Inter-field separator */char PS1[] = "PS1"; /* Prompt 1 */char PS2[] = "PS2"; /* Prompt 2 */char PS3[] = "PS3"; /* Prompt 3 */char PS4[] = "PS4"; /* Prompt 4 */char PathLiteral[] = "PATH";char UserLiteral[] = "USER";char CDPathLiteral[] = "CDPATH";char CurrentDirLiteral[] = ".";char ParentDirLiteral[] = "..";char PathExtsLiteral[] = "PATHEXTS";char HomeVariableName[] = "HOME";char ShellVariableName[] = "SHELL";char HistoryFileVariable[] = "HISTFILE";char HistorySizeVariable[] = "HISTSIZE";char *ComspecVariable= "COMSPEC";char *ParameterCountVariable = "#";char *ShellOptionsVariable = "-";char StatusVariable[] = "?";char SecondsVariable[] = "SECONDS";char RandomVariable[] = "RANDOM";char LineCountVariable[] = "LINENO";char *RootDirectory = "x:/";#if (OS_TYPE != OS_DOS)char WinTitleVariable[] = "WINTITLE";#endifchar *OldPWDVariable = "OLDPWD";char *PWDVariable = "PWD";char *ENVVariable = "ENV";#if (OS_TYPE == OS_DOS) || (OS_TYPE == OS_NT)char BATExtension[] = ".bat";#elsechar BATExtension[] = ".cmd";#endifchar SHELLExtension[] = ".sh";char KSHELLExtension[] = ".ksh";char EXEExtension[] = ".exe";char COMExtension[] = ".com";char *NotFound = "not found";char *BasicErrorMessage = "%s: %s";char *DirectorySeparator = "/";char LastWordVariable[] = "_";char OptArgVariable[] = "OPTARG";char OptIndVariable[] = "OPTIND";char MailCheckVariable[] = "MAILCHECK";char FCEditVariable[] = "FCEDIT";char EditorVariable[] = "EDITOR";char VisualVariable[] = "VISUAL";char Trap_DEBUG[] = "~DEBUG";char Trap_ERR[] = "~ERR";char LIT_dos[] = "DOS";char *LIT_NewLine = "\n";char *LIT_BadID = "bad identifier";char LIT_export[] = "export";char LIT_exit[] = "exit";char LIT_exec[] = "exec";char LIT_done[] = "done";char LIT_history[] = "history";char LIT_REPLY[] = "REPLY";char LIT_LINES[] = "LINES";char LIT_COLUMNS[] = "COLUMNS";char *ListVarFormat = "%s=%s\n";char *Outofmemory1 = "Out of memory";char *LIT_Emsg = "%s: %s (%s)";char *LIT_2Strings = "%s %s";char *LIT_3Strings = "%s %s%s";char *LIT_SyntaxError = "Syntax error";char *LIT_BadArray = "%s: bad array value";char *LIT_ArrayRange = "%s: subscript out of range";char *LIT_BNumber = "[%d]";char *LIT_Invalidfunction = "Invalid function name";char *LIT_AllowTTY = "SH_ALLOWTTYPIPES";char *LIT_IsReadonly = "is read-only";char LIT_Test[] = "[[";int MaximumColumns = 80; /* Max columns */int MaximumLines = 25; /* Max Lines *//** Fopen modes, different between IBM OS/2 2.x and the rest*/#ifdef __IBMC__char *sOpenReadMode = "r"; /* Open file in read mode */char *sOpenWriteMode = "w"; /* Open file in write mode */char *sOpenAppendMode = "w+";/* Open file in append mode */char *sOpenWriteBinaryMode = "wb";/* Open file in append mode */#elsechar *sOpenReadMode = "rt"; /* Open file in read mode */char *sOpenWriteMode = "wt"; /* Open file in write mode */char *sOpenAppendMode = "wt+";/* Open file in append mode */char *sOpenWriteBinaryMode = "wb";/* Open file in append mode */#endif#if (OS_TYPE == OS_OS2)STARTDATA *SessionControlBlock; /* Start a session info */STARTDATA PM_SessionControlBlock = { /* PM session defaults */sizeof (STARTDATA), /* Length */SSF_RELATED_CHILD, /* Related */SSF_FGBG_FORE, /* FgBg */SSF_TRACEOPT_NONE, /* TraceOpt */(char *)NULL, /* PgmTitle */(char *)NULL, /* PgmName */(PBYTE)NULL, /* PgmInputs */(PBYTE)NULL, /* TermQ */(char *)1, /* Environment */SSF_INHERTOPT_PARENT, /* InheritOpt */SSF_TYPE_PM, /* SessionType */(char *)NULL, /* IconFile */0L, /* PgmHandle */SSF_CONTROL_NOAUTOCLOSE, /* PgmControl */0, /* InitXPos */0, /* InitYPos */100, /* InitXSize */100 /* InitYSize */};STARTDATA DOS_SessionControlBlock = { /* DOS session defaults */sizeof (STARTDATA), /* Length */SSF_RELATED_CHILD, /* Related */SSF_FGBG_FORE, /* FgBg */SSF_TRACEOPT_NONE, /* TraceOpt */(char *)NULL, /* PgmTitle */(char *)NULL, /* PgmName */(PBYTE)NULL, /* PgmInputs */(PBYTE)NULL, /* TermQ */(char *)1, /* Environment */SSF_INHERTOPT_PARENT, /* InheritOpt */SSF_TYPE_VDM, /* SessionType */(char *)NULL, /* IconFile */0L, /* PgmHandle */SSF_CONTROL_NOAUTOCLOSE, /* PgmControl */0, /* InitXPos */0, /* InitYPos */100, /* InitXSize */100 /* InitYSize */};#endif/** Parser information*/char CurrentLexIdentifier [IDENT+1];/* Identifier */Source *source; /* yyparse/ScanNextToken source */YYSTYPE yylval; /* result from ScanNextToken */int yynerrs; /* Parse error flag *//** Global program mode information*/ExeMode ExecProcessingMode; /* Global Program mode *//** Character Types array*/unsigned char CharTypes [UCHAR_MAX + 1];/** Modified getopt values*/int OptionIndex = 1; /* optind */int OptionStart; /* start character */char *OptionArgument; /* optarg *//** Device directory. The length of this string is defined by the variable* LEN_DEVICE_NAME_HEADER*/char *DeviceNameHeader = "/dev/";int MemoryAreaLevel;/* Current allocation area */long flags = 0L; /* Command line flags */char null[] = ""; /* Null value */char ConsoleLineBuffer[LINE_MAX + 1]; /* Console line buffer *//** Current environment*/ShellFileEnvironment e = {(ErrorPoint)NULL, /* Error handler */0L, /* IO Map for this level */(char *)NULL, /* Current line buffer */(ShellFileEnvironment *)NULL, /* Previous Env pointer */};/** Some defines to print version and release info*/#define str(s) # s#define xstr(s) str(s)/** The only bit of code in this module prints the version number*/void PrintVersionNumber (FILE *fp){#if (OS_TYPE == OS_UNIX)char *Copy_Right2 = null;char *_osmajor = null;char *_osminor = null;struct utsname name;if (!uname (&name)){Copy_Right2 = name.machine;_osmajor = name.release;_osminor = name.version;}#endiffprintf (fp, Copy_Right1, LIT_OSname, Copy_Right2, xstr (RELEASE),__DATE__, OS_VERS_N, OS_VERS_M);fputs (Copy_Right3, fp);}