1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 01:36:01 +02:00

Patch from Gene Sally. And formatting "fixes".

This commit is contained in:
Alain Magloire 2002-09-26 19:52:22 +00:00
parent 8051af4120
commit b4b7151cf3
2 changed files with 100 additions and 94 deletions

View file

@ -1,12 +1,22 @@
# makefile for libspawner.so # 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_INCLUDES=/usr/local/jdk/include
JDK_OS_INCLUDES=/usr/local/jdk/include/linux JDK_OS_INCLUDES=/usr/local/jdk/include/linux
CC=gcc CC=gcc
CPPFLAGS = -I. -I$(JDK_INCLUDES) -I$(JDK_OS_INCLUDES) CPPFLAGS = -I. -I$(JDK_INCLUDES) -I$(JDK_OS_INCLUDES)
CFLAGS +=-fpic -D_REENTRANT CFLAGS +=-fpic -D_REENTRANT
LIB_NAME_SPAWNER = libspawner.so LIB_NAME_SPAWNER = libspawner.so
LIB_NAME_FULL_SPAWNER = ../os/linux/x86/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) 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 $(CC) -g -shared -Wl,-soname,$(LIB_NAME_SPAWNER) -o $(LIB_NAME_FULL_SPAWNER) $(OBJS_SPAWNER) -lc
$(LIB_NAME_FULL_PTY): $(OBJS_PTY) $(LIB_NAME_FULL_PTY): $(OBJS_PTY)
$(CC) -g -shared -Wl,-soname,$(LIB_NAME_PTY) -o $(LIB_NAME_FULL_PTY) $(OBJS_PTY) $(CC) -g -shared -Wl,-soname,$(LIB_NAME_PTY) -o $(LIB_NAME_FULL_PTY) $(OBJS_PTY)
clean : clean :
echo -rm $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER) $(RM) $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER)
-rm $(OBJS_PTY) $(LIB_NAME_FULL_PTY) $(RM) $(OBJS_PTY) $(LIB_NAME_FULL_PTY)

View file

@ -14,68 +14,66 @@ 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. * Handle this error case, we need the full path for execve() below.
// */
if (path[0] != '/' && path[0] != '.') { if (path[0] != '/' && path[0] != '.') {
full_path = pfind( path ); full_path = pfind(path);
//full_path = pathfind (getenv ("PATH"), path, "rx"); //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 { } else {
full_path = path; 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 = fork(); childpid = fork();
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 +84,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;
} }