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;
 | 
						|
}
 |