ewilts%Ins.MRC.AdhocNet.CA%Stasis.MRC.AdhocNet.CA%UNCAEDU.@CORNELLC.CCS.CORNELL.EDU.BITNET (Ed Wilts) (06/24/88)
$Part11:
$ File_is="ARCRUN.C"
$ Check_Sum_is=6780394
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
Xstatic char *RCSid = "$Header: arcrun.c,v 1.2 86/07/15 07:53:55 turner Exp $";
X
X/*
X * $Log:`009arcrun.c,v $
X * Hack-attack 1.3 86/12/20 01:23:45 wilhite@usceast.uucp
X * `009Bludgeoned into submission for VAX 11/780 BSD4.2
X *`009(ugly code, but fewer core dumps)
X *
X * Revision 1.2 86/07/15 07:53:55 turner
X *
X *
X * Revision 1.1 86/06/26 15:00:40 turner
X * initial version
X *
X *
X */
X
X/* ARC - Archive utility - ARCRUN
X
X$define(tag,$$segment(@1,$$index(@1,=)+1))#
X$define(version,Version $tag(
XTED_VERSION DB =1.17), created on $tag(
XTED_DATE DB =02/03/86) at $tag(
XTED_TIME DB =22:59:06))#
X$undefine(tag)#
X $version
X
X(C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
X
X By: Thom Henderson
X
X Description:
X This file contains the routines used to "run" a file
X which is stored in an archive. At present, all we really do
X is (a) extract a temporary file, (b) give its name as a system
X command, and then (c) delete the file.
X
X Language:
X Computer Innovations Optimizing C86
X*/
X#include <stdio.h>
X#include "arc.h"
X
XINT runarc(num,arg) /* run file from archive */
XINT num; /* number of arguments */
Xchar *arg[]; /* pointers to arguments */
X{
X struct heads hdr; /* file header */
X INT run; /* true to run current file */
X INT did[MAXARG]; /* true when argument was used */
X INT n; /* index */
X char *makefnam(); /* filename fixer */
X char buf[STRLEN]; /* filename buffer */
X FILE *fopen(); /* file opener */
X INT runfile();
X
X for(n=0; n<num; n++) /* for each argument */
X did[n] = 0; /* reset usage flag */
X rempath(num,arg); /* strip off paths */
X
X openarc(0); /* open archive for reading */
X
X if(num) /* if files were named */
X { while(readhdr(&hdr,arc)) /* while more files to check */
X { run = 0; /* reset run flag */
X for(n=0; n<num; n++) /* for each template given */
X { if(match(hdr.name,makefnam(arg[n],".*",buf)))
X { run = 1; /* turn on run flag */
X did[n] = 1; /* turn on usage flag */
X break; /* stop looking */
X }
X }
X
X if(run) /* if running this one */
X runfile(&hdr); /* then do it */
X else /* else just skip it */
X fseek(arc,hdr.size,1);
X }
X }
X
X else while(readhdr(&hdr,arc)) /* else run all files */
X runfile(&hdr);
X
X closearc(0); /* close archive after changes */
X
X if(note)
X { for(n=0; n<num; n++) /* report unused args */
X { if(!did[n])
X { printf("File not found: %s\n",arg[n]);
X nerrs++;
X }
X }
X }
X}
X
Xstatic INT runfile(hdr) /* run a file */
Xstruct heads *hdr; /* pointer to header data */
X{
X FILE *tmp, *fopen(); /* temporary file */
X char buf[STRLEN], *makefnam(); /* temp file name, fixer */
X char sys[STRLEN]; /* invocation command buffer */
X char *dir, *gcdir(); /* directory stuff */
X
X/* Replaced $ARCTEMP as the "system" call didn't approve. */
X/* makefnam("$ARCTEMP",hdr->name,buf); */
X sprintf(buf,"%s.RUN",arctemp);
X
X/* if(!strcmp(buf,"$ARCTEMP.BAS"))
X * strcpy(sys,"BASICA $ARCTEMP");
X *
X * else if(!strcmp(buf,"$ARCTEMP.BAT")
X * || !strcmp(buf,"$ARCTEMP.COM")
X * || !strcmp(buf,"$ARCTEMP.EXE"))
X * strcpy(sys,"$ARCTEMP");
X *
X * else
X * { if(warn)
X * { printf("File %s is not a .BAS, .BAT, .COM, or .EXE\n",
X * hdr->name);
X * nerrs++;
X * }
X * fseek(arc,hdr->size,1);
X * return;
X * }
X */
X
X if(warn)
X if(tmp=fopen(buf,"r"))
X abort("Temporary file %s already exists",buf);
X if(!(tmp=fopen(buf,"w")))
X abort("Unable to create temporary file %s",buf);
X
X if(note)
X printf("Invoking file: %s\n",hdr->name);
X
X dir = gcdir(""); /* see where we are */
X unpack(arc,tmp,hdr); /* unpack the entry */
X fclose(tmp); /* release the file */
X chmod(buf,"700"); /* make it exec'able */
X#ifdef VAXC
X/*
X * If we want to get fancy we could check for .COM files etc...
X */
X strcpy(sys,"$ RUN ");
X strcat(sys, buf);
X system(sys);
X#else
X system(buf); /* try to invoke it */
X#endif
X chdir(dir); free(dir); /* return to whence we started */
X
X if(unlink(buf) && warn)
X { printf("Cannot unsave temporary file %s\n",buf);
X nerrs++;
X }
X}
X
$ GoSub Convert_File
$ Goto Part13