/*********************************************************************/
/*
	Doarchive - news bundling for TIN / DLG

  Reads the users user.data file to determine the archiver type.

  Now looks up how to create archive from the archivers already set up
  from within DLG.  Cleaned up code ALOT.
	- Erik_Karlin@erixami.linet.org

  News articles saved from within TIN [to $HOME/News] are archived with
  the appropriate archiver and called MESSAGES.lzh|zoo|arc

*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <exec/types.h>
#include <libraries/dosextens.h>
/*********************************************************************/
/* For more information about the dlg include files, please contact  */
/*  TelePro Technologies  Red Deer, AB CANADA                        */
/*********************************************************************/
#include <dlg/user.h>
#include <dlg/misc.h>

main(argc,argv)
int 	argc;
char 	*argv[];

{
    int		ret, found, success;
    char	filename[80], command[256];
    char	archname[256], archfile[256];
    FILE	*userfile, *archfp;

    struct USER_DATA	UserData;
    struct Archiver	onearch;
    char		which_arch;
    int			i, j, loop;

    if(argc < 2)
    {
	fprintf(stderr, "DoArchive not setup correctly\n");
	exit(1);
    }

    sprintf(filename, "User:%s/User.Data", argv[1]);
    if((userfile = fopen(filename,"rb")) == NULL)
    {
	perror("Unable to open user.data file");
	exit(1);
    }
    if((archfp = fopen("DLGConfig:Misc/Archivers.bbs", "rb")) == NULL)
    {
	perror("Error opening archivers");
	if(userfile)
	  fclose(userfile);
	exit(1);
    }
    ret = fread(&UserData, sizeof(struct USER_DATA), 1, userfile);
    if(ret != 1)
    {
	perror("Error reading User.Data");
	if(userfile)
	  fclose(userfile);
	if(archfp)
	  fclose(archfp);
	exit(1);
    }
    which_arch = UserData.archiver;

    found = FALSE;
    while(!feof(archfp))
    {
	ret = fread(&onearch, sizeof(struct Archiver), 1, archfp);
	if(ret != 1)
	{
	    perror("Error reading archivers.bbs");
	    if(userfile)
	      fclose(userfile);
	    if(archfp)
	      fclose(archfp);
	    exit(1);
	}
	if(onearch.number == which_arch)
	{
	    found = TRUE;
	    break;
	}
    }

    if(found)
    {
	for(i = 0;i < 256;i++)	command[i] = '\0';
	
	sprintf(archname, "messages%s",onearch.extension);
	sprintf(archfile, "user:%s/news/#?", argv[1]);

	j = 0;
	i = 0;
	loop = 0;
	while(i < strlen(onearch.compress))
	{
	    while(onearch.compress[i] != '~')	/* grab first ~[ds] */
	      command[loop++] = onearch.compress[i++];

	    switch(onearch.compress[++i])
	    {
	    case 'd':
		for(j = 0;j < strlen(archname);j++)
		  command[loop++] = archname[j];
	        break;
	    case 's':
		for(j= 0;j < strlen(archfile);j++)
		  command[loop++] = archfile[j];
		break;
	    default:
		fprintf(stderr, "Unknown type for archiver[%c]\n",
			onearch.compress[i]);
		break;
	    }
	    i++;		/* move past the char */
	}

	success = Execute(command,0,0);
	if(!success)
	  perror("Archiver failed");
    }
    else
      perror("Archiver not found\n");

    if(userfile)
      fclose(userfile);
    if(archfp)
      fclose(archfp);
    exit(0);
}
