which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
156 lines
3.6 KiB
C
Executable File
156 lines
3.6 KiB
C
Executable File
/*
|
|
* makesfx - Makes a QDOS sfx zip file
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
* not copyrighted at all by Jonathan Hudson, 04/09/95
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
|
|
#ifdef QDOS
|
|
# include <qdos.h>
|
|
# define ZMODE (X_OK|R_OK)
|
|
#else
|
|
# define ZMODE (R_OK)
|
|
# define getchid(p1) p1
|
|
|
|
typedef struct
|
|
{
|
|
long id;
|
|
long dlen;
|
|
} NTC;
|
|
|
|
struct qdirect {
|
|
long d_length __attribute__ ((packed)); /* file length */
|
|
unsigned char d_access __attribute__ ((packed)); /* file access type */
|
|
unsigned char d_type __attribute__ ((packed)); /* file type */
|
|
long d_datalen __attribute__ ((packed)); /* data length */
|
|
long d_reserved __attribute__ ((packed));/* Unused */
|
|
short d_szname __attribute__ ((packed)); /* size of name */
|
|
char d_name[36] __attribute__ ((packed));/* name area */
|
|
long d_update __attribute__ ((packed)); /* last update */
|
|
long d_refdate __attribute__ ((packed));
|
|
long d_backup __attribute__ ((packed)); /* EOD */
|
|
} ;
|
|
|
|
int fs_headr (int fd, long t, struct qdirect *qs, short size)
|
|
{
|
|
NTC ntc;
|
|
int r = -1;
|
|
|
|
lseek(fd, -8, SEEK_END);
|
|
read(fd, &ntc, 8);
|
|
if(ntc.id == *(long *)"XTcc")
|
|
{
|
|
qs->d_datalen = ntc.dlen; /* This is big endian */
|
|
qs->d_type = 1;
|
|
r = 0;
|
|
}
|
|
lseek(fd, 0, 0);
|
|
return 42; /* why not ??? */
|
|
}
|
|
|
|
void fs_heads (int fd, long t, struct qdirect *qs, short size)
|
|
{
|
|
NTC ntc;
|
|
|
|
read(fd, &ntc, 8);
|
|
ntc.id = *(long *)"XTcc";
|
|
ntc.dlen = qs->d_datalen;
|
|
write (fd, &ntc, 8);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
#define RBUFSIZ 4096
|
|
|
|
int main (int ac, char **av)
|
|
{
|
|
int fd;
|
|
static char local_sig[4] = "PK\003\004";
|
|
char *p, tmp[4];
|
|
short ok = 0;
|
|
|
|
if(ac != 3)
|
|
{
|
|
fputs("makesfx unzipsfx zip_file\n", stderr);
|
|
exit (0);
|
|
}
|
|
if(isatty(1))
|
|
{
|
|
fputs("makesfx: writing sfx to terminal is TERMINAL !\n", stderr);
|
|
exit (0);
|
|
}
|
|
|
|
if((fd = open(*(av+2), O_RDONLY)) > 0)
|
|
{
|
|
if((read(fd, tmp, 4) == 4))
|
|
{
|
|
if(*(long *)tmp == *(long *)local_sig)
|
|
{
|
|
ok = 1;
|
|
}
|
|
}
|
|
close(fd);
|
|
}
|
|
if(!ok)
|
|
{
|
|
fprintf(stderr,
|
|
"Huum, %s doesn't look like a ZIP file to me\n", *(av+2));
|
|
exit(0);
|
|
}
|
|
|
|
if(strstr(*(av+1), "unzipsfx"))
|
|
{
|
|
if(access(*(av+1), ZMODE))
|
|
{
|
|
fprintf(stderr, "Sorry, don't like the look of %s\n", *(av+1));
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
if(p = malloc(RBUFSIZ))
|
|
{
|
|
struct qdirect qd;
|
|
int n;
|
|
|
|
if((fd = open(*(av+1), O_RDONLY)))
|
|
{
|
|
if(fs_headr(getchid(fd), -1, &qd, sizeof(qd)) > 0)
|
|
{
|
|
while((n = read(fd, p, RBUFSIZ)) > 0)
|
|
{
|
|
write(1, p, n);
|
|
}
|
|
close(fd);
|
|
if((fd = open(*(av+2), O_RDONLY)) > 0)
|
|
{
|
|
while((n = read(fd, p, RBUFSIZ)) > 0)
|
|
{
|
|
write(1, p, n);
|
|
}
|
|
close(fd);
|
|
}
|
|
fs_heads(getchid(1), -1, &qd, sizeof(qd));
|
|
}
|
|
else
|
|
{
|
|
close(fd);
|
|
fputs("Can't read unzipsfx header", stderr);
|
|
exit(0);
|
|
}
|
|
}
|
|
free(p);
|
|
}
|
|
else
|
|
{
|
|
fputs("Out of memory", stderr);
|
|
exit(0);
|
|
}
|
|
return 0;
|
|
}
|