/******************************************* * to submit DEl * * * *******************************************/ #include #include #include #include #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); } }