/*******************************************
* to submit DEl                            *
*                                          *
*******************************************/

#include <modes.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include "comx.h"

#define BIT32        0x80000000  

extern int os9forkc();
extern char **environ;
char *argblk[5];
int del_ok;

sighand(signal)
register int signal;
{
   if ( signal == DEL_TIMEOUT ){
      del_ok = 0;
   }
   else if ( signal >= 2 && signal <= 3){  /* ^C or ^E ?    */
      exit(0);
   }
}


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

   unsigned del_status;
   int del_id;
   int del_in, del_out, del_err;
   int pathin1, pathout1, patherr1;
   int pathin2, pathout2, patherr2;
   int alarm_id;
   int secs = 20;

   intercept(sighand);

   if (argc < 2)
       exit(_errmsg( -2 ," please give HOST and pipe"));
   if (argc >= 3 && (atoi(argv[2]) > DEL_T_MIN && atoi(argv[2]) < DEL_T_MAX))
       secs = atoi(argv[2]);       

   /* fork DEL */
   argblk[0] = "del";
   argblk[1] = argv[1];
   argblk[2] = 0;

   /* change the paths */
   pathin1  = dup(0);
   pathout1 = dup(1);
   patherr1 = dup(2);
   close(0);
   close(1);
   close(2);
   if( ( del_in  = open("/nil", S_IREAD) ) == -1 )
       exit(_errmsg(errno ," cannot open %s \n", argv[2]));
   del_out = dup(del_in);
   del_err = dup(del_out);

   if ((del_id = os9exec(os9forkc,argblk[0],argblk,environ,0,0,3)) == -1)
       exit(_errmsg(-1 ," error returned from os9exec(%s) \n",
       argblk[0]));

   close (del_in);
   close (del_out);
   close (del_err);
   pathin2  = dup(pathin1);
   pathout2 = dup(pathout1);
   patherr2 = dup(patherr1);
   close (pathin1);
   close (pathout1);
   close (patherr1);

   if ((alarm_id = alm_set(DEL_TIMEOUT, ( secs << 8 ) | BIT32 )) == -1) 
      exit(_errmsg(errno, "can't set alarm - "));

   del_ok = 1;
   wait(&del_status); /* wait del to finish */

   if (del_ok){
      if ( alm_delete(alarm_id) == -1)   
         exit(_errmsg(errno, "can't delete alarm - \n"));
      if (del_status)
         exit(_errmsg(del_status,"DEL return code  %d\n", del_status));
      exit(0);
   }
   else{
      if ( kill(del_id, SIGKILL) == -1)
         exit(_errmsg(errno," error killing del \n")); 
      exit(DEL_TIMEOUT);
   }
}