void ping(int argc, char **argv) { int err; /* init options */ init_options(); /* parse args */ if ((err = parse_args(argc, argv)) < 0) { if (err == -1) usage(); return; } /* signal install */ signal(SIGALRM, sigalrm); signal(SIGINT, sigint); /* address */ skaddr.dst_addr = ipaddr; sock = _socket(AF_INET, SOCK_RAW, IP_P_ICMP); /* send request */ sigalrm(SIGALRM); /* receive reply */ recv_packet(); alarm(0); close_socket(); if (buf) free(buf); ping_stat(); }
void *sh_timeradd(unsigned long msec,int flags,void (*action)(void*),void *handle) { register Timer_t *tp; double t; Handler_t fn; t = ((double)msec)/1000.; if(t<=0 || !action) return((void*)0); if(tp=tpfree) tpfree = tp->next; else if(!(tp=(Timer_t*)malloc(sizeof(Timer_t)))) return((void*)0); tp->wakeup = getnow() + t; tp->incr = (flags?t:0); tp->action = action; tp->handle = handle; time_state |= IN_ADDTIMEOUT; tp->next = tptop; tptop = tp; if(!tpmin || tp->wakeup < tpmin->wakeup) { tpmin = tp; fn = (Handler_t)signal(SIGALRM,sigalrm); if((t= setalarm(t))>0 && fn && fn!=(Handler_t)sigalrm) { Handler_t *hp = (Handler_t*)malloc(sizeof(Handler_t)); if(hp) { *hp = fn; sh_timeradd((long)(1000*t), 0, oldalrm, (void*)hp); } } tp = tptop; } else if(tpmin && !tpmin->action) time_state |= DEFER_SIGALRM; time_state &= ~IN_ADDTIMEOUT; if(time_state&DEFER_SIGALRM) { time_state=SIGALRM_CALL; sigalrm(SIGALRM); if(tp!=tptop) tp=0; } return((void*)tp); }