Browse Source

Plan 9 from Bell Labs 2004-02-25

David du Colombier 20 years ago
parent
commit
0e28fba470

+ 7 - 5
dist/replica/plan9.db

@@ -524,7 +524,7 @@
 386/lib/lib9p.a - 664 sys sys 1073851264 80496
 386/lib/lib9p.a - 664 sys sys 1073851264 80496
 386/lib/libString.a - 664 sys sys 1073851264 22204
 386/lib/libString.a - 664 sys sys 1073851264 22204
 386/lib/libauth.a - 664 sys sys 1076990357 56134
 386/lib/libauth.a - 664 sys sys 1076990357 56134
-386/lib/libauthsrv.a - 664 sys sys 1073851265 33806
+386/lib/libauthsrv.a - 664 sys sys 1077636970 33806
 386/lib/libbin.a - 664 sys sys 1073851265 2556
 386/lib/libbin.a - 664 sys sys 1073851265 2556
 386/lib/libbio.a - 664 sys sys 1073851265 28338
 386/lib/libbio.a - 664 sys sys 1073851265 28338
 386/lib/libc.a - 664 sys sys 1077076820 504454
 386/lib/libc.a - 664 sys sys 1077076820 504454
@@ -543,7 +543,7 @@
 386/lib/libmemdraw.a - 664 sys sys 1073851273 291288
 386/lib/libmemdraw.a - 664 sys sys 1073851273 291288
 386/lib/libmemlayer.a - 664 sys sys 1073851273 47636
 386/lib/libmemlayer.a - 664 sys sys 1073851273 47636
 386/lib/libmp.a - 664 sys sys 1077508785 77700
 386/lib/libmp.a - 664 sys sys 1077508785 77700
-386/lib/libndb.a - 664 sys sys 1073851273 54474
+386/lib/libndb.a - 664 sys sys 1077636970 54474
 386/lib/libplumb.a - 664 sys sys 1073851274 18876
 386/lib/libplumb.a - 664 sys sys 1073851274 18876
 386/lib/libregexp.a - 664 sys sys 1073851274 37502
 386/lib/libregexp.a - 664 sys sys 1073851274 37502
 386/lib/libscribble.a - 664 sys sys 1073851274 107542
 386/lib/libscribble.a - 664 sys sys 1073851274 107542
@@ -3413,7 +3413,7 @@ sys/include/memdraw.h - 664 sys sys 1039752978 5616
 sys/include/memlayer.h - 664 sys sys 1051031022 1851
 sys/include/memlayer.h - 664 sys sys 1051031022 1851
 sys/include/mouse.h - 664 sys sys 1035232010 1003
 sys/include/mouse.h - 664 sys sys 1035232010 1003
 sys/include/mp.h - 664 sys sys 1014929065 4610
 sys/include/mp.h - 664 sys sys 1014929065 4610
-sys/include/ndb.h - 664 sys sys 1032058245 3781
+sys/include/ndb.h - 664 sys sys 1077632684 4009
 sys/include/nfs3.h - 664 sys sys 1045589438 15082
 sys/include/nfs3.h - 664 sys sys 1045589438 15082
 sys/include/plumb.h - 664 sys sys 1014929065 989
 sys/include/plumb.h - 664 sys sys 1014929065 989
 sys/include/pool.h - 664 sys sys 1032058257 1156
 sys/include/pool.h - 664 sys sys 1032058257 1156
@@ -3891,14 +3891,16 @@ sys/lib/lp/process - 20000000775 sys sys 1015012169 0
 sys/lib/lp/process/dpost - 775 sys sys 1015012079 2412
 sys/lib/lp/process/dpost - 775 sys sys 1015012079 2412
 sys/lib/lp/process/dvipost - 775 sys sys 954037459 3123
 sys/lib/lp/process/dvipost - 775 sys sys 954037459 3123
 sys/lib/lp/process/g3post - 775 sys sys 954037459 2348
 sys/lib/lp/process/g3post - 775 sys sys 954037459 2348
-sys/lib/lp/process/generic - 775 sys sys 1015700868 4064
+sys/lib/lp/process/generic - 775 sys sys 1077634895 4849
 sys/lib/lp/process/gifpost - 775 sys sys 1015012079 2317
 sys/lib/lp/process/gifpost - 775 sys sys 1015012079 2317
 sys/lib/lp/process/gspipe - 775 sys sys 1015012079 434
 sys/lib/lp/process/gspipe - 775 sys sys 1015012079 434
+sys/lib/lp/process/gspipeijs - 775 sys sys 1077670465 949
 sys/lib/lp/process/hpost - 775 sys sys 1057868801 3247
 sys/lib/lp/process/hpost - 775 sys sys 1057868801 3247
 sys/lib/lp/process/jpgpost - 775 sys sys 1015012079 2313
 sys/lib/lp/process/jpgpost - 775 sys sys 1015012079 2313
 sys/lib/lp/process/noproc - 775 sys sys 954037459 62
 sys/lib/lp/process/noproc - 775 sys sys 954037459 62
 sys/lib/lp/process/p9bitpost - 775 sys sys 954037459 2436
 sys/lib/lp/process/p9bitpost - 775 sys sys 954037459 2436
 sys/lib/lp/process/pdfgs - 775 sys sys 1016833869 1732
 sys/lib/lp/process/pdfgs - 775 sys sys 1016833869 1732
+sys/lib/lp/process/pdfgsijs - 775 sys sys 1077634892 1687
 sys/lib/lp/process/pdfpost - 775 sys sys 1015012079 2100
 sys/lib/lp/process/pdfpost - 775 sys sys 1015012079 2100
 sys/lib/lp/process/post - 775 sys sys 1045164703 1955
 sys/lib/lp/process/post - 775 sys sys 1045164703 1955
 sys/lib/lp/process/ppost - 775 sys sys 969500538 2874
 sys/lib/lp/process/ppost - 775 sys sys 969500538 2874
@@ -4833,7 +4835,7 @@ sys/man/2/mouse - 664 sys sys 971455512 4966
 sys/man/2/mp - 664 sys sys 1071238964 10690
 sys/man/2/mp - 664 sys sys 1071238964 10690
 sys/man/2/muldiv - 664 sys sys 984709633 639
 sys/man/2/muldiv - 664 sys sys 984709633 639
 sys/man/2/nan - 664 sys sys 975084242 937
 sys/man/2/nan - 664 sys sys 975084242 937
-sys/man/2/ndb - 664 sys sys 1050078464 7686
+sys/man/2/ndb - 664 sys sys 1077632681 8901
 sys/man/2/notify - 664 sys sys 1032058674 6376
 sys/man/2/notify - 664 sys sys 1032058674 6376
 sys/man/2/object - 664 sys sys 944959695 3864
 sys/man/2/object - 664 sys sys 944959695 3864
 sys/man/2/open - 664 sys sys 1015091524 3404
 sys/man/2/open - 664 sys sys 1015091524 3404

+ 7 - 0
dist/replica/plan9.log

@@ -13989,3 +13989,10 @@
 1077508821 0 c 386/bin/snoopy - 775 sys sys 1077508785 153943
 1077508821 0 c 386/bin/snoopy - 775 sys sys 1077508785 153943
 1077508821 1 c 386/lib/libmp.a - 664 sys sys 1077508785 77700
 1077508821 1 c 386/lib/libmp.a - 664 sys sys 1077508785 77700
 1077595239 0 c sys/man/6/font - 664 sys sys 1077594184 2528
 1077595239 0 c sys/man/6/font - 664 sys sys 1077594184 2528
+1077633046 0 c sys/include/ndb.h - 664 sys sys 1077632684 4009
+1077633046 1 c sys/man/2/ndb - 664 sys sys 1077632681 8901
+1077636646 0 c sys/lib/lp/process/generic - 775 sys sys 1077634895 4849
+1077636646 1 a sys/lib/lp/process/pdfgsijs - 775 sys sys 1077634892 1687
+1077638447 0 c 386/lib/libauthsrv.a - 664 sys sys 1077636970 33806
+1077638447 1 c 386/lib/libndb.a - 664 sys sys 1077636970 54474
+1077670852 0 a sys/lib/lp/process/gspipeijs - 775 sys sys 1077670465 949

+ 18 - 13
sys/include/ndb.h

@@ -120,21 +120,26 @@ struct Ndbs
 
 
 #define NDB_IPlen 16
 #define NDB_IPlen 16
 
 
-ulong		ndbhash(char*, int);
-Ndbtuple*	ndbparse(Ndb*);
-void		ndbfree(Ndbtuple*);
-Ndb*		ndbopen(char*);
+Ndbtuple*	csgetval(char*, char*, char*, char*, char*);
+Ndbtuple*	csipinfo(char*, char*, char*, char**, int);
+Ndbtuple*	dnsquery(char*, char*, char*);
+char*		ipattr(char*);
 Ndb*		ndbcat(Ndb*, Ndb*);
 Ndb*		ndbcat(Ndb*, Ndb*);
-int		ndbreopen(Ndb*);
+int		ndbchanged(Ndb*);
 void		ndbclose(Ndb*);
 void		ndbclose(Ndb*);
+Ndbtuple*	ndbconcatenate(Ndbtuple*, Ndbtuple*);
+Ndbtuple*	ndbdiscard(Ndbtuple*, Ndbtuple*);
+void		ndbfree(Ndbtuple*);
+Ndbtuple*	ndbgetipaddr(Ndb*, char*);
+Ndbtuple*	ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*);
+ulong		ndbhash(char*, int);
+Ndbtuple*	ndbipinfo(Ndb*, char*, char*, char**, int);
 Ndbtuple*	ndblookval(Ndbtuple*, Ndbtuple*, char*, char*);
 Ndbtuple*	ndblookval(Ndbtuple*, Ndbtuple*, char*, char*);
-long		ndbseek(Ndb*, long);
+Ndb*		ndbopen(char*);
+Ndbtuple*	ndbparse(Ndb*);
+int		ndbreopen(Ndb*);
+Ndbtuple*	ndbreorder(Ndbtuple*, Ndbtuple*);
 Ndbtuple*	ndbsearch(Ndb*, Ndbs*, char*, char*);
 Ndbtuple*	ndbsearch(Ndb*, Ndbs*, char*, char*);
+long		ndbseek(Ndb*, long);
 Ndbtuple*	ndbsnext(Ndbs*, char*, char*);
 Ndbtuple*	ndbsnext(Ndbs*, char*, char*);
-Ndbtuple*	ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*);
-Ndbtuple*	csgetval(char*, char*, char*, char*, char*);
-char*		ipattr(char*);
-Ndbtuple*	ndbipinfo(Ndb*, char*, char*, char**, int);
-Ndbtuple*	csipinfo(char*, char*, char*, char**, int);
-Ndbtuple*	dnsquery(char*, char*, char*);
-int		ndbchanged(Ndb *db);
+Ndbtuple*	ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);

+ 12 - 1
sys/lib/lp/process/generic

@@ -1,3 +1,4 @@
+--------/sys/lib/lp/process/generic--------
 #!/bin/rc
 #!/bin/rc
 # Tries to determine what type of file you are printing and do the correct
 # Tries to determine what type of file you are printing and do the correct
 # thing with it.
 # thing with it.
@@ -19,7 +20,7 @@ case troff;
 					case UTF; $LPLIB/process/tr2post < $TMPFILE
 					case UTF; $LPLIB/process/tr2post < $TMPFILE
 					}
 					}
 
 
-	case *gs!*;	switch ($FILETYPE(5)) {
+	case *gs!* *gsijs!*;	switch ($FILETYPE(5)) {
 					# Latin1 is for compatibility with old research UNIX systems, doesn't work on Plan 9
 					# Latin1 is for compatibility with old research UNIX systems, doesn't work on Plan 9
 					case Latin1 post; tcs -s -f utf -t latin1 < $TMPFILE |$LPLIB/process/dpost |$LPLIB/process/gspipe
 					case Latin1 post; tcs -s -f utf -t latin1 < $TMPFILE |$LPLIB/process/dpost |$LPLIB/process/gspipe
 
 
@@ -33,6 +34,7 @@ case special;
 	case '#b';		switch ($LPCLASS) {
 	case '#b';		switch ($LPCLASS) {
 				case *post*;	$LPLIB/process/p9bitpost < $TMPFILE
 				case *post*;	$LPLIB/process/p9bitpost < $TMPFILE
 				case *gs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipe
 				case *gs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipe
+				case *gsijs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipeijs
 				}
 				}
 
 
 	case *;		echo $FILETYPE file is improper for $LPDEST >[1=2]
 	case *;		echo $FILETYPE file is improper for $LPDEST >[1=2]
@@ -42,23 +44,27 @@ case Compressed plan old;	# type is really 'Compressed image' or 'plan 9 image'
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/p9bitpost < $TMPFILE
 	case *post*;	$LPLIB/process/p9bitpost < $TMPFILE
 	case *gs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/p9bitpost < $TMPFILE |$LPLIB/process/gspipeijs
 	}
 	}
 case jpeg;
 case jpeg;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/jpgpost < $TMPFILE
 	case *post*;	$LPLIB/process/jpgpost < $TMPFILE
 	case *gs!*;	$LPLIB/process/jpgpost < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/jpgpost < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/jpgpost < $TMPFILE |$LPLIB/process/gspipeijs
 	}
 	}
 
 
 case GIF;
 case GIF;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/gifpost < $TMPFILE
 	case *post*;	$LPLIB/process/gifpost < $TMPFILE
 	case *gs!*;	$LPLIB/process/gifpost < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/gifpost < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/gifpost < $TMPFILE |$LPLIB/process/gspipeijs
 	}
 	}
 
 
 case ccitt-g31;
 case ccitt-g31;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/g3post < $TMPFILE
 	case *post*;	$LPLIB/process/g3post < $TMPFILE
 	case *gs!*;	$LPLIB/process/g3post < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/g3post < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/g3post < $TMPFILE |$LPLIB/process/gspipeijs
 	}
 	}
 
 
 # bitmap for research UNIX compatibility, does not work on Plan 9.
 # bitmap for research UNIX compatibility, does not work on Plan 9.
@@ -74,12 +80,14 @@ case tex;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/dvipost $TMPFILE
 	case *post*;	$LPLIB/process/dvipost $TMPFILE
 	case *gs!*;	$LPLIB/process/dvipost $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/dvipost $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/dvipost $TMPFILE |$LPLIB/process/gspipeijs
 	case *;		echo $FILETYPE(2) file is improper for $LPDEST >[1=2]
 	case *;		echo $FILETYPE(2) file is improper for $LPDEST >[1=2]
 	}
 	}
 case postscript;
 case postscript;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;		$LPLIB/process/post < $TMPFILE
 	case *post*;		$LPLIB/process/post < $TMPFILE
 	case *gs!*;		$LPLIB/process/post < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;		$LPLIB/process/post < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;		$LPLIB/process/post < $TMPFILE |$LPLIB/process/gspipeijs
 	case *;			echo $FILETYPE(2) file is improper for $LPDEST >[1=2]
 	case *;			echo $FILETYPE(2) file is improper for $LPDEST >[1=2]
 	}
 	}
 case HPJCL;
 case HPJCL;
@@ -95,6 +103,7 @@ case English short extended alef limbo [Aa]scii assembler c latin rc sh as mail
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/ppost < $TMPFILE
 	case *post*;	$LPLIB/process/ppost < $TMPFILE
 	case *gs!*;	$LPLIB/process/ppost < $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/ppost < $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/ppost < $TMPFILE |$LPLIB/process/gspipeijs
 	case *canon*;	$LPLIB/process/can $* < $TMPFILE
 	case *canon*;	$LPLIB/process/can $* < $TMPFILE
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	}
 	}
@@ -103,12 +112,14 @@ case tiff;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/tiffpost $TMPFILE
 	case *post*;	$LPLIB/process/tiffpost $TMPFILE
 	case *gs!*;	$LPLIB/process/tiffpost $TMPFILE |$LPLIB/process/gspipe
 	case *gs!*;	$LPLIB/process/tiffpost $TMPFILE |$LPLIB/process/gspipe
+	case *gsijs!*;	$LPLIB/process/tiffpost $TMPFILE |$LPLIB/process/gspipeijs
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	}
 	}
 case PDF;
 case PDF;
 	switch ($LPCLASS) {
 	switch ($LPCLASS) {
 	case *post*;	$LPLIB/process/pdfpost $TMPFILE
 	case *post*;	$LPLIB/process/pdfpost $TMPFILE
 	case *gs!*;	$LPLIB/process/pdfgs $TMPFILE
 	case *gs!*;	$LPLIB/process/pdfgs $TMPFILE
+	case *gsijs!*;	$LPLIB/process/pdfgsijs $TMPFILE
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	case *;		echo Unrecognized class of line printer for $LPDEST >[1=2]
 	}
 	}
 case empty;
 case empty;

+ 35 - 0
sys/lib/lp/process/gspipeijs

@@ -0,0 +1,35 @@
+#!/bin/rc
+# extended to IJS driver by K.Okamoto
+# duble-sided printing for PSC 2550 printer
+#
+if (! ~ $DEBUG '') flag x +
+
+# usage: gspipeijs [dev]
+# assumes postscript on stdin
+
+switch($#*) {
+case 0
+	MODEL=`{echo $LPCLASS | sed 's/(.*\+)?gsijs!([^+]*)(\+.*)?/\2/'}
+	NUMBER=`{echo $LPCLASS | sed 's/(.*\+)?gsijs!([^+]*)\+(.*)?/\3/'}
+case 1
+	IJS=$1
+case *
+	echo 'usage: gspipeijs [dev]' >[1=2]
+	exit gspipeijs
+}
+
+GSTMPFILE=/tmp/gsp$pid
+
+switch($NUMBER) {
+case 2100
+	GSOPT=(-q -sDEVICE'='ijs -sIjsServer'='hpijs -sDeviceManufacturer'='HP '-sDeviceModel='"$MODEL^' '^$NUMBER" -r600 -sOutputFile'='^$GSTMPFILE -sPAPERSIZE'='a4 -dIjsUseOutputFD -dSAFER -dNOPAUSE -DBATCH)
+case 2500
+	GSOPT=(-q -sDEVICE'='ijs -sIjsServer'='hpijs -sDeviceManufacturer'='HP '-sDeviceModel='"$MODEL^' '^$NUMBER" -r600 -sOutputFile'='^$GSTMPFILE -dDuplex'='true -sPAPERSIZE'='a4 -dIjsUseOutputFD -dSAFER -dNOPAUSE -DBATCH)
+}
+
+gs $GSOPT  - 
+
+cat $GSTMPFILE
+rm $GSTMPFILE
+
+exit

+ 63 - 0
sys/lib/lp/process/pdfgsijs

@@ -0,0 +1,63 @@
+#!/bin/rc
+
+# usage: pdfgsijs pdffile
+
+gs -dSAFER -dNOPAUSE -dBATCH -q -s'DEVICE=pswrite' -d'LanguageLevel=2' -s'OutputFile=/tmp/pdf2ps.ps' $1
+
+MODEL=`{echo $LPCLASS | sed 's/(.*\+)?gsijs!([^+]*)(\+.*)?/\2/'}
+NUMBER=`{echo $LPCLASS | sed 's/(.*\+)?gsijs!([^+]*)\+(.*)?/\3/'}
+
+GSTMPFILE=/tmp/pdf^$pid
+
+switch($NUMBER) {
+case 2100
+	GSOPT=(-q -sDEVICE'='ijs -sIjsServer'='hpijs -sDeviceManufacturer'='HP '-sDeviceModel='"$MODEL^' '^$NUMBER" -r600 -sOutputFile'='^$GSTMPFILE  -sPAPERSIZE'='a4 -dIjsUseOutputFD -dSAFER -dNOPAUSE -dBATCH)
+case 2500
+	GSOPT=(-q -sDEVICE'='ijs -sIjsServer'='hpijs -sDeviceManufacturer'='HP '-sDeviceModel='"$MODEL^' '^$NUMBER" -r600 -sOutputFile'='^$GSTMPFILE -dDuplex'='true -sPAPERSIZE'='a4 -dIjsUseOutputFD -dSAFER -dNOPAUSE -DBATCH)
+}
+
+
+if(~ $OLIST '')
+	gs $GSOPT /tmp/pdf2ps.ps
+if not {
+	PGLIST=`{echo $OLIST | sed 's/-o//;s/,/ /g;s/	/ /g' | tr -cd '0-9 -'}
+	GSPGLIST=()
+	for(i in $PGLIST){
+		switch($i){
+		case -*
+			GSPGLIST=($GSPGLIST `{seq 1 `{echo $i|tr -d '-'}})
+		case *-
+			# BUG assume 100 >= number of pages
+			GSPGLIST=($GSPGLIST `{seq `{echo $i|tr -d '-'} 100})
+		case *-*
+			GSPGLIST=($GSPGLIST `{seq `{echo $i|tr '-' ' '}})
+		case *
+			GSPGLIST=($GSPGLIST $i)
+		}
+	}
+	GSPGLIST=$"GSPGLIST
+	echo '
+		/Page null def
+		/Page# 0 def
+		/PDFSave null def
+		/DSCPageCount 0 def
+		/DoPDFPage {dup /Page# exch store pdfgetpage pdfshowpage} def
+		GS_PDF_ProcSet begin
+		pdfdict begin
+		('^$1^') (r) file pdfopen begin
+		/npage pdfpagecount def
+		['^$GSPGLIST^']
+		{
+			dup dup
+				1 ge exch npage le and 
+				{ DoPDFPage }
+				{ pop }
+			ifelse
+		} forall
+	' | gs $GSOPT - >/dev/null >[2=1]
+}
+
+cat $GSTMPFILE
+rm -f $GSTMPFILE
+rm -f /tmp/pdf2ps.ps
+exit ''

+ 75 - 4
sys/man/2/ndb

@@ -1,6 +1,6 @@
 .TH NDB 2
 .TH NDB 2
 .SH NAME
 .SH NAME
-ndbopen, ndbcat, ndbchanged, ndbclose, ndbreopen, ndbsearch, ndbsnext, ndbgetval, ndbfree, ipattr, ndbipinfo, csipinfo, ndbhash, ndbparse, csgetval, ndblookval, dnsquery \- network database
+ndbopen, ndbcat, ndbchanged, ndbclose, ndbreopen, ndbsearch, ndbsnext, ndbgetval, ndbfree, ipattr, ndbgetipaddr, ndbipinfo, csipinfo, ndbhash, ndbparse, csgetval, ndblookval, dnsquery, ndbdiscard, ndbconcatenate, ndbreorder, ndbsubstitute \- network database
 .SH SYNOPSIS
 .SH SYNOPSIS
 .B #include <u.h>
 .B #include <u.h>
 .br
 .br
@@ -42,10 +42,10 @@ Ndbtuple*	ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val,
 Ndbtuple*	csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf)
 Ndbtuple*	csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf)
 .PP
 .PP
 .B
 .B
-void	ndbfree(Ndbtuple *db)
+char*	ipattr(char *name)
 .PP
 .PP
 .B
 .B
-char*	ipattr(char *name)
+Ndbtuple*	ndbgetipaddr(Ndb *db, char *sys);
 .PP
 .PP
 .B
 .B
 Ndbtuple*	ndbipinfo(Ndb *db, char *attr, char *val, char **attrs,
 Ndbtuple*	ndbipinfo(Ndb *db, char *attr, char *val, char **attrs,
@@ -68,6 +68,21 @@ Ndbtuple*	dnsquery(char *netroot, char *domainname, char *type)
 .PP
 .PP
 .B
 .B
 Ndbtuple*	ndblookval(Ndbtuple *entry, Ndbtuple *line, char *attr, char *to)
 Ndbtuple*	ndblookval(Ndbtuple *entry, Ndbtuple *line, char *attr, char *to)
+.PP
+.B
+void	ndbfree(Ndbtuple *db)
+.PP
+.B
+Ndbtuple*	ndbdiscard(Ndbtuple  *t, Ndbtuple *a)
+.PP
+.B
+Ndbtuple*	ndbconcatenate(Ndbtuple *a, Ndbtuple *b);
+.PP
+.B
+Ndbtuple*	ndbreorder(Ndbtuple *t, Ndbtuple *a);
+.PP
+.B
+Ndbtuple*	ndbsubstitute(Ndbtuple *t, Ndbtuple *from, Ndbtuple *to);
 .SH DESCRIPTION
 .SH DESCRIPTION
 These routines are used by network administrative programs to search
 These routines are used by network administrative programs to search
 the network database.
 the network database.
@@ -213,6 +228,21 @@ Internet number
 system name
 system name
 .RE
 .RE
 .PP
 .PP
+.I Ndbgetipaddr
+looks in
+.I db
+for an entry matching
+.I sys
+as the value of a
+.B sys=
+or
+.B dom=
+attribute/value pair and returns all IP addresses in the entry.
+If
+.I sys
+is already an IP address, a tuple containing just
+that address is returned.
+.PP
 .I Ndbipinfo
 .I Ndbipinfo
 looks up Internet protocol information about a system.
 looks up Internet protocol information about a system.
 This is an IP aware search.  It looks first for information
 This is an IP aware search.  It looks first for information
@@ -260,7 +290,7 @@ as
 is to
 is to
 .IR ndbgetval .
 .IR ndbgetval .
 .PP
 .PP
-The last three calls are used by programs that create the
+The next three routines are used by programs that create the
 hash tables and database files.
 hash tables and database files.
 .I Ndbhash
 .I Ndbhash
 computes a hash offset into a table of length
 computes a hash offset into a table of length
@@ -371,6 +401,47 @@ routine can be used by the application to periodicly
 check for changes.  It returns zero
 check for changes.  It returns zero
 if none of the files comprising the database have
 if none of the files comprising the database have
 changes and non-zero if they have.
 changes and non-zero if they have.
+.PP
+Finally, a number of routines are provided for manipulating
+tuples.
+.PP
+.I Ndbdiscard
+removes attr/val pair
+.I a
+from tuple
+.I t
+and frees it.
+If
+.I a
+isn't in
+.I t
+it is just freed.
+.PP
+.I Ndbconcatenate
+concatenates two tuples and returns the result.  Either
+or both tuples may be nil.
+.PP
+.I Ndbreorder
+reorders a tuple
+.IR t
+to make the line containing attr/val pair
+.I a
+first in the entry and making
+.I a
+first in its line.
+.PP
+.I Ndbsubstitute
+replaces a single att/val pair
+.I from
+in
+.I t
+with the tuple
+.IR to .
+All attr/val pairs in
+.I to
+end up on the same line.
+.I from
+is freed.
 .SH FILES
 .SH FILES
 .BR /lib/ndb "    directory of network database files
 .BR /lib/ndb "    directory of network database files
 .SH SOURCE
 .SH SOURCE