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

// the remote tapehost 
#define REMOTE_HOST             "beatrix"

// the remote device at the REMOTE_HOST
#define REMOTE_DEVICE           "/dev/rst0"

// the username to run rsh under
#define USERNAME                "karel"



// you've edited enough, now try it out.
#define VER                     "1.00"

string devname;

string username (list envp)
{
    int
        i;
	
    for (i = 0; i < sizeof (envp); i += 2)
        if (element (i, envp) == "USER")
	    return (element (i + 1, envp));
	    
    printf ("netbackup: can't determine your user name; USER not set\n");
    exit (1);
}

void opendev_to_REMOTE_HOST ()
{
    exec ("su -", USERNAME, "-c",
                "'mknod", devname, "p'");
    exec ("su -", USERNAME, "-c",
                "'rsh ", REMOTE_HOST, 
	                "\"dd", "of=" REMOTE_DEVICE, "obs=20k", "conv=sync\"",
	                "<", devname,
	        "'&"
	 );
}   

void opendev_from_REMOTE_HOST ()
{
    string
        dev;
	
    exec ("su", USERNAME, "-c",
                "'mknod", devname, "p'");
    exec ("su", USERNAME, "-c", 
                "'rsh ", REMOTE_HOST, 
	                "\"dd", "if=" REMOTE_DEVICE, "ibs=20k", "conv=sync\"",
	                ">", devname,
	        "'&"
	 );
}

list syntargv (string selector, list oldargv)
{
    list
        ret;
    int
        i;
    
    ret += (list) selector;
    if (selector == "-full" || selector == "-incremental")
    {
        for (i = 2; i < sizeof (oldargv); i++)
	    ret += (list) element (i, oldargv);
	ret += (list) devname;
    }
    else if (selector == "-verbose" || selector == "-restore")
    {
        ret += (list) devname;
        for (i = 2; i < sizeof (oldargv); i++)
	    ret += (list) element (i, oldargv);
    }
    else
        for (i = 2; i < sizeof (oldargv); i++)
	    ret += (list) element (i, oldargv);

    return (ret);
}

int main (int argc, list argv, list envp)
{
    string
        selector;
    list
        newargv;
    int
        exitstatus;
	
    echo (0);
    
    if (argc == 1)
    {
        printf ("\n"
	        "ICCE Backup-Across-The-Net Runner  V" VER "\n"
		"Copyright (c) ICCE 1994. All rights reserved.\n"
		"\n"
		"netbackup by Karel Kubat.\n"
		"\n"
                "netbackup has exactly the arguments as the `backup' "
		                                "script, except for\n"
                "the output file specification which is supplied.\n"
                "netbackup runs a backup via a remote shell at a remote "
		                                "machine, using\n"
                "a given username.\n"
                "Supply the arguments which the program `backup' requires.\n"
		"\n");
        exit (1);	  
    }

    if (username (envp) != "root")
    {
        printf ("netbackup: you really should be root to do this.\n");
	exit (1);
    }
    
    selector = element (1, argv);
    
    devname = "/tmp/tapedev." + (string) getpid ();
    exec ("rm", "-f", devname);
    
    if (selector == "-full" || selector == "-incremental")
        opendev_to_REMOTE_HOST ();
    else if (selector == "-verbose" || selector == "-restore")
        opendev_from_REMOTE_HOST ();

    newargv = syntargv (selector, argv);
    
    exitstatus = exec (P_NOCHECK, "/usr/local/etc/backup/backup", newargv);

    exec ("rm", "-f", devname);
    exit (exitstatus);
}
