view packinst/packinst.c @ 0:879c2819a48d

Initial commit.
author Brian Smith <brian@dbsoft.org>
date Fri, 18 Feb 2011 08:45:38 -0600
parents
children 821abb186ec1
line wrap: on
line source

/* $Id: packinst.c,v 1.5 2003/11/22 00:50:28 bsmith Exp $ */

/*
 * include.c (c) 1998-2001 Brian Smith
 */

#include <stdlib.h>
#include <stdio.h>
#ifndef __UNIX__
#include <conio.h>
#include <io.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

#ifndef __UNIX__
#define strcasecmp stricmp
#endif

/* Handle binary extensions on differnt platforms */
#ifdef __UNIX__
#define BINEXT
#else
#define BINEXT ".exe"
#endif

extern int files;

FILE *cfgfile, *installfile;
char *INSTALLER_APPLICATION;
char *INSTALLER_VERSION;
char *INSTALLER_TITLE;
char *INSTALLER_PATH;
char *INSTALLER_FOLDER;
char *INSTALLER_PROGRAM;
char *INSTALLER_SHADOW;
char *INSTALLER_OBJECT;
char *INSTALLER_SETS;
char *INSTALLER_SYSVAR;
char *INSTALLER_SYSLINE;
char *INSTALLER_PACKAGES[20];
char *INSTALLER_CONFIRM_WPS;
char *INSTALLER_CONFIRM_CONFIGSYS;
char *INSTALLER_CONFIRM_OVERWRITE;
int INSTALLER_BITMAP_WIDTH;
int INSTALLER_BITMAP_HEIGHT;
int INSTALLER_PACKAGE_COUNT=0;

int packagefiles[20];
char *packagefilename[20];

void resetglobals(void);

int include_unpack(char *aname);

void append_file(char *filename)
{
   FILE *appendfile;
   int amnt;
   char buffer[512];

   if((appendfile = fopen(filename, "rb"))==NULL)
      {
         printf("Error opening %s for reading!\n", filename);
         exit(3);
      }
   while(!feof(appendfile))
      {
         amnt = fread(buffer, 1, 512, appendfile);
         fwrite(buffer, 1, amnt, installfile);
      }
   fclose(appendfile);
}

void getline(FILE *f, char *entry, char *entrydata)
{
char in[4096];
int z;

    memset(in, 0, 4096);
    fgets(in, 4095, f);

    if(in[strlen(in)-1] == '\n')
       in[strlen(in)-1] = 0;

    if(in[0] != '#')
       {
       for(z=0;z<strlen(in);z++)
           {
              if(in[z] == '=')
                 {
                    in[z] = 0;
                    strcpy(entry, in);
                    strcpy(entrydata, &in[z+1]);
                    return;
                 }
           }
      }
   strcpy(entry, "");
   strcpy(entrydata, "");
}

int main(int argc, char *argv[])
{
   char entry[8096], entrydata[8096];
   int z;

   printf("Packinst- version 2.1 (c) 1999-2003 DBSoft\n\n");
   if(argc!=2)
      {
         printf("Usage: Packinst <filename.cfg>\n");
         exit(1);
      }
   if((cfgfile = fopen(argv[1], "r"))==NULL)
      {
         printf("Error opening config file \"%s\"!\n", argv[1]);
         exit(2);
      }
   if((installfile = fopen("install" BINEXT, "wb"))==NULL)
      {
         printf("Error opening install" BINEXT " for writing!\n");
         exit(3);
      }
#if 0
   printf("Adding resources to sfx" BINEXT "...\n");
   system("rc install.rc sfx" BINEXT " > NUL");
#endif
   printf("Creating installer...\n");
   append_file("sfx" BINEXT);
   fwrite("DBSOFT-HEADER", 1, 13, installfile);
   while(!feof(cfgfile))
      {
        getline(cfgfile, entry, entrydata);
        if(strcasecmp(entry, "INSTALLER_APPLICATION") == 0)
           INSTALLER_APPLICATION = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_VERSION") == 0)
           INSTALLER_VERSION = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_TITLE") == 0)
           INSTALLER_TITLE = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_PATH") == 0)
           INSTALLER_PATH = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_FOLDER") == 0)
           INSTALLER_FOLDER = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_PROGRAM") == 0)
           INSTALLER_PROGRAM = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_SHADOW") == 0)
           INSTALLER_SHADOW = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_OBJECT") == 0)
           INSTALLER_OBJECT = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_SETS") == 0)
           INSTALLER_SETS = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_SYSVAR") == 0)
           INSTALLER_SYSVAR = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_SYSLINE") == 0)
           INSTALLER_SYSLINE = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_CONFIRM_WPS") == 0)
           INSTALLER_CONFIRM_WPS = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_CONFIRM_CONFIGSYS") == 0)
           INSTALLER_CONFIRM_CONFIGSYS = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_CONFIRM_OVERWRITE") == 0)
           INSTALLER_CONFIRM_OVERWRITE = (char *)strdup(entrydata);
        if(strcasecmp(entry, "INSTALLER_PACKAGE") == 0)
           {
              for(z=0;z<strlen(entrydata);z++)
                 {
                    if(entrydata[z] == ',')
                       {
                          entrydata[z] = 0;
                          packagefilename[INSTALLER_PACKAGE_COUNT] = (char *)strdup(entrydata);
                          INSTALLER_PACKAGES[INSTALLER_PACKAGE_COUNT] = (char *)strdup(&entrydata[z+1]);
                       }
                 }
              resetglobals();
              files=0;
              include_unpack(packagefilename[INSTALLER_PACKAGE_COUNT]);
              packagefiles[INSTALLER_PACKAGE_COUNT] = files;
              INSTALLER_PACKAGE_COUNT++;
           }
      }
   fclose(cfgfile);
   fprintf(installfile, "%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%d",
		   INSTALLER_APPLICATION, INSTALLER_VERSION, INSTALLER_TITLE,
		   INSTALLER_PATH, INSTALLER_FOLDER, INSTALLER_PROGRAM,
		   INSTALLER_SHADOW, INSTALLER_OBJECT, INSTALLER_SETS, INSTALLER_SYSVAR,
		   INSTALLER_SYSLINE, INSTALLER_CONFIRM_WPS, INSTALLER_CONFIRM_CONFIGSYS,
		   INSTALLER_CONFIRM_OVERWRITE, INSTALLER_PACKAGE_COUNT);
   for(z=0;z<INSTALLER_PACKAGE_COUNT;z++)
      fprintf(installfile, "-%s", INSTALLER_PACKAGES[z]);
   fwrite("~", 1, 1, installfile);
   for(z=0;z<INSTALLER_PACKAGE_COUNT;z++)
      {
         struct stat blah;

         stat(packagefilename[z], &blah);
         fprintf(installfile, "DBSOFT-ACE%d%d-%lu~", z, packagefiles[z], blah.st_size);
         append_file(packagefilename[z]);
         printf("Package: %s - %d files in %s (%lu bytes).\n", INSTALLER_PACKAGES[z], packagefiles[z], packagefilename[z], blah.st_size);
      }
   fclose(installfile);
   fclose(cfgfile);
#ifdef __UNIX__
   chmod("install" BINEXT,  S_IRWXU);
#endif
   return 0;
   }