We can send data

This commit is contained in:
Erik Ekman 2006-06-05 18:36:34 +00:00
parent ecb97656ab
commit f9381aa723
2 changed files with 51 additions and 4 deletions

52
dns.c
View file

@ -140,11 +140,13 @@ close_dns(int fd)
void void
dns_ping(int dns_fd) dns_ping(int dns_fd)
{ {
dns_query(dns_fd, "4.kryo.se", 1); dns_write(dns_fd, dns_fd,
"AAAAAAAAAAAKRYOAAAAAAAAAAAKRYOAAAAAAAAAAAAAKRYOAAAAAAAAAAAAAKRYOAAAAAAAAAAAAAAAKRYOAAAAAAAAAAAAAKRYOAAAAAAAAAAAAAAAAAAB",
119);
} }
void void
dns_query(int fd, char *host, int type) dns_query(int fd, int id, char *host, int type)
{ {
char *p; char *p;
int len; int len;
@ -157,7 +159,7 @@ dns_query(int fd, char *host, int type)
header = (HEADER*)buf; header = (HEADER*)buf;
header->id = 0; header->id = id;
header->qr = 0; header->qr = 0;
header->opcode = 0; header->opcode = 0;
header->aa = 0; header->aa = 0;
@ -179,6 +181,50 @@ dns_query(int fd, char *host, int type)
sendto(fd, buf, len+1, 0, (struct sockaddr*)&peer, peerlen); sendto(fd, buf, len+1, 0, (struct sockaddr*)&peer, peerlen);
} }
int
dns_write(int fd, int id, char *buf, int len)
{
int avail;
int i;
int parts;
int p;
char data[256];
char *d;
#define CHUNK 31
// 31 bytes expands to 62 chars in domain
// We just use hex as encoding right now
avail = 0xFF - strlen(topdomain) - 2;
avail /= 2; // use two chars per byte in encoding
avail -= (avail/CHUNK); // make space for parts
avail = MIN(avail, len); // do not use more bytes than is available;
d = data;
parts = avail / CHUNK;
for (p = 0; p < parts; p++) {
for (i = 0; i < CHUNK; i++) {
sprintf(d, "%02X", buf[p*CHUNK + i]);
d += 2;
}
*d++ = '.';
strcpy(d, topdomain);
}
parts = avail % CHUNK;
for (i = 0; i < parts; i++) {
sprintf(d, "%02X", buf[p*CHUNK + i]);
d += 2;
}
*d++ = '.';
strcpy(d, topdomain);
printf("Resolving %s\n", data);
dns_query(fd, id, data, T_A);
return avail;
}
int int
dns_read(int fd, char *buf, int buflen) dns_read(int fd, char *buf, int buflen)
{ {

3
dns.h
View file

@ -23,7 +23,8 @@ int open_dns(const char *, const char *);
void close_dns(int); void close_dns(int);
void dns_ping(int); void dns_ping(int);
void dns_query(int, char *, int); void dns_query(int, int, char *, int);
int dns_write(int, int, char *, int);
int dns_read(int, char *, int); int dns_read(int, char *, int);