#!/usr/local/bin/icmake -qi

/* 
Sample icmake file. See the file "tolower" for installation guidelines.
*/

						/* defaults: version nr, */
						/* and default tape dev */
#define VER 		"1.00"
#define TAPE 		"tapehost:/dev/rmt0"

int
    verbose;					/* 0: not verbose, 1: ver */
string
    tape;					/* actual tape device */
    
list remove_element (list l, int index)		/* remove element #index */
{						/* from list l */
    int
    	i;					/* counter */
    list
    	ret;					/* returned list */
    	
    for (i = 0; i < sizeof (l); i++)		/* loop thru source list */
    	if (i != index)				/* add elements to dest */
    	   ret += (list) element (i, l);	/* except for #index */
    	   
    return (ret);				/* return dest list */
}
    
void run_system (string sys)			/* execute system, print */
{						/* string if verbose */
    if (verbose)
    	printf ("backup: ", sys, "\n");
    system (sys);
}

void gettape (list envp)			/* get TAPE setting */
{						/* from environment, or */
    int						/* use predefined TAPE */
    	i;			
    int
    	found;					/* found environ string? */
    	
    for (i = 0; i < sizeof (envp); i += 2)	/* loop thru environ */
    	if (element (i, envp) == "TAPE")	/* if TAPE variable: */
    	{
    	    tape = element (i + 1, envp);	/* tape device found */
    	    found = 1;	
    	}
    	
    if (! found)				/* if not encountered, */
    	tape = TAPE;				/* use default */
}

string makecmd (string opt, list files, 	/* make tar system */
		int needverbose)		/* command */
{
    string
    	sys;					/* the system string */
    int 
    	i;					/* loop cntr */
    	
    sys = "tar --" + opt;			/* first tar option */
    if (needverbose)
    	sys += " --verbose";			/* verbose if requested */
    sys += " --file " + tape;			/* tape device */
    
    for (i = 0; i < sizeof (files); i++)	/* files to process */
    	sys += " " + element (i, files);
    	
    return (sys);				/* system string is */
}						/* returned */

void backup (list dirs)				/* writes files/dirs to */
{						/* tape device */
    string
    	sys;					/* tar cmd */
    	
    if (! dirs)					/* check if argument */
    {						/* present */
    	printf ("backup: store needs directory or file argument(s)\n");
    	exit (1);
    }
    
    sys = makecmd ("create", dirs, 1);		/* the system string */
    run_system (sys);				/* here goes.. */
}

void listtape (list files)
{
    string
    	sys;					/* system() string */
    	
    sys = makecmd ("list", files, verbose);	/* the system command */
    run_system (sys);
}

void extract (list files)
{
    string
    	sys;
    	
    sys = makecmd ("extract", files, verbose);	/* system() string */
    run_system (sys);
}

void usage ()
{
    printf ("\n"
    	    "ICCE Tar/Tape Backup Facility  V", VER, "\n"
    	    "Copyright (c) ICCE 1993. All rights reserved.\n"
    	    "\n"
    	    "Usage: backup [-v] operation [arguments]\n"
    	    "where:\n"
    	    "    -v flag                     : verbose operation\n"
    	    "    operation and arguments     : specify what to do, one of:\n"
    	    "        store file(s) or dir(s) : to backup to tape\n"
    	    "        list [file(s)]          : to list contents of the tape\n"
    	    "        restore [file(s)]       : to extract file(s) from tape\n"
    	    "Used tape drive is by default \"", TAPE, "\". If set, the\n"
    	    "environment variable \"TAPE\" takes precedence.\n"
    	    "\n");
    exit (1);
}

void main (int argc, list argv, list envp)
{
    string
    	selector;				/* option of program */
    	
    if (argc == 1)				/* no arguments: */
    	usage ();				/* print usage and die */
    	
    echo (0);					/* no cmds re-echoing */
    	
    argv = remove_element (argv, 0);		/* remove makefile name */
    selector = element (0, argv);		/* get selector */
    
    if (selector == "-v")			/* if this is the -v flag: */
    {
    	verbose++;				/* verbose requested */
    	argv = remove_element (argv, 0);	/* remove it */
    	selector = element (0, argv);		/* get new selector */
    }
    
    gettape (envp);				/* get TAPE environment */
    						/* variable, if any */
   
    argv = remove_element (argv, 0);		/* remove selector */
    
    if (selector == "store")			/* take action according */
    	backup (argv);				/* to selector */
    else if (selector == "list")
    	listtape (argv);
    else if (selector == "restore")
    	extract (argv);
    else
    	usage ();
    	
    exit (0);					/* done. */
}
