Listing 3: child_process member functions


/***************************************************
  FILE NAME   : cproc.cpp
  AUTHOR      : Matt Weisfeld                     
						  
  DESCRIPTION : execute child processes
***************************************************/
#include <iostream.h>
#include <string.h>
#include "cproc.hpp"
#ifdef DOS
#include <process.h>    // for _SPAWN 
#include <stdlib.h>
#endif
// DESCRIPTION  : default constructor
child_process::child_process() {
	CLINE = new command_line;
	command_extension[0] = NULL;
}
// DESCRIPTION  : character initialization constructor
child_process::child_process(const char *command) {
	CLINE = new command_line (command);
	command_extension[0] = NULL;
}
// DESCRIPTION  : child process object copy constructor
child_process::child_process(const child_process& cchild_process) {
	CLINE = new command_line (cchild_process.CLINE->command_buffer);
	strcpy(command_extension, cchild_process.command_extension);
}
// DESCRIPTION  : destructor
child_process::~child_process() {
	delete CLINE;
}
// DESCRIPTION  : build the calling path & execute
int child_process::exec_function(void) {
	int child_status;
	add_extension();
	if ((child_status = spawnv(P_WAIT,command_extension,CLINE->Cargv)) == -1) {
			return (-1);
	}
	cout << "CHILD STATUS = " << child_status << endl;
	return (child_status);
}
// DESCRIPTION  : add the file extension to the program name
void child_process::add_extension(void) {
	char command_buffer[100];
	char *command_ptr;
	char path[100];
	char program[100];
	char args[100];
	strcpy (path, PATH);
	strcpy (command_buffer, CLINE->command_buffer);
	command_ptr = command_buffer;
	for (int i=0; *command_ptr!=' '; i++, command_ptr++) {
		program[i] = *command_ptr;
	}
	program[i]='\0';
	strcpy (args, command_ptr);
	strcpy (command_extension, path);
	strcat (command_extension, program);
	strcat (command_extension, ".exe");
	strcat (command_extension, args);
}
// DESCRIPTION  : assignment operator for CCargv list
child_process& child_process::operator=(const char *ptr) {
	CLINE->build_command(ptr);
	return *this;
}
// DESCRIPTION  : assignment operator for argv list
child_process& child_process::operator=(const child_process& func) {
	CLINE->build_command(func.CLINE->command_buffer);
	return *this;
}
// DESCRIPTION  : execute the commmand as a child process via exec_function()
child_process::operator const int () {
	int status;
	status = exec_function();
	return(status);
}