Exemplo n.º 1
0
static logline *readline(FILE *inf, adns_state adns, int opts) {
  static char buf[MAXLINE];
  char *str;
  logline *line;

  if (fgets(buf, MAXLINE, inf)) {
    str= malloc(sizeof(*line) + strlen(buf) + 1);
    if (!str) aargh("malloc");
    line= (logline*)str;
    line->next= NULL;
    line->start= str+sizeof(logline);
    line->is_v6 = 0;
    *line->fullip = 0;
    strcpy(line->start, buf);
    str= ipaddr2domain(line->start, &line->addr, &line->rest, line->fullip,
                       &line->is_v6, opts);
    if (opts & OPT_DEBUG)
      msg("submitting %.*s -> %s", (int)(line->rest-line->addr), guard_null(line->addr), str);
    /* Note: ADNS does not yet support "ptr" for IPv6.  */
    if (adns_submit(adns, str,
                    line->is_v6? adns_r_ptr_raw : adns_r_ptr,
		    adns_qf_quoteok_cname|adns_qf_cname_loose,
		    NULL, &line->query))
      aargh("adns_submit");
    return line;
  }
  if (!feof(inf))
    aargh("fgets");
  return NULL;
}
Exemplo n.º 2
0
int main(int argc, char *argv[])
{
    adns_state adns;
    adns_query query;
    adns_answer *answer;

    progname= strrchr(*argv, '/');
    if (progname)
        progname++;
    else
        progname= *argv;

    if (argc != 2)
    {
        fprintf(stderr, "usage: %s <domain>\n", progname);
        exit(1);
    }

    errno= adns_init(&adns, adns_if_debug, 0);
    if (errno) aargh("adns_init");

    errno= adns_submit(adns, argv[1], adns_r_ptr,
                       adns_qf_quoteok_cname|adns_qf_cname_loose,
                       NULL, &query);
    if (errno) aargh("adns_submit");

    errno= adns_wait(adns, &query, &answer, NULL);
    if (errno) aargh("adns_init");

    printf("%s\n", answer->status == adns_s_ok ? *answer->rrs.str : "dunno");

    adns_finish(adns);

    return 0;
}
Exemplo n.º 3
0
static logline *readline(FILE *inf, adns_state adns, int opts)
{
    static char buf[MAXLINE];
    char *str;
    logline *line;

    if (fgets(buf, MAXLINE, inf))
    {
        str= malloc(sizeof(*line) + strlen(buf) + 1);
        if (!str) aargh("malloc");
        line= (logline*)str;
        line->next= NULL;
        line->start= str+sizeof(logline);
        strcpy(line->start, buf);
        str= ipaddr2domain(line->start, &line->addr, &line->rest);
        if (opts & OPT_DEBUG)
            msg("submitting %.*s -> %s", line->rest-line->addr, guard_null(line->addr), str);
        if (adns_submit(adns, str, adns_r_ptr,
                        adns_qf_quoteok_cname|adns_qf_cname_loose,
                        NULL, &line->query))
            aargh("adns_submit");
        return line;
    }
    if (!feof(inf))
        aargh("fgets");
    return NULL;
}
Exemplo n.º 4
0
static logline *readline(FILE *inf, adns_state adns, int opts) {
  static char buf[MAXLINE];
  char *str, *p, *q, *r;
  logline *line;

  if (fgets(buf, MAXLINE, inf)) {
    str= malloc(sizeof(*line) + strlen(buf) + 1);
    if (!str) aargh("malloc");
    line= (logline*)str;
    line->next= NULL;
    line->start= str+sizeof(logline);
    strcpy(line->start, buf);
    line->name= line->rest= line->addr= NULL;
    /* look for unverifiable HELO information matching the regex
       H=[a-z0-9.- ]*[(][a-z0-9.-]*[)] [[][0-9.]*[]] */
    for (p= strchr(line->start, ' '); p; p= strchr(p+1, ' ')) {
      if (!strncmp(p, " H=", 3)) {
	r= strchr(p, '[');
	if (!r) break;
	q= strchr(p, ')');
	if (!q || q>r) break;
	p= strchr(p, '(');
	if (!p || p>q) break;
	line->name= p+1;
	line->rest= q;
	line->addr= r+1;
	break;
      }
    }
    if (line->name) {
      *line->rest= '\0';
      if (opts & OPT_DEBUG)
	msg("submitting %s", line->name);
      if (adns_submit(adns, line->name, adns_r_a,
		      adns_qf_quoteok_query|adns_qf_quoteok_cname|adns_qf_cname_loose,
		      NULL, &line->query))
	aargh("adns_submit");
      *line->rest= ')';
    } else {
      if (opts & OPT_DEBUG)
	msg("no query");
      line->query= NULL;
    }
    return line;
  }
  if (!feof(inf))
    aargh("fgets");
  return NULL;
}
Exemplo n.º 5
0
static void printline(FILE *outf, char *start, char *addr, char *rest, char *domain) {
  if (domain)
    fprintf(outf, "%.*s%s%s", (int)(addr - start), start, domain, rest);
  else
    fputs(start, outf);
  if (ferror(outf)) aargh("write output");
}
Exemplo n.º 6
0
static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) {
  int eof, err, len;
  adns_state adns;
  adns_answer *answer;
  logline *head, *tail, *line;
  adns_initflags initflags;

  initflags= (opts & OPT_DEBUG) ? adns_if_debug : 0;
  if (config_text) {
    errno= adns_init_strcfg(&adns, initflags, stderr, config_text);
  } else {
    errno= adns_init(&adns, initflags, 0);
  }
  if (errno) aargh("adns_init");
  head= tail= readline(inf, adns, opts);
  len= 1; eof= 0;
  while (head) {
    while (head) {
      if (opts & OPT_DEBUG)
	msg("%d in queue; checking %.*s", len,
	    (int)(head->rest-head->addr), guard_null(head->addr));
      if (eof || len >= maxpending) {
	if (opts & OPT_POLL)
	  err= adns_wait_poll(adns, &head->query, &answer, NULL);
	else
	  err= adns_wait(adns, &head->query, &answer, NULL);
      } else {
	err= adns_check(adns, &head->query, &answer, NULL);
      }
      if (err == EAGAIN) break;
      if (err) {
	fprintf(stderr, "%s: adns_wait/check: %s", progname, strerror(err));
	exit(1);
      }
      printline(outf, head->start, head->addr, head->rest,
		answer->status == adns_s_ok ? *answer->rrs.str : NULL,
                head->fullip, head->is_v6, opts);
      line= head; head= head->next;
      free(line);
      free(answer);
      len--;
    }
    if (!eof) {
      line= readline(inf, adns, opts);
      if (line) {
        if (!head) head= line;
        else tail->next= line;
        tail= line; len++;
      } else {
	eof= 1;
      }
    }
  }
  adns_finish(adns);
}
Exemplo n.º 7
0
static void
printline(FILE *outf, char *start, char *addr, char *rest, const char *domain,
          const char *fullip, int is_v6, int opts)
{
  int append_null = 0;

  if ((opts & OPT_PRIVACY) && !domain && *fullip)
    {
      domain = fullip;
      append_null = 1;
    }

  if (domain)
    {
      const char *p;

      p = append_null? ".null" : strrchr (domain, '.');
      if ((opts & OPT_PRIVACY) && p && p[1])
        {
          unsigned char hash[20];
          int i;

          rmd160_hash_buffer (hash, domain, strlen (domain));
          fprintf (outf, "%.*sp", (int)(addr - start), start);
          for (i=0; i < 4; i++)
            fprintf (outf, "%02x", hash[i]);
          fprintf(outf, "%c%s%s", is_v6? '6':'4', p, rest);
        }
      else
        fprintf(outf, "%.*s%s%s", (int)(addr - start), start, domain, rest);
    }
  else
    fputs(start, outf);

  if (ferror(outf))
    aargh("write output");
}
Exemplo n.º 8
0
int main(int argc, char *argv[]) {
  int c, opts, maxpending;
  extern char *optarg;
  FILE *inf;

  if (argv[1] && !strncmp(argv[1],"--",2)) {
    if (!strcmp(argv[1],"--help")) {
      printhelp(stdout);
    } else if (!strcmp(argv[1],"--version")) {
      fputs(VERSION_MESSAGE("adnslogres"),stdout);
    } else {
      usage();
    }
    if (ferror(stdout) || fclose(stdout)) { perror("stdout"); exit(1); }
    exit(0);
  }

  maxpending= DEFMAXPENDING;
  opts= 0;
  while ((c= getopt(argc, argv, "c:C:dxfpPS:")) != -1)
    switch (c) {
    case 'c':
      maxpending= atoi(optarg);
      if (maxpending < 1 || maxpending > MAXMAXPENDING) {
       fprintf(stderr, "%s: unfeasible concurrency %d\n", progname, maxpending);
       exit(1);
      }
      break;
    case 'C':
      config_text= optarg;
      break;
    case 'd':
      opts|= OPT_DEBUG;
      break;
    case 'x':
      opts|= OPT_VHOST;
      break;
    case 'f':
      opts|= OPT_FTP;
      break;
    case 'P':
      opts|= OPT_PRIVACY;
      break;
    case 'S':
      salt = optarg;
      break;
    default:
      usage();
    }

  argc-= optind;
  argv+= optind;

  inf= NULL;
  if (argc == 0)
    inf= stdin;
  else if (argc == 1)
    inf= fopen(*argv, "r");
  else
    usage();

  if (!inf)
    aargh("couldn't open input");

  proclog(inf, stdout, maxpending, opts);

  if (fclose(inf))
    aargh("fclose input");
  if (fclose(stdout))
    aargh("fclose output");

  return 0;
}
Exemplo n.º 9
0
static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) {
  int eof, err, len;
  adns_state adns;
  adns_answer *answer;
  logline *head, *tail, *line;
  adns_initflags initflags;

  initflags= (opts & OPT_DEBUG) ? adns_if_debug : 0;
  if (config_text) {
    errno= adns_init_strcfg(&adns, initflags, stderr, config_text);
  } else {
    errno= adns_init(&adns, initflags, 0);
  }
  if (errno) aargh("adns_init");
  head= tail= readline(inf, adns, opts);
  len= 1; eof= 0;
  while (head) {
    while (head) {
      if (head->query) {
	if (opts & OPT_DEBUG)
	  msg("%d in queue; checking %.*s", len,
	      (int)(head->rest-head->name), guard_null(head->name));
	if (eof || len >= maxpending) {
	  if (opts & OPT_POLL)
	    err= adns_wait_poll(adns, &head->query, &answer, NULL);
	  else
	    err= adns_wait(adns, &head->query, &answer, NULL);
	} else {
	  err= adns_check(adns, &head->query, &answer, NULL);
	}
	if (err == EAGAIN) break;
	if (err) {
	  fprintf(stderr, "%s: adns_wait/check: %s", progname, strerror(err));
	  exit(1);
	}
	if (answer->status == adns_s_ok) {
	  const char *addr;
	  int ok = 0;
	  fprintf(outf, "%.*s", (int)(head->rest-head->start), head->start);
	  while(answer->nrrs--) {
	    addr= inet_ntoa(answer->rrs.inaddr[answer->nrrs]);
	    ok |= !strncmp(addr, head->addr, strlen(addr));
	    fprintf(outf, " [%s]", addr);
	  }
	  fprintf(outf, "%s%s", ok ? " OK" : "", head->rest);
	} else {
	  if (opts & OPT_DEBUG)
	    msg("query failed");
	  fputs(head->start, outf);
	}
	free(answer);
	len--;
      } else {
	if (opts & OPT_DEBUG)
	  msg("%d in queue; no query on this line", len);
	fputs(head->start, outf);
      }
      line= head; head= head->next;
      free(line);
    }
    if (!eof) {
      line= readline(inf, adns, opts);
      if (line) {
        if (!head) head= line;
        else tail->next= line;
        tail= line;
	if (line->query) len++;
      } else {
	eof= 1;
      }
    }
  }
  adns_finish(adns);
}