1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
/*
* $Header: /cvsroot/arc/arc/arcrun.c,v 1.8 2005/10/12 15:22:18 highlandsun Exp $
*/
/*
* ARC - Archive utility - ARCRUN
*
* Version 1.20, created on 03/24/86 at 19:34:31
*
* (C) COPYRIGHT 1985,85 by System Enhancement Associates; ALL RIGHTS RESERVED
*
* By: Thom Henderson
*
* Description: This file contains the routines used to "run" a file which is
* stored in an archive. At present, all we really do is (a) extract a
* temporary file, (b) give its name as a system command, and then (c) delete
* the file.
*
* Language: Computer Innovations Optimizing C86
*/
#include <stdio.h>
#include <string.h>
#include "arc.h"
#if UNIX
#include <unistd.h>
#include <sys/stat.h>
#endif
VOID rempath(), openarc(), closearc(), arcdie();
int readhdr(), match(), unpack();
static VOID runfile();
FILE *tmpopen();
VOID
runarc(num, arg) /* run file from archive */
int num; /* number of arguments */
char *arg[]; /* pointers to arguments */
{
struct heads hdr; /* file header */
char *makefnam(); /* filename fixer */
char buf[STRLEN]; /* filename buffer */
FILE *fopen();/* file opener */
char *dummy[2];
dummy[0]="dummy";
dummy[1]=NULL;
rempath(num, arg); /* strip off paths */
openarc(0); /* open archive for reading */
if (num) { /* if files were named */
while (readhdr(&hdr, arc)) { /* while more files to check */
if (match(hdr.name, makefnam(arg[0], ".*", buf)))
runfile(&hdr, num, arg);
else
fseek(arc, hdr.size, 1);
}
} else
while (readhdr(&hdr, arc)) /* else run all files */
runfile(&hdr, 1, dummy);
closearc(0); /* close archive after changes */
}
static VOID
runfile(hdr, num, arg) /* run a file */
struct heads *hdr; /* pointer to header data */
int num; /* number of arguments */
char *arg[]; /* pointers to arguments */
{
FILE *tmp, *fopen(); /* temporary file */
char buf[STRLEN], *makefnam(); /* temp file name, fixer */
#if DOS
char nbuf[64], *i, *rindex();
#endif
#if !GEMDOS
int n; /* index */
char sys[STRLEN]; /* invocation command buffer */
#endif
/* makefnam("$ARCTEMP",hdr->name,buf); */
#if UNIX
sprintf(buf, "%s.RUN", arctemp);
strcpy(sys, buf);
#else
strcpy(nbuf, arctemp);
makefnam(nbuf,hdr->name,buf);
i = rindex(buf,'.');
#endif
#if MSDOS
if (!strcmp(i, ".BAS")) {
strcpy(sys, "BASICA ");
strcat(sys, buf);
}
else if (!strcmp(i, ".BAT")
|| !strcmp(i, ".COM")
|| !strcmp(i, ".EXE"))
strcpy(sys, buf);
else {
if (warn) {
printf("File %s is not a .BAS, .BAT, .COM, or .EXE\n",
hdr->name);
nerrs++;
}
fseek(arc, hdr->size, 1); /* skip this file */
return;
}
#endif
#if GEMDOS
if (strcmp(i, ".PRG")
&& strcmp(i, ".TTP")
&& strcmp(i, ".TOS"))
{
if (warn) {
printf("File %s is not a .PRG, .TOS, or .TTP\n",
hdr->name);
nerrs++;
}
fseek(arc, hdr->size, 1); /* skip this file */
return;
}
#endif
if (warn)
if ((tmp = fopen(buf, "r")))
arcdie("Temporary file %s already exists", buf);
if (!(tmp = tmpopen(buf)))
arcdie("Unable to create temporary file %s", buf);
if (note)
printf("Invoking file: %s\n", hdr->name);
unpack(arc, tmp, hdr); /* unpack the entry */
fclose(tmp); /* release the file */
#if UNIX
chmod(buf, 0700); /* make it executable */
#endif
#if GEMDOS
execve(buf, arg, NULL);
#else
for (n = 1; n < num; n++) { /* add command line arguments */
strcat(sys, " ");
strcat(sys, arg[n]);
}
if (system(buf)) /* try to invoke it */
arcdie("Execution failed for %s", buf);
#endif
if (unlink(buf) && warn) {
printf("Cannot unsave temporary file %s\n", buf);
nerrs++;
}
}
|