📄 execute.c
字号:
if ( (temp == NULL) && (errno != 0) )
{
printerr("stdin");
panic();
}
setvbuf( stdin, NULL, _IONBF, 0);
} /* if ( input != NULL ) */
/*--------------------------------------------------------------------*/
/* Report results of command */
/*--------------------------------------------------------------------*/
printmsg( 4 ,"Result of spawn %s is ... %d", command, result);
return result;
} /* execute */
#else
#ifdef __TURBOC__
#pragma argsused
#endif
/*--------------------------------------------------------------------*/
/* e x e c u t e (OS/2 + DOS version) */
/* */
/* Generic execute external command with optional redirection */
/* of standard input and output */
/*--------------------------------------------------------------------*/
int execute( const char *command,
const char *parameters,
const char *input,
const char *output,
const boolean synchronous,
const boolean foreground )
{
int result;
char path[BUFSIZ];
/*--------------------------------------------------------------------*/
/* Redirect STDIN and STDOUT as required */
/*--------------------------------------------------------------------*/
if ((input != NULL) && (freopen(input , "rb", stdin) == NULL))
{
printerr(input);
return -2;
}
if ((output != NULL) && (freopen(output, "wt", stdout) == NULL))
{
printerr( output );
if ( input != NULL )
{
FILE *temp = freopen("con", "rt", stdin);
if ( (temp == NULL) && (errno != 0) )
{
printerr("stdin");
panic();
}
setvbuf( stdin, NULL, _IONBF, 0);
} /* if ( input != NULL ) */
return -2;
}
/*--------------------------------------------------------------------*/
/* Execute the command in question */
/*--------------------------------------------------------------------*/
if (internal(strcpy(path,command)) ||
batch(command,path)) // Internal command or batch file?
{
if ( parameters == NULL )
result = system( path );
else {
strcat( path, " ");
strcat( path, parameters );
result = system( path );
} /* else */
} /* if (internal(command)) */
else { /* No --> Invoke normally */
if ( *path )
{
printmsg(4,"execute: spawnlp(%d, %s, %s%s%s)",
synchronous ? P_WAIT : P_NOWAIT,
path,
command,
parameters == NULL ? "" : ", ",
parameters == NULL ? "" : parameters );
result = spawnlp( synchronous ? P_WAIT : P_NOWAIT,
(char *) path,
(char *) command,
(char *) parameters,
NULL);
if (result == -1) /* Did spawn fail? */
printerr(command); /* Yes --> Report error */
} /* else */
else
result = -3; // Flag we never ran command
} /* else */
/*--------------------------------------------------------------------*/
/* Re-open our standard i/o streams */
/*--------------------------------------------------------------------*/
if ( output != NULL )
{
freopen("con", "wt", stdout);
setvbuf( stdout, NULL, _IONBF, 0);
}
if ( input != NULL )
{
FILE *temp = freopen("con", "rt", stdin);
if ( (temp == NULL) && (errno != 0) )
{
printerr("stdin");
panic();
}
setvbuf( stdin, NULL, _IONBF, 0);
} /* if ( input != NULL ) */
/*--------------------------------------------------------------------*/
/* Report results of command */
/*--------------------------------------------------------------------*/
printmsg( 4,"Result of spawn %s is ... %d", command, result);
return result;
} /* execute */
#endif
/*--------------------------------------------------------------------*/
/* e x e c u t e C o m m a n d */
/* */
/* Split command from its parameters for execute */
/*--------------------------------------------------------------------*/
int executeCommand( const char *command,
const char *input,
const char *output,
const boolean synchronous,
const boolean foreground )
{
char *cmdname;
char *parameters;
char buffer[FILENAME_MAX];
int result;
strcpy( buffer, command );
cmdname = strtok( buffer, WHITESPACE );
parameters = strtok( NULL, "\r\n" );
if ( parameters != NULL )
{
while (isspace( *parameters ) || iscntrl( *parameters ))
parameters++;
if ( !strlen( parameters ))
parameters = NULL;
}
result = execute( cmdname,
parameters,
input,
output,
synchronous,
foreground );
return result;
} /* executeCommand */
/*--------------------------------------------------------------------*/
/* i n t e r n a l */
/* */
/* Determine if command is internal DOS command */
/*--------------------------------------------------------------------*/
static boolean internal( const char *command )
{
static char *commands[] = { "break", "cd", "chdir", "copy",
"ctty", "date", "del", "dir",
"echo", "erase", "for", "md",
"mkdir", "rd", "rem", "ren",
"rename", "rmdir", "time", "ver",
"verify", "vol",
NULL };
char **list;
/*--------------------------------------------------------------------*/
/* Determine command list to use */
/*--------------------------------------------------------------------*/
if (E_internal == NULL )
list = commands;
else
list = E_internal;
/*--------------------------------------------------------------------*/
/* Scan the list for the command */
/*--------------------------------------------------------------------*/
while( *list != NULL )
{
printmsg(5,"Searching for \"%s\", comparing to \"%s\"",
*list, command);
if (equali(*list++,command))
{
printmsg(4,"\"%s\" is an internal command",command);
return TRUE;
} /* if */
} /* while( *list != NULL ) */
/*--------------------------------------------------------------------*/
/* The command is not in the list; return FALSE (external */
/* command) */
/*--------------------------------------------------------------------*/
printmsg(4,"\"%s\" is an external command",command);
return FALSE;
} /* internal */
/*--------------------------------------------------------------------*/
/* b a t c h */
/* */
/* Determine if a command is batch file */
/*--------------------------------------------------------------------*/
static boolean batch( const char *input, char *output)
{
char *search = getenv("PATH");
char *gotPath;
char *period;
static const char *extensions[] = { ".exe",
".com",
#if !defined(_DOS) && !defined(_Windows)
".cmd",
#endif
".bat",
NULL };
/*--------------------------------------------------------------------*/
/* Validate the search path exists */
/*--------------------------------------------------------------------*/
if ( search == NULL )
{
printmsg(0,"batch: Unable to retrieve PATH environment variable!");
panic();
}
/*--------------------------------------------------------------------*/
/* Determine if we have path, and if we have an extension */
/*--------------------------------------------------------------------*/
gotPath = strchr( input, '/');
if ( gotPath == NULL )
gotPath = strchr( input, '\\');
period = strchr( (gotPath == NULL) ? input : gotPath, '.');
if ( period != NULL ) // We have extension?
{
if ( gotPath ) // Extension + path?
{ // Yes --> Just look for the file
char *fname = normalize( input );
if ( access( input, 00))
*output = '\0';
else
strcpy( output, fname );
} /* if ( gotPath ) */
else
_searchenv( input, "PATH", output );
if ( ! *output ) // No file found?
{
printerr( input );
return FALSE;
} /* if ( ! *output ) */
#if defined(_DOS) || defined(_Windows)
return equal( period, ".bat" );
#else
return equali( period, ".cmd" ) || equali( period, ".bat" );
#endif
} /* if ( p != NULL ) */
/*--------------------------------------------------------------------*/
/* Walk the path looking for the file's possible types in */
/* the path's directories */
/*--------------------------------------------------------------------*/
while( *search )
{
char base[FILENAME_MAX];
int extension = 0;
if ( gotPath )
{
strcpy( base, input );
search = ""; // Force this to be last pass
}
else {
char *next = strchr(search,';'); // Find next path component
size_t len;
if ( next == NULL )
len = strlen( search );
else
len = (size_t) (next - search);
memcpy( base, search, len ); // Path for search ...
search += len + 1; // Step past semicolon
if ( base[len - 1 ] != '\\' ) // Ending in back slash?
base[len++] = '\\'; // No --> Add one
strcpy( base + len , input ); // ... plus file name
} /* else */
printmsg(8,
"Searching for extension of %s",
base );
/*--------------------------------------------------------------------*/
/* Search a single directory in a path for a file with */
/* various extensions. */
/*--------------------------------------------------------------------*/
while( extensions[extension] != NULL )
{
strcpy( output, base );
strcat( output, extensions[extension] );
if ( ! access(output, 00 ))
{
#if defined(_DOS) || defined(_Windows)
return equal( extensions[extension] , ".bat" );
#else
return equal( extensions[extension] , ".cmd" ) ||
equal( extensions[extension] , ".bat" );
#endif
} /* if ( result != NULL ) */
extension++;
} /* while( extensions[extension] != NULL ) */
} /* while( *search ) */
/*--------------------------------------------------------------------*/
/* We could not find the file, report failure to the caller */
/*--------------------------------------------------------------------*/
printmsg(0, "batch: Unable to locate %s in search path", input);
*output = '\0'; // Flag no file found!
return FALSE;
} /* batch */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -