static int try_etcpath(const char *const *files, ExtlTryConfigFn *tryfn, void *tryfnparam) { const char *const *file=NULL; int i, ret, ret2=EXTL_TRYCONFIG_NOTFOUND; char *path, *colon, *dir; if(sessiondir!=NULL){ for(file=files; *file!=NULL; file++){ ret=do_try(sessiondir, *file, tryfn, tryfnparam); if(ret>=0) return ret; if(ret2==EXTL_TRYCONFIG_NOTFOUND) ret2=ret; } } path=scriptpath; while(path!=NULL){ colon=strchr(path, ':'); if(colon!=NULL){ dir=extl_scopyn(path, colon-path); path=colon+1; }else{ dir=extl_scopy(path); path=NULL; } if(dir!=NULL){ if(*dir!='\0'){ for(file=files; *file!=NULL; file++){ ret=do_try(dir, *file, tryfn, tryfnparam); if(ret>=0){ free(dir); return ret; } if(ret2==EXTL_TRYCONFIG_NOTFOUND) ret2=ret; } } free(dir); } } return ret2; }
int main (int argc, char **argv) { struct addrinfo hints, *res; trace_t trace; set_program_name (argv[0]); /* Parse command line */ iu_argp_init ("traceroute", program_authors); argp_parse (&argp, argc, argv, 0, NULL, NULL); /* Hostname lookup first for better information */ memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_INET; hints.ai_flags = AI_CANONNAME; if ((hostname == NULL) || (*hostname == '\0') || getaddrinfo (hostname, NULL, &hints, &res)) error (EXIT_FAILURE, 0, "unknown host"); memcpy (&dest, res->ai_addr, res->ai_addrlen); dest.sin_port = htons (opt_port); getnameinfo (res->ai_addr, res->ai_addrlen, addrstr, sizeof (addrstr), NULL, 0, NI_NUMERICHOST); printf ("traceroute to %s (%s), %d hops max\n", res->ai_canonname, addrstr, opt_max_hops); freeaddrinfo (res); trace_init (&trace, dest, opt_type); int hop = 1; while (!stop) { if (hop > opt_max_hops) exit (EXIT_SUCCESS); do_try (&trace, hop, opt_max_hops, opt_max_tries); trace_inc_ttl (&trace); trace_inc_port (&trace); hop++; } exit (EXIT_SUCCESS); }
static int try_dir(const char *const *files, const char *cfdir, ExtlTryConfigFn *tryfn, void *tryfnparam) { const char *const *file; int ret, ret2=EXTL_TRYCONFIG_NOTFOUND; for(file=files; *file!=NULL; file++){ if(cfdir==NULL) ret=tryfn(*file, tryfnparam); else ret=do_try(cfdir, *file, tryfn, tryfnparam); if(ret>=0) return ret; if(ret2==EXTL_TRYCONFIG_NOTFOUND) ret2=ret; } return ret2; }
s32 get_tracert_list (char *argv, char* option, u32 *count, tracert_cfg_item_t *item_buf,char *info1,char *info2) { trace_t trace; struct tracert_info tracert_info; int i = 0; int ret; int fd; struct sockaddr_in loc_addr; stop = 0; /* Parse command line */ parse_opt(argv); if (geteuid () != 0) return -1; ret = tracert_opt_parse(option, &tracert_info, info1); if(0 != ret) { return 0; } dest.sin_addr = *(struct in_addr *) tracehost->h_addr; dest.sin_family = AF_INET; dest.sin_port = htons (tracert_info.port); //给trace结构体的源地址赋初值 if(NULL != tracert_info.host_addr) { //测试源地址是否存在 loc_addr.sin_family=AF_INET; loc_addr.sin_addr.s_addr=inet_addr(tracert_info.host_addr); loc_addr.sin_port=htons(SRCPORT); fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(bind(fd,(struct sockaddr*)&loc_addr,sizeof(loc_addr))) { close(fd); sprintf(info1,"Please select a local address!"); return 1; } close(fd); trace.from.sin_addr.s_addr = inet_addr(tracert_info.host_addr); sprintf(info1, "traceroute from %s to %s (%s), %d hops max", tracert_info.host_addr, tracehost->h_name, inet_ntoa (dest.sin_addr), tracert_info.max_hops); } else { sprintf(info1, "traceroute to %s (%s), %d hops max", tracehost->h_name, inet_ntoa (dest.sin_addr), tracert_info.max_hops); } trace_init (&trace, dest, opt_type, tracert_info.hop, tracert_info.host_addr); while (!stop) { item_buf[i].rowid = tracert_info.hop; if (tracert_info.hop > tracert_info.max_hops) break; ret = do_try (&trace, tracert_info.hop, tracert_info.max_hops, tracert_info.max_tries, tracert_info.wait_time, &(item_buf[i])); if(ret == 1) { sprintf(info2, "sendto: Network is unreachable!"); return 1; } if(ret < 0) return -1; trace_inc_ttl (&trace); trace_inc_port (&trace); tracert_info.hop++; i++; (*count)++; } return 0; }