home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.wwiv.com
/
ftp.wwiv.com.zip
/
ftp.wwiv.com
/
pub
/
PPPBCKP
/
SRC
/
SRC20A01.ZIP
/
NSLOOKUP.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1999-06-20
|
8KB
|
447 lines
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <mem.h>
#include <alloc.h>
extern "C" {
#include "tcp.h"
}
extern char *def_domain;
extern char *loc_domain;
extern longword def_nameservers[MAX_NAMESERVERS];
extern int _last_nameserver;
extern word _domaintimeout = 0;
static longword timeoutwhen;
static udp_Socket *dom_sock;
#define DOMSIZE 512
struct dhead {
word ident,
flags, qdcount,
ancount,
nscount,
arcount;
};
#define DQR 0x8000
#define DOPCODE 0x7100
#define DAA 0x0400
#define DTC 0x0200
#define DRD 0x0100
#define DRA 0x0080
#define DRCODE 0x000F
#define DOPQUERY 0
#define DOPIQ 1
#define DOPCQM 2
#define DOPCQU 3
#define DROK 0
#define DRFORM 1
#define DRFAIL 2
#define DRNAME 3
#define DRNOPE 4
#define DRNOWAY 5
#define DTYPEA 1
#define DTYPEPTR 12
#define DIN 1
#define DWILD 255
struct rrpart {
word rtype,
rclass;
longword ttl;
word rdlength;
byte rdata[DOMSIZE];
};
static struct useek {
struct dhead h;
byte x[DOMSIZE];
} *question;
static packdom(char *dst, char *src)
{
char *p, *q, *savedst;
int i, dotflag, defflag;
p = src;
dotflag = defflag = 0;
savedst = dst;
do {
*dst = 0;
q = dst + 1;
while (*p && (*p != '.'))
*q++ = *p++;
i = p - src;
if (i > 0x3f)
return (-1);
*dst = i;
*q = 0;
if (*p) {
dotflag = 1;
src = ++p;
dst = q;
} else if (!dotflag && !defflag && loc_domain) {
p = loc_domain;
defflag = 1;
src = p;
dst = q;
}
} while (*p);
q++;
return (q - savedst);
}
static unpackdom(char *dst, char *src, char *buf)
{
int i, j, retval;
char *savesrc;
savesrc = src;
retval = 0;
while (*src) {
j = *src;
while ((j & 0xC0) == 0xC0) {
if (!retval)
retval = src - savesrc + 2;
src++;
src = &buf[(j & 0x3f) * 256 + *src];
j = *src;
}
src++;
for (i = 0; i < (j & 0x3f); i++)
*dst++ = *src++;
*dst++ = '.';
}
*(--dst) = 0;
src++;
if (!retval)
retval = src - savesrc;
return (retval);
}
static sendom(char *s, longword towho, word num)
{
word i, ulen;
byte *psave, *p;
psave = (byte *) & (question->x);
i = packdom((unsigned char *)&(question->x), s);
p = &(question->x[i]);
*p++ = 0;
*p++ = DTYPEA;
*p++ = 0;
*p++ = DIN;
question->h.ident = intel16(num);
ulen = sizeof(struct dhead) + (p - psave);
udp_open(dom_sock, 997, towho, 53, NULL);
sock_write(dom_sock, (unsigned char *)question, ulen);
return (ulen);
}
static sendrdom(char *s, longword towho, word num)
{
word i, ulen;
byte *psave, *p;
psave = (byte *) & (question->x);
i = packdom((char *)&(question->x), s);
p = &(question->x[i]);
*p++ = 0;
*p++ = DTYPEA;
*p++ = 0;
*p++ = DIN;
question->h.ident = intel16(num);
ulen = sizeof(struct dhead) + (p - psave);
udp_open(dom_sock, 997, towho, 53, NULL);
sock_write(dom_sock, (unsigned char *)question, ulen);
return (ulen);
}
static int countpaths(char *pathstring)
{
int count = 0;
char *p;
for (p = pathstring; (*p != 0) || (*(p + 1) != 0); p++) {
if (*p == 0)
count++;
}
return (++count);
}
static char *getpath(char *pathstring, int whichone)
{
char *retval;
if (whichone > countpaths(pathstring))
return (NULL);
whichone--;
for (retval = pathstring; whichone; retval++) {
if (*retval == 0)
whichone--;
}
return (retval);
}
static longword ddextract(struct useek *qp, unsigned char *mip)
{
word i, j, nans, rcode;
struct rrpart *rrp;
byte *p, space[260];
nans = intel16(qp->h.ancount);
rcode = DRCODE & intel16(qp->h.flags);
if (rcode > 0)
return (rcode);
if (nans > 0 &&
(intel16(qp->h.flags) & DQR)) {
p = (byte *) & qp->x;
i = unpackdom(space, p, (unsigned char *)qp);
p += i + 4;
printf(" NAME : ? %s\n", space);
while (nans-- > 0) {
i = unpackdom(space, p, (unsigned char *)qp);
p += i;
rrp = (struct rrpart *) p;
if (!*p && *(p + 1) == DTYPEA && !*(p + 2) && *(p + 3) == DIN) {
movmem(rrp->rdata, mip, 4);
return (0);
}
movmem(&rrp->rdlength, &j, 2);
p += 10 + intel16(j);
}
}
return -1;
}
static longword udpdom(void)
{
int i, uret;
longword desired;
uret = sock_fastread(dom_sock, (unsigned char *)question, sizeof(struct useek));
if (uret < 0)
return -1;
i = ddextract((useek *)question, (unsigned char *)&desired);
switch (i) {
case 3:
return 0;
case 0:
return (intel(desired));
case -1:
return 0;
default:
return 0;
}
}
static longword Sdomain(char *mname, int adddom, longword nameserver, int *timedout)
{
char namebuff[512];
int isaname;
int status, i;
longword response;
isaname = !isaddr(mname);
response = 0;
*timedout = 1;
if (!nameserver) {
printf("No nameserver defined!\n\r");
return (0);
}
while (*mname && *mname < 33)
mname++;
if (!(*mname))
return (0L);
question->h.flags = intel16(DRD);
question->h.qdcount = 0;
question->h.ancount = 0;
question->h.nscount = 0;
question->h.arcount = 0;
// qinit();
strcpy(namebuff, mname);
if (isaname) {
question->h.qdcount = intel16(1);
if (adddom) {
if (namebuff[strlen(namebuff) - 1] != '.') {
if (loc_domain) {
countpaths(loc_domain);
strcat(namebuff, ".");
strcat(namebuff, getpath(loc_domain, 1));
}
} else
namebuff[strlen(namebuff) - 1] = 0;
}
} else
question->h.ancount = intel16(1);
for (i = 2; i < 17; i *= 2) {
if (isaname)
sendom(namebuff, nameserver, 0xf001);
else
sendrdom(namebuff, nameserver, 0xf001);
ip_timer_init(dom_sock, i);
do {
kbhit();
tcp_tick(dom_sock);
if (ip_timer_expired(dom_sock))
break;
if (watcbroke) {
break;
}
if (chk_timeout(timeoutwhen))
break;
if (sock_dataready(dom_sock))
*timedout = 0;
} while (*timedout);
if (!*timedout)
break;
}
if (!*timedout)
response = udpdom();
sock_close(dom_sock);
return (response);
}
static char *nextdomain(char *domain, int count)
{
char *p;
int i;
p = domain;
for (i = 0; i < count; ++i) {
p = strchr(p, '.');
if (!p)
return (NULL);
++p;
}
return (p);
}
longword newresolve(char *name)
{
longword ip_address, temp;
int count, i;
byte timeout[MAX_NAMESERVERS];
struct useek qp;
udp_Socket ds;
word oldhndlcbrk;
question = &qp;
dom_sock = &ds;
if (!name)
return (0);
rip(name);
if (!_domaintimeout)
_domaintimeout = sock_delay << 2;
timeoutwhen = set_timeout(_domaintimeout);
count = 0;
memset(&timeout, 0, sizeof(timeout));
oldhndlcbrk = wathndlcbrk;
wathndlcbrk = 1;
watcbroke = 0;
do {
if ((loc_domain = nextdomain(def_domain, count)) == NULL)
count = -1;
for (i = 0; i < _last_nameserver; ++i) {
if (!timeout[i])
if ((ip_address = Sdomain(name, count != -1, def_nameservers[i], (int *)&timeout[i])) != 0)
break;
}
if (count == -1)
break;
count++;
} while (!ip_address);
watcbroke = 0;
wathndlcbrk = oldhndlcbrk;
return (ip_address);
}
main(int argc, char *argv[])
{
char *name;
longword host;
int status, i;
char buffer[20];
if (argc < 2) {
puts("NSLOOKUP <hostname>\n\n");
exit(3);
}
sock_init();
for (i = 1; i < argc; ++i) {
if ((*argv[i] == '/') || (*argv[i] == '-')) {
} else {
name = strdup(argv[i]);
printf("resolving \"%s\"...", name);
host = newresolve(name);
printf("\r");
clreol();
}
}
if (host) {
printf("\r");
clreol();
printf("%s : %s\n", name, inet_ntoa(buffer, host));
}
exit(host ? 0 : 1);
return 0;
}