Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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;
}