mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Patch from Gene Sally. And formatting "fixes".
This commit is contained in:
parent
8051af4120
commit
b4b7151cf3
2 changed files with 100 additions and 94 deletions
|
@ -1,12 +1,22 @@
|
|||
# makefile for libspawner.so
|
||||
|
||||
#set JDK_INCLUDES
|
||||
# set JDK_INCLUDES if they are not already set in the environment
|
||||
# spit out a warning if the make script will be using the default values
|
||||
ifeq ($(JDK_INCLUDES),)
|
||||
$(warning JDK_INCLUDES not set in environment, using default: $(JDK_INCLUDES))
|
||||
endif
|
||||
|
||||
ifeq ($(JDK_OS_INCLUDES),)
|
||||
$(warning JDK_OS_INCLUDES not set in environment, using default: $(JDK_OS_INCLUDES))
|
||||
endif
|
||||
|
||||
|
||||
JDK_INCLUDES=/usr/local/jdk/include
|
||||
JDK_OS_INCLUDES=/usr/local/jdk/include/linux
|
||||
|
||||
CC=gcc
|
||||
CPPFLAGS = -I. -I$(JDK_INCLUDES) -I$(JDK_OS_INCLUDES)
|
||||
CFLAGS +=-fpic -D_REENTRANT
|
||||
CFLAGS +=-fpic -D_REENTRANT
|
||||
|
||||
LIB_NAME_SPAWNER = libspawner.so
|
||||
LIB_NAME_FULL_SPAWNER = ../os/linux/x86/libspawner.so
|
||||
|
@ -20,12 +30,14 @@ OBJS = $(OBJS_SPAWNER) $(OBJS_PTY)
|
|||
|
||||
all: $(LIB_NAME_FULL_SPAWNER) $(LIB_NAME_FULL_PTY)
|
||||
|
||||
$(LIB NAME_FULL_SPAWNER) : $(OBJS_SPAWNER)
|
||||
rebuild: clean all
|
||||
|
||||
$(LIB_NAME_FULL_SPAWNER) : $(OBJS_SPAWNER)
|
||||
$(CC) -g -shared -Wl,-soname,$(LIB_NAME_SPAWNER) -o $(LIB_NAME_FULL_SPAWNER) $(OBJS_SPAWNER) -lc
|
||||
|
||||
$(LIB_NAME_FULL_PTY): $(OBJS_PTY)
|
||||
$(CC) -g -shared -Wl,-soname,$(LIB_NAME_PTY) -o $(LIB_NAME_FULL_PTY) $(OBJS_PTY)
|
||||
|
||||
clean :
|
||||
echo -rm $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER)
|
||||
-rm $(OBJS_PTY) $(LIB_NAME_FULL_PTY)
|
||||
$(RM) $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER)
|
||||
$(RM) $(OBJS_PTY) $(LIB_NAME_FULL_PTY)
|
||||
|
|
|
@ -14,68 +14,66 @@ pid_t
|
|||
exec0(const char *path, char *const argv[], char *const envp[],
|
||||
const char *dirpath, int channels[3])
|
||||
{
|
||||
int pipe0[2], pipe1[2], pipe2[2];
|
||||
pid_t childpid;
|
||||
char *full_path;
|
||||
int pipe0[2], pipe1[2], pipe2[2];
|
||||
pid_t childpid;
|
||||
char *full_path;
|
||||
|
||||
//
|
||||
// Handle this error case, we need the full path for execve() below.
|
||||
//
|
||||
if (path[0] != '/' && path[0] != '.') {
|
||||
full_path = pfind( path );
|
||||
/*
|
||||
* Handle this error case, we need the full path for execve() below.
|
||||
*/
|
||||
if (path[0] != '/' && path[0] != '.') {
|
||||
full_path = pfind(path);
|
||||
//full_path = pathfind (getenv ("PATH"), path, "rx");
|
||||
if (full_path == NULL) {
|
||||
fprintf( stderr, "Unable to find full path for \"%s\"\n", path );
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
full_path = path;
|
||||
}
|
||||
if (full_path == NULL) {
|
||||
fprintf(stderr, "Unable to find full path for \"%s\"\n", path );
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
full_path = strdup(path);
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure we can create our pipes before forking.
|
||||
//
|
||||
if( channels != NULL )
|
||||
{
|
||||
if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) {
|
||||
fprintf(stderr, "%s(%d): returning due to error.\n",
|
||||
__FUNCTION__, __LINE__);
|
||||
/*
|
||||
* Make sure we can create our pipes before forking.
|
||||
*/
|
||||
if (channels != NULL) {
|
||||
if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) {
|
||||
fprintf(stderr, "%s(%d): returning due to error.\n",
|
||||
__FUNCTION__, __LINE__);
|
||||
free(full_path);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
childpid = fork();
|
||||
childpid = fork();
|
||||
|
||||
if (childpid < 0) {
|
||||
fprintf(stderr, "%s(%d): returning due to error: %s\n",
|
||||
__FUNCTION__, __LINE__, strerror(errno));
|
||||
if (childpid < 0) {
|
||||
fprintf(stderr, "%s(%d): returning due to error: %s\n",
|
||||
__FUNCTION__, __LINE__, strerror(errno));
|
||||
free(full_path);
|
||||
return -1;
|
||||
} else if (childpid == 0) { /* child */
|
||||
char *ptr;
|
||||
return -1;
|
||||
} else if (childpid == 0) { /* child */
|
||||
char *ptr;
|
||||
|
||||
chdir(dirpath);
|
||||
chdir(dirpath);
|
||||
|
||||
if( channels != NULL )
|
||||
{
|
||||
/* Close the write end of pipe0 */
|
||||
if( close(pipe0[1]) == -1 )
|
||||
perror( "close(pipe0[1])" );
|
||||
|
||||
/* Close the read end of pipe1 */
|
||||
if( close(pipe1[0]) == -1 )
|
||||
perror( "close(pipe1[0])" );
|
||||
if (channels != NULL) {
|
||||
/* Close the write end of pipe0 */
|
||||
if (close(pipe0[1]) == -1)
|
||||
perror("close(pipe0[1])");
|
||||
|
||||
/* Close the read end of pipe2 */
|
||||
if( close(pipe2[0]) == -1 )
|
||||
perror( "close(pipe2[0]))" );
|
||||
/* Close the read end of pipe1 */
|
||||
if (close(pipe1[0]) == -1)
|
||||
perror("close(pipe1[0])");
|
||||
|
||||
/* redirections */
|
||||
dup2(pipe0[0], STDIN_FILENO); /* dup stdin */
|
||||
dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */
|
||||
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
|
||||
}
|
||||
/* Close the read end of pipe2 */
|
||||
if (close(pipe2[0]) == -1)
|
||||
perror("close(pipe2[0]))");
|
||||
|
||||
/* redirections */
|
||||
dup2(pipe0[0], STDIN_FILENO); /* dup stdin */
|
||||
dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */
|
||||
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
|
||||
}
|
||||
|
||||
/* Close all the fd's in the child */
|
||||
{
|
||||
|
@ -86,60 +84,56 @@ exec0(const char *path, char *const argv[], char *const envp[],
|
|||
close(fd++);
|
||||
}
|
||||
|
||||
if( envp[0] == NULL )
|
||||
{
|
||||
execv( full_path, argv );
|
||||
}
|
||||
else
|
||||
{
|
||||
execve( full_path, argv, envp );
|
||||
}
|
||||
if (envp[0] == NULL) {
|
||||
execv(full_path, argv);
|
||||
} 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 )
|
||||
{
|
||||
/* close the read end of pipe1 */
|
||||
if( close(pipe0[0]) == -1 )
|
||||
perror( "close(pipe0[0])" );
|
||||
|
||||
/* close the write end of pipe2 */
|
||||
if( close(pipe1[1]) == -1 )
|
||||
perror( "close(pipe1[1])" );
|
||||
if (channels != NULL) {
|
||||
/* close the read end of pipe1 */
|
||||
if (close(pipe0[0]) == -1)
|
||||
perror("close(pipe0[0])");
|
||||
|
||||
/* close the write end of pipe2 */
|
||||
if (close(pipe1[1]) == -1)
|
||||
perror("close(pipe1[1])");
|
||||
|
||||
/* close the write end of pipe2 */
|
||||
if( close(pipe2[1]) == -1 )
|
||||
perror( "close(pipe2[1])" );
|
||||
/* close the write end of pipe2 */
|
||||
if (close(pipe2[1]) == -1)
|
||||
perror("close(pipe2[1])");
|
||||
|
||||
channels[0] = pipe0[1]; /* Output Stream. */
|
||||
channels[1] = pipe1[0]; /* Input Stream. */
|
||||
channels[2] = pipe2[0]; /* Input Stream. */
|
||||
}
|
||||
channels[0] = pipe0[1]; /* Output Stream. */
|
||||
channels[1] = pipe1[0]; /* Input Stream. */
|
||||
channels[2] = pipe2[0]; /* Input Stream. */
|
||||
}
|
||||
|
||||
free(full_path);
|
||||
return childpid;
|
||||
}
|
||||
return childpid;
|
||||
}
|
||||
|
||||
free(full_path);
|
||||
return -1; /*NOT REACHED */
|
||||
return -1; /*NOT REACHED */
|
||||
}
|
||||
|
||||
|
||||
int wait0(pid_t pid)
|
||||
{
|
||||
int status;
|
||||
int val = -1;
|
||||
int status;
|
||||
int val = -1;
|
||||
|
||||
if (pid < 0 || waitpid(pid, &status, 0) < 0)
|
||||
return -1;
|
||||
if (pid < 0 || waitpid(pid, &status, 0) < 0)
|
||||
return -1;
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
val = WEXITSTATUS(status);
|
||||
}
|
||||
if (WIFEXITED(status)) {
|
||||
val = WEXITSTATUS(status);
|
||||
}
|
||||
|
||||
return val;
|
||||
return val;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue