Browse Source

Added ndb, now boot works as usually.

Updated jsons to not using relatives.

I always forget that first amend, later changes.

Change-Id: Ie471b08765c7b8cc2ef1069e9c929174e25ba24f
Elbing 8 years ago
parent
commit
03e69f5664

+ 2 - 8
sys/include/ndb.h

@@ -7,9 +7,6 @@
  * in the LICENSE file.
  */
 
-#pragma	src	"/sys/src/libndb"
-#pragma	lib	"libndb.a"
-
 /*
  *  this include file requires includes of <u.h> and <bio.h>
  */
@@ -19,9 +16,6 @@ typedef struct Ndbhf	Ndbhf;
 typedef struct Ndbs	Ndbs;
 typedef struct Ndbcache	Ndbcache;
 
-#pragma incomplete Ndbhf
-#pragma incomplete Ndbcache
-
 enum
 {
 	Ndbalen=	32,	/* max attribute length */
@@ -122,13 +116,13 @@ struct Ndbs
 /*
  *  macros for packing and unpacking pointers
  */
-#define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; }
+#define NDBPUTP(v,a) { (a)[0] = (uint8_t)v; (a)[1] = (uint8_t)(v)>>8; (a)[2] = (uint8_t)(v)>>16; }
 #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))
 
 /*
  *  macros for packing and unpacking unsigned longs
  */
-#define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; }
+#define NDBPUTUL(v,a) { (a)[0] = (uint8_t)v; (a)[1] = (uint8_t)(v)>>8; (a)[2] = (uint8_t)(v)>>16; (a)[3] = (uint8_t)(v)>>24; }
 #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))
 
 #define NDB_IPlen 16

+ 2 - 1
sys/src/cmd/cmds.json

@@ -22,7 +22,8 @@
 		"fossil/fossil.json",
 		"ip/ip.json",
 		"hoc/hoc.json",
-		"grep/grep.json"
+		"grep/grep.json",
+		"ndb/ndb.json"
 	],
 	"SourceFilesCmd": [
 		"aan.c",

+ 1 - 1
sys/src/cmd/ndb/convM2DNS.c

@@ -35,7 +35,7 @@ errneg(RR *rp, Scan *sp, int actual)
 	return 0;
 }
 
-static int
+static int64_t
 errtoolong(RR *rp, Scan *sp, int remain, int need, char *where)
 {
 	char *p, *ep;

+ 2 - 16
sys/src/cmd/ndb/cs.c

@@ -963,19 +963,6 @@ isvalidip(uint8_t *ip)
 	return ipcmp(ip, IPnoaddr) != 0 && ipcmp(ip, v4prefix) != 0;
 }
 
-static uint8_t loopbacknet[IPaddrlen] = {
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0xff, 0xff,
-	127, 0, 0, 0
-};
-static uint8_t loopbackmask[IPaddrlen] = {
-	0xff, 0xff, 0xff, 0xff,
-	0xff, 0xff, 0xff, 0xff,
-	0xff, 0xff, 0xff, 0xff,
-	0xff, 0, 0, 0
-};
-
 void
 readipinterfaces(void)
 {
@@ -1081,7 +1068,6 @@ netinit(int background)
 {
 	char clone[Maxpath];
 	Network *np;
-	static int working;
 
 	if(background){
 		switch(rfork(RFPROC|RFNOTEG|RFMEM|RFNOWAIT)){
@@ -1510,7 +1496,7 @@ telcolookup(Network *np, char *host, char *serv, int nolookup)
 	Ndbtuple *t;
 	Ndbs s;
 
-	USED(np, nolookup, serv);
+	USED(np); USED(nolookup); USED(serv);
 
 	werrstr("can't translate address");
 	free(ndbgetvalue(db, &s, "sys", host, "telco", &t));
@@ -1524,7 +1510,7 @@ telcolookup(Network *np, char *host, char *serv, int nolookup)
  *  translate a telephone address
  */
 char*
-telcotrans(Ndbtuple *t, Network *np, char *serv, char *rem, int)
+telcotrans(Ndbtuple *t, Network *np, char *serv, char *rem, int i)
 {
 	char reply[Maxreply];
 	char x[Maxservice];

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

@@ -546,21 +546,11 @@ look(Ndbtuple *entry, Ndbtuple *line, char *attr)
 	return 0;
 }
 
-static RR**
-linkrr(RR *rp, DN *dp, RR **l)
-{
-	rp->owner = dp;
-	rp->auth = 1;
-	rp->db = 1;
-	*l = rp;
-	return &rp->next;
-}
-
 /* these are answered specially by the tcp version */
 static RR*
 doaxfr(Ndb *db, char *name)
 {
-	USED(db, name);
+	USED(db); USED(name);
 	return 0;
 }
 

+ 4 - 4
sys/src/cmd/ndb/dn.c

@@ -43,11 +43,11 @@ DN *ht[HTLEN];
 
 static struct {
 	Lock;
-	ulong	names;		/* names allocated */
-	ulong	oldest;		/* longest we'll leave a name around */
+	uint32_t	names;		/* names allocated */
+	uint32_t	oldest;		/* longest we'll leave a name around */
 	int	active;
 	int	mutex;
-	ushort	id;		/* same size as in packet */
+	uint16_t	id;		/* same size as in packet */
 } dnvars;
 
 /* names of RR types */
@@ -159,7 +159,7 @@ static int rrequiv(RR *r1, RR *r2);
 static int sencodefmt(Fmt*);
 
 static void
-ding(void*, char *msg)
+ding(void *v, char *msg)
 {
 	if(strstr(msg, "alarm") != nil) {
 		stats.alarms++;

+ 1 - 1
sys/src/cmd/ndb/dnnotify.c

@@ -16,7 +16,7 @@
 
 /* get a notification from another system of a changed zone */
 void
-dnnotify(DNSmsg *reqp, DNSmsg *repp, Request *)
+dnnotify(DNSmsg *reqp, DNSmsg *repp, Request *req)
 {
 	RR *tp;
 	Area *a;

+ 8 - 6
sys/src/cmd/ndb/dns.c

@@ -38,7 +38,7 @@ extern	uint32_t	start;
 
 int vers;		/* incremented each clone/attach */
 
-static volatile int stop;
+static int stop;
 
 /* holds data to be returned via read of /net/dns, perhaps multiple reads */
 struct Mfile
@@ -116,8 +116,10 @@ void	setext(char*, int, char*);
 
 static char *lookupqueryold(Job*, Mfile*, Request*, char*, char*, int,
 			      int);
+#ifdef notused
 static char *lookupquerynew(Job*, Mfile*, Request*, char*, char*, int,
 			      int);
+#endif
 static char *respond(Job*, Mfile*, RR*, char*, int, int);
 
 void
@@ -454,11 +456,11 @@ flushjob(int tag)
 void
 io(void)
 {
-	volatile int32_t n;
-	volatile uint8_t mdata[IOHDRSZ + Maxfdata];
-	Job *volatile job;
-	Mfile *volatile mf;
-	volatile Request req;
+	int32_t n;
+	uint8_t mdata[IOHDRSZ + Maxfdata];
+	Job *job;
+	Mfile *mf;
+	Request req;
 
 	memset(&req, 0, sizeof req);
 	/*

+ 48 - 48
sys/src/cmd/ndb/dns.h

@@ -197,7 +197,7 @@ typedef struct Txt	Txt;
 struct Request
 {
 	int	isslave;	/* pid of slave */
-	uvlong	aborttime;	/* time in ms at which we give up */
+	uint64_t	aborttime;	/* time in ms at which we give up */
 	jmp_buf	mret;		/* where master jumps to after starting a slave */
 	int	id;
 	char	*from;		/* who asked us? */
@@ -225,10 +225,10 @@ struct DN
 	/* refs was `char' but we've seen refs > 120, so go whole hog */
 	uint32_t	refs;		/* for mark and sweep */
 	uint32_t	ordinal;
-	ushort	class;		/* RR class */
-	uchar	keep;		/* flag: never age this name */
-	uchar	respcode;	/* response code */
-/* was:	char	nonexistent; /* true if we get an authoritative nx for this domain */
+	uint16_t	class;		/* RR class */
+	unsigned char	keep;		/* flag: never age this name */
+	unsigned char	respcode;	/* response code */
+/* was:	char	nonexistent; *//* true if we get an authoritative nx for this domain */
 	/* permit only 1 query per (domain name, type) at a time */
 	Querylck querylck[Maxlcks];
 };
@@ -239,7 +239,7 @@ struct DN
 struct Block
 {
 	int	dlen;
-	uchar	*data;
+	unsigned char	*data;
 };
 struct Key
 {
@@ -290,12 +290,12 @@ struct RR
 	uint32_t	ttl;		/* time to live to be passed on */
 	uint32_t	expire;		/* time this entry expires locally */
 	uint32_t	marker;		/* used locally when scanning rrlists */
-	ushort	type;		/* RR type */
-	ushort	query;		/* query type is in response to */
-	uchar	auth;		/* flag: authoritative */
-	uchar	db;		/* flag: from database */
-	uchar	cached;		/* flag: rr in cache */
-	uchar	negative;	/* flag: this is a cached negative response */
+	uint16_t	type;		/* RR type */
+	uint16_t	query;		/* query type is in response to */
+	unsigned char	auth;		/* flag: authoritative */
+	unsigned char	db;		/* flag: from database */
+	unsigned char	cached;		/* flag: rr in cache */
+	unsigned char	negative;	/* flag: this is a cached negative response */
 
 	union {			/* discriminated by negative & type */
 		DN	*negsoaowner;	/* soa for cached negative response */
@@ -313,7 +313,7 @@ struct RR
 		DN	*os;	/* operating system - hinfo */
 		uint32_t	pref;	/* preference value - mx */
 		uint32_t	local;	/* ns served from local database - ns */
-		ushort	port;	/* - srv */
+		uint16_t	port;	/* - srv */
 		uintptr	arg1;	/* arg[01] are compared to find dups in dn.c */
 	};
 	union {			/* discriminated by type */
@@ -337,7 +337,7 @@ struct Server
 };
 
 /*
- *  timers for a start-of-authority record.  all ulongs are in seconds.
+ *  timers for a start-of-authority record.  all uint32_t's are in seconds.
  */
 struct SOA
 {
@@ -356,8 +356,8 @@ struct SOA
  */
 struct Srv
 {
-	ushort	pri;
-	ushort	weight;
+	uint16_t	pri;
+	uint16_t	weight;
 };
 
 typedef struct Rrlist Rrlist;
@@ -372,7 +372,7 @@ struct Rrlist
  */
 struct DNSmsg
 {
-	ushort	id;
+	uint16_t	id;
 	int	flags;
 	int	qdcount;	/* questions */
 	RR 	*qd;
@@ -410,25 +410,25 @@ struct Cfg {
 /* (udp) query stats */
 typedef struct {
 	QLock;
-	ulong	slavehiwat;	/* procs */
-	ulong	qrecvd9p;	/* query counts */
-	ulong	qrecvdudp;
-	ulong	qsent;
-	ulong	qrecvd9prpc;	/* packet count */
-	ulong	alarms;
+	uint32_t	slavehiwat;	/* procs */
+	uint32_t	qrecvd9p;	/* query counts */
+	uint32_t	qrecvdudp;
+	uint32_t	qsent;
+	uint32_t	qrecvd9prpc;	/* packet count */
+	uint32_t	alarms;
 	/* reply times by count */
-	ulong	under10ths[3*10+2];	/* under n*0.1 seconds, n is index */
-	ulong	tmout;
-	ulong	tmoutcname;
-	ulong	tmoutv6;
-
-	ulong	answinmem;	/* answers in memory */
-	ulong	negans;		/* negative answers received */
-	ulong	negserver;	/* neg ans with Rserver set */
-	ulong	negbaddeleg;	/* neg ans with bad delegations */
-	ulong	negbdnoans;	/* ⋯ and no answers */
-	ulong	negnorname;	/* neg ans with no Rname set */
-	ulong	negcached;	/* neg ans cached */
+	uint32_t	under10ths[3*10+2];	/* under n*0.1 seconds, n is index */
+	uint32_t	tmout;
+	uint32_t	tmoutcname;
+	uint32_t	tmoutv6;
+
+	uint32_t	answinmem;	/* answers in memory */
+	uint32_t	negans;		/* negative answers received */
+	uint32_t	negserver;	/* neg ans with Rserver set */
+	uint32_t	negbaddeleg;	/* neg ans with bad delegations */
+	uint32_t	negbdnoans;	/* ⋯ and no answers */
+	uint32_t	negnorname;	/* neg ans with no Rname set */
+	uint32_t	negcached;	/* neg ans cached */
 } Stats;
 
 Stats stats;
@@ -451,7 +451,7 @@ extern char	mntpt[];
 extern int	needrefresh;
 extern int	norecursion;
 extern uint32_t	now;		/* time base */
-extern vlong	nowns;
+extern int64_t	nowns;
 extern Area	*owned;
 extern int	sendnotifies;
 extern uint32_t	target;
@@ -486,7 +486,7 @@ void	dndump(char*);
 void	dnget(void);
 void	dninit(void);
 DN*	dnlookup(char*, int, int);
-void	dnptr(uchar*, uchar*, char*, int, int, int);
+void	dnptr(unsigned char*, unsigned char*, char*, int, int, int);
 void	dnpurge(void);
 void	dnput(void);
 void	dnslog(char*, ...);
@@ -525,35 +525,35 @@ void	freearea(Area**);
 void	addarea(DN *dp, RR *rp, Ndbtuple *t);
 
 /* dblookup.c */
-int	baddelegation(RR*, RR*, uchar*);
+int	baddelegation(RR*, RR*, unsigned char*);
 RR*	dbinaddr(DN*, int);
 RR*	dblookup(char*, int, int, int, int);
 void	dnforceage(void);
 RR*	dnsservers(int);
 RR*	domainlist(int);
 int	insideaddr(char *dom);
-int	insidens(uchar *ip);
+int	insidens(unsigned char *ip);
 int	myaddr(char *addr);
 int	opendatabase(void);
-uchar*	outsidens(int);
+unsigned char*	outsidens(int);
 
 /* dns.c */
 char*	walkup(char*);
 RR*	getdnsservers(int);
-void	logreply(int, uchar*, DNSmsg*);
-void	logsend(int, int, uchar*, char*, char*, int);
+void	logreply(int, unsigned char*, DNSmsg*);
+void	logsend(int, int, unsigned char*, char*, char*, int);
 void	procsetname(char *fmt, ...);
 
 /* dnresolve.c */
 RR*	dnresolve(char*, int, int, Request*, RR**, int, int, int, int*);
 int	udpport(char *);
-int	mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno);
+int	mkreq(DN *dp, int type, unsigned char *buf, int flags, uint16_t reqno);
 int	seerootns(void);
-void	initdnsmsg(DNSmsg *mp, RR *rp, int flags, ushort reqno);
-DNSmsg*	newdnsmsg(RR *rp, int flags, ushort reqno);
+void	initdnsmsg(DNSmsg *mp, RR *rp, int flags, uint16_t reqno);
+DNSmsg*	newdnsmsg(RR *rp, int flags, uint16_t reqno);
 
 /* dnserver.c */
-void	dnserver(DNSmsg*, DNSmsg*, Request*, uchar *, int);
+void	dnserver(DNSmsg*, DNSmsg*, Request*, unsigned char *, int);
 void	dnudpserver(char*);
 void	dntcpserver(char*);
 
@@ -562,9 +562,9 @@ void	dnnotify(DNSmsg*, DNSmsg*, Request*);
 void	notifyproc(void);
 
 /* convDNS2M.c */
-int	convDNS2M(DNSmsg*, uchar*, int);
+int	convDNS2M(DNSmsg*, unsigned char*, int);
 
 /* convM2DNS.c */
-char*	convM2DNS(uchar*, int, DNSmsg*, int*);
+char*	convM2DNS(unsigned char*, int, DNSmsg*, int*);
 
 #pragma varargck argpos dnslog 1

+ 20 - 0
sys/src/cmd/ndb/dns.json

@@ -0,0 +1,20 @@
+{
+	"Include": [
+		"../cmd.json"
+	],
+	"Install": "/$ARCH/bin/ndb/",
+	"Name": "dns",
+	"Program": "dns",
+	"SourceFiles": [
+		"convDNS2M.c",
+		"convM2DNS.c",
+		"dblookup.c",
+		"dn.c",
+		"dnarea.c",
+		"dnnotify.c",
+		"dnresolve.c",
+		"dns.c",
+		"dnserver.c",
+		"dnudpserver.c"
+	]
+}

+ 0 - 1
sys/src/cmd/ndb/dnsdebug.c

@@ -22,7 +22,6 @@ enum {
 Cfg cfg;
 
 static char *servername;
-static RR *serverrr;
 static RR *serveraddrs;
 
 char	*dbfile;

+ 18 - 0
sys/src/cmd/ndb/dnsdebug.json

@@ -0,0 +1,18 @@
+{
+	"Include": [
+		"/sys/src/cmd/cmd.json"
+	],
+	"Install": "/$ARCH/bin/ndb/",
+	"Name": "dnsdebug",
+	"Program": "dnsdebug",
+	"SourceFiles": [
+		"convDNS2M.c",
+		"convM2DNS.c",
+		"dblookup.c",
+		"dn.c",
+		"dnarea.c",
+		"dnresolve.c",
+		"dnserver.c",
+		"dnsdebug.c"
+	]
+}

+ 6 - 6
sys/src/cmd/ndb/dnstcp.c

@@ -47,12 +47,12 @@ usage(void)
 void
 main(int argc, char *argv[])
 {
-	volatile int len, rcode;
-	volatile char tname[32];
-	char *volatile err, *volatile ext = "";
-	volatile uchar buf[64*1024], callip[IPaddrlen];
-	volatile DNSmsg reqmsg, repmsg;
-	volatile Request req;
+	int len, rcode;
+	char tname[32];
+	char *err, *ext = "";
+	unsigned char buf[64*1024], callip[IPaddrlen];
+	DNSmsg reqmsg, repmsg;
+	Request req;
 
 	alarm(2*60*1000);
 	cfg.cachedb = 1;

+ 18 - 0
sys/src/cmd/ndb/dnstcp.json

@@ -0,0 +1,18 @@
+{
+	"Include": [
+		"/sys/src/cmd/cmd.json"
+	],
+	"Install": "/$ARCH/bin/ndb/",
+	"Name": "dnstcp",
+	"Program": "dnstcp",
+	"SourceFiles": [
+		"convDNS2M.c",
+		"convM2DNS.c",
+		"dblookup.c",
+		"dn.c",
+		"dnarea.c",
+		"dnresolve.c",
+		"dnserver.c",
+		"dnstcp.c"
+	]
+}

+ 8 - 8
sys/src/cmd/ndb/dnudpserver.c

@@ -140,14 +140,14 @@ redistrib(uint8_t *buf, int len)
 void
 dnudpserver(char *mntpt)
 {
-	volatile int fd, len, op, rcode;
-	char *volatile err;
-	volatile char tname[32];
-	volatile uint8_t buf[Udphdrsize + Maxpayload];
-	volatile DNSmsg reqmsg, repmsg;
-	Inprogress *volatile p;
-	volatile Request req;
-	Udphdr *volatile uh;
+	int fd, len, op, rcode;
+	char *err;
+	char tname[32];
+	uint8_t buf[Udphdrsize + Maxpayload];
+	DNSmsg reqmsg, repmsg;
+	Inprogress *p;
+	Request req;
+	Udphdr *uh;
 
 	/*
 	 * fork sharing text, data, and bss with parent.

+ 3 - 3
sys/src/cmd/ndb/inform.c

@@ -41,7 +41,7 @@ usage(void)
 }
 
 void
-ding(void *, char *msg)
+ding(void *v, char *msg)
 {
 	if(strstr(msg, "alarm") != nil)
 		noted(NCONT);
@@ -103,8 +103,8 @@ main(int argc, char *argv[])
 	int debug, len, fd;
 	uint err;
 	char *sysname, *dnsdomain, *dom, *inform, *ns, net[32];
-	uchar *p, buf[4096], addr[IPv4addrlen], v6addr[IPaddrlen];
-	ushort txid;
+	unsigned char *p, buf[4096], addr[IPv4addrlen], v6addr[IPaddrlen];
+	uint16_t txid;
 	Ndb *db;
 	Ndbtuple *t, *tt;
 	static char *query[] = { "dom", "dnsdomain", "ns", "inform" };

+ 0 - 101
sys/src/cmd/ndb/mkfile

@@ -1,101 +0,0 @@
-# cs & dns mkfile
-</$objtype/mkfile
-
-TARG =	\
-	mkdb\
-	query\
-	mkhash\
-	mkhosts\
-	cs\
-	csquery\
-	dns\
-	dnsquery\
-	dnstcp\
-	dnsdebug\
-	ipquery\
-	inform\
-
-
-DNSOBJ = dns.$O dnudpserver.$O dn.$O dnresolve.$O dblookup.$O dnserver.$O dnnotify.$O\
-	 dnarea.$O convM2DNS.$O convDNS2M.$O
-
-DNSTCPOBJ = dnstcp.$O dn.$O dnresolve.$O dblookup.$O dnserver.$O\
-	 dnarea.$O convM2DNS.$O convDNS2M.$O
-
-DNSDEBUGOBJ = dnsdebug.$O dn.$O dnresolve.$O dblookup.$O dnserver.$O\
-	 dnarea.$O convM2DNS.$O convDNS2M.$O
-
-HFILES = dns.h /$objtype/lib/libndb.a
-
-BIN=/$objtype/bin/ndb
-
-</sys/src/cmd/mkmany
-
-$O.dns: $DNSOBJ
-	$LD -o $target $prereq
-
-# print it in landscape orientation; it's way more useful than 80 columns
-calls.dns:D: ${DNSOBJ:%.$O=%.c}
-	calls -w 132 -f main $prereq >$target
-
-$O.dnstcp: $DNSTCPOBJ
-	$LD -o $target $prereq
-
-$O.dnsdebug: $DNSDEBUGOBJ
-	$LD -o $target $prereq
-
-$O.cs: cs.$O
-	$LD -o $target $prereq
-
-$O.testipinfo: testipinfo.$O ipinfo.$O
-	$LD -o $target $prereq
-
-push: $O.dns $O.dnsdebug $O.dnstcp
-	import lookout / /n/lookout
-	cp $O.dns /n/lookout/$objtype/bin/ndb/dns
-	cp $O.dnsdebug /n/lookout/$objtype/bin/ndb/dnsdebug
-	cp $O.dnstcp /n/lookout/$objtype/bin/ndb/dnstcp
-	unmount /n/lookout
-	import boundary / /n/boundary
-	cp $O.dns /n/boundary/$objtype/bin/ndb/dns
-	cp $O.dnsdebug /n/boundary/$objtype/bin/ndb/dnsdebug
-	cp $O.dnstcp /n/boundary/$objtype/bin/ndb/dnstcp
-	unmount /n/boundary
-
-cs.safeinstall:V: $O.cs
-	if(test -e $BIN/ooocs)
-		mv $BIN/ooocs $BIN/oooocs
-	if(test -e $BIN/oocs)
-		mv $BIN/oocs $BIN/ooocs
-	if(test -e $BIN/ocs)
-		mv $BIN/ocs $BIN/oocs
-	mv $BIN/cs $BIN/ocs
-	cp $O.cs $BIN/cs
-
-dns.safeinstall:V: $O.dns
-	if(test -e $BIN/ooodns)
-		mv $BIN/ooodns $BIN/oooodns
-	if(test -e $BIN/oodns)
-		mv $BIN/oodns $BIN/ooodns
-	if(test -e $BIN/odns)
-		mv $BIN/odns $BIN/oodns
-	mv $BIN/dns $BIN/odns
-	cp $O.dns $BIN/dns
-
-%.safeinstallall:V:
-	for (objtype in $CPUS)
-		mk $stem.safeinstall
-
-dns.update:V:
-	SRC=`{echo $DNSOBJ|sed 's/\.'$O'/.c/g'}
-	update $UPDATEFLAGS dns.h $SRC
-
-%.update:V:
-	update $UPDATEFLAGS $stem.c
-
-update:V:
-	mk clean
-	T=`{echo $TARG|sed 's/( |$)/.update /g'}
-	mk 'UPDATEFLAGS='$"UPDATEFLAGS $T
-	update $UPDATEFLAGS mkfile
-

+ 23 - 0
sys/src/cmd/ndb/ndb.json

@@ -0,0 +1,23 @@
+{
+	"Include": [
+		"/sys/src/cmd/cmd.json"
+	],
+	"Install": "/$ARCH/bin/ndb/",
+	"Name": "ndb",
+	"Projects": [
+		"dns.json",
+		"dnstcp.json",
+		"dnsdebug.json"
+	],
+	"SourceFilesCmd": [
+		"cs.c",
+		"csquery.c",
+		"dnsquery.c",
+		"ipquery.c",
+		"inform.c",
+		"mkdb.c",
+		"mkhash.c",
+		"mkhosts.c",
+		"query.c"
+	]
+}