Browse Source

Plan 9 from Bell Labs 2007-03-02

David du Colombier 17 years ago
parent
commit
48295da6b9

+ 38 - 32
dist/replica/_plan9.db

@@ -19,7 +19,7 @@
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/aan - 775 sys sys 1168402261 131298
 386/bin/aan - 775 sys sys 1168402261 131298
-386/bin/acid - 775 sys sys 1172203052 401181
+386/bin/acid - 775 sys sys 1172780590 402190
 386/bin/acme - 775 sys sys 1168402263 432256
 386/bin/acme - 775 sys sys 1168402263 432256
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape/basename - 775 sys sys 1136656314 132873
 386/bin/ape/basename - 775 sys sys 1136656314 132873
@@ -95,7 +95,7 @@
 386/bin/aux/cropmarks - 775 sys sys 1020319062 1808
 386/bin/aux/cropmarks - 775 sys sys 1020319062 1808
 386/bin/aux/data2s - 775 sys sys 1168402278 60761
 386/bin/aux/data2s - 775 sys sys 1168402278 60761
 386/bin/aux/depend - 775 sys sys 1168402279 146101
 386/bin/aux/depend - 775 sys sys 1168402279 146101
-386/bin/aux/disksim - 775 sys sys 1168402279 150825
+386/bin/aux/disksim - 775 sys sys 1172780591 150851
 386/bin/aux/download - 775 sys sys 1087442506 176016
 386/bin/aux/download - 775 sys sys 1087442506 176016
 386/bin/aux/faxreceive - 775 sys sys 1168402279 84186
 386/bin/aux/faxreceive - 775 sys sys 1168402279 84186
 386/bin/aux/faxsend - 775 sys sys 1168402280 89693
 386/bin/aux/faxsend - 775 sys sys 1168402280 89693
@@ -176,7 +176,7 @@
 386/bin/cat - 775 sys sys 1148500611 37482
 386/bin/cat - 775 sys sys 1148500611 37482
 386/bin/cb - 775 sys sys 1168402293 77628
 386/bin/cb - 775 sys sys 1168402293 77628
 386/bin/cdfs - 775 sys sys 1168402294 167435
 386/bin/cdfs - 775 sys sys 1168402294 167435
-386/bin/cfs - 775 sys sys 1172175927 128780
+386/bin/cfs - 775 sys sys 1172780592 131665
 386/bin/chgrp - 775 sys sys 1168402294 59522
 386/bin/chgrp - 775 sys sys 1168402294 59522
 386/bin/chmod - 775 sys sys 1168402294 62518
 386/bin/chmod - 775 sys sys 1168402294 62518
 386/bin/cifscmd - 775 sys sys 1169612022 343611
 386/bin/cifscmd - 775 sys sys 1169612022 343611
@@ -543,7 +543,7 @@
 386/lib/ape/libregexp.a - 664 sys sys 1143777857 47500
 386/lib/ape/libregexp.a - 664 sys sys 1143777857 47500
 386/lib/ape/libutf.a - 664 sys sys 1146156980 88500
 386/lib/ape/libutf.a - 664 sys sys 1146156980 88500
 386/lib/ape/libv.a - 664 sys sys 1143777858 19668
 386/lib/ape/libv.a - 664 sys sys 1143777858 19668
-386/lib/lib9p.a - 664 sys sys 1168402362 90956
+386/lib/lib9p.a - 664 sys sys 1172780592 91012
 386/lib/libString.a - 664 sys sys 1168402362 22126
 386/lib/libString.a - 664 sys sys 1168402362 22126
 386/lib/libauth.a - 664 sys sys 1171743876 58570
 386/lib/libauth.a - 664 sys sys 1171743876 58570
 386/lib/libauthsrv.a - 664 sys sys 1171830301 35838
 386/lib/libauthsrv.a - 664 sys sys 1171830301 35838
@@ -5464,7 +5464,7 @@ rc/bin/kill - 775 sys sys 1143389260 142
 rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/label - 775 sys sys 945617207 34
 rc/bin/label - 775 sys sys 945617207 34
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/lc - 775 sys sys 945617207 24
-rc/bin/leak - 775 sys sys 1139744263 1052
+rc/bin/leak - 775 sys sys 1172760642 1921
 rc/bin/lookman - 775 sys sys 1017679344 686
 rc/bin/lookman - 775 sys sys 1017679344 686
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/mail - 775 sys sys 1045504003 138
@@ -5624,7 +5624,7 @@ sys/doc/8½/fig1.ps - 664 sys sys 1020895859 473747
 sys/doc/8½/mkfile - 664 sys sys 1138459303 214
 sys/doc/8½/mkfile - 664 sys sys 1138459303 214
 sys/doc/9.ms - 664 sys sys 1138396402 84662
 sys/doc/9.ms - 664 sys sys 1138396402 84662
 sys/doc/9.ps - 664 sys sys 960837924 508340
 sys/doc/9.ps - 664 sys sys 960837924 508340
-sys/doc/acid.ms - 664 sys sys 1168701270 65160
+sys/doc/acid.ms - 664 sys sys 1172764379 65609
 sys/doc/acid.ps - 664 sys sys 1015012454 426359
 sys/doc/acid.ps - 664 sys sys 1015012454 426359
 sys/doc/acidpaper.ms - 664 sys sys 1138396403 44851
 sys/doc/acidpaper.ms - 664 sys sys 1138396403 44851
 sys/doc/acidpaper.ps - 664 sys sys 960837913 359639
 sys/doc/acidpaper.ps - 664 sys sys 960837913 359639
@@ -7339,7 +7339,7 @@ sys/man/1/jpg - 664 sys sys 1166760721 4841
 sys/man/1/kbmap - 664 sys sys 1159419894 846
 sys/man/1/kbmap - 664 sys sys 1159419894 846
 sys/man/1/kill - 664 sys sys 1018369246 1193
 sys/man/1/kill - 664 sys sys 1018369246 1193
 sys/man/1/ktrace - 664 sys sys 957920006 1330
 sys/man/1/ktrace - 664 sys sys 957920006 1330
-sys/man/1/leak - 664 sys sys 1168893962 3457
+sys/man/1/leak - 664 sys sys 1172760642 4097
 sys/man/1/lens - 664 sys sys 1130425868 1272
 sys/man/1/lens - 664 sys sys 1130425868 1272
 sys/man/1/lex - 664 sys sys 1113743328 1520
 sys/man/1/lex - 664 sys sys 1113743328 1520
 sys/man/1/look - 664 sys sys 1113743326 1357
 sys/man/1/look - 664 sys sys 1113743326 1357
@@ -7615,7 +7615,7 @@ sys/man/4/INDEX.html - 664 sys sys 1141352366 5045
 sys/man/4/acme - 664 sys sys 1142172883 10392
 sys/man/4/acme - 664 sys sys 1142172883 10392
 sys/man/4/archfs - 664 sys sys 960000712 533
 sys/man/4/archfs - 664 sys sys 960000712 533
 sys/man/4/cdfs - 664 sys sys 1026846913 3638
 sys/man/4/cdfs - 664 sys sys 1026846913 3638
-sys/man/4/cfs - 664 sys sys 1015024813 1758
+sys/man/4/cfs - 664 sys sys 1172762903 1813
 sys/man/4/consolefs - 664 sys sys 1144424854 4245
 sys/man/4/consolefs - 664 sys sys 1144424854 4245
 sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/execnet - 664 sys sys 1019866708 1069
 sys/man/4/execnet - 664 sys sys 1019866708 1069
@@ -7648,7 +7648,7 @@ sys/man/4/tapefs - 664 sys sys 1140965924 1861
 sys/man/4/telco - 664 sys sys 1015024814 4359
 sys/man/4/telco - 664 sys sys 1015024814 4359
 sys/man/4/u9fs - 664 sys sys 1043769139 4748
 sys/man/4/u9fs - 664 sys sys 1043769139 4748
 sys/man/4/upasfs - 664 sys sys 1034348505 6212
 sys/man/4/upasfs - 664 sys sys 1034348505 6212
-sys/man/4/usb - 664 sys sys 1167253879 4649
+sys/man/4/usb - 664 sys sys 1172764045 4682
 sys/man/4/usbd - 664 sys sys 1164149441 712
 sys/man/4/usbd - 664 sys sys 1164149441 712
 sys/man/4/vacfs - 664 sys sys 1084333062 1545
 sys/man/4/vacfs - 664 sys sys 1084333062 1545
 sys/man/4/webcookies - 664 sys sys 1019828742 3525
 sys/man/4/webcookies - 664 sys sys 1019828742 3525
@@ -9321,12 +9321,12 @@ sys/src/cmd/9nfs/unixnames.c - 664 sys sys 1065963574 6006
 sys/src/cmd/9nfs/xfile.c - 664 sys sys 1131293680 1894
 sys/src/cmd/9nfs/xfile.c - 664 sys sys 1131293680 1894
 sys/src/cmd/aan.c - 664 sys sys 1019856827 9758
 sys/src/cmd/aan.c - 664 sys sys 1019856827 9758
 sys/src/cmd/acid - 20000000775 sys sys 1063859225 0
 sys/src/cmd/acid - 20000000775 sys sys 1063859225 0
-sys/src/cmd/acid/acid.h - 664 sys sys 1131289460 4273
-sys/src/cmd/acid/builtin.c - 664 sys sys 1168034619 20982
-sys/src/cmd/acid/dbg.y - 664 sys sys 1131289463 5568
+sys/src/cmd/acid/acid.h - 664 sys sys 1172764379 4305
+sys/src/cmd/acid/builtin.c - 664 sys sys 1172764379 21752
+sys/src/cmd/acid/dbg.y - 664 sys sys 1172764472 5552
 sys/src/cmd/acid/dot.c - 664 sys sys 1131289462 2162
 sys/src/cmd/acid/dot.c - 664 sys sys 1131289462 2162
 sys/src/cmd/acid/exec.c - 664 sys sys 1132674180 8383
 sys/src/cmd/acid/exec.c - 664 sys sys 1132674180 8383
-sys/src/cmd/acid/expr.c - 664 sys sys 1168034614 15242
+sys/src/cmd/acid/expr.c - 664 sys sys 1172799792 15425
 sys/src/cmd/acid/lex.c - 664 sys sys 1131289460 7963
 sys/src/cmd/acid/lex.c - 664 sys sys 1131289460 7963
 sys/src/cmd/acid/list.c - 664 sys sys 1131289462 3680
 sys/src/cmd/acid/list.c - 664 sys sys 1131289462 3680
 sys/src/cmd/acid/main.c - 664 sys sys 1143695038 8549
 sys/src/cmd/acid/main.c - 664 sys sys 1143695038 8549
@@ -9477,7 +9477,7 @@ sys/src/cmd/astro/venust.c - 664 sys sys 944960761 739
 sys/src/cmd/auth - 20000000775 sys sys 1071334976 0
 sys/src/cmd/auth - 20000000775 sys sys 1071334976 0
 sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
 sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
 sys/src/cmd/auth/authcmdlib.h - 664 sys sys 1155994851 1421
 sys/src/cmd/auth/authcmdlib.h - 664 sys sys 1155994851 1421
-sys/src/cmd/auth/authsrv.c - 664 sys sys 1143694958 18403
+sys/src/cmd/auth/authsrv.c - 664 sys sys 1172776678 18383
 sys/src/cmd/auth/challenge.c - 664 sys sys 1015008432 980
 sys/src/cmd/auth/challenge.c - 664 sys sys 1015008432 980
 sys/src/cmd/auth/changeuser.c - 664 sys sys 1155994851 2949
 sys/src/cmd/auth/changeuser.c - 664 sys sys 1155994851 2949
 sys/src/cmd/auth/convbio.c - 664 sys sys 1015008432 2212
 sys/src/cmd/auth/convbio.c - 664 sys sys 1015008432 2212
@@ -9507,7 +9507,7 @@ sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1140272941 14955
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
 sys/src/cmd/auth/factotum/util.c - 664 sys sys 1143694878 18460
 sys/src/cmd/auth/factotum/util.c - 664 sys sys 1143694878 18460
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
-sys/src/cmd/auth/guard.srv.c - 664 sys sys 1143759354 2412
+sys/src/cmd/auth/guard.srv.c - 664 sys sys 1172776773 2873
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
 sys/src/cmd/auth/keyfs.c - 664 sys sys 1140272942 17633
 sys/src/cmd/auth/keyfs.c - 664 sys sys 1140272942 17633
 sys/src/cmd/auth/lib - 20000000775 sys sys 1045504996 0
 sys/src/cmd/auth/lib - 20000000775 sys sys 1045504996 0
@@ -9522,7 +9522,7 @@ sys/src/cmd/auth/lib/netcheck.c - 664 sys sys 1155994850 2065
 sys/src/cmd/auth/lib/okpasswd.c - 664 sys sys 1155994850 707
 sys/src/cmd/auth/lib/okpasswd.c - 664 sys sys 1155994850 707
 sys/src/cmd/auth/lib/querybio.c - 664 sys sys 1015008430 1344
 sys/src/cmd/auth/lib/querybio.c - 664 sys sys 1015008430 1344
 sys/src/cmd/auth/lib/rdbio.c - 664 sys sys 1015008430 958
 sys/src/cmd/auth/lib/rdbio.c - 664 sys sys 1015008430 958
-sys/src/cmd/auth/lib/readarg.c - 664 sys sys 1155994850 298
+sys/src/cmd/auth/lib/readarg.c - 664 sys sys 1172776607 311
 sys/src/cmd/auth/lib/readln.c - 664 sys sys 1155994851 2057
 sys/src/cmd/auth/lib/readln.c - 664 sys sys 1155994851 2057
 sys/src/cmd/auth/lib/readn.c - 664 sys sys 1155994851 264
 sys/src/cmd/auth/lib/readn.c - 664 sys sys 1155994851 264
 sys/src/cmd/auth/lib/readwrite.c - 664 sys sys 1155994851 1441
 sys/src/cmd/auth/lib/readwrite.c - 664 sys sys 1155994851 1441
@@ -9553,13 +9553,13 @@ sys/src/cmd/auth/secstore/dirls.c - 664 sys sys 1062277640 1842
 sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1106577499 836
 sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1106577499 836
 sys/src/cmd/auth/secstore/pak.c - 664 sys sys 1140272943 9314
 sys/src/cmd/auth/secstore/pak.c - 664 sys sys 1140272943 9314
 sys/src/cmd/auth/secstore/password.c - 664 sys sys 1106577427 2929
 sys/src/cmd/auth/secstore/password.c - 664 sys sys 1106577427 2929
-sys/src/cmd/auth/secstore/secchk.c - 664 sys sys 1055698993 560
+sys/src/cmd/auth/secstore/secchk.c - 664 sys sys 1172776633 565
 sys/src/cmd/auth/secstore/secstore.c - 664 sys sys 1143465894 12678
 sys/src/cmd/auth/secstore/secstore.c - 664 sys sys 1143465894 12678
 sys/src/cmd/auth/secstore/secstore.h - 664 sys sys 1106575526 859
 sys/src/cmd/auth/secstore/secstore.h - 664 sys sys 1106575526 859
 sys/src/cmd/auth/secstore/secstored.c - 664 sys sys 1140272944 8087
 sys/src/cmd/auth/secstore/secstored.c - 664 sys sys 1140272944 8087
 sys/src/cmd/auth/secstore/secuser.c - 664 sys sys 1143465899 5136
 sys/src/cmd/auth/secstore/secuser.c - 664 sys sys 1143465899 5136
 sys/src/cmd/auth/secstore/util.c - 664 sys sys 1143694883 1741
 sys/src/cmd/auth/secstore/util.c - 664 sys sys 1143694883 1741
-sys/src/cmd/auth/secureidcheck.c - 664 sys sys 1168307802 9787
+sys/src/cmd/auth/secureidcheck.c - 664 sys sys 1172776708 9914
 sys/src/cmd/auth/status - 775 sys sys 1015008430 738
 sys/src/cmd/auth/status - 775 sys sys 1015008430 738
 sys/src/cmd/auth/uniq.c - 664 sys sys 1140272945 1440
 sys/src/cmd/auth/uniq.c - 664 sys sys 1140272945 1440
 sys/src/cmd/auth/userpasswd.c - 664 sys sys 1015008432 591
 sys/src/cmd/auth/userpasswd.c - 664 sys sys 1015008432 591
@@ -9886,14 +9886,14 @@ sys/src/cmd/cdfs/mmc.c - 664 sys sys 1146318348 17198
 sys/src/cmd/cfs - 20000000775 sys sys 1045505024 0
 sys/src/cmd/cfs - 20000000775 sys sys 1045505024 0
 sys/src/cmd/cfs/bcache.c - 664 sys sys 1172123361 2964
 sys/src/cmd/cfs/bcache.c - 664 sys sys 1172123361 2964
 sys/src/cmd/cfs/bcache.h - 664 sys sys 1014925220 797
 sys/src/cmd/cfs/bcache.h - 664 sys sys 1014925220 797
-sys/src/cmd/cfs/cformat.h - 664 sys sys 1172125152 1400
-sys/src/cmd/cfs/cfs.c - 664 sys sys 1172123357 16567
-sys/src/cmd/cfs/disk.c - 664 sys sys 1172123358 5900
-sys/src/cmd/cfs/disk.h - 664 sys sys 1172123358 471
+sys/src/cmd/cfs/cformat.h - 664 sys sys 1172762903 1386
+sys/src/cmd/cfs/cfs.c - 664 sys sys 1172801081 17100
+sys/src/cmd/cfs/disk.c - 664 sys sys 1172801077 6106
+sys/src/cmd/cfs/disk.h - 664 sys sys 1172762904 482
 sys/src/cmd/cfs/file.c - 664 sys sys 1172123358 5088
 sys/src/cmd/cfs/file.c - 664 sys sys 1172123358 5088
 sys/src/cmd/cfs/file.h - 664 sys sys 944960876 225
 sys/src/cmd/cfs/file.h - 664 sys sys 944960876 225
-sys/src/cmd/cfs/inode.c - 664 sys sys 1172123357 6939
-sys/src/cmd/cfs/inode.h - 664 sys sys 944960876 1145
+sys/src/cmd/cfs/inode.c - 664 sys sys 1172762904 6963
+sys/src/cmd/cfs/inode.h - 664 sys sys 1172762905 1152
 sys/src/cmd/cfs/lru.c - 664 sys sys 944960876 1013
 sys/src/cmd/cfs/lru.c - 664 sys sys 944960876 1013
 sys/src/cmd/cfs/lru.h - 664 sys sys 944960876 197
 sys/src/cmd/cfs/lru.h - 664 sys sys 944960876 197
 sys/src/cmd/cfs/mkfile - 664 sys sys 1032457443 663
 sys/src/cmd/cfs/mkfile - 664 sys sys 1032457443 663
@@ -10170,7 +10170,7 @@ sys/src/cmd/fax/receiverc - 775 sys sys 944960990 581
 sys/src/cmd/fax/send.c - 664 sys sys 944960990 923
 sys/src/cmd/fax/send.c - 664 sys sys 944960990 923
 sys/src/cmd/fax/subr.c - 664 sys sys 1015090401 1245
 sys/src/cmd/fax/subr.c - 664 sys sys 1015090401 1245
 sys/src/cmd/fcp.c - 664 sys sys 1136651872 3799
 sys/src/cmd/fcp.c - 664 sys sys 1136651872 3799
-sys/src/cmd/file.c - 664 sys sys 1166761867 28088
+sys/src/cmd/file.c - 664 sys sys 1172764226 28088
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
@@ -12269,7 +12269,7 @@ sys/src/cmd/gzip/zip.h - 664 sys sys 954778719 1428
 sys/src/cmd/hget.c - 664 sys sys 1161442159 25962
 sys/src/cmd/hget.c - 664 sys sys 1161442159 25962
 sys/src/cmd/history.c - 664 sys sys 1136378274 6098
 sys/src/cmd/history.c - 664 sys sys 1136378274 6098
 sys/src/cmd/hoc - 20000000775 sys sys 1039727559 0
 sys/src/cmd/hoc - 20000000775 sys sys 1039727559 0
-sys/src/cmd/hoc/code.c - 664 sys sys 1172257358 10061
+sys/src/cmd/hoc/code.c - 664 sys sys 1172800014 10063
 sys/src/cmd/hoc/hoc.h - 664 sys sys 944960999 2358
 sys/src/cmd/hoc/hoc.h - 664 sys sys 944960999 2358
 sys/src/cmd/hoc/hoc.y - 664 sys sys 1155364037 9666
 sys/src/cmd/hoc/hoc.y - 664 sys sys 1155364037 9666
 sys/src/cmd/hoc/init.c - 664 sys sys 944960999 1441
 sys/src/cmd/hoc/init.c - 664 sys sys 944960999 1441
@@ -14108,12 +14108,12 @@ sys/src/cmd/upas/vf/mkfile - 664 sys sys 1064393881 241
 sys/src/cmd/upas/vf/vf.c - 664 sys sys 1143759341 20030
 sys/src/cmd/upas/vf/vf.c - 664 sys sys 1143759341 20030
 sys/src/cmd/usb - 20000000775 sys sys 1091205029 0
 sys/src/cmd/usb - 20000000775 sys sys 1091205029 0
 sys/src/cmd/usb/audio - 20000000775 sys sys 1091204980 0
 sys/src/cmd/usb/audio - 20000000775 sys sys 1091204980 0
-sys/src/cmd/usb/audio/audiofs.c - 664 sys sys 1143759340 18169
-sys/src/cmd/usb/audio/audiosub.c - 664 sys sys 1140695061 8085
+sys/src/cmd/usb/audio/audiofs.c - 664 sys sys 1172764045 18191
+sys/src/cmd/usb/audio/audiosub.c - 664 sys sys 1172764044 8275
 sys/src/cmd/usb/audio/mkfile - 664 sys sys 1091204980 349
 sys/src/cmd/usb/audio/mkfile - 664 sys sys 1091204980 349
-sys/src/cmd/usb/audio/usbaudio.c - 664 sys sys 1140695061 10155
+sys/src/cmd/usb/audio/usbaudio.c - 664 sys sys 1172764045 10358
 sys/src/cmd/usb/audio/usbaudio.h - 664 sys sys 1140695062 1889
 sys/src/cmd/usb/audio/usbaudio.h - 664 sys sys 1140695062 1889
-sys/src/cmd/usb/audio/usbaudioctl.c - 664 sys sys 1140695062 18245
+sys/src/cmd/usb/audio/usbaudioctl.c - 664 sys sys 1172764044 18825
 sys/src/cmd/usb/audio/usbaudioctl.h - 664 sys sys 1140695062 618
 sys/src/cmd/usb/audio/usbaudioctl.h - 664 sys sys 1140695062 618
 sys/src/cmd/usb/lib - 20000000775 sys sys 1091204979 0
 sys/src/cmd/usb/lib - 20000000775 sys sys 1091204979 0
 sys/src/cmd/usb/lib/device.c - 664 sys sys 1168308464 3284
 sys/src/cmd/usb/lib/device.c - 664 sys sys 1168308464 3284
@@ -14320,7 +14320,7 @@ sys/src/cmd/webfs/cookies.c - 664 sys sys 1128664611 21888
 sys/src/cmd/webfs/dat.h - 664 sys sys 1128664462 1621
 sys/src/cmd/webfs/dat.h - 664 sys sys 1128664462 1621
 sys/src/cmd/webfs/fns.h - 664 sys sys 1032665987 1453
 sys/src/cmd/webfs/fns.h - 664 sys sys 1032665987 1453
 sys/src/cmd/webfs/fs.c - 664 sys sys 1128664603 10944
 sys/src/cmd/webfs/fs.c - 664 sys sys 1128664603 10944
-sys/src/cmd/webfs/http.c - 664 sys sys 1161484900 10381
+sys/src/cmd/webfs/http.c - 664 sys sys 1172759957 10408
 sys/src/cmd/webfs/io.c - 664 sys sys 1034736588 1384
 sys/src/cmd/webfs/io.c - 664 sys sys 1034736588 1384
 sys/src/cmd/webfs/main.c - 664 sys sys 1128664462 1083
 sys/src/cmd/webfs/main.c - 664 sys sys 1128664462 1083
 sys/src/cmd/webfs/mkfile - 664 sys sys 1032665986 340
 sys/src/cmd/webfs/mkfile - 664 sys sys 1032665986 340
@@ -14585,7 +14585,7 @@ sys/src/lib9p/intmap.c - 664 sys sys 1016833881 2255
 sys/src/lib9p/listen.c - 664 sys sys 1134335266 1626
 sys/src/lib9p/listen.c - 664 sys sys 1134335266 1626
 sys/src/lib9p/mem.c - 664 sys sys 1015023310 765
 sys/src/lib9p/mem.c - 664 sys sys 1015023310 765
 sys/src/lib9p/mkfile - 664 sys sys 1134337555 387
 sys/src/lib9p/mkfile - 664 sys sys 1134337555 387
-sys/src/lib9p/parse.c - 664 sys sys 1032324435 2050
+sys/src/lib9p/parse.c - 664 sys sys 1172760149 2089
 sys/src/lib9p/post.c - 664 sys sys 1134346047 1559
 sys/src/lib9p/post.c - 664 sys sys 1134346047 1559
 sys/src/lib9p/ramfs.c - 664 sys sys 1134335266 2657
 sys/src/lib9p/ramfs.c - 664 sys sys 1134335266 2657
 sys/src/lib9p/req.c - 664 sys sys 1089299187 1652
 sys/src/lib9p/req.c - 664 sys sys 1089299187 1652
@@ -15685,3 +15685,9 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
+386/bin/acid - 775 sys sys 1172808055 401961
+386/bin/cfs - 775 sys sys 1172808057 131665
+386/bin/hoc - 775 sys sys 1172808058 100101
+386/bin/auth/authsrv - 775 sys sys 1172808056 166692
+386/bin/auth/guard.srv - 775 sys sys 1172808056 145120
+386/bin/auth/secstored - 775 sys sys 1172808057 198043

+ 36 - 36
dist/replica/plan9.db

@@ -19,7 +19,7 @@
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/aan - 775 sys sys 1168402261 131298
 386/bin/aan - 775 sys sys 1168402261 131298
-386/bin/acid - 775 sys sys 1172203052 401181
+386/bin/acid - 775 sys sys 1172808055 401961
 386/bin/acme - 775 sys sys 1168402263 432256
 386/bin/acme - 775 sys sys 1168402263 432256
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape/basename - 775 sys sys 1136656314 132873
 386/bin/ape/basename - 775 sys sys 1136656314 132873
@@ -45,7 +45,7 @@
 386/bin/auth - 20000000775 sys sys 1016920815 0
 386/bin/auth - 20000000775 sys sys 1016920815 0
 386/bin/auth/aescbc - 775 sys sys 1171830297 141337
 386/bin/auth/aescbc - 775 sys sys 1171830297 141337
 386/bin/auth/asn12rsa - 775 sys sys 1168402266 120828
 386/bin/auth/asn12rsa - 775 sys sys 1168402266 120828
-386/bin/auth/authsrv - 775 sys sys 1169612018 166651
+386/bin/auth/authsrv - 775 sys sys 1172808056 166692
 386/bin/auth/changeuser - 775 sys sys 1168402267 97488
 386/bin/auth/changeuser - 775 sys sys 1168402267 97488
 386/bin/auth/convkeys - 775 sys sys 1171830297 88680
 386/bin/auth/convkeys - 775 sys sys 1171830297 88680
 386/bin/auth/convkeys2 - 775 sys sys 1171830297 88739
 386/bin/auth/convkeys2 - 775 sys sys 1171830297 88739
@@ -55,7 +55,7 @@
 386/bin/auth/enable - 775 sys sys 1020319057 134
 386/bin/auth/enable - 775 sys sys 1020319057 134
 386/bin/auth/factotum - 775 sys sys 1171830298 322644
 386/bin/auth/factotum - 775 sys sys 1171830298 322644
 386/bin/auth/fgui - 775 sys sys 1168402269 218990
 386/bin/auth/fgui - 775 sys sys 1168402269 218990
-386/bin/auth/guard.srv - 775 sys sys 1169612018 143828
+386/bin/auth/guard.srv - 775 sys sys 1172808056 145120
 386/bin/auth/iam - 775 sys sys 1085076981 50791
 386/bin/auth/iam - 775 sys sys 1085076981 50791
 386/bin/auth/keyfs - 775 sys sys 1171830298 116576
 386/bin/auth/keyfs - 775 sys sys 1171830298 116576
 386/bin/auth/login - 775 sys sys 1168402270 104747
 386/bin/auth/login - 775 sys sys 1168402270 104747
@@ -72,7 +72,7 @@
 386/bin/auth/rsagen - 775 sys sys 1168402273 153528
 386/bin/auth/rsagen - 775 sys sys 1168402273 153528
 386/bin/auth/secretpem - 775 sys sys 1045537944 118526
 386/bin/auth/secretpem - 775 sys sys 1045537944 118526
 386/bin/auth/secstore - 775 sys sys 1171830299 196463
 386/bin/auth/secstore - 775 sys sys 1171830299 196463
-386/bin/auth/secstored - 775 sys sys 1169612019 198002
+386/bin/auth/secstored - 775 sys sys 1172808057 198043
 386/bin/auth/secuser - 775 sys sys 1168402275 153231
 386/bin/auth/secuser - 775 sys sys 1168402275 153231
 386/bin/auth/status - 775 sys sys 1020319060 738
 386/bin/auth/status - 775 sys sys 1020319060 738
 386/bin/auth/uniq - 775 sys sys 1168402275 63314
 386/bin/auth/uniq - 775 sys sys 1168402275 63314
@@ -95,7 +95,7 @@
 386/bin/aux/cropmarks - 775 sys sys 1020319062 1808
 386/bin/aux/cropmarks - 775 sys sys 1020319062 1808
 386/bin/aux/data2s - 775 sys sys 1168402278 60761
 386/bin/aux/data2s - 775 sys sys 1168402278 60761
 386/bin/aux/depend - 775 sys sys 1168402279 146101
 386/bin/aux/depend - 775 sys sys 1168402279 146101
-386/bin/aux/disksim - 775 sys sys 1168402279 150825
+386/bin/aux/disksim - 775 sys sys 1172780591 150851
 386/bin/aux/download - 775 sys sys 1087442506 176016
 386/bin/aux/download - 775 sys sys 1087442506 176016
 386/bin/aux/faxreceive - 775 sys sys 1168402279 84186
 386/bin/aux/faxreceive - 775 sys sys 1168402279 84186
 386/bin/aux/faxsend - 775 sys sys 1168402280 89693
 386/bin/aux/faxsend - 775 sys sys 1168402280 89693
@@ -176,7 +176,7 @@
 386/bin/cat - 775 sys sys 1148500611 37482
 386/bin/cat - 775 sys sys 1148500611 37482
 386/bin/cb - 775 sys sys 1168402293 77628
 386/bin/cb - 775 sys sys 1168402293 77628
 386/bin/cdfs - 775 sys sys 1168402294 167435
 386/bin/cdfs - 775 sys sys 1168402294 167435
-386/bin/cfs - 775 sys sys 1172175927 128780
+386/bin/cfs - 775 sys sys 1172808057 131665
 386/bin/chgrp - 775 sys sys 1168402294 59522
 386/bin/chgrp - 775 sys sys 1168402294 59522
 386/bin/chmod - 775 sys sys 1168402294 62518
 386/bin/chmod - 775 sys sys 1168402294 62518
 386/bin/cifscmd - 775 sys sys 1169612022 343611
 386/bin/cifscmd - 775 sys sys 1169612022 343611
@@ -274,7 +274,7 @@
 386/bin/hayes - 775 sys sys 1168402314 64793
 386/bin/hayes - 775 sys sys 1168402314 64793
 386/bin/hget - 775 sys sys 1169612024 233943
 386/bin/hget - 775 sys sys 1169612024 233943
 386/bin/history - 775 sys sys 1168402314 75705
 386/bin/history - 775 sys sys 1168402314 75705
-386/bin/hoc - 775 sys sys 1172289653 100101
+386/bin/hoc - 775 sys sys 1172808058 100101
 386/bin/html2ms - 775 sys sys 1168402315 66321
 386/bin/html2ms - 775 sys sys 1168402315 66321
 386/bin/htmlfmt - 775 sys sys 1168402315 163476
 386/bin/htmlfmt - 775 sys sys 1168402315 163476
 386/bin/htmlroff - 775 sys sys 1168402315 148450
 386/bin/htmlroff - 775 sys sys 1168402315 148450
@@ -543,7 +543,7 @@
 386/lib/ape/libregexp.a - 664 sys sys 1143777857 47500
 386/lib/ape/libregexp.a - 664 sys sys 1143777857 47500
 386/lib/ape/libutf.a - 664 sys sys 1146156980 88500
 386/lib/ape/libutf.a - 664 sys sys 1146156980 88500
 386/lib/ape/libv.a - 664 sys sys 1143777858 19668
 386/lib/ape/libv.a - 664 sys sys 1143777858 19668
-386/lib/lib9p.a - 664 sys sys 1168402362 90956
+386/lib/lib9p.a - 664 sys sys 1172780592 91012
 386/lib/libString.a - 664 sys sys 1168402362 22126
 386/lib/libString.a - 664 sys sys 1168402362 22126
 386/lib/libauth.a - 664 sys sys 1171743876 58570
 386/lib/libauth.a - 664 sys sys 1171743876 58570
 386/lib/libauthsrv.a - 664 sys sys 1171830301 35838
 386/lib/libauthsrv.a - 664 sys sys 1171830301 35838
@@ -5464,7 +5464,7 @@ rc/bin/kill - 775 sys sys 1143389260 142
 rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/label - 775 sys sys 945617207 34
 rc/bin/label - 775 sys sys 945617207 34
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/lc - 775 sys sys 945617207 24
-rc/bin/leak - 775 sys sys 1139744263 1052
+rc/bin/leak - 775 sys sys 1172760642 1921
 rc/bin/lookman - 775 sys sys 1017679344 686
 rc/bin/lookman - 775 sys sys 1017679344 686
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/mail - 775 sys sys 1045504003 138
@@ -5624,7 +5624,7 @@ sys/doc/8½/fig1.ps - 664 sys sys 1020895859 473747
 sys/doc/8½/mkfile - 664 sys sys 1138459303 214
 sys/doc/8½/mkfile - 664 sys sys 1138459303 214
 sys/doc/9.ms - 664 sys sys 1138396402 84662
 sys/doc/9.ms - 664 sys sys 1138396402 84662
 sys/doc/9.ps - 664 sys sys 960837924 508340
 sys/doc/9.ps - 664 sys sys 960837924 508340
-sys/doc/acid.ms - 664 sys sys 1168701270 65160
+sys/doc/acid.ms - 664 sys sys 1172764379 65609
 sys/doc/acid.ps - 664 sys sys 1015012454 426359
 sys/doc/acid.ps - 664 sys sys 1015012454 426359
 sys/doc/acidpaper.ms - 664 sys sys 1138396403 44851
 sys/doc/acidpaper.ms - 664 sys sys 1138396403 44851
 sys/doc/acidpaper.ps - 664 sys sys 960837913 359639
 sys/doc/acidpaper.ps - 664 sys sys 960837913 359639
@@ -7339,7 +7339,7 @@ sys/man/1/jpg - 664 sys sys 1166760721 4841
 sys/man/1/kbmap - 664 sys sys 1159419894 846
 sys/man/1/kbmap - 664 sys sys 1159419894 846
 sys/man/1/kill - 664 sys sys 1018369246 1193
 sys/man/1/kill - 664 sys sys 1018369246 1193
 sys/man/1/ktrace - 664 sys sys 957920006 1330
 sys/man/1/ktrace - 664 sys sys 957920006 1330
-sys/man/1/leak - 664 sys sys 1168893962 3457
+sys/man/1/leak - 664 sys sys 1172760642 4097
 sys/man/1/lens - 664 sys sys 1130425868 1272
 sys/man/1/lens - 664 sys sys 1130425868 1272
 sys/man/1/lex - 664 sys sys 1113743328 1520
 sys/man/1/lex - 664 sys sys 1113743328 1520
 sys/man/1/look - 664 sys sys 1113743326 1357
 sys/man/1/look - 664 sys sys 1113743326 1357
@@ -7615,7 +7615,7 @@ sys/man/4/INDEX.html - 664 sys sys 1141352366 5045
 sys/man/4/acme - 664 sys sys 1142172883 10392
 sys/man/4/acme - 664 sys sys 1142172883 10392
 sys/man/4/archfs - 664 sys sys 960000712 533
 sys/man/4/archfs - 664 sys sys 960000712 533
 sys/man/4/cdfs - 664 sys sys 1026846913 3638
 sys/man/4/cdfs - 664 sys sys 1026846913 3638
-sys/man/4/cfs - 664 sys sys 1015024813 1758
+sys/man/4/cfs - 664 sys sys 1172762903 1813
 sys/man/4/consolefs - 664 sys sys 1144424854 4245
 sys/man/4/consolefs - 664 sys sys 1144424854 4245
 sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/execnet - 664 sys sys 1019866708 1069
 sys/man/4/execnet - 664 sys sys 1019866708 1069
@@ -7648,7 +7648,7 @@ sys/man/4/tapefs - 664 sys sys 1140965924 1861
 sys/man/4/telco - 664 sys sys 1015024814 4359
 sys/man/4/telco - 664 sys sys 1015024814 4359
 sys/man/4/u9fs - 664 sys sys 1043769139 4748
 sys/man/4/u9fs - 664 sys sys 1043769139 4748
 sys/man/4/upasfs - 664 sys sys 1034348505 6212
 sys/man/4/upasfs - 664 sys sys 1034348505 6212
-sys/man/4/usb - 664 sys sys 1167253879 4649
+sys/man/4/usb - 664 sys sys 1172764045 4682
 sys/man/4/usbd - 664 sys sys 1164149441 712
 sys/man/4/usbd - 664 sys sys 1164149441 712
 sys/man/4/vacfs - 664 sys sys 1084333062 1545
 sys/man/4/vacfs - 664 sys sys 1084333062 1545
 sys/man/4/webcookies - 664 sys sys 1019828742 3525
 sys/man/4/webcookies - 664 sys sys 1019828742 3525
@@ -9321,12 +9321,12 @@ sys/src/cmd/9nfs/unixnames.c - 664 sys sys 1065963574 6006
 sys/src/cmd/9nfs/xfile.c - 664 sys sys 1131293680 1894
 sys/src/cmd/9nfs/xfile.c - 664 sys sys 1131293680 1894
 sys/src/cmd/aan.c - 664 sys sys 1019856827 9758
 sys/src/cmd/aan.c - 664 sys sys 1019856827 9758
 sys/src/cmd/acid - 20000000775 sys sys 1063859225 0
 sys/src/cmd/acid - 20000000775 sys sys 1063859225 0
-sys/src/cmd/acid/acid.h - 664 sys sys 1131289460 4273
-sys/src/cmd/acid/builtin.c - 664 sys sys 1168034619 20982
-sys/src/cmd/acid/dbg.y - 664 sys sys 1131289463 5568
+sys/src/cmd/acid/acid.h - 664 sys sys 1172764379 4305
+sys/src/cmd/acid/builtin.c - 664 sys sys 1172764379 21752
+sys/src/cmd/acid/dbg.y - 664 sys sys 1172764472 5552
 sys/src/cmd/acid/dot.c - 664 sys sys 1131289462 2162
 sys/src/cmd/acid/dot.c - 664 sys sys 1131289462 2162
 sys/src/cmd/acid/exec.c - 664 sys sys 1132674180 8383
 sys/src/cmd/acid/exec.c - 664 sys sys 1132674180 8383
-sys/src/cmd/acid/expr.c - 664 sys sys 1168034614 15242
+sys/src/cmd/acid/expr.c - 664 sys sys 1172799792 15425
 sys/src/cmd/acid/lex.c - 664 sys sys 1131289460 7963
 sys/src/cmd/acid/lex.c - 664 sys sys 1131289460 7963
 sys/src/cmd/acid/list.c - 664 sys sys 1131289462 3680
 sys/src/cmd/acid/list.c - 664 sys sys 1131289462 3680
 sys/src/cmd/acid/main.c - 664 sys sys 1143695038 8549
 sys/src/cmd/acid/main.c - 664 sys sys 1143695038 8549
@@ -9477,7 +9477,7 @@ sys/src/cmd/astro/venust.c - 664 sys sys 944960761 739
 sys/src/cmd/auth - 20000000775 sys sys 1071334976 0
 sys/src/cmd/auth - 20000000775 sys sys 1071334976 0
 sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
 sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
 sys/src/cmd/auth/authcmdlib.h - 664 sys sys 1155994851 1421
 sys/src/cmd/auth/authcmdlib.h - 664 sys sys 1155994851 1421
-sys/src/cmd/auth/authsrv.c - 664 sys sys 1143694958 18403
+sys/src/cmd/auth/authsrv.c - 664 sys sys 1172776678 18383
 sys/src/cmd/auth/challenge.c - 664 sys sys 1015008432 980
 sys/src/cmd/auth/challenge.c - 664 sys sys 1015008432 980
 sys/src/cmd/auth/changeuser.c - 664 sys sys 1155994851 2949
 sys/src/cmd/auth/changeuser.c - 664 sys sys 1155994851 2949
 sys/src/cmd/auth/convbio.c - 664 sys sys 1015008432 2212
 sys/src/cmd/auth/convbio.c - 664 sys sys 1015008432 2212
@@ -9507,7 +9507,7 @@ sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1140272941 14955
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
 sys/src/cmd/auth/factotum/util.c - 664 sys sys 1143694878 18460
 sys/src/cmd/auth/factotum/util.c - 664 sys sys 1143694878 18460
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
-sys/src/cmd/auth/guard.srv.c - 664 sys sys 1143759354 2412
+sys/src/cmd/auth/guard.srv.c - 664 sys sys 1172776773 2873
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
 sys/src/cmd/auth/keyfs.c - 664 sys sys 1140272942 17633
 sys/src/cmd/auth/keyfs.c - 664 sys sys 1140272942 17633
 sys/src/cmd/auth/lib - 20000000775 sys sys 1045504996 0
 sys/src/cmd/auth/lib - 20000000775 sys sys 1045504996 0
@@ -9522,7 +9522,7 @@ sys/src/cmd/auth/lib/netcheck.c - 664 sys sys 1155994850 2065
 sys/src/cmd/auth/lib/okpasswd.c - 664 sys sys 1155994850 707
 sys/src/cmd/auth/lib/okpasswd.c - 664 sys sys 1155994850 707
 sys/src/cmd/auth/lib/querybio.c - 664 sys sys 1015008430 1344
 sys/src/cmd/auth/lib/querybio.c - 664 sys sys 1015008430 1344
 sys/src/cmd/auth/lib/rdbio.c - 664 sys sys 1015008430 958
 sys/src/cmd/auth/lib/rdbio.c - 664 sys sys 1015008430 958
-sys/src/cmd/auth/lib/readarg.c - 664 sys sys 1155994850 298
+sys/src/cmd/auth/lib/readarg.c - 664 sys sys 1172776607 311
 sys/src/cmd/auth/lib/readln.c - 664 sys sys 1155994851 2057
 sys/src/cmd/auth/lib/readln.c - 664 sys sys 1155994851 2057
 sys/src/cmd/auth/lib/readn.c - 664 sys sys 1155994851 264
 sys/src/cmd/auth/lib/readn.c - 664 sys sys 1155994851 264
 sys/src/cmd/auth/lib/readwrite.c - 664 sys sys 1155994851 1441
 sys/src/cmd/auth/lib/readwrite.c - 664 sys sys 1155994851 1441
@@ -9553,13 +9553,13 @@ sys/src/cmd/auth/secstore/dirls.c - 664 sys sys 1062277640 1842
 sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1106577499 836
 sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1106577499 836
 sys/src/cmd/auth/secstore/pak.c - 664 sys sys 1140272943 9314
 sys/src/cmd/auth/secstore/pak.c - 664 sys sys 1140272943 9314
 sys/src/cmd/auth/secstore/password.c - 664 sys sys 1106577427 2929
 sys/src/cmd/auth/secstore/password.c - 664 sys sys 1106577427 2929
-sys/src/cmd/auth/secstore/secchk.c - 664 sys sys 1055698993 560
+sys/src/cmd/auth/secstore/secchk.c - 664 sys sys 1172776633 565
 sys/src/cmd/auth/secstore/secstore.c - 664 sys sys 1143465894 12678
 sys/src/cmd/auth/secstore/secstore.c - 664 sys sys 1143465894 12678
 sys/src/cmd/auth/secstore/secstore.h - 664 sys sys 1106575526 859
 sys/src/cmd/auth/secstore/secstore.h - 664 sys sys 1106575526 859
 sys/src/cmd/auth/secstore/secstored.c - 664 sys sys 1140272944 8087
 sys/src/cmd/auth/secstore/secstored.c - 664 sys sys 1140272944 8087
 sys/src/cmd/auth/secstore/secuser.c - 664 sys sys 1143465899 5136
 sys/src/cmd/auth/secstore/secuser.c - 664 sys sys 1143465899 5136
 sys/src/cmd/auth/secstore/util.c - 664 sys sys 1143694883 1741
 sys/src/cmd/auth/secstore/util.c - 664 sys sys 1143694883 1741
-sys/src/cmd/auth/secureidcheck.c - 664 sys sys 1168307802 9787
+sys/src/cmd/auth/secureidcheck.c - 664 sys sys 1172776708 9914
 sys/src/cmd/auth/status - 775 sys sys 1015008430 738
 sys/src/cmd/auth/status - 775 sys sys 1015008430 738
 sys/src/cmd/auth/uniq.c - 664 sys sys 1140272945 1440
 sys/src/cmd/auth/uniq.c - 664 sys sys 1140272945 1440
 sys/src/cmd/auth/userpasswd.c - 664 sys sys 1015008432 591
 sys/src/cmd/auth/userpasswd.c - 664 sys sys 1015008432 591
@@ -9886,14 +9886,14 @@ sys/src/cmd/cdfs/mmc.c - 664 sys sys 1146318348 17198
 sys/src/cmd/cfs - 20000000775 sys sys 1045505024 0
 sys/src/cmd/cfs - 20000000775 sys sys 1045505024 0
 sys/src/cmd/cfs/bcache.c - 664 sys sys 1172123361 2964
 sys/src/cmd/cfs/bcache.c - 664 sys sys 1172123361 2964
 sys/src/cmd/cfs/bcache.h - 664 sys sys 1014925220 797
 sys/src/cmd/cfs/bcache.h - 664 sys sys 1014925220 797
-sys/src/cmd/cfs/cformat.h - 664 sys sys 1172125152 1400
-sys/src/cmd/cfs/cfs.c - 664 sys sys 1172123357 16567
-sys/src/cmd/cfs/disk.c - 664 sys sys 1172123358 5900
-sys/src/cmd/cfs/disk.h - 664 sys sys 1172123358 471
+sys/src/cmd/cfs/cformat.h - 664 sys sys 1172762903 1386
+sys/src/cmd/cfs/cfs.c - 664 sys sys 1172801081 17100
+sys/src/cmd/cfs/disk.c - 664 sys sys 1172801077 6106
+sys/src/cmd/cfs/disk.h - 664 sys sys 1172762904 482
 sys/src/cmd/cfs/file.c - 664 sys sys 1172123358 5088
 sys/src/cmd/cfs/file.c - 664 sys sys 1172123358 5088
 sys/src/cmd/cfs/file.h - 664 sys sys 944960876 225
 sys/src/cmd/cfs/file.h - 664 sys sys 944960876 225
-sys/src/cmd/cfs/inode.c - 664 sys sys 1172123357 6939
-sys/src/cmd/cfs/inode.h - 664 sys sys 944960876 1145
+sys/src/cmd/cfs/inode.c - 664 sys sys 1172762904 6963
+sys/src/cmd/cfs/inode.h - 664 sys sys 1172762905 1152
 sys/src/cmd/cfs/lru.c - 664 sys sys 944960876 1013
 sys/src/cmd/cfs/lru.c - 664 sys sys 944960876 1013
 sys/src/cmd/cfs/lru.h - 664 sys sys 944960876 197
 sys/src/cmd/cfs/lru.h - 664 sys sys 944960876 197
 sys/src/cmd/cfs/mkfile - 664 sys sys 1032457443 663
 sys/src/cmd/cfs/mkfile - 664 sys sys 1032457443 663
@@ -10170,7 +10170,7 @@ sys/src/cmd/fax/receiverc - 775 sys sys 944960990 581
 sys/src/cmd/fax/send.c - 664 sys sys 944960990 923
 sys/src/cmd/fax/send.c - 664 sys sys 944960990 923
 sys/src/cmd/fax/subr.c - 664 sys sys 1015090401 1245
 sys/src/cmd/fax/subr.c - 664 sys sys 1015090401 1245
 sys/src/cmd/fcp.c - 664 sys sys 1136651872 3799
 sys/src/cmd/fcp.c - 664 sys sys 1136651872 3799
-sys/src/cmd/file.c - 664 sys sys 1166761867 28088
+sys/src/cmd/file.c - 664 sys sys 1172764226 28088
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
@@ -12269,7 +12269,7 @@ sys/src/cmd/gzip/zip.h - 664 sys sys 954778719 1428
 sys/src/cmd/hget.c - 664 sys sys 1161442159 25962
 sys/src/cmd/hget.c - 664 sys sys 1161442159 25962
 sys/src/cmd/history.c - 664 sys sys 1136378274 6098
 sys/src/cmd/history.c - 664 sys sys 1136378274 6098
 sys/src/cmd/hoc - 20000000775 sys sys 1039727559 0
 sys/src/cmd/hoc - 20000000775 sys sys 1039727559 0
-sys/src/cmd/hoc/code.c - 664 sys sys 1172257358 10061
+sys/src/cmd/hoc/code.c - 664 sys sys 1172800014 10063
 sys/src/cmd/hoc/hoc.h - 664 sys sys 944960999 2358
 sys/src/cmd/hoc/hoc.h - 664 sys sys 944960999 2358
 sys/src/cmd/hoc/hoc.y - 664 sys sys 1155364037 9666
 sys/src/cmd/hoc/hoc.y - 664 sys sys 1155364037 9666
 sys/src/cmd/hoc/init.c - 664 sys sys 944960999 1441
 sys/src/cmd/hoc/init.c - 664 sys sys 944960999 1441
@@ -14108,12 +14108,12 @@ sys/src/cmd/upas/vf/mkfile - 664 sys sys 1064393881 241
 sys/src/cmd/upas/vf/vf.c - 664 sys sys 1143759341 20030
 sys/src/cmd/upas/vf/vf.c - 664 sys sys 1143759341 20030
 sys/src/cmd/usb - 20000000775 sys sys 1091205029 0
 sys/src/cmd/usb - 20000000775 sys sys 1091205029 0
 sys/src/cmd/usb/audio - 20000000775 sys sys 1091204980 0
 sys/src/cmd/usb/audio - 20000000775 sys sys 1091204980 0
-sys/src/cmd/usb/audio/audiofs.c - 664 sys sys 1143759340 18169
-sys/src/cmd/usb/audio/audiosub.c - 664 sys sys 1140695061 8085
+sys/src/cmd/usb/audio/audiofs.c - 664 sys sys 1172764045 18191
+sys/src/cmd/usb/audio/audiosub.c - 664 sys sys 1172764044 8275
 sys/src/cmd/usb/audio/mkfile - 664 sys sys 1091204980 349
 sys/src/cmd/usb/audio/mkfile - 664 sys sys 1091204980 349
-sys/src/cmd/usb/audio/usbaudio.c - 664 sys sys 1140695061 10155
+sys/src/cmd/usb/audio/usbaudio.c - 664 sys sys 1172764045 10358
 sys/src/cmd/usb/audio/usbaudio.h - 664 sys sys 1140695062 1889
 sys/src/cmd/usb/audio/usbaudio.h - 664 sys sys 1140695062 1889
-sys/src/cmd/usb/audio/usbaudioctl.c - 664 sys sys 1140695062 18245
+sys/src/cmd/usb/audio/usbaudioctl.c - 664 sys sys 1172764044 18825
 sys/src/cmd/usb/audio/usbaudioctl.h - 664 sys sys 1140695062 618
 sys/src/cmd/usb/audio/usbaudioctl.h - 664 sys sys 1140695062 618
 sys/src/cmd/usb/lib - 20000000775 sys sys 1091204979 0
 sys/src/cmd/usb/lib - 20000000775 sys sys 1091204979 0
 sys/src/cmd/usb/lib/device.c - 664 sys sys 1168308464 3284
 sys/src/cmd/usb/lib/device.c - 664 sys sys 1168308464 3284
@@ -14320,7 +14320,7 @@ sys/src/cmd/webfs/cookies.c - 664 sys sys 1128664611 21888
 sys/src/cmd/webfs/dat.h - 664 sys sys 1128664462 1621
 sys/src/cmd/webfs/dat.h - 664 sys sys 1128664462 1621
 sys/src/cmd/webfs/fns.h - 664 sys sys 1032665987 1453
 sys/src/cmd/webfs/fns.h - 664 sys sys 1032665987 1453
 sys/src/cmd/webfs/fs.c - 664 sys sys 1128664603 10944
 sys/src/cmd/webfs/fs.c - 664 sys sys 1128664603 10944
-sys/src/cmd/webfs/http.c - 664 sys sys 1161484900 10381
+sys/src/cmd/webfs/http.c - 664 sys sys 1172759957 10408
 sys/src/cmd/webfs/io.c - 664 sys sys 1034736588 1384
 sys/src/cmd/webfs/io.c - 664 sys sys 1034736588 1384
 sys/src/cmd/webfs/main.c - 664 sys sys 1128664462 1083
 sys/src/cmd/webfs/main.c - 664 sys sys 1128664462 1083
 sys/src/cmd/webfs/mkfile - 664 sys sys 1032665986 340
 sys/src/cmd/webfs/mkfile - 664 sys sys 1032665986 340
@@ -14585,7 +14585,7 @@ sys/src/lib9p/intmap.c - 664 sys sys 1016833881 2255
 sys/src/lib9p/listen.c - 664 sys sys 1134335266 1626
 sys/src/lib9p/listen.c - 664 sys sys 1134335266 1626
 sys/src/lib9p/mem.c - 664 sys sys 1015023310 765
 sys/src/lib9p/mem.c - 664 sys sys 1015023310 765
 sys/src/lib9p/mkfile - 664 sys sys 1134337555 387
 sys/src/lib9p/mkfile - 664 sys sys 1134337555 387
-sys/src/lib9p/parse.c - 664 sys sys 1032324435 2050
+sys/src/lib9p/parse.c - 664 sys sys 1172760149 2089
 sys/src/lib9p/post.c - 664 sys sys 1134346047 1559
 sys/src/lib9p/post.c - 664 sys sys 1134346047 1559
 sys/src/lib9p/ramfs.c - 664 sys sys 1134335266 2657
 sys/src/lib9p/ramfs.c - 664 sys sys 1134335266 2657
 sys/src/lib9p/req.c - 664 sys sys 1089299187 1652
 sys/src/lib9p/req.c - 664 sys sys 1089299187 1652

+ 41 - 0
dist/replica/plan9.log

@@ -47568,3 +47568,44 @@
 1172680206 3 c sys/src/fs/emelie/fns.h - 664 sys sys 1172679929 2168
 1172680206 3 c sys/src/fs/emelie/fns.h - 664 sys sys 1172679929 2168
 1172680206 4 c sys/src/fs/fs/fns.h - 664 sys sys 1172679929 2168
 1172680206 4 c sys/src/fs/fs/fns.h - 664 sys sys 1172679929 2168
 1172680206 5 c sys/src/fs/fs64/fns.h - 664 sys sys 1172679929 2330
 1172680206 5 c sys/src/fs/fs64/fns.h - 664 sys sys 1172679929 2330
+1172761206 0 c rc/bin/leak - 775 sys sys 1172760642 1921
+1172761206 1 c sys/man/1/leak - 664 sys sys 1172760642 4097
+1172761206 2 c sys/src/cmd/webfs/http.c - 664 sys sys 1172759957 10408
+1172761206 3 c sys/src/lib9p/parse.c - 664 sys sys 1172760149 2089
+1172763005 0 c sys/man/4/cfs - 664 sys sys 1172762903 1813
+1172763005 1 c sys/src/cmd/cfs/cformat.h - 664 sys sys 1172762903 1386
+1172763005 2 c sys/src/cmd/cfs/cfs.c - 664 sys sys 1172762904 17108
+1172763005 3 c sys/src/cmd/cfs/disk.c - 664 sys sys 1172762904 6213
+1172763005 4 c sys/src/cmd/cfs/disk.h - 664 sys sys 1172762904 482
+1172763005 5 c sys/src/cmd/cfs/inode.c - 664 sys sys 1172762904 6963
+1172763005 6 c sys/src/cmd/cfs/inode.h - 664 sys sys 1172762905 1152
+1172764806 0 c sys/doc/acid.ms - 664 sys sys 1172764379 65609
+1172764806 1 c sys/man/4/usb - 664 sys sys 1172764045 4682
+1172764806 2 c sys/src/cmd/acid/acid.h - 664 sys sys 1172764379 4305
+1172764806 3 c sys/src/cmd/acid/builtin.c - 664 sys sys 1172764379 21752
+1172764806 4 c sys/src/cmd/acid/dbg.y - 664 sys sys 1172764472 5552
+1172764806 5 c sys/src/cmd/acid/expr.c - 664 sys sys 1172764472 15694
+1172764806 6 c sys/src/cmd/usb/audio/audiofs.c - 664 sys sys 1172764045 18191
+1172764806 7 c sys/src/cmd/usb/audio/audiosub.c - 664 sys sys 1172764044 8275
+1172764806 8 c sys/src/cmd/usb/audio/usbaudio.c - 664 sys sys 1172764045 10358
+1172764806 9 c sys/src/cmd/usb/audio/usbaudioctl.c - 664 sys sys 1172764044 18825
+1172764806 10 c sys/src/cmd/file.c - 664 sys sys 1172764226 28088
+1172777407 0 c sys/src/cmd/auth/authsrv.c - 664 sys sys 1172776678 18383
+1172777407 1 c sys/src/cmd/auth/guard.srv.c - 664 sys sys 1172776773 2873
+1172777407 2 c sys/src/cmd/auth/lib/readarg.c - 664 sys sys 1172776607 311
+1172777407 3 c sys/src/cmd/auth/secstore/secchk.c - 664 sys sys 1172776633 565
+1172777407 4 c sys/src/cmd/auth/secureidcheck.c - 664 sys sys 1172776708 9914
+1172781006 0 c 386/bin/acid - 775 sys sys 1172780590 402190
+1172781006 1 c 386/bin/cfs - 775 sys sys 1172780592 131665
+1172781006 2 c 386/bin/aux/disksim - 775 sys sys 1172780591 150851
+1172781006 3 c 386/lib/lib9p.a - 664 sys sys 1172780592 91012
+1172800806 0 c sys/src/cmd/acid/expr.c - 664 sys sys 1172799792 15425
+1172800806 1 c sys/src/cmd/hoc/code.c - 664 sys sys 1172800014 10063
+1172802606 0 c sys/src/cmd/cfs/cfs.c - 664 sys sys 1172801081 17100
+1172802606 1 c sys/src/cmd/cfs/disk.c - 664 sys sys 1172801077 6106
+1172809806 0 c 386/bin/acid - 775 sys sys 1172808055 401961
+1172809806 1 c 386/bin/cfs - 775 sys sys 1172808057 131665
+1172809806 2 c 386/bin/hoc - 775 sys sys 1172808058 100101
+1172809806 3 c 386/bin/auth/authsrv - 775 sys sys 1172808056 166692
+1172809806 4 c 386/bin/auth/guard.srv - 775 sys sys 1172808056 145120
+1172809806 5 c 386/bin/auth/secstored - 775 sys sys 1172808057 198043

+ 55 - 14
rc/bin/leak

@@ -2,21 +2,28 @@
 
 
 rfork e
 rfork e
 
 
-flagfmt='b,s,f binary,r res,x width'
+flagfmt='a,b,c,d,s,f binary,r res,x width'
 args='name | pid list'
 args='name | pid list'
 if(! ifs=() eval `{aux/getflags $*} || ~ $#* 0){
 if(! ifs=() eval `{aux/getflags $*} || ~ $#* 0){
 	aux/usage
 	aux/usage
 	exit usage
 	exit usage
 }
 }
 
 
-if(~ $#flags 1 && ~ $#flagb 1){
-	echo 'cannot use both -b and -s' >[1=2]
+conflicting=($flagb $flagc $flags)
+if(~ $#conflicting 2 || ~ $#conflicting 3){
+	echo 'can only use one of -b, -c or -s' >[1=2]
 	exit usage
 	exit usage
 }
 }
 
 
 leakflags=()
 leakflags=()
 if(~ $#flags 1)
 if(~ $#flags 1)
 	leakflags=($leakflags -s)
 	leakflags=($leakflags -s)
+if(~ $#flaga 1)
+	leakflags=($leakflags -a)
+if(~ $#flagc 1)
+	leakflags=($leakflags -c)
+if(~ $#flagd 1)
+	leakflags=($leakflags -d)
 if(~ $#flagf 1)
 if(~ $#flagf 1)
 	leakflags=($leakflags -f $flagf)
 	leakflags=($leakflags -f $flagf)
 
 
@@ -41,14 +48,48 @@ if(! test -d /proc/$1) {
 
 
 pidlist=`{echo $"* | tr ' ' ,}
 pidlist=`{echo $"* | tr ' ' ,}
 
 
-echo 'leakdump({'$pidlist'})' | 
-	acid -lpool -lleak $1 $flagf | 
-	aux/acidleak $acidleakflags $flagf |
-	{
-		if(~ $#flags 1)
-			awk '{print $4}' |
-				sort | uniq -c | sort -nr |
-				sed 's! *(.*) (0x.*)!src(\2); // \1!'
-		if not
-			cat
-	}
+echo 'leakdump({'$pidlist'})' | acid -lpool -lleak $1 $flagf | 
+{
+	if(~ $#flaga 1 && ~ $#flagd 1)
+		grep 'block|free'
+	if not
+	if(~ $#flaga 1)
+		grep block
+	if not
+	if(~ $#flagd 1)
+		grep free 
+	if not
+		aux/acidleak $acidleakflags $flagf
+} |
+{
+	if(~ $#flags 1)
+		awk '{print $4}' |
+			sort | uniq -c | sort -nr |
+			sed 's! *(.*) (0x.*)!src(\2); // \1!'
+	if not
+	if(~ $#flagc 1)
+		awk 'BEGIN {
+				for(i=0; i<16; i++)
+					_unhex[sprintf("%x", i)] = _unhex[sprintf("%X", i)] = i
+			}
+			function unhex(s, i, v) {
+				sub("^0[xX]0*","",s)
+				for (i=1; i<=length(s); i++)
+					v = v*16 + _unhex[substr(s,i,1)]
+				return v
+			}
+			{	sum[$4] += unhex($3);
+				count[$4]++;
+				alloc[$4] = $6;
+			}
+			END {
+				for (v in sum) {
+					printf("src(%s);\t// %d\t%d\t%d\t%s\n", v, sum[v], count[v], sum[v] / count[v], alloc[v])
+					total += sum[v]
+				}
+				printf("// %d\n", total);
+			}
+		'  | sort -nr +2
+	if not
+		cat
+}	

+ 32 - 0
sys/doc/acid.ms

@@ -1202,6 +1202,38 @@ acid: print(main\eX, "\et", *main)
 .\"
 .\"
 .\"
 .\"
 .\"
 .\"
+.Ip fmt fmtof item "Get format
+.CW fmtof
+evaluates the expression
+.I item
+and returns the format of the result.
+.Ex
+acid: +fmtof(33)
+W
+acid: +fmtof("string")
+s
+.Ee
+.\"
+.\"
+.\"
+.Ip integer fmtsize item "Get format size
+.CW fmtsize
+evaluates the expression
+.I item
+and returns the size in bytes of a single element of result's format.
+.Ex
+acid: +fmtsize('c')
+8
+acid: +fmtsize('c'\ec)
+1
+acid: +fmtsize(0\eX)
+4
+acid: +fmtsize('c'\e3)
+10
+.Ee
+.\"
+.\"
+.\"
 .Ip list fnbound integer "Find start and end address of a function
 .Ip list fnbound integer "Find start and end address of a function
 .CW fnbound
 .CW fnbound
 interprets its
 interprets its

+ 37 - 4
sys/man/1/leak

@@ -4,7 +4,7 @@ leak, kmem \- help find memory leaks
 .SH SYNOPSIS
 .SH SYNOPSIS
 .B leak
 .B leak
 [
 [
-.B -bs
+.B -abcds
 ]
 ]
 [
 [
 .B -f
 .B -f
@@ -37,12 +37,13 @@ the shared bss segment as well as each process's registers.
 .PP
 .PP
 Unless directed otherwise,
 Unless directed otherwise,
 .I leak
 .I leak
-prints, for each block, a line with five space-separated fields:
+prints, for each block, a line with seven space-separated fields:
 the string
 the string
 .BR block ,
 .BR block ,
 the address of the block,
 the address of the block,
 the size of the block, 
 the size of the block, 
-and the first two words of the block.
+the first two words of the block,
+and the function names represented by the first two words of the block.
 Usually, the first two words of the block
 Usually, the first two words of the block
 contain the malloc and realloc tags
 contain the malloc and realloc tags
 (see
 (see
@@ -51,14 +52,46 @@ useful for finding who allocated the leaked blocks.
 .PP
 .PP
 If the
 If the
 .B -s
 .B -s
+or the
+.B -c
 option is given,
 option is given,
 .I leak 
 .I leak 
 will instead present a sequence of
 will instead present a sequence of
 .IR acid (1)
 .IR acid (1)
 commands that show each leaky allocation site.
 commands that show each leaky allocation site.
-A comment appears next to each command to 
+With
+.B -s
+a comment appears next to each command to 
 indicate how many lost blocks were allocated
 indicate how many lost blocks were allocated
 at that point in the program.
 at that point in the program.
+With
+.B -c
+the comments are extended to indicate also the total
+number of bytes lost at that point in the program,
+and an additional comment line gives the
+overall total number of bytes.
+.PP
+If the
+.B -a
+option is given,
+.I leak 
+will print information as decribed above,
+but for all allocated blocks,
+not only leaked ones.
+If the
+.B -d
+option is given,
+.I leak 
+will print information as decribed above,
+but for all free blocks,
+i.e. those freed,
+or those that are not yet
+in use (fragmentation?).
+The
+.B -a
+and
+.B -d
+options can be combined.
 .PP
 .PP
 If the
 If the
 .B -b
 .B -b

+ 6 - 8
sys/man/4/cfs

@@ -4,14 +4,14 @@ cfs \- cache file system
 .SH SYNOPSIS
 .SH SYNOPSIS
 .B cfs
 .B cfs
 .B -s
 .B -s
-.RB [ -rdS ]
+.RB [ -krdS ]
 .RB [ -f
 .RB [ -f
 .IR partition ]
 .IR partition ]
 .PP
 .PP
 .B cfs 
 .B cfs 
 .B -a
 .B -a
 .I netaddr
 .I netaddr
-.RB [ -rdS ]
+.RB [ -krdS ]
 .RB [ -f
 .RB [ -f
 .IR partition ]
 .IR partition ]
 .RI [ mtpt ]
 .RI [ mtpt ]
@@ -66,6 +66,10 @@ sides and latencies.
 use file
 use file
 .I partition
 .I partition
 as the cache disk partition.
 as the cache disk partition.
+.TP
+.BI k
+Keep cache contents even if they might have come from a different server.
+Cfs will obey the -r flag even if -k is given.
 .PP
 .PP
 All 9P messages except
 All 9P messages except
 .BR read ,
 .BR read ,
@@ -77,12 +81,6 @@ and
 are passed through
 are passed through
 .I cfs
 .I cfs
 unchanged to the remote server.
 unchanged to the remote server.
-A
-.B clone
-followed immediately by a
-.B walk
-is converted into a
-.BR clwalk .
 If possible, a
 If possible, a
 .B read
 .B read
 is satisfied by cached data.
 is satisfied by cached data.

+ 2 - 1
sys/man/4/usb

@@ -108,7 +108,8 @@ speed out 44100
 .PP
 .PP
 This file can be written using the same syntax.  The keyword
 This file can be written using the same syntax.  The keyword
 .I out
 .I out
-may be omitted.  Settings are given as percentages of the range.
+may be omitted.  Settings are given as percentages of the range,
+except for speed which is in Hz.
 .PP
 .PP
 The file
 The file
 .B audioctl
 .B audioctl

+ 2 - 0
sys/src/cmd/acid/acid.h

@@ -53,8 +53,10 @@ Extern Node*	prnt;
 Extern List*	tracelist;
 Extern List*	tracelist;
 Extern int	initialising;
 Extern int	initialising;
 Extern int	quiet;
 Extern int	quiet;
+
 extern void	(*expop[])(Node*, Node*);
 extern void	(*expop[])(Node*, Node*);
 #define expr(n, r) (r)->comt=0; (*expop[(n)->op])(n, r);
 #define expr(n, r) (r)->comt=0; (*expop[(n)->op])(n, r);
+extern int	fmtsize(Value *v) ;
 
 
 enum
 enum
 {
 {

+ 48 - 0
sys/src/cmd/acid/builtin.c

@@ -40,6 +40,8 @@ void	interpret(Node*, Node*);
 void	include(Node*, Node*);
 void	include(Node*, Node*);
 void	regexp(Node*, Node*);
 void	regexp(Node*, Node*);
 void	dosysr1(Node*, Node*);
 void	dosysr1(Node*, Node*);
+void	fmtof(Node*, Node*) ;
+void	dofmtsize(Node*, Node*) ;
 
 
 typedef struct Btab Btab;
 typedef struct Btab Btab;
 struct Btab
 struct Btab
@@ -80,6 +82,8 @@ struct Btab
 	"interpret",	interpret,
 	"interpret",	interpret,
 	"include",	include,
 	"include",	include,
 	"regexp",	regexp,
 	"regexp",	regexp,
+	"fmtof",	fmtof,
+	"fmtsize",	dofmtsize,
 	0
 	0
 };
 };
 
 
@@ -1265,3 +1269,47 @@ pcline(Node *r, Node *args)
 		error("pcline(addr): funny file %s", buf);
 		error("pcline(addr): funny file %s", buf);
 	r->ival = strtol(p+1, 0, 0);	
 	r->ival = strtol(p+1, 0, 0);	
 }
 }
+
+void fmtof(Node *r, Node *args)
+{
+	Node *av[Maxarg];
+	Node res;
+
+	na = 0;
+	flatten(av, args);
+	if(na < 1)
+		error("fmtof(obj): no argument");
+	if(na > 1)
+		error("fmtof(obj): too many arguments") ;
+	expr(av[0], &res);
+
+	r->op = OCONST;
+	r->type = TINT ;
+	r->ival = res.fmt ;
+	r->fmt = 'c';
+}
+
+void dofmtsize(Node *r, Node *args)
+{
+	Node *av[Maxarg];
+	Node res;
+	Store * s ;
+	Value v ;
+
+	na = 0;
+	flatten(av, args);
+	if(na < 1)
+		error("fmtsize(obj): no argument");
+	if(na > 1)
+		error("fmtsize(obj): too many arguments") ;
+	expr(av[0], &res);
+
+	v.type = res.type ;
+	s = &v.Store ;
+	*s = res ;
+
+	r->op = OCONST;
+	r->type = TINT ;
+	r->ival = fmtsize(&v) ;
+	r->fmt = 'D';
+}

+ 1 - 2
sys/src/cmd/acid/dbg.y

@@ -281,8 +281,7 @@ monexpr		: term
 		}
 		}
 		| '+' monexpr
 		| '+' monexpr
 		{
 		{
-			$$ = con(0);
-			$$ = an(OADD, $2, $$);
+			$$ = an(OADD, $2, ZN);
 		}
 		}
 		| '-' monexpr
 		| '-' monexpr
 		{
 		{

+ 9 - 0
sys/src/cmd/acid/expr.c

@@ -201,13 +201,22 @@ oindex(Node *n, Node *res)
 void
 void
 oappend(Node *n, Node *res)
 oappend(Node *n, Node *res)
 {
 {
+	Value *v;
 	Node r, l;
 	Node r, l;
+	int  empty;
 
 
 	expr(n->left, &l);
 	expr(n->left, &l);
 	expr(n->right, &r);
 	expr(n->right, &r);
 	if(l.type != TLIST)
 	if(l.type != TLIST)
 		error("must append to list");
 		error("must append to list");
+	empty = (l.l == nil && (n->left->op == ONAME));
 	append(res, &l, &r);
 	append(res, &l, &r);
+	if(empty) {
+		v = n->left->sym->v;
+		v->type = res->type;
+		v->Store = res->Store;
+		v->comt = res->comt;
+	}
 }
 }
 
 
 void
 void

+ 15 - 15
sys/src/cmd/auth/authsrv.c

@@ -65,7 +65,7 @@ main(int argc, char *argv[])
 	for(;;){
 	for(;;){
 		if(readn(0, buf, TICKREQLEN) <= 0)
 		if(readn(0, buf, TICKREQLEN) <= 0)
 			exits(0);
 			exits(0);
-	
+
 		convM2TR(buf, &tr);
 		convM2TR(buf, &tr);
 		switch(buf[0]){
 		switch(buf[0]){
 		case AuthTreq:
 		case AuthTreq:
@@ -246,7 +246,7 @@ changepasswd(Ticketreq *tr)
 	safecpy(t.suid, tr->uid, sizeof(t.suid));
 	safecpy(t.suid, tr->uid, sizeof(t.suid));
 	convT2M(&t, tbuf+1, okey);
 	convT2M(&t, tbuf+1, okey);
 	write(1, tbuf, sizeof(tbuf));
 	write(1, tbuf, sizeof(tbuf));
-		
+
 	/* loop trying passwords out */
 	/* loop trying passwords out */
 	for(;;){
 	for(;;){
 		if(readn(0, prbuf, PASSREQLEN) < 0)
 		if(readn(0, prbuf, PASSREQLEN) < 0)
@@ -323,7 +323,7 @@ http(Ticketreq *tr)
 			p++;
 			p++;
 		passtokey(key, p);
 		passtokey(key, p);
 	}
 	}
-	
+
 	/* send back a ticket encrypted with the key */
 	/* send back a ticket encrypted with the key */
 	randombytes((uchar*)t.chal, CHALLEN);
 	randombytes((uchar*)t.chal, CHALLEN);
 	mkkey(t.key);
 	mkkey(t.key);
@@ -390,7 +390,7 @@ apop(Ticketreq *tr, int type)
 	USED(tr);
 	USED(tr);
 
 
 	/*
 	/*
-	 *  Create a challenge and send it.  
+	 *  Create a challenge and send it.
 	 */
 	 */
 	randombytes((uchar*)rb, sizeof(rb));
 	randombytes((uchar*)rb, sizeof(rb));
 	p = chal;
 	p = chal;
@@ -410,7 +410,7 @@ apop(Ticketreq *tr, int type)
 		tr = &treq;
 		tr = &treq;
 		if(tr->type != type)
 		if(tr->type != type)
 			exits(0);
 			exits(0);
-	
+
 		/*
 		/*
 		 * read response
 		 * read response
 		 */
 		 */
@@ -418,7 +418,7 @@ apop(Ticketreq *tr, int type)
 			exits(0);
 			exits(0);
 		for(i = 0; i < MD5dlen; i++)
 		for(i = 0; i < MD5dlen; i++)
 			resp[i] = (h2b(buf[2*i])<<4)|h2b(buf[2*i+1]);
 			resp[i] = (h2b(buf[2*i])<<4)|h2b(buf[2*i+1]);
-	
+
 		/*
 		/*
 		 * lookup
 		 * lookup
 		 */
 		 */
@@ -431,7 +431,7 @@ apop(Ticketreq *tr, int type)
 				return;
 				return;
 			continue;
 			continue;
 		}
 		}
-	
+
 		/*
 		/*
 		 *  check for match
 		 *  check for match
 		 */
 		 */
@@ -504,7 +504,7 @@ vnc(Ticketreq *tr)
 	int i;
 	int i;
 
 
 	/*
 	/*
-	 *  Create a challenge and send it.  
+	 *  Create a challenge and send it.
 	 */
 	 */
 	randombytes(chal+6, VNCchallen);
 	randombytes(chal+6, VNCchallen);
 	chal[0] = AuthOKvar;
 	chal[0] = AuthOKvar;
@@ -569,7 +569,7 @@ chap(Ticketreq *tr)
 	OChapreply reply;
 	OChapreply reply;
 
 
 	/*
 	/*
-	 *  Create a challenge and send it.  
+	 *  Create a challenge and send it.
 	 */
 	 */
 	randombytes((uchar*)chal, sizeof(chal));
 	randombytes((uchar*)chal, sizeof(chal));
 	write(1, chal, sizeof(chal));
 	write(1, chal, sizeof(chal));
@@ -646,7 +646,7 @@ mschap(Ticketreq *tr)
 	uchar digest[SHA1dlen];
 	uchar digest[SHA1dlen];
 
 
 	/*
 	/*
-	 *  Create a challenge and send it.  
+	 *  Create a challenge and send it.
 	 */
 	 */
 	randombytes((uchar*)chal, sizeof(chal));
 	randombytes((uchar*)chal, sizeof(chal));
 	write(1, chal, sizeof(chal));
 	write(1, chal, sizeof(chal));
@@ -656,7 +656,7 @@ mschap(Ticketreq *tr)
 	 */
 	 */
 	if(readn(0, &reply, sizeof(reply)) < 0)
 	if(readn(0, &reply, sizeof(reply)) < 0)
 		exits(0);
 		exits(0);
-	
+
 	safecpy(tr->uid, reply.uid, sizeof(tr->uid));
 	safecpy(tr->uid, reply.uid, sizeof(tr->uid));
 	/*
 	/*
 	 * lookup
 	 * lookup
@@ -712,7 +712,7 @@ nthash(uchar hash[MShashlen], char *passwd)
 {
 {
 	uchar buf[512];
 	uchar buf[512];
 	int i;
 	int i;
-	
+
 	for (i = 0; *passwd && i + 1 < sizeof(buf);) {
 	for (i = 0; *passwd && i + 1 < sizeof(buf);) {
 		Rune r;
 		Rune r;
 		passwd += chartorune(&r, passwd);
 		passwd += chartorune(&r, passwd);
@@ -750,7 +750,7 @@ mschalresp(uchar resp[MSresplen], uchar hash[MShashlen], uchar chal[MSchallen])
 {
 {
 	int i;
 	int i;
 	uchar buf[21];
 	uchar buf[21];
-	
+
 	memset(buf, 0, sizeof(buf));
 	memset(buf, 0, sizeof(buf));
 	memcpy(buf, hash, MShashlen);
 	memcpy(buf, hash, MShashlen);
 
 
@@ -781,13 +781,13 @@ speaksfor(char *speaker, char *user)
 	Ndbs s;
 	Ndbs s;
 	int ok;
 	int ok;
 	char notuser[Maxpath];
 	char notuser[Maxpath];
-	
+
 	if(strcmp(speaker, user) == 0)
 	if(strcmp(speaker, user) == 0)
 		return 1;
 		return 1;
 
 
 	if(db == 0)
 	if(db == 0)
 		return 0;
 		return 0;
-	
+
 	tp = ndbsearch(db, &s, "hostid", speaker);
 	tp = ndbsearch(db, &s, "hostid", speaker);
 	if(tp == 0)
 	if(tp == 0)
 		return 0;
 		return 0;

+ 35 - 9
sys/src/cmd/auth/guard.srv.c

@@ -1,3 +1,6 @@
+/*
+ * guard service
+ */
 #include <u.h>
 #include <u.h>
 #include <libc.h>
 #include <libc.h>
 #include <fcall.h>
 #include <fcall.h>
@@ -6,6 +9,10 @@
 #include <authsrv.h>
 #include <authsrv.h>
 #include "authcmdlib.h"
 #include "authcmdlib.h"
 
 
+enum {
+	Pinlen = 4,
+};
+
 /*
 /*
  * c -> a	client
  * c -> a	client
  * a -> c	challenge prompt
  * a -> c	challenge prompt
@@ -24,11 +31,11 @@ Ndb	*db;
 void
 void
 main(int argc, char *argv[])
 main(int argc, char *argv[])
 {
 {
-	char ukey[DESKEYLEN], resp[32], buf[NETCHLEN];
-	long chal;
 	int n;
 	int n;
-	Ndb *db2;
+	long chal;
 	char *err;
 	char *err;
+	char ukey[DESKEYLEN], resp[32], buf[NETCHLEN];
+	Ndb *db2;
 
 
 	ARGBEGIN{
 	ARGBEGIN{
 	case 'd':
 	case 'd':
@@ -43,6 +50,7 @@ main(int argc, char *argv[])
 	if(db2 == 0)
 	if(db2 == 0)
 		syslog(0, AUTHLOG, "no /lib/ndb/local");
 		syslog(0, AUTHLOG, "no /lib/ndb/local");
 	db = ndbcat(db, db2);
 	db = ndbcat(db, db2);
+	werrstr("");
 
 
 	strcpy(raddr, "unknown");
 	strcpy(raddr, "unknown");
 	if(argc >= 1)
 	if(argc >= 1)
@@ -66,27 +74,45 @@ main(int argc, char *argv[])
 	n = strlen(buf) + 1;
 	n = strlen(buf) + 1;
 	if(write(1, buf, n) != n){
 	if(write(1, buf, n) != n){
 		if(debug)
 		if(debug)
-			syslog(0, AUTHLOG, "g-fail %s@%s :%r sending chal",
+			syslog(0, AUTHLOG, "g-fail %s@%s: %r sending chal",
 				user, raddr);
 				user, raddr);
 		exits("replying to server");
 		exits("replying to server");
 	}
 	}
 	alarm(3*60*1000);
 	alarm(3*60*1000);
+	werrstr("");
 	if(readarg(0, resp, sizeof resp) < 0){
 	if(readarg(0, resp, sizeof resp) < 0){
 		if(debug)
 		if(debug)
-			syslog(0, AUTHLOG, "g-fail %s@%s :%r reading resp",
+			syslog(0, AUTHLOG, "g-fail %s@%s: %r reading resp",
 				user, raddr);
 				user, raddr);
 		fail(0);
 		fail(0);
 	}
 	}
 	alarm(0);
 	alarm(0);
 
 
+	/* remove password login from guard.research.bell-labs.com, sucre, etc. */
+//	if(!findkey(KEYDB,    user, ukey) || !netcheck(ukey, chal, resp))
 	if(!findkey(NETKEYDB, user, ukey) || !netcheck(ukey, chal, resp))
 	if(!findkey(NETKEYDB, user, ukey) || !netcheck(ukey, chal, resp))
-	/* if(!findkey(KEYDB, user, ukey) || !netcheck(ukey, chal, resp)) /* remove password login from guard.research.bell-labs.com, sucre, etc. */
 	if((err = secureidcheck(user, resp)) != nil){
 	if((err = secureidcheck(user, resp)) != nil){
 		print("NO %s", err);
 		print("NO %s", err);
 		write(1, "NO", 2);
 		write(1, "NO", 2);
-		if(debug)
-			syslog(0, AUTHLOG, "g-fail %s@%s: %s %s to %lud",
-				err, user, raddr, resp, chal);
+		if(debug) {
+			char *r;
+
+			/*
+			 * don't log the entire response, since the first
+			 * Pinlen digits may be the user's secure-id pin.
+			 */
+			if (strlen(resp) < Pinlen)
+				r = strdup("<too short for pin>");
+			else if (strlen(resp) == Pinlen)
+				r = strdup("<pin only>");
+			else
+				r = smprint("%.*s%s", Pinlen,
+					"******************", resp + Pinlen);
+			syslog(0, AUTHLOG,
+				"g-fail %s@%s: %s: resp %s to chal %lud",
+				user, raddr, err, r, chal);
+			free(r);
+		}
 		fail(user);
 		fail(user);
 	}
 	}
 	write(1, "OK", 2);
 	write(1, "OK", 2);

+ 3 - 3
sys/src/cmd/auth/lib/readarg.c

@@ -10,9 +10,8 @@ readarg(int fd, char *arg, int len)
 	int i;
 	int i;
 
 
 	i = 0;
 	i = 0;
-	for(;;){
-		if(read(fd, buf, 1) != 1)
-			return -1;
+	memset(arg, 0, len);
+	while(read(fd, buf, 1) == 1){
 		if(i < len - 1)
 		if(i < len - 1)
 			arg[i++] = *buf;
 			arg[i++] = *buf;
 		if(*buf == '\0'){
 		if(*buf == '\0'){
@@ -20,4 +19,5 @@ readarg(int fd, char *arg, int len)
 			return 0;
 			return 0;
 		}
 		}
 	}
 	}
+	return -1;
 }
 }

+ 4 - 1
sys/src/cmd/auth/secstore/secchk.c

@@ -4,6 +4,7 @@
 #include <ndb.h>
 #include <ndb.h>
 
 
 extern char* secureidcheck(char *user, char *response);
 extern char* secureidcheck(char *user, char *response);
+
 Ndb *db;
 Ndb *db;
 
 
 void
 void
@@ -12,9 +13,10 @@ main(int argc, char **argv)
 	Ndb *db2;
 	Ndb *db2;
 
 
 	if(argc!=2){
 	if(argc!=2){
-		fprint(2,"usage %s pinsecurid\n", argv[0]);
+		fprint(2, "usage: %s pinsecurid\n", argv[0]);
 		exits("usage");
 		exits("usage");
 	}
 	}
+
 	db = ndbopen("/lib/ndb/auth");
 	db = ndbopen("/lib/ndb/auth");
 	if(db == 0)
 	if(db == 0)
 		syslog(0, "secstore", "no /lib/ndb/auth");
 		syslog(0, "secstore", "no /lib/ndb/auth");
@@ -22,6 +24,7 @@ main(int argc, char **argv)
 	if(db2 == 0)
 	if(db2 == 0)
 		syslog(0, "secstore", "no /lib/ndb/local");
 		syslog(0, "secstore", "no /lib/ndb/local");
 	db = ndbcat(db, db2);
 	db = ndbcat(db, db2);
+
 	print("user=%s\n", getenv("user"));
 	print("user=%s\n", getenv("user"));
 	print("%s\n", secureidcheck(getenv("user"), argv[1]));
 	print("%s\n", secureidcheck(getenv("user"), argv[1]));
 	exits(0);
 	exits(0);

+ 79 - 70
sys/src/cmd/auth/secureidcheck.c

@@ -1,14 +1,14 @@
 /*
 /*
-	This code uses RADIUS as a portable way to validate tokens such as SecurID.
-	It is relatively simple to send a UDP packet and get a response, but various
-	things can go wrong.  Speaking the proprietary ACE protocol would allow
-	handling "next token code" and other error messages.  More importantly, the
-	timeout threshold is inherently hard to pick.  We observe responses taking
-	longer than 10 seconds in normal times.  That is a long time to wait before
-	retrying on a second server.  Moreover, if the UDP response is lost, retrying
-	on a second server will also fail because the valid token code may be
-	presented only once.  This whole approach is flawed, but best we can do.
-*/
+ * This code uses RADIUS as a portable way to validate tokens such as SecurID.
+ * It is relatively simple to send a UDP packet and get a response, but various
+ * things can go wrong.  Speaking the proprietary ACE protocol would allow
+ * handling "next token code" and other error messages.  More importantly, the
+ * timeout threshold is inherently hard to pick.  We observe responses taking
+ * longer than 10 seconds in normal times.  That is a long time to wait before
+ * retrying on a second server.  Moreover, if the UDP response is lost, retrying
+ * on a second server will also fail because the valid token code may be
+ * presented only once.  This whole approach is flawed, but best we can do.
+ */
 /* RFC2138 */
 /* RFC2138 */
 #include <u.h>
 #include <u.h>
 #include <libc.h>
 #include <libc.h>
@@ -18,39 +18,41 @@
 #include <libsec.h>
 #include <libsec.h>
 #include <bio.h>
 #include <bio.h>
 #include <ndb.h>
 #include <ndb.h>
+
 #define AUTHLOG "auth"
 #define AUTHLOG "auth"
 
 
-enum{	R_AccessRequest=1,	/* Packet code */
-	R_AccessAccept=2,
-	R_AccessReject=3,
+enum{
+	R_AccessRequest	=1,	/* Packet code */
+	R_AccessAccept	=2,
+	R_AccessReject	=3,
 	R_AccessChallenge=11,
 	R_AccessChallenge=11,
-	R_UserName=1,
-	R_UserPassword=2,
-	R_NASIPAddress=4,
-	R_ReplyMessage=18,
-	R_State=24,
-	R_NASIdentifier=32
+	R_UserName	=1,
+	R_UserPassword	=2,
+	R_NASIPAddress	=4,
+	R_ReplyMessage	=18,
+	R_State		=24,
+	R_NASIdentifier	=32,
 };
 };
 
 
 typedef struct Secret{
 typedef struct Secret{
-	uchar *s;
-	int len;
+	uchar	*s;
+	int	len;
 } Secret;
 } Secret;
 
 
 typedef struct Attribute{
 typedef struct Attribute{
 	struct Attribute *next;
 	struct Attribute *next;
-	uchar type;
-	uchar len;	// number of bytes in value
-	uchar val[256];
+	uchar	type;
+	uchar	len;		/* number of bytes in value */
+	uchar	val[256];
 } Attribute;
 } Attribute;
 
 
 typedef struct Packet{
 typedef struct Packet{
-	uchar code, ID;
-	uchar authenticator[16];
+	uchar	code, ID;
+	uchar	authenticator[16];
 	Attribute first;
 	Attribute first;
 } Packet;
 } Packet;
 
 
-// assumes pass is at most 16 chars
+/* assumes pass is at most 16 chars */
 void
 void
 hide(Secret *shared, uchar *auth, Secret *pass, uchar *x)
 hide(Secret *shared, uchar *auth, Secret *pass, uchar *x)
 {
 {
@@ -62,7 +64,7 @@ hide(Secret *shared, uchar *auth, Secret *pass, uchar *x)
 	if(n > 16)
 	if(n > 16)
 		n = 16;
 		n = 16;
 	for(i = 0; i < n; i++)
 	for(i = 0; i < n; i++)
-		x[i] ^= (pass->s)[i];
+		x[i] ^= pass->s[i];
 }
 }
 
 
 int
 int
@@ -71,9 +73,9 @@ authcmp(Secret *shared, uchar *buf, int m, uchar *auth)
 	DigestState *M;
 	DigestState *M;
 	uchar x[16];
 	uchar x[16];
 
 
-	M = md5(buf, 4, nil, nil); // Code+ID+Length
-	M = md5(auth, 16, nil, M); // RequestAuth
-	M = md5(buf+20, m-20, nil, M); // Attributes
+	M = md5(buf, 4, nil, nil);	/* Code+ID+Length */
+	M = md5(auth, 16, nil, M);	/* RequestAuth */
+	M = md5(buf+20, m-20, nil, M);	/* Attributes */
 	md5(shared->s, shared->len, x, M);
 	md5(shared->s, shared->len, x, M);
 	return memcmp(x, buf+4, 16);
 	return memcmp(x, buf+4, 16);
 }
 }
@@ -128,7 +130,7 @@ rpc(char *dest, Secret *shared, Packet *req)
 	Attribute *a;
 	Attribute *a;
 	int m, n, fd, try;
 	int m, n, fd, try;
 
 
-	// marshal request
+	/* marshal request */
 	e = buf + sizeof buf;
 	e = buf + sizeof buf;
 	buf[0] = req->code;
 	buf[0] = req->code;
 	buf[1] = req->ID;
 	buf[1] = req->ID;
@@ -146,7 +148,7 @@ rpc(char *dest, Secret *shared, Packet *req)
 	buf[2] = n>>8;
 	buf[2] = n>>8;
 	buf[3] = n;
 	buf[3] = n;
 
 
-	// send request, wait for reply
+	/* send request, wait for reply */
 	fd = dial(dest, 0, 0, 0);
 	fd = dial(dest, 0, 0, 0);
 	if(fd < 0){
 	if(fd < 0){
 		syslog(0, AUTHLOG, "%s: rpc can't get udp channel", dest);
 		syslog(0, AUTHLOG, "%s: rpc can't get udp channel", dest);
@@ -155,11 +157,15 @@ rpc(char *dest, Secret *shared, Packet *req)
 	atnotify(ding, 1);
 	atnotify(ding, 1);
 	m = -1;
 	m = -1;
 	for(try = 0; try < 2; try++){
 	for(try = 0; try < 2; try++){
-		/* increased timeout from 4sec to 15sec because corporate server really takes that long */
+		/*
+		 * increased timeout from 4sec to 15sec because
+		 * corporate server really takes that long.
+		 */
 		alarm(15000);
 		alarm(15000);
 		m = write(fd, buf, n);
 		m = write(fd, buf, n);
 		if(m != n){
 		if(m != n){
-			syslog(0, AUTHLOG, "%s: rpc write err %d %d: %r", dest, m, n);
+			syslog(0, AUTHLOG, "%s: rpc write err %d %d: %r",
+				dest, m, n);
 			m = -1;
 			m = -1;
 			break;
 			break;
 		}
 		}
@@ -167,9 +173,9 @@ rpc(char *dest, Secret *shared, Packet *req)
 		alarm(0);
 		alarm(0);
 		if(m < 0){
 		if(m < 0){
 			syslog(0, AUTHLOG, "%s rpc read err %d: %r", dest, m);
 			syslog(0, AUTHLOG, "%s rpc read err %d: %r", dest, m);
-			break; // failure
+			break;			/* failure */
 		}
 		}
-		if(m == 0 || buf2[1] != buf[1]){  // need matching ID
+		if(m == 0 || buf2[1] != buf[1]){	/* need matching ID */
 			syslog(0, AUTHLOG, "%s unmatched reply %d", dest, m);
 			syslog(0, AUTHLOG, "%s unmatched reply %d", dest, m);
 			continue;
 			continue;
 		}
 		}
@@ -181,7 +187,7 @@ rpc(char *dest, Secret *shared, Packet *req)
 	if(m <= 0)
 	if(m <= 0)
 		return nil;
 		return nil;
 
 
-	// unmarshal reply
+	/* unmarshal reply */
 	b = buf2;
 	b = buf2;
 	e = buf2+m;
 	e = buf2+m;
 	resp = (Packet*)malloc(sizeof(*resp));
 	resp = (Packet*)malloc(sizeof(*resp));
@@ -203,18 +209,18 @@ rpc(char *dest, Secret *shared, Packet *req)
 	for(;;){
 	for(;;){
 		if(b >= e){
 		if(b >= e){
 			a->next = nil;
 			a->next = nil;
-			break;			// exit loop
+			break;		/* exit loop */
 		}
 		}
 		a->type = *b++;
 		a->type = *b++;
 		a->len = (*b++) - 2;
 		a->len = (*b++) - 2;
-		if(b + a->len > e){ // corrupt packet
+		if(b + a->len > e){	/* corrupt packet */
 			a->next = nil;
 			a->next = nil;
 			freePacket(resp);
 			freePacket(resp);
 			return nil;
 			return nil;
 		}
 		}
 		memmove(a->val, b, a->len);
 		memmove(a->val, b, a->len);
 		b += a->len;
 		b += a->len;
-		if(b < e){  // any more attributes?
+		if(b < e){		/* any more attributes? */
 			a->next = (Attribute*)malloc(sizeof(*a));
 			a->next = (Attribute*)malloc(sizeof(*a));
 			if(a->next == nil){
 			if(a->next == nil){
 				free(req);
 				free(req);
@@ -241,7 +247,7 @@ setAttribute(Packet *p, uchar type, uchar *s, int n)
 	}
 	}
 	a->type = type;
 	a->type = type;
 	a->len = n;
 	a->len = n;
-	if(a->len > 253 )  // RFC2138, section 5
+	if(a->len > 253)	/* RFC2138, section 5 */
 		a->len = 253;
 		a->len = 253;
 	memmove(a->val, s, a->len);
 	memmove(a->val, s, a->len);
 	return 0;
 	return 0;
@@ -254,14 +260,13 @@ replymsg(Packet *p)
 	Attribute *a;
 	Attribute *a;
 	static char buf[255];
 	static char buf[255];
 
 
-	for(a = &p->first; a; a = a->next){
+	for(a = &p->first; a; a = a->next)
 		if(a->type == R_ReplyMessage){
 		if(a->type == R_ReplyMessage){
 			if(a->len >= sizeof buf)
 			if(a->len >= sizeof buf)
 				a->len = sizeof(buf)-1;
 				a->len = sizeof(buf)-1;
 			memmove(buf, a->val, a->len);
 			memmove(buf, a->val, a->len);
 			buf[a->len] = 0;
 			buf[a->len] = 0;
 		}
 		}
-	}
 	return buf;
 	return buf;
 }
 }
 
 
@@ -272,16 +277,16 @@ Attribute *stateattr;
 void
 void
 logPacket(Packet *p)
 logPacket(Packet *p)
 {
 {
-	Attribute *a;
-	char buf[255];
-	char pbuf[4*1024];
-	uchar *au = p->authenticator;
 	int i;
 	int i;
 	char *np, *e;
 	char *np, *e;
+	char buf[255], pbuf[4*1024];
+	uchar *au = p->authenticator;
+	Attribute *a;
 
 
 	e = pbuf + sizeof(pbuf);
 	e = pbuf + sizeof(pbuf);
 
 
-	np = seprint(pbuf, e, "Packet ID=%d auth=%x %x %x... ", p->ID, au[0], au[1], au[2]);
+	np = seprint(pbuf, e, "Packet ID=%d auth=%x %x %x... ",
+		p->ID, au[0], au[1], au[2]);
 	switch(p->code){
 	switch(p->code){
 	case R_AccessRequest:
 	case R_AccessRequest:
 		np = seprint(np, e, "request\n");
 		np = seprint(np, e, "request\n");
@@ -305,7 +310,7 @@ logPacket(Packet *p)
 			a->len = 253;
 			a->len = 253;
 		memmove(buf, a->val, a->len);
 		memmove(buf, a->val, a->len);
 		np = seprint(np, e, " [%d]", a->type);
 		np = seprint(np, e, " [%d]", a->type);
-		for(i = 0; i<a->len; i++)
+		for(i = 0; i < a->len; i++)
 			if(isprint(a->val[i]))
 			if(isprint(a->val[i]))
 				np = seprint(np, e, "%c", a->val[i]);
 				np = seprint(np, e, "%c", a->val[i]);
 			else
 			else
@@ -331,7 +336,8 @@ getipv4addr(void)
 	ifc = readipifc("/net", ifc, -1);
 	ifc = readipifc("/net", ifc, -1);
 	for(nifc = ifc; nifc; nifc = nifc->next)
 	for(nifc = ifc; nifc; nifc = nifc->next)
 		for(lifc = nifc->lifc; lifc; lifc = lifc->next)
 		for(lifc = nifc->lifc; lifc; lifc = lifc->next)
-			if(ipcmp(lifc->ip, IPnoaddr) != 0 && ipcmp(lifc->ip, v4prefix) != 0)
+			if (ipcmp(lifc->ip, IPnoaddr) != 0 &&
+			    ipcmp(lifc->ip, v4prefix) != 0)
 				return lifc->ip;
 				return lifc->ip;
 	return nil;
 	return nil;
 }
 }
@@ -342,17 +348,16 @@ extern Ndb *db;
 char*
 char*
 secureidcheck(char *user, char *response)
 secureidcheck(char *user, char *response)
 {
 {
-	Packet *req = nil, *resp = nil;
-	ulong u[4];
-	uchar x[16];
-	char *radiussecret;
-	char ruser[ 64];
-	char dest[3*IPaddrlen+20];
-	Secret shared, pass;
+	char *radiussecret = nil;
 	char *rv = "authentication failed";
 	char *rv = "authentication failed";
-	Ndbs s;
-	Ndbtuple *t, *nt, *tt;
+	char dest[3*IPaddrlen+20], ruser[64];
 	uchar *ip;
 	uchar *ip;
+	uchar x[16];
+	ulong u[4];
+	Ndbs s;
+	Ndbtuple *t = nil, *nt, *tt;
+	Packet *req = nil, *resp = nil;
+	Secret shared, pass;
 	static Ndb *netdb;
 	static Ndb *netdb;
 
 
 	if(netdb == nil)
 	if(netdb == nil)
@@ -371,15 +376,15 @@ secureidcheck(char *user, char *response)
 
 
 	/* translate user name if we have to */
 	/* translate user name if we have to */
 	strcpy(ruser, user);
 	strcpy(ruser, user);
-	for(nt = t; nt; nt = nt->entry){
+	for(nt = t; nt; nt = nt->entry)
 		if(strcmp(nt->attr, "uid") == 0 && strcmp(nt->val, user) == 0)
 		if(strcmp(nt->attr, "uid") == 0 && strcmp(nt->val, user) == 0)
 			for(tt = nt->line; tt != nt; tt = tt->line)
 			for(tt = nt->line; tt != nt; tt = tt->line)
 				if(strcmp(tt->attr, "rid") == 0){
 				if(strcmp(tt->attr, "rid") == 0){
 					strcpy(ruser, tt->val);
 					strcpy(ruser, tt->val);
 					break;
 					break;
 				}
 				}
-	}
 	ndbfree(t);
 	ndbfree(t);
+	t = nil;
 
 
 	u[0] = fastrand();
 	u[0] = fastrand();
 	u[1] = fastrand();
 	u[1] = fastrand();
@@ -415,7 +420,7 @@ secureidcheck(char *user, char *response)
 		if(strcmp(nt->attr, "ip") != 0)
 		if(strcmp(nt->attr, "ip") != 0)
 			continue;
 			continue;
 
 
-		snprint(dest,sizeof dest,"udp!%s!radius", nt->val);
+		snprint(dest, sizeof dest, "udp!%s!radius", nt->val);
 		resp = rpc(dest, &shared, req);
 		resp = rpc(dest, &shared, req);
 		if(resp == nil){
 		if(resp == nil){
 			syslog(0, AUTHLOG, "%s nil response", dest);
 			syslog(0, AUTHLOG, "%s nil response", dest);
@@ -428,29 +433,33 @@ secureidcheck(char *user, char *response)
 			resp = nil;
 			resp = nil;
 			continue;
 			continue;
 		}
 		}
-	
+
 		switch(resp->code){
 		switch(resp->code){
 		case R_AccessAccept:
 		case R_AccessAccept:
 			syslog(0, AUTHLOG, "%s accepted ruser=%s", dest, ruser);
 			syslog(0, AUTHLOG, "%s accepted ruser=%s", dest, ruser);
 			rv = nil;
 			rv = nil;
 			break;
 			break;
 		case R_AccessReject:
 		case R_AccessReject:
-			syslog(0, AUTHLOG, "%s rejected ruser=%s %s", dest, ruser, replymsg(resp));
+			syslog(0, AUTHLOG, "%s rejected ruser=%s %s",
+				dest, ruser, replymsg(resp));
 			rv = "secureid failed";
 			rv = "secureid failed";
 			break;
 			break;
 		case R_AccessChallenge:
 		case R_AccessChallenge:
-			syslog(0, AUTHLOG, "%s challenge ruser=%s %s", dest, ruser, replymsg(resp));
+			syslog(0, AUTHLOG, "%s challenge ruser=%s %s",
+				dest, ruser, replymsg(resp));
 			rv = "secureid out of sync";
 			rv = "secureid out of sync";
 			break;
 			break;
 		default:
 		default:
-			syslog(0, AUTHLOG, "%s code=%d ruser=%s %s", dest, resp->code, ruser, replymsg(resp));
+			syslog(0, AUTHLOG, "%s code=%d ruser=%s %s",
+				dest, resp->code, ruser, replymsg(resp));
 			break;
 			break;
 		}
 		}
-		break; // we have a proper reply, no need to ask again
+		break;	/* we have a proper reply, no need to ask again */
 	}
 	}
-	ndbfree(t);
-	free(radiussecret);
 out:
 out:
+	if (t)
+		ndbfree(t);
+	free(radiussecret);
 	freePacket(req);
 	freePacket(req);
 	freePacket(resp);
 	freePacket(resp);
 	return rv;
 	return rv;

+ 2 - 2
sys/src/cmd/cfs/cformat.h

@@ -15,7 +15,7 @@ enum
 	Amagic= 	0xbebeefed,	/* allocation block magic */
 	Amagic= 	0xbebeefed,	/* allocation block magic */
 	Imagic=		0xbadc00ce,	/* inode block magic */
 	Imagic=		0xbadc00ce,	/* inode block magic */
 	BtoUL=		8*sizeof(ulong),/* bits in a ulong */
 	BtoUL=		8*sizeof(ulong),/* bits in a ulong */
-	KNAMELEN=	28	/* old NAMELEN: BUG */
+	CACHENAMELEN=	128
 };
 };
 #define	Indbno		0x80000000	/* indirect block */
 #define	Indbno		0x80000000	/* indirect block */
 #define	Notabno		0xFFFFFFFF	/* not a block number */
 #define	Notabno		0xFFFFFFFF	/* not a block number */
@@ -29,7 +29,7 @@ struct Dahdr
 {
 {
 	ulong	magic;
 	ulong	magic;
 	ulong	bsize;		/* logical block size */
 	ulong	bsize;		/* logical block size */
-	char	name[KNAMELEN];
+	char	name[CACHENAMELEN];
 	short	nab;		/* number of allocation blocks */
 	short	nab;		/* number of allocation blocks */
 };
 };
 struct Dalloc
 struct Dalloc

+ 30 - 9
sys/src/cmd/cfs/cfs.c

@@ -81,7 +81,7 @@ void	sendmsg(P9fs*, Fcall*);
 void	rcvmsg(P9fs*, Fcall*);
 void	rcvmsg(P9fs*, Fcall*);
 int	delegate(void);
 int	delegate(void);
 int	askserver(void);
 int	askserver(void);
-void	cachesetup(int, char*);
+void	cachesetup(int, char*, char*);
 int	ctltest(Mfile*);
 int	ctltest(Mfile*);
 void	genstats(void);
 void	genstats(void);
 
 
@@ -119,8 +119,8 @@ char *mname[]={
 void
 void
 usage(void)
 usage(void)
 {
 {
-	fprint(2, "usage:\tcfs -s [-rd] [-f partition]");
-	fprint(2, "\tcfs [-rd] [-f partition] [-a netaddr] [mt-pt]\n");
+	fprint(2, "usage:\tcfs -s [-krd] [-f partition]\n");
+	fprint(2, "\tcfs [-krd] [-f partition] [-a netaddr] [mt-pt]\n");
 	exits("usage");
 	exits("usage");
 }
 }
 
 
@@ -133,10 +133,14 @@ main(int argc, char *argv[])
 	char *server;
 	char *server;
 	char *mtpt;
 	char *mtpt;
 
 
+	int chkid;
+	NetConnInfo * snci;
+
 	std = 0;
 	std = 0;
 	format = 0;
 	format = 0;
+	chkid = 1;
 	part = "/dev/sdC0/cache";
 	part = "/dev/sdC0/cache";
-	server = "tcp!edith";
+	server = "tcp!fs";
 	mtpt = "/tmp";
 	mtpt = "/tmp";
 
 
 	ARGBEGIN{
 	ARGBEGIN{
@@ -158,6 +162,9 @@ main(int argc, char *argv[])
 	case 'd':
 	case 'd':
 		debug = 1;
 		debug = 1;
 		break;
 		break;
+	case 'k':
+		chkid = 0;
+		break;
 	default:
 	default:
 		usage();
 		usage();
 	}ARGEND
 	}ARGEND
@@ -167,8 +174,6 @@ main(int argc, char *argv[])
 	if(debug)
 	if(debug)
 		fmtinstall('F', fcallfmt);
 		fmtinstall('F', fcallfmt);
 
 
-	cachesetup(format, part);
-
 	c.name = "client";
 	c.name = "client";
 	s.name = "server";
 	s.name = "server";
 	if(std){
 	if(std){
@@ -177,6 +182,17 @@ main(int argc, char *argv[])
 	}else
 	}else
 		mountinit(server, mtpt);
 		mountinit(server, mtpt);
 
 
+	if(chkid){
+		if((snci = getnetconninfo(nil, s.fd[0])) == nil)
+			/* Failed to lookup information; format */
+			cachesetup(1, nil, part);
+		else
+			/* Do partition check */
+			cachesetup(0, snci->raddr, part);
+	}else
+		/* Obey -f w/o regard to cache vs. remote server */
+		cachesetup(format, nil, part);
+
 	switch(fork()){
 	switch(fork()){
 	case 0:
 	case 0:
 		io();
 		io();
@@ -189,7 +205,7 @@ main(int argc, char *argv[])
 }
 }
 
 
 void
 void
-cachesetup(int format, char *partition)
+cachesetup(int format, char *name, char *partition)
 {
 {
 	int f;
 	int f;
 	int secsize;
 	int secsize;
@@ -204,8 +220,13 @@ cachesetup(int format, char *partition)
 	if(f < 0)
 	if(f < 0)
 		error("opening partition");
 		error("opening partition");
 
 
-	if(format || iinit(&ic, f, secsize)<0){
-		if(iformat(&ic, f, inodes, "bootes", blocksize, secsize) < 0)
+	if(format || iinit(&ic, f, secsize, name) < 0){
+		/*
+		 * If we need to format and don't have a name, fall
+		 * back to our old behavior of using "bootes"
+		 */
+		name = (name == nil? "bootes": name);
+		if(iformat(&ic, f, inodes, name, blocksize, secsize) < 0)
 			error("formatting failed");
 			error("formatting failed");
 	}
 	}
 }
 }

+ 8 - 2
sys/src/cmd/cfs/disk.c

@@ -12,7 +12,7 @@ int	icformat(Disk*, ulong);
  *  is inconsistent.
  *  is inconsistent.
  */
  */
 int
 int
-dinit(Disk *d, int f, int psize)
+dinit(Disk *d, int f, int psize, char *expname)
 {
 {
 	ulong	i;
 	ulong	i;
 	uvlong	length;
 	uvlong	length;
@@ -59,7 +59,13 @@ dinit(Disk *d, int f, int psize)
 	d->b2b = (d->bsize - sizeof(Dahdr))*8;
 	d->b2b = (d->bsize - sizeof(Dahdr))*8;
 	d->nab = (d->nb+d->b2b-1)/d->b2b;
 	d->nab = (d->nb+d->b2b-1)/d->b2b;
 	d->p2b = d->bsize/sizeof(Dptr);
 	d->p2b = d->bsize/sizeof(Dptr);
-	strncpy(d->name, ba->name, sizeof(d->name));
+	strncpy(d->name, ba->name, sizeof d->name);
+
+	if (expname != nil && strncmp(d->name, expname, sizeof d->name) != 0) {
+		/* Mismatch with recorded name; fail here to force a format */
+		fprint(2, "cfs: name mismatch\n");
+		return -1;
+	}
 
 
 	/*
 	/*
 	 *  check allocation blocks for consistency
 	 *  check allocation blocks for consistency

+ 2 - 2
sys/src/cmd/cfs/disk.h

@@ -10,10 +10,10 @@ struct Disk
 	ulong	nab;	/* number of allocation blocks */
 	ulong	nab;	/* number of allocation blocks */
 	int	b2b;	/* allocation bits to a block */
 	int	b2b;	/* allocation bits to a block */
 	int	p2b;	/* Dptr's per page */
 	int	p2b;	/* Dptr's per page */
-	char	name[KNAMELEN];
+	char	name[CACHENAMELEN];
 };
 };
 
 
-int	dinit(Disk*, int, int);
+int	dinit(Disk*, int, int, char*);
 int	dformat(Disk*, int, char*, ulong, ulong);
 int	dformat(Disk*, int, char*, ulong, ulong);
 ulong	dalloc(Disk*, Dptr*);
 ulong	dalloc(Disk*, Dptr*);
 ulong	dpalloc(Disk*, Dptr*);
 ulong	dpalloc(Disk*, Dptr*);

+ 3 - 3
sys/src/cmd/cfs/inode.c

@@ -18,7 +18,7 @@
  *  nab is the first inode block.
  *  nab is the first inode block.
  */
  */
 int
 int
-iinit(Icache *ic, int f, int psize)
+iinit(Icache *ic, int f, int psize, char* name)
 {
 {
 	Ibuf *b;
 	Ibuf *b;
 	Imap *m;
 	Imap *m;
@@ -29,7 +29,7 @@ iinit(Icache *ic, int f, int psize)
 	/*
 	/*
 	 *  get basic sizes and allocation info from disk
 	 *  get basic sizes and allocation info from disk
 	 */
 	 */
-	if(dinit(ic, f, psize) < 0)
+	if(dinit(ic, f, psize, name) < 0)
 		return -1;
 		return -1;
 
 
 	/*
 	/*
@@ -141,7 +141,7 @@ iformat(Icache *ic, int f, ulong nino, char *name, int bsize, int psize)
 
 
 	bcsync(ic);
 	bcsync(ic);
 
 
-	return iinit(ic, f, psize);
+	return iinit(ic, f, psize, name);
 }
 }
 
 
 /*
 /*

+ 1 - 1
sys/src/cmd/cfs/inode.h

@@ -52,7 +52,7 @@ Ibuf*	ialloc(Icache*, ulong);
 Ibuf*	iget(Icache*, Qid);
 Ibuf*	iget(Icache*, Qid);
 Ibuf*	iread(Icache*, ulong);
 Ibuf*	iread(Icache*, ulong);
 int	iformat(Icache*, int, ulong, char*, int, int);
 int	iformat(Icache*, int, ulong, char*, int, int);
-int	iinit(Icache*, int, int);
+int	iinit(Icache*, int, int, char*);
 int	iremove(Icache*, ulong);
 int	iremove(Icache*, ulong);
 int	iupdate(Icache*, ulong, Qid);
 int	iupdate(Icache*, ulong, Qid);
 int	iwrite(Icache*, Ibuf*);
 int	iwrite(Icache*, Ibuf*);

+ 12 - 12
sys/src/cmd/file.c

@@ -790,18 +790,18 @@ struct	FILE_STRING
 	"P3\n",			"ppm",				3,	"image/ppm",
 	"P3\n",			"ppm",				3,	"image/ppm",
 	"P6\n",			"ppm",				3,	"image/ppm",
 	"P6\n",			"ppm",				3,	"image/ppm",
 	"/* XPM */\n",	"xbm",				10,	"image/xbm",
 	"/* XPM */\n",	"xbm",				10,	"image/xbm",
-	".HTML ",		"troff -ms input",	6,	"text/plain",
-	".LP",			"troff -ms input",	3,	"text/plain",
-	".ND",			"troff -ms input",	3,	"text/plain",
-	".PP",			"troff -ms input",	3,	"text/plain",
-	".TL",			"troff -ms input",	3,	"text/plain",
-	".TR",			"troff -ms input",	3,	"text/plain",
-	".TH",			"manual page",		3,	"text/plain",
-	".\\\"",		"troff input",		3,	"text/plain",
-	".de",			"troff input",		3,	"text/plain",
-	".if",			"troff input",		3,	"text/plain",
-	".nr",			"troff input",		3,	"text/plain",
-	".tr",			"troff input",		3,	"text/plain",
+	".HTML ",		"troff -ms input",	6,	"text/troff",
+	".LP",			"troff -ms input",	3,	"text/troff",
+	".ND",			"troff -ms input",	3,	"text/troff",
+	".PP",			"troff -ms input",	3,	"text/troff",
+	".TL",			"troff -ms input",	3,	"text/troff",
+	".TR",			"troff -ms input",	3,	"text/troff",
+	".TH",			"manual page",		3,	"text/troff",
+	".\\\"",		"troff input",		3,	"text/troff",
+	".de",			"troff input",		3,	"text/troff",
+	".if",			"troff input",		3,	"text/troff",
+	".nr",			"troff input",		3,	"text/troff",
+	".tr",			"troff input",		3,	"text/troff",
 	"vac:",			"venti score",		4,	"text/plain",
 	"vac:",			"venti score",		4,	"text/plain",
 	0,0,0,0
 	0,0,0,0
 };
 };

+ 1 - 1
sys/src/cmd/hoc/code.c

@@ -161,7 +161,7 @@ call(void) 		/* call a function */
 
 
 	Symbol *sp = (Symbol *)pc[0]; /* symbol table entry */
 	Symbol *sp = (Symbol *)pc[0]; /* symbol table entry */
 				      /* for function */
 				      /* for function */
-	if (fp >= &frame[NFRAME])
+	if (fp >= &frame[NFRAME-1])
 		execerror(sp->name, "call nested too deeply");
 		execerror(sp->name, "call nested too deeply");
 	fp++;
 	fp++;
 	fp->sp = sp;
 	fp->sp = sp;

+ 2 - 2
sys/src/cmd/usb/audio/audiofs.c

@@ -349,7 +349,7 @@ rwalk(Fid *f)
 	for(i = 0; i < thdr.nwname; i++){
 	for(i = 0; i < thdr.nwname; i++){
 		rv = dowalk(f, thdr.wname[i]);
 		rv = dowalk(f, thdr.wname[i]);
 		if(rv != nil){
 		if(rv != nil){
-			if(nf != nil)	
+			if(nf != nil)
 				rclunk(nf);
 				rclunk(nf);
 			else
 			else
 				f->dir = savedir;
 				f->dir = savedir;
@@ -720,7 +720,7 @@ rwrite(Fid *f)
 				if (debug) fprint(2, "bad3\n");
 				if (debug) fprint(2, "bad3\n");
 				return Ebadctl;
 				return Ebadctl;
 			}
 			}
-			if (f->dir == &dirs[Qvolume] && c->min != Undef  && c->max != Undef){
+			if (f->dir == &dirs[Qvolume] && ctl != Speed_control && c->min != Undef && c->max != Undef){
 				nnf = tokenize(fields[nf-1], subfields, nelem(subfields));
 				nnf = tokenize(fields[nf-1], subfields, nelem(subfields));
 				if (nnf <= 0 || nnf > 8){
 				if (nnf <= 0 || nnf > 8){
 					if (debug) fprint(2, "bad4\n");
 					if (debug) fprint(2, "bad4\n");

+ 5 - 0
sys/src/cmd/usb/audio/audiosub.c

@@ -8,8 +8,10 @@
 Namelist terminal_types[] = {
 Namelist terminal_types[] = {
 	{	0x100, "USB Terminal, undefined type"},
 	{	0x100, "USB Terminal, undefined type"},
 	{	0x101, "USB Streaming"},
 	{	0x101, "USB Streaming"},
+	{	0x201, "Microphone"},
 	{	0x301, "Speaker"},
 	{	0x301, "Speaker"},
 	{	0x603, "Line connector"},
 	{	0x603, "Line connector"},
+	{	0x605, "S/PDIF"},
 	{	0, nil }
 	{	0, nil }
 };
 };
 
 
@@ -153,6 +155,9 @@ audio_interface(Device *d, int n, ulong csp, void *bb, int nb) {
 					if (selectorid[u] >= 0)
 					if (selectorid[u] >= 0)
 						fprint(2, "Second selector (%d, %d) on %s\n", selectorid[u], b[3], u?"record":"playback");
 						fprint(2, "Second selector (%d, %d) on %s\n", selectorid[u], b[3], u?"record":"playback");
 					selectorid[u] = b[3];
 					selectorid[u] = b[3];
+					controls[u][Selector_control].readable = 1;
+					controls[u][Selector_control].settable = 1;
+					controls[u][Selector_control].chans = 0;
 				}
 				}
 			}
 			}
 			break;
 			break;

+ 11 - 4
sys/src/cmd/usb/audio/usbaudio.c

@@ -354,15 +354,22 @@ threadmain(int argc, char **argv)
 	if (endpt[Record] >= 0){
 	if (endpt[Record] >= 0){
 		if(verbose)
 		if(verbose)
 			fprint(2, "Setting default record parameters: %d Hz, %d channels at %d bits\n",
 			fprint(2, "Setting default record parameters: %d Hz, %d channels at %d bits\n",
-				defaultspeed[Play], 2, 16);
-		if(findalt(Record, 2, 16, defaultspeed[Record]) < 0){
-			if(findalt(Record, 2, 16, 48000) < 0)
+				defaultspeed[Record], 2, 16);
+		i = 2;
+		while(findalt(Record, i, 16, defaultspeed[Record]) < 0){
+			if(i == 2 && controls[Record][Channel_control].max == 1){
+				fprint(2, "Warning, can't configure stereo recording, configuring mono instead\n");
+				i = 1;
+				continue;
+			}
+			if(findalt(Record, i, 16, 48000) < 0)
 				sysfatal("Can't configure record for %d or %d Hz", defaultspeed[Record], 48000);
 				sysfatal("Can't configure record for %d or %d Hz", defaultspeed[Record], 48000);
 			fprint(2, "Warning, can't configure record for %d Hz, configuring for %d Hz instead\n",
 			fprint(2, "Warning, can't configure record for %d Hz, configuring for %d Hz instead\n",
 				defaultspeed[Record], 48000);
 				defaultspeed[Record], 48000);
 			defaultspeed[Record] = 48000;
 			defaultspeed[Record] = 48000;
+			break;
 		}
 		}
-		value[0] = 2;
+		value[0] = i;
 		if (setcontrol(Record, "channels", value) == Undef)
 		if (setcontrol(Record, "channels", value) == Undef)
 			sysfatal("Can't set record channels\n");
 			sysfatal("Can't set record channels\n");
 		value[0] = 16;
 		value[0] = 16;

+ 49 - 24
sys/src/cmd/usb/audio/usbaudioctl.c

@@ -197,24 +197,32 @@ setspeed(int rec, int speed)
 		buf[0] = speed;
 		buf[0] = speed;
 		buf[1] = speed >> 8;
 		buf[1] = speed >> 8;
 		buf[2] = speed >> 16;
 		buf[2] = speed >> 16;
-		if(setupcmd(ad->ep[0], RH2D|Rclass|Rendpt, SET_CUR, sampling_freq_control<<8, endpt[rec], buf, 3) < 0){
+		n = endpt[rec];
+		if (rec)
+			n |= 0x80;
+		if(setupcmd(ad->ep[0], RH2D|Rclass|Rendpt, SET_CUR, sampling_freq_control<<8, n, buf, 3) < 0){
 			fprint(2, "Error in setupcmd\n");
 			fprint(2, "Error in setupcmd\n");
 			return Undef;
 			return Undef;
 		}
 		}
-		if (setupreq(ad->ep[0], RD2H|Rclass|Rendpt, GET_CUR, sampling_freq_control<<8, endpt[rec], 3) < 0){
+		if (setupreq(ad->ep[0], RD2H|Rclass|Rendpt, GET_CUR, sampling_freq_control<<8, n, 3) < 0){
 			fprint(2, "Error in setupreq\n");
 			fprint(2, "Error in setupreq\n");
 			return Undef;
 			return Undef;
 		}
 		}
 		n = setupreply(ad->ep[0], buf, 3);
 		n = setupreply(ad->ep[0], buf, 3);
 		if (n != 3)
 		if (n != 3)
 			fprint(2, "Error in setupreply: %d\n", n);
 			fprint(2, "Error in setupreply: %d\n", n);
-		else if (buf[2]){
-			if (debug & Dbgcontrol)
-				fprint(2, "Speed out of bounds %d (0x%x)\n",
-					buf[0] | buf[1] << 8 | buf[2] << 16,
-					buf[0] | buf[1] << 8 | buf[2] << 16);
-		}else
-			speed = buf[0] | buf[1] << 8 | buf[2] << 16;
+		else{
+			n = buf[0] | buf[1] << 8 | buf[2] << 16;
+			if (buf[2] || n == 0){
+				if (debug & Dbgcontrol)
+					fprint(2, "Speed out of bounds %d (0x%x)\n", n, n);
+			}else if (n != speed && ad->vid == 0x077d && (ad->did == 0x0223 || ad->did == 0x07af)){
+				/* Griffin iMic responds incorrectly to sample rate inquiry */
+				if (debug & Dbgcontrol)
+					fprint(2, " reported as %d (iMic bug?);", n);
+			}else
+				speed = n;
+		}
 		if (debug & Dbgcontrol)
 		if (debug & Dbgcontrol)
 			fprint(2, " speed now %d Hz;", speed);
 			fprint(2, " speed now %d Hz;", speed);
 	}
 	}
@@ -229,7 +237,7 @@ setspeed(int rec, int speed)
 	if (debug & Dbgcontrol)
 	if (debug & Dbgcontrol)
 		fprint(2, "Configuring %s endpoint for %d Hz\n",
 		fprint(2, "Configuring %s endpoint for %d Hz\n",
 				rec?"record":"playback", speed);
 				rec?"record":"playback", speed);
-	sprint(cmdbuf, "ep %d %d %c %ld %d", endpt[rec], da->interval, rec?'r':'w', 
+	sprint(cmdbuf, "ep %d %d %c %ld %d", endpt[rec], da->interval, rec?'r':'w',
 		controls[rec][Channel_control].value[0]*controls[rec][Resolution_control].value[0]/8,
 		controls[rec][Channel_control].value[0]*controls[rec][Resolution_control].value[0]/8,
 		speed);
 		speed);
 	if (write(ad->ctl, cmdbuf, strlen(cmdbuf)) != strlen(cmdbuf)){
 	if (write(ad->ctl, cmdbuf, strlen(cmdbuf)) != strlen(cmdbuf)){
@@ -256,7 +264,7 @@ getspeed(int rec, int which)
 	if (endpt[rec] < 0)
 	if (endpt[rec] < 0)
 		sysfatal("endpt[%s] not set\n", rec?"Record":"Playback");
 		sysfatal("endpt[%s] not set\n", rec?"Record":"Playback");
 	if(debug & Dbgcontrol)
 	if(debug & Dbgcontrol)
-		fprint(2, "getspeed: curalt[%d] == %d\n", rec, endpt[rec]);
+		fprint(2, "getspeed: endpt[%d] == %d\n", rec, endpt[rec]);
 	ep = ad->ep[endpt[rec]];
 	ep = ad->ep[endpt[rec]];
 	if (ep->iface == nil)
 	if (ep->iface == nil)
 		sysfatal("no interface");
 		sysfatal("no interface");
@@ -274,7 +282,10 @@ getspeed(int rec, int which)
 	if (a->caps & has_setspeed){
 	if (a->caps & has_setspeed){
 		if(debug & Dbgcontrol)
 		if(debug & Dbgcontrol)
 			fprint(2, "getspeed: has_setspeed, ask\n");
 			fprint(2, "getspeed: has_setspeed, ask\n");
-		if (setupreq(ad->ep[0], RD2H|Rclass|Rendpt, which, sampling_freq_control<<8, endpt[rec], 3) < 0)
+		n = endpt[rec];
+		if (rec)
+			n |= 0x80;
+		if (setupreq(ad->ep[0], RD2H|Rclass|Rendpt, which, sampling_freq_control<<8, n, 3) < 0)
 			return Undef;
 			return Undef;
 		n = setupreply(ad->ep[0], buf, 3);
 		n = setupreply(ad->ep[0], buf, 3);
 		if(n == 3){
 		if(n == 3){
@@ -411,8 +422,8 @@ setcontrol(int rec, char *name, long *value)
 		break;
 		break;
 	case Selector_control:
 	case Selector_control:
 		type = RH2D|Rclass|Rinterface;
 		type = RH2D|Rclass|Rinterface;
-		control = ctl<<8;
-		index = selectorid[rec];
+		control = 0;
+		index = selectorid[rec]<<8;
 		break;
 		break;
 	case Channel_control:
 	case Channel_control:
 		control = findalt(rec, value[0], controls[rec][Resolution_control].value[0], defaultspeed[rec]);
 		control = findalt(rec, value[0], controls[rec][Resolution_control].value[0], defaultspeed[rec]);
@@ -463,10 +474,11 @@ getspecialcontrol(int rec, int ctl, int req, long *value)
 {
 {
 	byte buf[3];
 	byte buf[3];
 	int m, n, i;
 	int m, n, i;
-	int type, control, index, count;
+	int type, control, index, count, signedbyte;
 	short svalue;
 	short svalue;
 
 
 	count = 1;
 	count = 1;
+	signedbyte = 0;
 	switch(ctl){
 	switch(ctl){
 	default:
 	default:
 		return Undef;
 		return Undef;
@@ -488,22 +500,29 @@ getspecialcontrol(int rec, int ctl, int req, long *value)
 	case Delay_control:
 	case Delay_control:
 		count = 2;
 		count = 2;
 		/* fall through */
 		/* fall through */
-	case Mute_control:
 	case Bass_control:
 	case Bass_control:
 	case Mid_control:
 	case Mid_control:
 	case Treble_control:
 	case Treble_control:
 	case Equalizer_control:
 	case Equalizer_control:
-	case Agc_control:
-	case Bassboost_control:
-	case Loudness_control:
+		signedbyte = 1;
 		type = RD2H|Rclass|Rinterface;
 		type = RD2H|Rclass|Rinterface;
 		control = ctl<<8;
 		control = ctl<<8;
 		index = featureid[rec]<<8;
 		index = featureid[rec]<<8;
 		break;
 		break;
 	case Selector_control:
 	case Selector_control:
 		type = RD2H|Rclass|Rinterface;
 		type = RD2H|Rclass|Rinterface;
+		control = 0;
+		index = selectorid[rec]<<8;
+		break;
+	case Mute_control:
+	case Agc_control:
+	case Bassboost_control:
+	case Loudness_control:
+		if (req != GET_CUR)
+			return Undef;
+		type = RD2H|Rclass|Rinterface;
 		control = ctl<<8;
 		control = ctl<<8;
-		index = selectorid[rec];
+		index = featureid[rec]<<8;
 		break;
 		break;
 	}
 	}
 	if (controls[rec][ctl].chans){
 	if (controls[rec][ctl].chans){
@@ -528,12 +547,15 @@ getspecialcontrol(int rec, int ctl, int req, long *value)
 						value[0] = svalue;
 						value[0] = svalue;
 					break;
 					break;
 				case 1:
 				case 1:
+					svalue = buf[0];
+					if (signedbyte && (svalue&0x80))
+						svalue |= 0xFF00;
 					if (req == GET_CUR){
 					if (req == GET_CUR){
-						value[i] = buf[0];
-						value[0] += buf[0];
+						value[i] = svalue;
+						value[0] += svalue;
 						m++;
 						m++;
 					}else
 					}else
-						value[0] = buf[0];
+						value[0] = svalue;
 				}
 				}
 			}
 			}
 		}
 		}
@@ -552,7 +574,10 @@ getspecialcontrol(int rec, int ctl, int req, long *value)
 		value[0] = svalue;
 		value[0] = svalue;
 		break;
 		break;
 	case 1:
 	case 1:
-		value[0] = buf[0];
+		svalue = buf[0];
+		if (signedbyte && (svalue&0x80))
+			svalue |= 0xFF00;
+		value[0] = svalue;
 	}
 	}
 	return 0;
 	return 0;
 }
 }

+ 1 - 0
sys/src/cmd/webfs/http.c

@@ -359,6 +359,7 @@ httpopen(Client *c, Url *url)
 
 
 	case 301:	/* Moved Permanently */
 	case 301:	/* Moved Permanently */
 	case 302:	/* Moved Temporarily */
 	case 302:	/* Moved Temporarily */
+	case 303:	/* See Other */
 	case 307: /* Temporary Redirect  */
 	case 307: /* Temporary Redirect  */
 		redirect = 1;
 		redirect = 1;
 		break;
 		break;

+ 1 - 0
sys/src/lib9p/parse.c

@@ -76,6 +76,7 @@ respondcmderror(Req *r, Cmdbuf *cb, char *fmt, ...)
 	p = vseprint(err, e, fmt, arg);
 	p = vseprint(err, e, fmt, arg);
 	va_end(arg);
 	va_end(arg);
 	p = seprint(p, e, ": \"");
 	p = seprint(p, e, ": \"");
+	quotefmtinstall();	/* just in case */
 	for(i=0; i<cb->nf; i++){
 	for(i=0; i<cb->nf; i++){
 		if(i > 0)
 		if(i > 0)
 			p = seprint(p, e, " ");
 			p = seprint(p, e, " ");