mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-09 17:25:38 +02:00
Reformat to be Unix format. Check the program
with pfind() to see if executable.
This commit is contained in:
parent
e1b17f11c1
commit
b968757017
1 changed files with 135 additions and 145 deletions
|
@ -8,74 +8,68 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* from pfind.c */
|
/* from pfind.c */
|
||||||
char *pfind( char *name );
|
extern char *pfind(const char *name);
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
exec0(const char *path, char *const argv[], char *const envp[],
|
exec0(const char *path, char *const argv[], char *const envp[],
|
||||||
const char *dirpath, int channels[3])
|
const char *dirpath, int channels[3])
|
||||||
{
|
{
|
||||||
int pipe0[2], pipe1[2], pipe2[2];
|
int pipe0[2], pipe1[2], pipe2[2];
|
||||||
pid_t childpid;
|
pid_t childpid;
|
||||||
char *full_path;
|
char *full_path;
|
||||||
|
|
||||||
//
|
/*
|
||||||
// Handle this error case, we need the full path for execve() below.
|
* We use pfind() to check that the program exists and is an executable.
|
||||||
//
|
* If not pass the error up.
|
||||||
if (path[0] != '/' && path[0] != '.') {
|
*/
|
||||||
full_path = pfind( path );
|
full_path = pfind(path);
|
||||||
//full_path = pathfind (getenv ("PATH"), path, "rx");
|
if (full_path == NULL) {
|
||||||
if (full_path == NULL) {
|
fprintf(stderr, "Unable to find full path for \"%s\"\n", path);
|
||||||
fprintf( stderr, "Unable to find full path for \"%s\"\n", path );
|
return -1;
|
||||||
return -1;
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
full_path = strdup(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
/*
|
||||||
// Make sure we can create our pipes before forking.
|
* Make sure we can create our pipes before forking.
|
||||||
//
|
*/
|
||||||
if( channels != NULL )
|
if (channels != NULL) {
|
||||||
{
|
if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) {
|
||||||
if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) {
|
fprintf(stderr, "%s(%d): returning due to error.\n",
|
||||||
fprintf(stderr, "%s(%d): returning due to error.\n",
|
__FUNCTION__, __LINE__);
|
||||||
__FUNCTION__, __LINE__);
|
|
||||||
free(full_path);
|
free(full_path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
childpid = fork1();
|
childpid = fork1();
|
||||||
|
|
||||||
if (childpid < 0) {
|
if (childpid < 0) {
|
||||||
fprintf(stderr, "%s(%d): returning due to error: %s\n",
|
fprintf(stderr, "%s(%d): returning due to error: %s\n",
|
||||||
__FUNCTION__, __LINE__, strerror(errno));
|
__FUNCTION__, __LINE__, strerror(errno));
|
||||||
free(full_path);
|
free(full_path);
|
||||||
return -1;
|
return -1;
|
||||||
} else if (childpid == 0) { /* child */
|
} else if (childpid == 0) { /* child */
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
chdir(dirpath);
|
chdir(dirpath);
|
||||||
|
|
||||||
if( channels != NULL )
|
if (channels != NULL) {
|
||||||
{
|
/* Close the write end of pipe0 */
|
||||||
/* Close the write end of pipe0 */
|
if (close(pipe0[1]) == -1)
|
||||||
if( close(pipe0[1]) == -1 )
|
perror("close(pipe0[1])");
|
||||||
perror( "close(pipe0[1])" );
|
|
||||||
|
|
||||||
/* Close the read end of pipe1 */
|
/* Close the read end of pipe1 */
|
||||||
if( close(pipe1[0]) == -1 )
|
if (close(pipe1[0]) == -1)
|
||||||
perror( "close(pipe1[0])" );
|
perror("close(pipe1[0])");
|
||||||
|
|
||||||
/* Close the read end of pipe2 */
|
/* Close the read end of pipe2 */
|
||||||
if( close(pipe2[0]) == -1 )
|
if (close(pipe2[0]) == -1)
|
||||||
perror( "close(pipe2[0]))" );
|
perror("close(pipe2[0]))");
|
||||||
|
|
||||||
/* redirections */
|
/* redirections */
|
||||||
dup2(pipe0[0], STDIN_FILENO); /* dup stdin */
|
dup2(pipe0[0], STDIN_FILENO); /* dup stdin */
|
||||||
dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */
|
dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */
|
||||||
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
|
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close all the fd's in the child */
|
/* Close all the fd's in the child */
|
||||||
{
|
{
|
||||||
|
@ -86,60 +80,56 @@ exec0(const char *path, char *const argv[], char *const envp[],
|
||||||
close(fd++);
|
close(fd++);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( envp[0] == NULL )
|
if (envp[0] == NULL) {
|
||||||
{
|
execv(full_path, argv);
|
||||||
execv( full_path, argv );
|
} else {
|
||||||
}
|
execve(full_path, argv, envp);
|
||||||
else
|
}
|
||||||
{
|
|
||||||
execve( full_path, argv, envp );
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit(127);
|
_exit(127);
|
||||||
|
|
||||||
} else if (childpid != 0) { /* parent */
|
} else if (childpid != 0) { /* parent */
|
||||||
|
|
||||||
char b;
|
char b;
|
||||||
|
|
||||||
if( channels != NULL )
|
if (channels != NULL) {
|
||||||
{
|
/* close the read end of pipe1 */
|
||||||
/* close the read end of pipe1 */
|
if (close(pipe0[0]) == -1)
|
||||||
if( close(pipe0[0]) == -1 )
|
perror("close(pipe0[0])");
|
||||||
perror( "close(pipe0[0])" );
|
|
||||||
|
|
||||||
/* close the write end of pipe2 */
|
/* close the write end of pipe2 */
|
||||||
if( close(pipe1[1]) == -1 )
|
if (close(pipe1[1]) == -1)
|
||||||
perror( "close(pipe1[1])" );
|
perror("close(pipe1[1])");
|
||||||
|
|
||||||
/* close the write end of pipe2 */
|
/* close the write end of pipe2 */
|
||||||
if( close(pipe2[1]) == -1 )
|
if (close(pipe2[1]) == -1)
|
||||||
perror( "close(pipe2[1])" );
|
perror("close(pipe2[1])");
|
||||||
|
|
||||||
channels[0] = pipe0[1]; /* Output Stream. */
|
channels[0] = pipe0[1]; /* Output Stream. */
|
||||||
channels[1] = pipe1[0]; /* Input Stream. */
|
channels[1] = pipe1[0]; /* Input Stream. */
|
||||||
channels[2] = pipe2[0]; /* Input Stream. */
|
channels[2] = pipe2[0]; /* Input Stream. */
|
||||||
}
|
}
|
||||||
|
|
||||||
free(full_path);
|
free(full_path);
|
||||||
return childpid;
|
return childpid;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(full_path);
|
free(full_path);
|
||||||
return -1; /*NOT REACHED */
|
return -1; /*NOT REACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int wait0(pid_t pid)
|
int wait0(pid_t pid)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
int val = -1;
|
int val = -1;
|
||||||
|
|
||||||
if (pid < 0 || waitpid(pid, &status, 0) < 0)
|
if (pid < 0 || waitpid(pid, &status, 0) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (WIFEXITED(status)) {
|
if (WIFEXITED(status)) {
|
||||||
val = WEXITSTATUS(status);
|
val = WEXITSTATUS(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue