Browse Source

Plan 9 from Bell Labs 2003-08-12

David du Colombier 21 years ago
parent
commit
0e88d7f1c7

+ 6 - 6
dist/replica/plan9.db

@@ -309,7 +309,7 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1060173545 144252
 386/bin/ndb/csquery - 775 sys sys 1056364307 60158
-386/bin/ndb/dns - 775 sys sys 1056364308 216571
+386/bin/ndb/dns - 775 sys sys 1060651817 218244
 386/bin/ndb/dnsdebug - 775 sys sys 1056364309 188863
 386/bin/ndb/dnsquery - 775 sys sys 1056364309 62464
 386/bin/ndb/dnstcp - 775 sys sys 1056364310 187648
@@ -9429,18 +9429,18 @@ sys/src/cmd/ms2html.c - 664 sys sys 1045505445 40080
 sys/src/cmd/mtime.c - 664 sys sys 1036172302 450
 sys/src/cmd/mv.c - 664 sys sys 1014926695 4276
 sys/src/cmd/ndb - 20000000775 sys sys 988249988 0
-sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1021579991 6525
-sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1050714836 6740
+sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1060612175 6862
+sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1060612175 7248
 sys/src/cmd/ndb/cs.c - 664 sys sys 1060173544 32903
 sys/src/cmd/ndb/csgetval.c - 664 sys sys 957402051 1051
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1014926159 1062
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1055701929 17465
-sys/src/cmd/ndb/dn.c - 664 sys sys 1055701925 25919
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1060612175 17896
+sys/src/cmd/ndb/dn.c - 664 sys sys 1060651816 26571
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1055701929 2126
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1055701929 3062
 sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1055701926 15331
 sys/src/cmd/ndb/dns.c - 664 sys sys 1055701923 15221
-sys/src/cmd/ndb/dns.h - 664 sys sys 1055701923 8875
+sys/src/cmd/ndb/dns.h - 664 sys sys 1060612174 8957
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1055701923 8359
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1021579994 3687
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1014926160 2108

+ 8 - 0
dist/replica/plan9.log

@@ -13044,3 +13044,11 @@
 1060270370 0 c sys/src/9/pc/vganvidia.c - 664 sys sys 1060269772 6545
 1060354970 0 c lib/namespace - 664 sys sys 1060354451 590
 1060360372 0 c sys/games/lib/fortunes - 664 sys sys 1060359152 244377
+1060612338 0 c 386/bin/ndb/dns - 775 sys sys 1060612191 218227
+1060612338 1 c sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1060612175 6862
+1060612338 2 c sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1060612175 7248
+1060612338 3 c sys/src/cmd/ndb/dblookup.c - 664 sys sys 1060612175 17896
+1060612338 4 c sys/src/cmd/ndb/dn.c - 664 sys sys 1060612174 26553
+1060612338 5 c sys/src/cmd/ndb/dns.h - 664 sys sys 1060612174 8957
+1060651964 0 c 386/bin/ndb/dns - 775 sys sys 1060651817 218244
+1060651964 1 c sys/src/cmd/ndb/dn.c - 664 sys sys 1060651816 26571

+ 24 - 6
sys/src/cmd/ndb/convDNS2M.c

@@ -24,7 +24,8 @@ struct Dict
 };
 
 #define NAME(x)		p = pname(p, ep, x, dp)
-#define STRING(x)	p = pstring(p, ep, x)
+#define SYMBOL(x)	p = psym(p, ep, x)
+#define STRING(x)	p = pstr(p, ep, x)
 #define BYTES(x, n)	p = pbytes(p, ep, x, n)
 #define USHORT(x)	p = pushort(p, ep, x)
 #define UCHAR(x)	p = puchar(p, ep, x)
@@ -33,7 +34,22 @@ struct Dict
 #define V6ADDR(x)	p = pv6addr(p, ep, x)
 
 static uchar*
-pstring(uchar *p, uchar *ep, char *np)
+psym(uchar *p, uchar *ep, char *np)
+{
+	int n;
+
+	n = strlen(np);
+	if(n >= Strlen)			/* DNS maximum length string */
+		n = Strlen - 1;
+	if(ep - p < n+1)		/* see if it fits in the buffer */
+		return ep+1;
+	*p++ = n;
+	memcpy(p, np, n);
+	return p + n;
+}
+
+static uchar*
+pstr(uchar *p, uchar *ep, char *np)
 {
 	int n;
 
@@ -184,6 +200,7 @@ convRR2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
 {
 	uchar *lp, *data;
 	int len, ttl;
+	Txt *t;
 
 	NAME(rp->owner->name);
 	USHORT(rp->type);
@@ -207,8 +224,8 @@ convRR2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
 
 	switch(rp->type){
 	case Thinfo:
-		STRING(rp->cpu->name);
-		STRING(rp->os->name);
+		SYMBOL(rp->cpu->name);
+		SYMBOL(rp->os->name);
 		break;
 	case Tcname:
 	case Tmb:
@@ -248,14 +265,15 @@ convRR2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
 		ULONG(rp->soa->minttl);
 		break;
 	case Ttxt:
-		STRING(rp->txt->name);
+		for(t = rp->txt; t != nil; t = t->next)
+			STRING(t->p);
 		break;
 	case Tnull:
 		BYTES(rp->null->data, rp->null->dlen);
 		break;
 	case Trp:
 		NAME(rp->rmb->name);
-		NAME(rp->txt->name);
+		NAME(rp->rp->name);
 		break;
 	case Tkey:
 		USHORT(rp->key->flags);

+ 45 - 7
sys/src/cmd/ndb/convM2DNS.c

@@ -13,6 +13,7 @@ struct Scan
 };
 
 #define NAME(x)		gname(x, sp)
+#define SYMBOL(x)	(x = gsym(sp))
 #define STRING(x)	(x = gstr(sp))
 #define USHORT(x)	(x = gshort(sp))
 #define ULONG(x)	(x = glong(sp))
@@ -112,7 +113,7 @@ gv6addr(Scan *sp)
  *  get a string.  make it an internal symbol.
  */
 static DN*
-gstr(Scan *sp)
+gsym(Scan *sp)
 {
 	int n;
 	char sym[Strlen+1];
@@ -136,6 +137,38 @@ gstr(Scan *sp)
 	return dnlookup(sym, Csym, 1);
 }
 
+/*
+ *  get a string.  don't make it an internal symbol.
+ */
+static Txt*
+gstr(Scan *sp)
+{
+	int n;
+	char sym[Strlen+1];
+	Txt *t;
+
+	if(sp->err)
+		return 0;
+	n = *(sp->p++);
+	if(sp->p+n > sp->ep){
+		sp->err = toolong;
+		return 0;
+	}
+
+	if(n > Strlen){
+		sp->err = "illegal string";
+		return 0;
+	}
+	strncpy(sym, (char*)sp->p, n);
+	sym[n] = 0;
+	sp->p += n;
+
+	t = emalloc(sizeof(*t));
+	t->next = nil;
+	t->p = estrdup(sym);
+	return t;
+}
+
 /*
  *  get a sequence of bytes
  */
@@ -231,6 +264,7 @@ convM2RR(Scan *sp)
 	uchar *data;
 	int len;
 	char dname[Domlen+1];
+	Txt *t, **l;
 
 retry:
 	NAME(dname);
@@ -260,8 +294,8 @@ retry:
 		rrfree(rp);
 		goto retry;
 	case Thinfo:
-		STRING(rp->cpu);
-		STRING(rp->os);
+		SYMBOL(rp->cpu);
+		SYMBOL(rp->os);
 		break;
 	case Tcname:
 	case Tmb:
@@ -301,16 +335,20 @@ retry:
 		ULONG(rp->soa->minttl);
 		break;
 	case Ttxt:
-		STRING(rp->txt);
-		if(sp->p - data != len)
-			sp->p = data + len;
+		l = &rp->txt;
+		*l = nil;
+		while(sp->p-data < len){
+			STRING(t);
+			*l = t;
+			l = &t->next;
+		}
 		break;
 	case Tnull:
 		BYTES(rp->null->data, rp->null->dlen);
 		break;
 	case Trp:
 		rp->rmb = dnlookup(NAME(dname), Cin, 1);
-		rp->txt = dnlookup(NAME(dname), Cin, 1);
+		rp->rp = dnlookup(NAME(dname), Cin, 1);
 		break;
 	case Tkey:
 		USHORT(rp->key->flags);

+ 27 - 1
sys/src/cmd/ndb/dblookup.c

@@ -308,14 +308,40 @@ nullrr(Ndbtuple *entry, Ndbtuple *pair)
 	rp->null->dlen = strlen((char*)rp->null->data);
 	return rp;
 }
+/*
+ *  txt rr strings are at most 255 bytes long.  one
+ *  can represent longer strings by multiple concatenated
+ *  <= 255 byte ones.
+ */
 static RR*
 txtrr(Ndbtuple *entry, Ndbtuple *pair)
 {
 	RR *rp;
+	Txt *t, **l;
+	int i, len, sofar;
 
 	USED(entry);
 	rp = rralloc(Ttxt);
-	rp->txt = dnlookup(pair->val, Cin, 1);
+	l = &rp->txt;
+	rp->txt = nil;
+	len = strlen(pair->val);
+	sofar = 0;
+	while(len > sofar){
+		t = emalloc(sizeof(*t));
+		t->next = nil;
+
+		i = len-sofar;
+		if(i > 255)
+			i = 255;
+
+		t->p = emalloc(i+1);
+		memmove(t->p, pair->val+sofar, i);
+		t->p[i] = 0;
+		sofar += i;
+
+		*l = t;
+		l = &t->next;
+	}
 	return rp;
 }
 static RR*

+ 42 - 6
sys/src/cmd/ndb/dn.c

@@ -278,7 +278,6 @@ dnageall(int doit)
 					REF(rp->os);
 					break;
 				case Ttxt:
-					REF(rp->txt);
 					break;
 				case Tcname:
 				case Tmb:
@@ -297,7 +296,7 @@ dnageall(int doit)
 					break;
 				case Trp:
 					REF(rp->rmb);
-					REF(rp->txt);
+					REF(rp->rp);
 					break;
 				case Tmx:
 					REF(rp->host);
@@ -609,6 +608,7 @@ rrfree(RR *rp)
 {
 	DN *dp;
 	RR *nrp;
+	Txt *t;
 
 	assert(!rp->cached);
 
@@ -640,6 +640,14 @@ rrfree(RR *rp)
 		free(rp->null->data);
 		free(rp->null);
 		break;
+	case Ttxt:
+		while(rp->txt != nil){
+			t = rp->txt;
+			rp->txt = t->next;
+			free(t->p);
+			free(t);
+		}
+		break;
 	}
 
 	free(rp);
@@ -668,9 +676,22 @@ rrcopy(RR *rp, RR **last)
 	Cert *cert;
 	Sig *sig;
 	Null *null;
+	Txt *t, *nt, **l;
 
 	nrp = rralloc(rp->type);
 	switch(rp->type){
+	case Ttxt:
+		*nrp = *rp;
+		l = &nrp->txt;
+		*l = nil;
+		for(t = rp->txt; t != nil; t = t->next){
+			nt = emalloc(sizeof(*nt));
+			nt->p = estrdup(t->p);
+			nt->next = nil;
+			*l = nt;
+			l = &nt->next;
+		}
+		break;
 	case Tsoa:
 		soa = nrp->soa;
 		*nrp = *rp;
@@ -941,6 +962,7 @@ rrfmt(Fmt *f)
 	int rv;
 	char buf[Domlen];
 	Server *s;
+	Txt *t;
 
 	fmtstrinit(&fstr);
 
@@ -997,10 +1019,12 @@ rrfmt(Fmt *f)
 		fmtprint(&fstr, "\t%.*H", rp->null->dlen, rp->null->data);
 		break;
 	case Ttxt:
-		fmtprint(&fstr, "\t%s", rp->txt->name);
+		fmtprint(&fstr, "\t");
+		for(t = rp->txt; t != nil; t = t->next)
+			fmtprint(&fstr, "%s", t->p);
 		break;
 	case Trp:
-		fmtprint(&fstr, "\t%s %s", rp->rmb->name, rp->txt->name);
+		fmtprint(&fstr, "\t%s %s", rp->rmb->name, rp->rp->name);
 		break;
 	case Tkey:
 		fmtprint(&fstr, "\t%d %d %d", rp->key->flags, rp->key->proto,
@@ -1036,6 +1060,8 @@ rravfmt(Fmt *f)
 	Fmt fstr;
 	int rv;
 	Server *s;
+	Txt *t;
+	int quote;
 
 	fmtstrinit(&fstr);
 
@@ -1094,10 +1120,20 @@ rravfmt(Fmt *f)
 		fmtprint(&fstr, " null=%.*H", rp->null->dlen, rp->null->data);
 		break;
 	case Ttxt:
-		fmtprint(&fstr, " txt=%s", rp->txt->name);
+		fmtprint(&fstr, " txt=");
+		quote = 0;
+		for(t = rp->txt; t != nil; t = t->next)
+			if(strchr(t->p, ' '))
+				quote = 1;
+		if(quote)
+			fmtprint(&fstr, "\"");
+		for(t = rp->txt; t != nil; t = t->next)
+			fmtprint(&fstr, "%s", t->p);
+		if(quote)
+			fmtprint(&fstr, "\"");
 		break;
 	case Trp:
-		fmtprint(&fstr, " rp=%s txt=%s", rp->rmb->name, rp->txt->name);
+		fmtprint(&fstr, " rp=%s txt=%s", rp->rmb->name, rp->rp->name);
 		break;
 	case Tkey:
 		fmtprint(&fstr, " flags=%d proto=%d alg=%d",

+ 12 - 1
sys/src/cmd/ndb/dns.h

@@ -106,6 +106,7 @@ typedef struct Cert	Cert;
 typedef struct Sig	Sig;
 typedef struct Null	Null;
 typedef struct Server	Server;
+typedef struct Txt	Txt;
 
 /*
  *  a structure to track a request and any slave process handling it
@@ -173,6 +174,15 @@ struct Null
 	uchar	*data;
 };
 
+/*
+ *  text strings
+ */
+struct Txt
+{
+	Txt	*next;
+	char	*p;
+};
+
 /*
  *  an unpacked resource record
  */
@@ -197,7 +207,7 @@ struct RR
 		DN	*cpu;	/* cpu type - hinfo */
 		DN	*mb;	/* mailbox - mg, minfo */
 		DN	*ip;	/* ip addrss - a */
-		DN	*txt;	/* first text string - txt, rp */
+		DN	*rp;	/* rp arg - rp */
 		int	cruftlen;
 		ulong	arg0;
 	};
@@ -216,6 +226,7 @@ struct RR
 		Cert	*cert;
 		Sig	*sig;
 		Null	*null;
+		Txt	*txt;
 	};
 };