mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
- Fixed to compile correctly.
- Changed how multi-volume assignments are handled by execve(). git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15115 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd.h,v 1.20 2006-08-01 16:41:02 obarthel Exp $
|
||||
* $Id: unistd.h,v 1.21 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -123,7 +123,7 @@ extern char *ttyname(int);
|
||||
extern int ttyname_r(int file_descriptor,char *name,size_t buflen);
|
||||
extern int ttyname_t(int,char *,size_t);
|
||||
extern int execl(const char *path,const char *arg0,...);
|
||||
extern int execle(const char *path,const char *arg0,...):
|
||||
extern int execle(const char *path,const char *arg0,...);
|
||||
extern int execlp(const char *path,const char *arg0,...);
|
||||
extern int execv(const char *path,char * const argv[]);
|
||||
extern int execve(const char *path,char *const argv[],char *const envp[]);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_execl.c,v 1.1 2006-08-01 14:27:52 obarthel Exp $
|
||||
* $Id: unistd_execl.c,v 1.2 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -75,12 +75,12 @@ execl(const char *path, const char *arg0, ...)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
argv[0] = arg0;
|
||||
argv[0] = (char *)arg0;
|
||||
|
||||
va_start(args,arg0);
|
||||
|
||||
for(i = 1 ; i < argc ; i++)
|
||||
argv[i] = va_arg(args,const char *);
|
||||
argv[i] = va_arg(args,char *);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_execle.c,v 1.2 2006-08-01 17:01:13 obarthel Exp $
|
||||
* $Id: unistd_execle.c,v 1.3 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -78,10 +78,10 @@ execle(const char *path, const char *arg0, ...)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
argv[0] = arg0;
|
||||
argv[0] = (char *)arg0;
|
||||
|
||||
for(i = 1 ; i < argc ; i++)
|
||||
argv[i] = va_arg(args,const char *);
|
||||
argv[i] = va_arg(args,char *);
|
||||
|
||||
/* Skip the NULL terminator */
|
||||
(void)va_arg(args, char **);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_execlp.c,v 1.1 2006-08-01 14:27:52 obarthel Exp $
|
||||
* $Id: unistd_execlp.c,v 1.2 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -75,12 +75,12 @@ execlp(const char *path, const char *arg0, ...)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
argv[0] = arg0;
|
||||
argv[0] = (char *)arg0;
|
||||
|
||||
va_start(args,arg0);
|
||||
|
||||
for(i = 1 ; i < argc ; i++)
|
||||
argv[i] = va_arg(args,const char *);
|
||||
argv[i] = va_arg(args,char *);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_execve.c,v 1.2 2006-08-01 19:01:17 obarthel Exp $
|
||||
* $Id: unistd_execve.c,v 1.3 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -37,6 +37,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <dos/stdio.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||
|
||||
/****************************************************************************/
|
||||
@ -73,7 +77,7 @@ find_resident_command(const char * command_name)
|
||||
a more sophisticated arbitration method for this yet... */
|
||||
Forbid();
|
||||
|
||||
seg = FindSegment((STRPTR)name,NULL,0);
|
||||
seg = FindSegment((STRPTR)command_name,NULL,0);
|
||||
if(seg != NULL)
|
||||
{
|
||||
/* Check if that's a disable command or something else. */
|
||||
@ -104,11 +108,12 @@ get_first_script_line(const char * path,char ** line_ptr)
|
||||
int result = -1;
|
||||
char * script_line = NULL;
|
||||
size_t script_line_size = 0;
|
||||
size_t script_line_length = 0;
|
||||
LONG c;
|
||||
|
||||
(*line_ptr) = NULL;
|
||||
|
||||
script_file = Open(path,MODE_OLDFILE);
|
||||
script_file = Open((STRPTR)path,MODE_OLDFILE);
|
||||
if(script_file == ZERO)
|
||||
{
|
||||
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||
@ -133,7 +138,7 @@ get_first_script_line(const char * path,char ** line_ptr)
|
||||
new_script_line = realloc(script_line,script_line_length + 10);
|
||||
if(new_script_line == NULL)
|
||||
{
|
||||
__set_error(ENOMEM);
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -141,11 +146,11 @@ get_first_script_line(const char * path,char ** line_ptr)
|
||||
script_line_size = script_line_length + 10;
|
||||
}
|
||||
|
||||
script_line[script_line_length++] = c;
|
||||
|
||||
/* Stop when we hit a line feed or unprintable character */
|
||||
if(c == '\n' || c < ' ' || (c >= 128 && c < 160))
|
||||
break;
|
||||
|
||||
script_line[script_line_length++] = c;
|
||||
}
|
||||
|
||||
/* Check for read error */
|
||||
@ -224,14 +229,13 @@ free_program_info(struct program_info * pi)
|
||||
/* Try to find a command by name; if the name does not include any path
|
||||
information, try the dos.library resident command list */
|
||||
static int
|
||||
find_command(char * path,struct program_info ** result_ptr)
|
||||
find_command(const char * path,struct program_info ** result_ptr)
|
||||
{
|
||||
struct name_translation_info nti;
|
||||
char * script_line = NULL;
|
||||
struct program_info * pi;
|
||||
APTR old_window_ptr;
|
||||
int result = -1;
|
||||
BPTR file_lock;
|
||||
BPTR old_dir;
|
||||
int error;
|
||||
|
||||
@ -258,7 +262,7 @@ find_command(char * path,struct program_info ** result_ptr)
|
||||
}
|
||||
|
||||
/* No relative or absolute path given? */
|
||||
if(FilePart(path) == (STRPTR)path)
|
||||
if(FilePart((STRPTR)path) == (STRPTR)path)
|
||||
{
|
||||
/* Try to find the command on the resident list */
|
||||
pi->resident_command = find_resident_command(path);
|
||||
@ -272,6 +276,7 @@ find_command(char * path,struct program_info ** result_ptr)
|
||||
{
|
||||
struct MsgPort * file_system;
|
||||
struct DevProc * dvp = NULL;
|
||||
STRPTR relative_path;
|
||||
BOOL done = FALSE;
|
||||
LONG io_err;
|
||||
int error = 0;
|
||||
@ -281,18 +286,30 @@ find_command(char * path,struct program_info ** result_ptr)
|
||||
referring to "C:" gracefully */
|
||||
file_system = GetFileSysTask();
|
||||
|
||||
/* Figure out which part of the path name includes the device
|
||||
or assignment portion, then skip it. This is because the
|
||||
loop below uses GetDeviceProc() to find the file or command,
|
||||
and it starts by changing to the directory the device, volume
|
||||
or assignment in the path name is bound to. */
|
||||
relative_path = (STRPTR)strchr(path,':');
|
||||
if(relative_path != NULL)
|
||||
relative_path++;
|
||||
else
|
||||
relative_path = (STRPTR)path;
|
||||
|
||||
do
|
||||
{
|
||||
dvp = GetDeviceProc(path,dvp);
|
||||
dvp = GetDeviceProc((STRPTR)path,dvp);
|
||||
if(dvp != NULL)
|
||||
{
|
||||
|
||||
SetFileSysTask(dvp->dvp_Port);
|
||||
|
||||
old_dir = CurrentDir(dvp->dvp_Lock);
|
||||
|
||||
/* First try: let's assume that that the file is
|
||||
executable */
|
||||
pi->segment_list = LoadSeg(path);
|
||||
pi->segment_list = LoadSeg(relative_path);
|
||||
if(pi->segment_list != ZERO)
|
||||
{
|
||||
/* Remember where that file came from so that
|
||||
@ -320,7 +337,7 @@ find_command(char * path,struct program_info ** result_ptr)
|
||||
if(error == 0 && !done && (io_err == ERROR_OBJECT_NOT_FOUND || io_err == ERROR_OBJECT_WRONG_TYPE || io_err == ERROR_BAD_HUNK))
|
||||
{
|
||||
/* Could that be an ARexx or shell script? */
|
||||
if(get_first_script_line(path,&script_line) == 0)
|
||||
if(get_first_script_line(relative_path,&script_line) == 0)
|
||||
{
|
||||
if(strncmp(script_line,"/*",2) == SAME)
|
||||
{
|
||||
@ -387,7 +404,7 @@ find_command(char * path,struct program_info ** result_ptr)
|
||||
{
|
||||
BPTR file_lock;
|
||||
|
||||
file_lock = Lock(path,SHARED_LOCK);
|
||||
file_lock = Lock(relative_path,SHARED_LOCK);
|
||||
if(file_lock != ZERO)
|
||||
{
|
||||
D_S(struct FileInfoBlock,fib);
|
||||
@ -458,7 +475,7 @@ count_extra_escape_chars(const char * string,size_t len)
|
||||
|
||||
for(i = 0 ; i < len ; i++)
|
||||
{
|
||||
c = (*s++);
|
||||
c = (*string++);
|
||||
if(c == '\"' || c == '*' || c == '\n')
|
||||
count++;
|
||||
}
|
||||
@ -479,7 +496,7 @@ string_needs_quoting(const char * string,size_t len)
|
||||
|
||||
for(i = 0 ; i < len ; i++)
|
||||
{
|
||||
c = (*s++);
|
||||
c = (*string++);
|
||||
if(c == ' ' || ((unsigned char)c) == 0xA0 || c == '\t' || c == '\n' || c == '\"')
|
||||
{
|
||||
result = TRUE;
|
||||
@ -580,16 +597,15 @@ int
|
||||
execve(const char *path, char *const argv[], char *const envp[])
|
||||
{
|
||||
struct Process * this_process = (struct Process *)FindTask(NULL);
|
||||
char old_program_name[256]
|
||||
char old_program_name[256];
|
||||
int result = -1;
|
||||
struct program_info * pi;
|
||||
char * arg_string = NULL;
|
||||
size_t arg_string_len = 0;
|
||||
size_t parameter_string_len;
|
||||
BOOL success = FALSE;
|
||||
int error;
|
||||
BPTR old_dir;
|
||||
LONG rc;
|
||||
LONG c;
|
||||
|
||||
/* We begin by trying to find the command to execute */
|
||||
if(find_command((char *)path,&pi) != 0)
|
||||
@ -679,8 +695,8 @@ execve(const char *path, char *const argv[], char *const envp[])
|
||||
|
||||
/* Change the command's home directory, so that "PROGDIR:"
|
||||
can be used */
|
||||
old_dir = ThisProcess->pr_HomeDir;
|
||||
ThisProcess->pr_HomeDir = pi->home_dir;
|
||||
old_dir = this_process->pr_HomeDir;
|
||||
this_process->pr_HomeDir = pi->home_dir;
|
||||
|
||||
/* Reset the break signal before the program starts */
|
||||
SetSignal(0,SIGBREAKF_CTRL_C);
|
||||
@ -689,7 +705,7 @@ execve(const char *path, char *const argv[], char *const envp[])
|
||||
rc = RunCommand((pi->resident_command != NULL) ? pi->resident_command->seg_Seg : pi->segment_list,Cli()->cli_DefaultStack * sizeof(LONG),arg_string,arg_string_len);
|
||||
|
||||
/* Restore the home directory */
|
||||
ThisProcess->pr_HomeDir = old_dir;
|
||||
this_process->pr_HomeDir = old_dir;
|
||||
|
||||
/* Restore the program name */
|
||||
SetProgramName(old_program_name);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_execvp.c,v 1.2 2006-08-01 17:01:13 obarthel Exp $
|
||||
* $Id: unistd_execvp.c,v 1.3 2006-08-02 06:49:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -98,7 +98,6 @@ execvp(const char *command,char * const argv[])
|
||||
char * command_buffer = NULL;
|
||||
char * path_copy = NULL;
|
||||
int result = -1;
|
||||
char * bp;
|
||||
|
||||
/* Do not allow null command */
|
||||
if(command == NULL || (*command) == '\0')
|
||||
|
||||
Reference in New Issue
Block a user