Open System Services Programmer's Guide

Example 32 Creating an OSS Process Using PROCESS_SPAWN_
/* Example 3-7 Creating an OSS Process using PROCESS_SPAWN_ */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <errno.h>
#include <spawn.h>
#include <tdmext.h>
#include <zsysc>
#include <cextdecs.h(FILE_OPEN_, FILE_GETINFO_, READX, MONITORCPUS,\
PROCESS_SPAWN_, PROCESS_GETINFOLIST_, FILENAME_TO_PATHNAME_)>
/* Structures for standard I/O file descriptor information */
fdentry_def *fdentry; /* structure pointer for fdentry */
fdinfo_def *fdinfo; /* structure pointer to fdinfo block
with one fdentry */
fdinfo_def fdinit = DEFAULT_FDINFO; /* initialize structure */
/* Structure for inheritance values */
struct inheritance inherit;
/* Set defaults for process spawn input/output structures */
struct process_extension
proc_ext = DEFAULT_PROCESS_EXTENSION;
struct process_extension_results
proc_results = DEFAULT_PROCESS_EXTENSION_RESULTS;
/* Structure used for process termination message */
union {
short msgcode; /* message code */
zsys_ddl_smsg_procdeath_def procdeath;/* termination message format */
} msg;
extern char **environ;
#define FILE_MAX ZSYS_VAL_LEN_FILENAME /* maximum characters in file name */
char *progname; /* Name of program to be executed */
pid_t pid; /* OSS process ID */
char *pargv[4]; /* arguments for program to be run */
short error; /* error code, if any */
char inpath[FILE_MAX]; /* standard input file name */
char outpath[FILE_MAX]; /* standard output file name */
char errpath[FILE_MAX]; /* standard error file name */
char *recvname = "$RECEIVE"; /* $RECEIVE file */
short recvfile; /* file number for $RECEIVE */
/*
* This procedure converts an internal file descriptor to an OSS pathname.
*/
short fd_to_pathname(FILE *fp, char *pathname)
{
short err;
char extfname[FILE_MAX];
short len;
short pathnamelen;
#ifdef D30
err = FILE_GETINFO_((short)fdtogfn((short)fileno(fp)), /*lasterr*/,
#else
err = FILE_GETINFO_((short)gfileno(fp), /*lasterr*/,
#endif
extfname, (short)sizeof(extfname)-1,
&len);
if (err == ENOERR) {
extfname[len] = '\0';
err = FILENAME_TO_PATHNAME_(extfname, len,
pathname, PATH_MAX,
&pathnamelen);
if (err == ENOERR)
pathname[pathnamelen] = '\0';
Creating and Controlling Processes 127