Browse Source

Plan 9 from Bell Labs 2003-03-26

David du Colombier 21 years ago
parent
commit
a3a7fea79b
100 changed files with 2076 additions and 1017 deletions
  1. 164 145
      dist/replica/plan9.db
  2. 172 0
      dist/replica/plan9.log
  3. 1 18
      lib/vgadb
  4. 4 7
      rc/bin/ps2pdf
  5. 1 0
      sys/include/auth.h
  6. 2 1
      sys/include/libsec.h
  7. 19 9
      sys/lib/acid/leak
  8. 1 1
      sys/lib/sysconfig/fl/boot
  9. 1 1
      sys/lib/sysconfig/fl/flproto
  10. 24 37
      sys/man/1/ssh
  11. 0 1
      sys/man/2/9pfid
  12. 0 1
      sys/man/2/9pfile
  13. 2 0
      sys/man/2/fgetc
  14. 2 0
      sys/man/2/fopen
  15. 2 0
      sys/man/2/fprintf
  16. 2 0
      sys/man/2/fscanf
  17. 116 64
      sys/man/2/lock
  18. 3 0
      sys/man/2/rsa
  19. 2 0
      sys/man/2/tmpfile
  20. 55 13
      sys/man/4/factotum
  21. 0 9
      sys/man/4/fossil
  22. 8 0
      sys/man/4/lnfs
  23. 14 1
      sys/man/6/namespace
  24. 241 0
      sys/man/8/rsa
  25. 3 1
      sys/man/8/venti
  26. 1 1
      sys/src/9/mtx/dat.h
  27. 3 3
      sys/src/9/mtx/devether.c
  28. 1 1
      sys/src/9/pc/dat.h
  29. 80 25
      sys/src/9/pc/devarch.c
  30. 14 6
      sys/src/9/pc/devether.c
  31. 5 0
      sys/src/9/pc/devfloppy.c
  32. 1 1
      sys/src/9/pc/devpccard.c
  33. 1 1
      sys/src/9/pc/devusb.c
  34. 1 1
      sys/src/9/pc/ethersink.c
  35. 0 29
      sys/src/9/pc/i8253.c
  36. 4 1
      sys/src/9/pc/main.c
  37. 0 5
      sys/src/9/pc/mp.c
  38. 1 0
      sys/src/9/pc/pccpu
  39. 2 1
      sys/src/9/pc/pcmciamodem.c
  40. 1 0
      sys/src/9/pc/screen.h
  41. 9 0
      sys/src/9/pc/sdata.c
  42. 2 0
      sys/src/9/pc/vgahiqvideo.c
  43. 5 2
      sys/src/9/pc/vgamach64xx.c
  44. 13 40
      sys/src/9/pc/vganvidia.c
  45. 2 0
      sys/src/9/pc/vgas3.c
  46. 18 7
      sys/src/9/pc/wavelan.c
  47. 0 2
      sys/src/9/pc/wavelan.h
  48. 35 15
      sys/src/9/port/chan.c
  49. 11 2
      sys/src/9/port/dev.c
  50. 2 2
      sys/src/9/port/devaudio.c
  51. 30 18
      sys/src/9/port/devcap.c
  52. 2 2
      sys/src/9/port/devcons.c
  53. 63 41
      sys/src/9/port/devenv.c
  54. 2 0
      sys/src/9/port/devmouse.c
  55. 12 4
      sys/src/9/port/devroot.c
  56. 4 1
      sys/src/9/port/portdat.h
  57. 5 0
      sys/src/9/port/proc.c
  58. 23 10
      sys/src/9/port/sysfile.c
  59. 1 1
      sys/src/ape/cmd/make/mkfile
  60. 2 0
      sys/src/ape/cmd/mkfile
  61. 0 293
      sys/src/ape/cmd/pdksh/missing.c
  62. 0 1
      sys/src/ape/cmd/pdksh/mkfile
  63. 3 1
      sys/src/ape/lib/ap/gen/strxfrm.c
  64. 5 0
      sys/src/ape/lib/ap/plan9/_buf.c
  65. 16 16
      sys/src/ape/lib/ap/plan9/_envsetup.c
  66. 1 0
      sys/src/ape/lib/ap/plan9/dir.h
  67. 5 1
      sys/src/ape/lib/ap/plan9/dirtostat.c
  68. 2 4
      sys/src/ape/lib/ap/plan9/open.c
  69. 0 1
      sys/src/ape/lib/ap/plan9/sys9.h
  70. 4 4
      sys/src/ape/lib/ap/plan9/time.c
  71. 1 0
      sys/src/ape/lib/bsd/mkfile
  72. 0 2
      sys/src/cmd/9660srv/mkfile
  73. 71 0
      sys/src/cmd/auth/asn12rsa.c
  74. 1 1
      sys/src/cmd/auth/factotum/apop.c
  75. 6 11
      sys/src/cmd/auth/factotum/dat.h
  76. 17 20
      sys/src/cmd/auth/factotum/fs.c
  77. 1 1
      sys/src/cmd/auth/factotum/mkfile
  78. 5 5
      sys/src/cmd/auth/factotum/p9any.c
  79. 1 1
      sys/src/cmd/auth/factotum/p9cr.c
  80. 8 4
      sys/src/cmd/auth/factotum/p9sk1.c
  81. 1 1
      sys/src/cmd/auth/factotum/pass.c
  82. 1 1
      sys/src/cmd/auth/factotum/rsa.c
  83. 0 88
      sys/src/cmd/auth/factotum/secretpem.c
  84. 2 2
      sys/src/cmd/auth/factotum/secstore.c
  85. 1 1
      sys/src/cmd/auth/factotum/sshrsa.c
  86. 19 21
      sys/src/cmd/auth/factotum/util.c
  87. 126 0
      sys/src/cmd/auth/factotum/wep.c
  88. 1 1
      sys/src/cmd/auth/login.c
  89. 17 2
      sys/src/cmd/auth/mkfile
  90. 4 3
      sys/src/cmd/auth/newns.c
  91. 59 0
      sys/src/cmd/auth/pemdecode.c
  92. 64 0
      sys/src/cmd/auth/pemencode.c
  93. 160 0
      sys/src/cmd/auth/rsa2any.c
  94. 1 0
      sys/src/cmd/auth/rsa2any.h
  95. 43 0
      sys/src/cmd/auth/rsa2csr.c
  96. 44 0
      sys/src/cmd/auth/rsa2pub.c
  97. 35 0
      sys/src/cmd/auth/rsa2ssh.c
  98. 50 0
      sys/src/cmd/auth/rsa2x509.c
  99. 46 0
      sys/src/cmd/auth/rsafill.c
  100. 60 0
      sys/src/cmd/auth/rsagen.c

+ 164 - 145
dist/replica/plan9.db

@@ -46,6 +46,7 @@
 386/bin/astro - 775 sys sys 1039758530 139263
 386/bin/auth - 20000000775 sys sys 1016920815 0
 386/bin/auth/aescbc - 775 sys sys 1045537938 120957
+386/bin/auth/asn12rsa - 775 sys sys 1048622916 117753
 386/bin/auth/authsrv - 775 sys sys 1045537939 161978
 386/bin/auth/changeuser - 775 sys sys 1045537939 96090
 386/bin/auth/convkeys - 775 sys sys 1046656929 86221
@@ -54,13 +55,22 @@
 386/bin/auth/debug - 775 sys sys 1045537941 98167
 386/bin/auth/disable - 775 sys sys 1020319057 146
 386/bin/auth/enable - 775 sys sys 1020319057 134
-386/bin/auth/factotum - 775 sys sys 1048341823 305986
+386/bin/auth/factotum - 775 sys sys 1048622917 307859
 386/bin/auth/fgui - 775 sys sys 1045537942 211917
 386/bin/auth/guard.srv - 775 sys sys 1045537943 139879
 386/bin/auth/iam - 775 sys sys 1039758534 51077
 386/bin/auth/keyfs - 775 sys sys 1046656931 116514
-386/bin/auth/login - 775 sys sys 1045537944 100738
+386/bin/auth/login - 775 sys sys 1048622917 100746
+386/bin/auth/newns - 775 sys sys 1048622918 85710
+386/bin/auth/pemdecode - 775 sys sys 1048622918 59616
+386/bin/auth/pemencode - 775 sys sys 1048622919 58345
 386/bin/auth/printnetkey - 775 sys sys 1039758534 40969
+386/bin/auth/rsa2csr - 775 sys sys 1048622919 177865
+386/bin/auth/rsa2pub - 775 sys sys 1048622920 141752
+386/bin/auth/rsa2ssh - 775 sys sys 1048622920 137257
+386/bin/auth/rsa2x509 - 775 sys sys 1048622921 181871
+386/bin/auth/rsafill - 775 sys sys 1048622922 141820
+386/bin/auth/rsagen - 775 sys sys 1048622922 152103
 386/bin/auth/secretpem - 775 sys sys 1045537944 118526
 386/bin/auth/secstore - 775 sys sys 1048341824 186912
 386/bin/auth/secstored - 775 sys sys 1048341825 193098
@@ -472,36 +482,36 @@
 386/lib/ape/libnet.a - 664 sys sys 1038237543 16604
 386/lib/ape/libregexp.a - 664 sys sys 1038237544 46270
 386/lib/ape/libv.a - 664 sys sys 1038237545 19266
-386/lib/lib9p.a - 664 sys sys 1045538115 80508
+386/lib/lib9p.a - 664 sys sys 1048622923 80508
 386/lib/libString.a - 664 sys sys 1045538115 18554
-386/lib/libauth.a - 664 sys sys 1045538115 52988
-386/lib/libauthsrv.a - 664 sys sys 1046656925 33706
+386/lib/libauth.a - 664 sys sys 1048622923 52988
+386/lib/libauthsrv.a - 664 sys sys 1048622923 33706
 386/lib/libbin.a - 664 sys sys 1045538115 2556
 386/lib/libbio.a - 664 sys sys 1045538115 28390
-386/lib/libc.a - 664 sys sys 1045538117 496970
+386/lib/libc.a - 664 sys sys 1048622925 496970
 386/lib/libcontrol.a - 664 sys sys 1045538117 243448
-386/lib/libdisk.a - 664 sys sys 1045538118 43692
+386/lib/libdisk.a - 664 sys sys 1048622925 43692
 386/lib/libdraw.a - 664 sys sys 1045538119 372606
 386/lib/libflate.a - 664 sys sys 1045538119 77880
 386/lib/libframe.a - 664 sys sys 1045538119 65832
 386/lib/libgeometry.a - 664 sys sys 1045538120 50806
 386/lib/libhtml.a - 664 sys sys 1045538120 220944
-386/lib/libhttpd.a - 664 sys sys 1045538121 98914
+386/lib/libhttpd.a - 664 sys sys 1048622926 98914
 386/lib/libip.a - 664 sys sys 1045538121 32560
 386/lib/libl.a - 664 sys sys 1045538121 5412
 386/lib/libmach.a - 664 sys sys 1045538123 743792
 386/lib/libmemdraw.a - 664 sys sys 1046656926 292604
 386/lib/libmemlayer.a - 664 sys sys 1046182506 47256
-386/lib/libmp.a - 664 sys sys 1048341830 77064
+386/lib/libmp.a - 664 sys sys 1048622926 77064
 386/lib/libndb.a - 664 sys sys 1045538125 52836
 386/lib/libplumb.a - 664 sys sys 1045538125 19000
 386/lib/libregexp.a - 664 sys sys 1045538126 37356
 386/lib/libscribble.a - 664 sys sys 1045538126 108138
-386/lib/libsec.a - 664 sys sys 1047763618 642760
+386/lib/libsec.a - 664 sys sys 1048622928 642760
 386/lib/libstdio.a - 664 sys sys 1045538128 125144
 386/lib/libsunrpc.a - 664 sys sys 1046368791 357146
 386/lib/libthread.a - 664 sys sys 1045538129 71494
-386/lib/libventi.a - 664 sys sys 1045538129 97938
+386/lib/libventi.a - 664 sys sys 1048622928 97938
 386/mbr - 775 sys sys 1022125974 407
 386/mkfile - 664 sys sys 948141303 46
 386/pbs - 775 sys sys 1022125973 494
@@ -2698,7 +2708,7 @@ lib/tftpd - 20000000775 sys sys 944944178 0
 lib/unicode - 664 sys sys 958440028 223312
 lib/unicode.notice - 664 sys sys 958504386 1398
 lib/units - 664 sys sys 1014923483 9984
-lib/vgadb - 664 sys sys 1046203906 28125
+lib/vgadb - 664 sys sys 1048636622 27466
 lib/volcanoes - 664 sys sys 944944024 119831
 lib/words - 664 sys sys 1014923442 247097
 lp - 20000000775 sys sys 958199268 0
@@ -2920,7 +2930,7 @@ rc/bin/pdf2ps - 775 sys sys 1032054728 827
 rc/bin/postscript - 20000000775 sys sys 950322845 0
 rc/bin/printfont - 775 sys sys 945617208 2851
 rc/bin/ps2gif - 775 sys sys 945617208 100
-rc/bin/ps2pdf - 775 sys sys 1032054728 680
+rc/bin/ps2pdf - 775 sys sys 1048636764 646
 rc/bin/psfax - 775 sys sys 945617208 1738
 rc/bin/psu - 775 sys sys 1019769762 333
 rc/bin/reboot - 775 sys sys 1020011207 36
@@ -3256,7 +3266,7 @@ sys/include/ape/u.h - 664 sys sys 1038237538 399
 sys/include/ape/unistd.h - 664 sys sys 944948760 3917
 sys/include/ape/utime.h - 664 sys sys 944948760 259
 sys/include/ar.h - 664 sys sys 1014929061 244
-sys/include/auth.h - 664 sys sys 1044828839 3428
+sys/include/auth.h - 664 sys sys 1048614957 3469
 sys/include/authsrv.h - 664 sys sys 1014929062 4542
 sys/include/bin.h - 664 sys sys 1014929062 215
 sys/include/bio.h - 664 sys sys 1014929062 1854
@@ -3276,7 +3286,7 @@ sys/include/httpd.h - 664 sys sys 1014929064 5726
 sys/include/ip.h - 664 sys sys 1015700847 2395
 sys/include/keyboard.h - 664 sys sys 1014929064 799
 sys/include/libc.h - 664 sys sys 1037035097 18624
-sys/include/libsec.h - 664 sys sys 1044638428 8817
+sys/include/libsec.h - 664 sys sys 1048616895 8914
 sys/include/mach.h - 664 sys sys 1032058231 8101
 sys/include/memdraw.h - 664 sys sys 1039752978 5616
 sys/include/memlayer.h - 664 sys sys 1014929065 1810
@@ -3304,7 +3314,7 @@ sys/lib/acid/alpha - 664 sys sys 944955985 4849
 sys/lib/acid/arm - 664 sys sys 984696197 1842
 sys/lib/acid/coverage - 664 sys sys 944955985 1746
 sys/lib/acid/kernel - 664 sys sys 1020313817 4737
-sys/lib/acid/leak - 664 sys sys 1014924361 1796
+sys/lib/acid/leak - 664 sys sys 1048637057 2185
 sys/lib/acid/mips - 664 sys sys 944955985 5472
 sys/lib/acid/network - 664 sys sys 1020313817 2499
 sys/lib/acid/pool - 664 sys sys 1016833869 4244
@@ -4184,8 +4194,8 @@ sys/lib/sysconfig/auth/files/tcp566 - 775 sys sys 1016833537 36
 sys/lib/sysconfig/auth/files/tcp567 - 775 sys sys 1016833537 34
 sys/lib/sysconfig/auth/mkfile - 664 sys sys 1016833657 2937
 sys/lib/sysconfig/fl - 20000000775 sys sys 1042004836 0
-sys/lib/sysconfig/fl/boot - 775 sys sys 1042004836 773
-sys/lib/sysconfig/fl/flproto - 664 sys sys 1042004836 129
+sys/lib/sysconfig/fl/boot - 775 sys sys 1048637071 773
+sys/lib/sysconfig/fl/flproto - 664 sys sys 1048637070 137
 sys/lib/sysconfig/fl/venti.conf - 664 sys sys 1042004837 139
 sys/lib/sysconfig/proto - 20000000775 sys sys 959740591 0
 sys/lib/sysconfig/proto/allproto - 664 sys sys 945018241 2
@@ -4522,7 +4532,7 @@ sys/man/1/spell - 664 sys sys 964455062 1873
 sys/man/1/spin - 664 sys sys 953242867 3588
 sys/man/1/split - 664 sys sys 1038183072 1171
 sys/man/1/src - 664 sys sys 954266293 1138
-sys/man/1/ssh - 664 sys sys 1042330461 6968
+sys/man/1/ssh - 664 sys sys 1048643947 6622
 sys/man/1/stop - 664 sys sys 944959673 658
 sys/man/1/strings - 664 sys sys 944959675 774
 sys/man/1/strip - 664 sys sys 958580250 448
@@ -4557,8 +4567,8 @@ sys/man/2 - 20000000775 sys sys 1017423721 0
 sys/man/2/0intro - 664 sys sys 1044724217 11574
 sys/man/2/9p - 664 sys sys 1046886431 15221
 sys/man/2/9pcmdbuf - 664 sys sys 1044430197 2057
-sys/man/2/9pfid - 664 sys sys 1030451710 3644
-sys/man/2/9pfile - 664 sys sys 1017423719 4426
+sys/man/2/9pfid - 664 sys sys 1048637158 3626
+sys/man/2/9pfile - 664 sys sys 1048637158 4408
 sys/man/2/INDEX - 664 sys sys 1045538129 20216
 sys/man/2/INDEX.html - 664 sys sys 1019918562 26387
 sys/man/2/abort - 664 sys sys 944959693 331
@@ -4605,16 +4615,16 @@ sys/man/2/exp - 664 sys sys 944959694 935
 sys/man/2/fauth - 664 sys sys 1017251164 1222
 sys/man/2/fcall - 664 sys sys 1022557346 7053
 sys/man/2/fd2path - 664 sys sys 957920009 1280
-sys/man/2/fgetc - 664 sys sys 952627479 3961
+sys/man/2/fgetc - 664 sys sys 1048637163 3983
 sys/man/2/flate - 664 sys sys 1018386775 4147
 sys/man/2/floor - 664 sys sys 944959697 737
 sys/man/2/fmtinstall - 664 sys sys 1034952837 7862
-sys/man/2/fopen - 664 sys sys 944959695 7748
+sys/man/2/fopen - 664 sys sys 1048637159 7770
 sys/man/2/fork - 664 sys sys 1018386775 3764
-sys/man/2/fprintf - 664 sys sys 985124879 9704
+sys/man/2/fprintf - 664 sys sys 1048637160 9726
 sys/man/2/frame - 664 sys sys 984709631 7875
 sys/man/2/frexp - 664 sys sys 984709631 871
-sys/man/2/fscanf - 664 sys sys 944959695 10527
+sys/man/2/fscanf - 664 sys sys 1048637160 10550
 sys/man/2/fversion - 664 sys sys 1017423720 1654
 sys/man/2/genrandom - 664 sys sys 1017251164 876
 sys/man/2/getcallerpc - 664 sys sys 964455063 670
@@ -4634,7 +4644,7 @@ sys/man/2/iounit - 664 sys sys 1015091523 1001
 sys/man/2/ip - 664 sys sys 1015701015 6986
 sys/man/2/isalpharune - 664 sys sys 1015091523 1059
 sys/man/2/keyboard - 664 sys sys 950892860 2065
-sys/man/2/lock - 664 sys sys 1017435044 3244
+sys/man/2/lock - 664 sys sys 1048643958 4692
 sys/man/2/mach - 664 sys sys 944959696 7994
 sys/man/2/malloc - 664 sys sys 1032238537 4397
 sys/man/2/matrix - 664 sys sys 950892861 6090
@@ -4673,7 +4683,7 @@ sys/man/2/readv - 664 sys sys 1017423721 1454
 sys/man/2/regexp - 664 sys sys 988225293 3548
 sys/man/2/remove - 664 sys sys 958249504 518
 sys/man/2/rendezvous - 664 sys sys 950593497 1322
-sys/man/2/rsa - 664 sys sys 1037580114 4087
+sys/man/2/rsa - 664 sys sys 1048643959 4151
 sys/man/2/rune - 664 sys sys 1015091526 3069
 sys/man/2/runestrcat - 664 sys sys 969499889 1086
 sys/man/2/scribble - 664 sys sys 985638584 3847
@@ -4695,7 +4705,7 @@ sys/man/2/subfont - 664 sys sys 956345937 5140
 sys/man/2/symbol - 664 sys sys 950892874 9423
 sys/man/2/thread - 664 sys sys 1032058675 11625
 sys/man/2/time - 664 sys sys 1015091527 739
-sys/man/2/tmpfile - 664 sys sys 944959694 1135
+sys/man/2/tmpfile - 664 sys sys 1048637161 1157
 sys/man/2/wait - 664 sys sys 1015091528 2481
 sys/man/2/window - 664 sys sys 950593499 5522
 sys/man/3 - 20000000775 sys sys 1017251174 0
@@ -4746,15 +4756,15 @@ sys/man/4/consolefs - 664 sys sys 1022112154 3751
 sys/man/4/dossrv - 664 sys sys 1015024813 4176
 sys/man/4/execnet - 664 sys sys 1019866708 1069
 sys/man/4/exportfs - 664 sys sys 1018386776 3746
-sys/man/4/factotum - 664 sys sys 1021579982 13900
-sys/man/4/fossil - 664 sys sys 1045777955 8690
+sys/man/4/factotum - 664 sys sys 1048639180 14728
+sys/man/4/fossil - 664 sys sys 1048643971 8463
 sys/man/4/fs - 664 sys sys 1019058716 3387
 sys/man/4/ftpfs - 664 sys sys 1048285446 4327
 sys/man/4/import - 664 sys sys 1034195346 2204
 sys/man/4/iostats - 664 sys sys 959566568 1415
 sys/man/4/keyfs - 664 sys sys 1017251244 5003
 sys/man/4/kfs - 664 sys sys 1019058716 2159
-sys/man/4/lnfs - 664 sys sys 1018973955 1006
+sys/man/4/lnfs - 664 sys sys 1048643973 1215
 sys/man/4/mntgen - 664 sys sys 1043680799 473
 sys/man/4/namespace - 664 sys sys 1018386777 6916
 sys/man/4/nfs - 664 sys sys 1046367663 2740
@@ -4808,7 +4818,7 @@ sys/man/6/man - 664 sys sys 944959678 4961
 sys/man/6/map - 664 sys sys 944959678 1892
 sys/man/6/mpictures - 664 sys sys 944959678 2899
 sys/man/6/ms - 664 sys sys 958249504 6815
-sys/man/6/namespace - 664 sys sys 969499892 1380
+sys/man/6/namespace - 664 sys sys 1048637182 1576
 sys/man/6/ndb - 664 sys sys 1032354298 6081
 sys/man/6/plot - 664 sys sys 944959679 6739
 sys/man/6/plumb - 664 sys sys 969499892 10918
@@ -4875,6 +4885,7 @@ sys/man/8/prep - 664 sys sys 1018802868 12910
 sys/man/8/qer - 664 sys sys 960837925 4785
 sys/man/8/reboot - 664 sys sys 969499895 414
 sys/man/8/replica - 664 sys sys 1021579979 6239
+sys/man/8/rsa - 664 sys sys 1048614939 4620
 sys/man/8/scanmail - 664 sys sys 969499895 10803
 sys/man/8/scuzz - 664 sys sys 984709640 7916
 sys/man/8/secstore - 664 sys sys 1045501623 990
@@ -4889,7 +4900,7 @@ sys/man/8/timesync - 664 sys sys 1022590210 1629
 sys/man/8/tlssrv - 664 sys sys 1037580152 2594
 sys/man/8/udpecho - 664 sys sys 954305553 303
 sys/man/8/update - 664 sys sys 961259288 2336
-sys/man/8/venti - 664 sys sys 1036468085 5130
+sys/man/8/venti - 664 sys sys 1048637200 5194
 sys/man/8/ventiaux - 664 sys sys 1045501683 9967
 sys/man/8/vga - 664 sys sys 959698505 3557
 sys/man/8/x509 - 664 sys sys 1037581047 1115
@@ -5061,9 +5072,9 @@ sys/src/9/mkfile - 664 sys sys 1017795039 191
 sys/src/9/mtx - 20000000775 sys sys 1018721288 0
 sys/src/9/mtx/clock.c - 664 sys sys 1032053278 1293
 sys/src/9/mtx/cycintr.c - 664 sys sys 1018721285 230
-sys/src/9/mtx/dat.h - 664 sys sys 1032053279 3733
+sys/src/9/mtx/dat.h - 664 sys sys 1048644012 3731
 sys/src/9/mtx/devarch.c - 664 sys sys 1018721285 6793
-sys/src/9/mtx/devether.c - 664 sys sys 1026848168 9279
+sys/src/9/mtx/devether.c - 664 sys sys 1048644013 9279
 sys/src/9/mtx/devrtc.c - 664 sys sys 1018721285 6772
 sys/src/9/mtx/errstr.h - 664 sys sys 1018721285 2100
 sys/src/9/mtx/ether2114x.c - 664 sys sys 1026848191 37904
@@ -5095,19 +5106,19 @@ sys/src/9/pc/apmjump.s - 664 sys sys 1032058947 1527
 sys/src/9/pc/archmp.c - 664 sys sys 1018974173 2194
 sys/src/9/pc/audio.h - 664 sys sys 1015014513 343
 sys/src/9/pc/cga.c - 664 sys sys 1015014513 1843
-sys/src/9/pc/dat.h - 664 sys sys 1032052913 6070
-sys/src/9/pc/devarch.c - 664 sys sys 1045504479 16138
-sys/src/9/pc/devether.c - 664 sys sys 1042004805 10072
-sys/src/9/pc/devfloppy.c - 664 sys sys 1015014514 19930
+sys/src/9/pc/dat.h - 664 sys sys 1048644041 6068
+sys/src/9/pc/devarch.c - 664 sys sys 1048637309 17462
+sys/src/9/pc/devether.c - 664 sys sys 1048644042 10178
+sys/src/9/pc/devfloppy.c - 664 sys sys 1048637319 20016
 sys/src/9/pc/devi82365.c - 664 sys sys 1020284820 19987
 sys/src/9/pc/devlm78.c - 664 sys sys 1026847635 6038
 sys/src/9/pc/devlml.c - 664 sys sys 1026847636 7486
 sys/src/9/pc/devlml.h - 664 sys sys 1026847636 2948
 sys/src/9/pc/devlpt.c - 664 sys sys 1015014514 4420
-sys/src/9/pc/devpccard.c - 664 sys sys 1036812831 39978
+sys/src/9/pc/devpccard.c - 664 sys sys 1048644060 39977
 sys/src/9/pc/devrtc.c - 664 sys sys 1015014515 7167
 sys/src/9/pc/devtv.c - 664 sys sys 1032052915 45652
-sys/src/9/pc/devusb.c - 664 sys sys 1026847638 17993
+sys/src/9/pc/devusb.c - 664 sys sys 1048644072 17991
 sys/src/9/pc/devvga.c - 664 sys sys 1039753498 8625
 sys/src/9/pc/dma.c - 664 sys sys 1015014515 4736
 sys/src/9/pc/errstr.h - 664 sys sys 1022588155 2100
@@ -5130,36 +5141,36 @@ sys/src/9/pc/etherga620fw.h - 644 sys sys 1026847642 222295
 sys/src/9/pc/etherif.h - 664 sys sys 1045063564 961
 sys/src/9/pc/ethermii.c - 664 sys sys 1039803177 4555
 sys/src/9/pc/ethermii.h - 664 sys sys 1039895684 3259
-sys/src/9/pc/ethersink.c - 664 sys sys 1017854323 1075
+sys/src/9/pc/ethersink.c - 664 sys sys 1048644103 1076
 sys/src/9/pc/ethersmc.c - 664 sys sys 1015014518 15079
 sys/src/9/pc/etherwavelan.c - 664 sys sys 1026847642 3722
 sys/src/9/pc/floppy.h - 664 sys sys 1015014518 3925
 sys/src/9/pc/fns.h - 664 sys sys 1026847643 4216
 sys/src/9/pc/hcwAMC.h - 664 sys sys 1026860163 166004
-sys/src/9/pc/i8253.c - 664 sys sys 1044630532 6880
+sys/src/9/pc/i8253.c - 664 sys sys 1048637309 6257
 sys/src/9/pc/i8259.c - 664 sys sys 1015014519 4423
 sys/src/9/pc/init9.c - 664 sys sys 1040002518 94
 sys/src/9/pc/initcode.s - 664 sys sys 1015014519 282
 sys/src/9/pc/io.h - 664 sys sys 1015014519 7956
 sys/src/9/pc/kbd.c - 664 sys sys 1039753498 9134
 sys/src/9/pc/l.s - 664 sys sys 1026847645 20867
-sys/src/9/pc/main.c - 664 sys sys 1041431178 14272
+sys/src/9/pc/main.c - 664 sys sys 1048644107 14454
 sys/src/9/pc/mem.h - 664 sys sys 1018553448 4573
 sys/src/9/pc/memory.c - 664 sys sys 1032303986 12994
 sys/src/9/pc/mkfile - 664 sys sys 1040002514 2995
 sys/src/9/pc/mmu.c - 664 sys sys 1018553449 10008
 sys/src/9/pc/mouse.c - 664 sys sys 1020369766 6315
-sys/src/9/pc/mp.c - 664 sys sys 1018974174 17091
+sys/src/9/pc/mp.c - 664 sys sys 1048644112 16928
 sys/src/9/pc/mp.h - 664 sys sys 1015014520 6575
 sys/src/9/pc/pc - 664 sys sys 1046359057 1316
 sys/src/9/pc/pcauth - 664 sys sys 1046359058 605
 sys/src/9/pc/pccd - 664 sys sys 1039753495 1278
-sys/src/9/pc/pccpu - 664 sys sys 1046359058 790
+sys/src/9/pc/pccpu - 664 sys sys 1048644120 804
 sys/src/9/pc/pcdisk - 664 sys sys 1046359059 1374
 sys/src/9/pc/pcfl - 664 sys sys 1042004821 1563
 sys/src/9/pc/pcflop - 664 sys sys 1045500133 1386
 sys/src/9/pc/pci.c - 664 sys sys 1032052921 23359
-sys/src/9/pc/pcmciamodem.c - 664 sys sys 1036812832 1499
+sys/src/9/pc/pcmciamodem.c - 664 sys sys 1048635123 1545
 sys/src/9/pc/piix4smbus.c - 664 sys sys 1015014521 5264
 sys/src/9/pc/plan9l.s - 664 sys sys 1015014521 910
 sys/src/9/pc/psaux.c - 664 sys sys 1026847650 915
@@ -5168,11 +5179,11 @@ sys/src/9/pc/random.c - 664 sys sys 1036812832 2021
 sys/src/9/pc/reboot.h - 664 sys sys 1015014522 334
 sys/src/9/pc/rebootcode.s - 664 sys sys 1015014522 988
 sys/src/9/pc/screen.c - 664 sys sys 1039753497 7266
-sys/src/9/pc/screen.h - 664 sys sys 1039753497 3742
+sys/src/9/pc/screen.h - 664 sys sys 1048644129 3760
 sys/src/9/pc/sd53c8xx.c - 664 sys sys 1033134905 51568
 sys/src/9/pc/sd53c8xx.i - 664 sys sys 1045063730 27355
 sys/src/9/pc/sd53c8xx.n - 664 sys sys 1032059019 12455
-sys/src/9/pc/sdata.c - 664 sys sys 1044630537 45002
+sys/src/9/pc/sdata.c - 664 sys sys 1048644136 45225
 sys/src/9/pc/sdmylex.c - 664 sys sys 1015014523 27750
 sys/src/9/pc/sdscsi.c - 664 sys sys 1015014523 7412
 sys/src/9/pc/trap.c - 664 sys sys 1047261661 18991
@@ -5189,52 +5200,52 @@ sys/src/9/pc/vgaclgd546x.c - 664 sys sys 1015014525 4740
 sys/src/9/pc/vgact65545.c - 664 sys sys 1015014525 2243
 sys/src/9/pc/vgacyber938x.c - 664 sys sys 1015014526 4192
 sys/src/9/pc/vgaet4000.c - 664 sys sys 1015014526 5105
-sys/src/9/pc/vgahiqvideo.c - 664 sys sys 1015014526 4963
+sys/src/9/pc/vgahiqvideo.c - 664 sys sys 1048635701 5033
 sys/src/9/pc/vgai81x.c - 664 sys sys 1032052924 4905
-sys/src/9/pc/vgamach64xx.c - 664 sys sys 1024072422 29061
+sys/src/9/pc/vgamach64xx.c - 664 sys sys 1048644147 29112
 sys/src/9/pc/vgamga2164w.c - 664 sys sys 1015014527 5654
 sys/src/9/pc/vgamga4xx.c - 664 sys sys 1015014527 11122
 sys/src/9/pc/vganeomagic.c - 664 sys sys 1032375144 10693
-sys/src/9/pc/vganvidia.c - 664 sys sys 1020284821 6841
+sys/src/9/pc/vganvidia.c - 664 sys sys 1048644159 6306
 sys/src/9/pc/vgargb524.c - 664 sys sys 1015014527 4235
-sys/src/9/pc/vgas3.c - 664 sys sys 1046203924 11986
+sys/src/9/pc/vgas3.c - 664 sys sys 1048640451 12064
 sys/src/9/pc/vgasavage.c - 664 sys sys 1046203931 16194
 sys/src/9/pc/vgat2r4.c - 664 sys sys 1015014528 10355
 sys/src/9/pc/vgatvp3020.c - 664 sys sys 1015014528 4491
 sys/src/9/pc/vgatvp3026.c - 664 sys sys 1015014528 3940
 sys/src/9/pc/vgavmware.c - 664 sys sys 1020284822 6334
 sys/src/9/pc/vgax.c - 664 sys sys 1015014528 1655
-sys/src/9/pc/wavelan.c - 664 sys sys 1042855781 27095
-sys/src/9/pc/wavelan.h - 664 sys sys 1042855780 6228
+sys/src/9/pc/wavelan.c - 664 sys sys 1048644170 27255
+sys/src/9/pc/wavelan.h - 664 sys sys 1048644171 6166
 sys/src/9/port - 20000000775 sys sys 1018469625 0
 sys/src/9/port/alarm.c - 664 sys sys 1026847545 1733
 sys/src/9/port/alloc.c - 664 sys sys 1019663885 5328
 sys/src/9/port/allocb.c - 664 sys sys 1026847546 3198
 sys/src/9/port/auth.c - 664 sys sys 1032052799 2309
 sys/src/9/port/cache.c - 664 sys sys 1014931171 9242
-sys/src/9/port/chan.c - 664 sys sys 1031706300 28370
+sys/src/9/port/chan.c - 664 sys sys 1048644187 29000
 sys/src/9/port/cis.c - 664 sys sys 1014931171 8087
 sys/src/9/port/debugalloc.c - 664 sys sys 1014931171 10402
-sys/src/9/port/dev.c - 664 sys sys 1042004688 8082
-sys/src/9/port/devaudio.c - 664 sys sys 1026847546 21137
+sys/src/9/port/dev.c - 664 sys sys 1048644191 8241
+sys/src/9/port/devaudio.c - 664 sys sys 1048644215 21133
 sys/src/9/port/devbridge.c - 664 sys sys 1026847546 24311
-sys/src/9/port/devcap.c - 664 sys sys 1032052801 4070
-sys/src/9/port/devcons.c - 664 sys sys 1036812998 20919
+sys/src/9/port/devcap.c - 664 sys sys 1048644215 4113
+sys/src/9/port/devcons.c - 664 sys sys 1048644216 20917
 sys/src/9/port/devdraw.c - 664 sys sys 1039753332 41987
 sys/src/9/port/devdup.c - 664 sys sys 1014931172 2332
-sys/src/9/port/devenv.c - 664 sys sys 1019762849 6562
+sys/src/9/port/devenv.c - 664 sys sys 1048644225 6992
 sys/src/9/port/devfs.c - 664 sys sys 1045530194 10701
 sys/src/9/port/devkprof.c - 664 sys sys 1014931173 3111
 sys/src/9/port/devloopback.c - 664 sys sys 1018721201 14968
 sys/src/9/port/devmnt.c - 664 sys sys 1041443399 21588
 sys/src/9/port/devmntstats.c - 664 sys sys 1014931173 4039
-sys/src/9/port/devmouse.c - 664 sys sys 1036827459 11420
+sys/src/9/port/devmouse.c - 664 sys sys 1048637374 11460
 sys/src/9/port/devnmouse.c - 664 sys sys 1036812999 3738
 sys/src/9/port/devpipe.c - 664 sys sys 1032640439 5825
 sys/src/9/port/devpnp.c - 664 sys sys 1019864265 13027
 sys/src/9/port/devproc.c - 664 sys sys 1047952847 23450
 sys/src/9/port/devrealtime.c - 664 sys sys 1044630510 15975
-sys/src/9/port/devroot.c - 664 sys sys 1042304978 3593
+sys/src/9/port/devroot.c - 664 sys sys 1048583810 3730
 sys/src/9/port/devsd.c - 664 sys sys 1026847547 28679
 sys/src/9/port/devsdp.c - 664 sys sys 1026847548 44841
 sys/src/9/port/devsegment.c - 664 sys sys 1017679394 9600
@@ -5268,11 +5279,11 @@ sys/src/9/port/page.c - 664 sys sys 1014931177 8086
 sys/src/9/port/parse.c - 664 sys sys 1014931177 2026
 sys/src/9/port/pgrp.c - 664 sys sys 1032052809 3925
 sys/src/9/port/portclock.c - 664 sys sys 1047260623 3835
-sys/src/9/port/portdat.h - 664 sys sys 1047995947 21197
+sys/src/9/port/portdat.h - 664 sys sys 1048644230 21247
 sys/src/9/port/portfns.h - 664 sys sys 1047995955 10620
 sys/src/9/port/portmkfile - 664 sys sys 1039753335 2372
 sys/src/9/port/print.c - 664 sys sys 1014931178 227
-sys/src/9/port/proc.c - 664 sys sys 1047952847 24170
+sys/src/9/port/proc.c - 664 sys sys 1048644240 24347
 sys/src/9/port/qio.c - 664 sys sys 1047260594 23281
 sys/src/9/port/qlock.c - 664 sys sys 1026847551 3246
 sys/src/9/port/rdb.c - 664 sys sys 1018721202 1698
@@ -5281,7 +5292,7 @@ sys/src/9/port/rebootcmd.c - 664 sys sys 1015278340 1561
 sys/src/9/port/sd.h - 664 sys sys 1018386997 2702
 sys/src/9/port/segment.c - 664 sys sys 1032990942 13776
 sys/src/9/port/swap.c - 664 sys sys 1020284484 6986
-sys/src/9/port/sysfile.c - 664 sys sys 1014931179 15822
+sys/src/9/port/sysfile.c - 664 sys sys 1048644253 15992
 sys/src/9/port/sysproc.c - 664 sys sys 1047995943 15125
 sys/src/9/port/systab.h - 664 sys sys 1014931179 3044
 sys/src/9/port/taslock.c - 664 sys sys 1036813005 2896
@@ -5446,8 +5457,8 @@ sys/src/ape/cmd/make/gram.y - 664 sys sys 1014921974 7369
 sys/src/ape/cmd/make/ident.c - 664 sys sys 1014921974 4910
 sys/src/ape/cmd/make/main.c - 664 sys sys 1014921974 7652
 sys/src/ape/cmd/make/misc.c - 664 sys sys 1014921974 7176
-sys/src/ape/cmd/make/mkfile - 664 sys sys 1014921974 337
-sys/src/ape/cmd/mkfile - 664 sys sys 1014921973 522
+sys/src/ape/cmd/make/mkfile - 664 sys sys 1048644265 343
+sys/src/ape/cmd/mkfile - 664 sys sys 1048644277 537
 sys/src/ape/cmd/patch - 20000000775 sys sys 1046198789 0
 sys/src/ape/cmd/patch/COPYING - 664 sys sys 1046198780 18007
 sys/src/ape/cmd/patch/ChangeLog - 664 sys sys 1046198780 66042
@@ -5557,8 +5568,7 @@ sys/src/ape/cmd/pdksh/lex.h - 664 sys sys 1014921977 3823
 sys/src/ape/cmd/pdksh/mail.c - 664 sys sys 1014921977 4050
 sys/src/ape/cmd/pdksh/main.c - 664 sys sys 1014921977 19342
 sys/src/ape/cmd/pdksh/misc.c - 664 sys sys 1014921977 28368
-sys/src/ape/cmd/pdksh/missing.c - 664 sys sys 1014921977 6441
-sys/src/ape/cmd/pdksh/mkfile - 664 sys sys 1014921977 562
+sys/src/ape/cmd/pdksh/mkfile - 664 sys sys 1048644309 549
 sys/src/ape/cmd/pdksh/path.c - 664 sys sys 1014921977 7369
 sys/src/ape/cmd/pdksh/proto.h - 664 sys sys 1014921977 12016
 sys/src/ape/cmd/pdksh/sh.h - 664 sys sys 1014921977 22835
@@ -5737,7 +5747,7 @@ sys/src/ape/lib/ap/gen/strtol.c - 664 sys sys 1014921987 1223
 sys/src/ape/lib/ap/gen/strtoll.c - 664 sys sys 1038237525 1326
 sys/src/ape/lib/ap/gen/strtoul.c - 664 sys sys 1014921987 1220
 sys/src/ape/lib/ap/gen/strtoull.c - 664 sys sys 1038237525 1322
-sys/src/ape/lib/ap/gen/strxfrm.c - 664 sys sys 1014921987 297
+sys/src/ape/lib/ap/gen/strxfrm.c - 664 sys sys 1048644320 308
 sys/src/ape/lib/ap/gen/toupper.c - 664 sys sys 1014921987 175
 sys/src/ape/lib/ap/math - 20000000775 sys sys 1014921986 0
 sys/src/ape/lib/ap/math/asin.c - 664 sys sys 1014921986 647
@@ -5784,9 +5794,9 @@ sys/src/ape/lib/ap/plan9 - 20000000775 sys sys 1014921986 0
 sys/src/ape/lib/ap/plan9/9read.c - 664 sys sys 1014921986 169
 sys/src/ape/lib/ap/plan9/9wait.c - 664 sys sys 1014921986 1517
 sys/src/ape/lib/ap/plan9/9write.c - 664 sys sys 1014921986 171
-sys/src/ape/lib/ap/plan9/_buf.c - 664 sys sys 1014921983 9617
+sys/src/ape/lib/ap/plan9/_buf.c - 664 sys sys 1048644332 9661
 sys/src/ape/lib/ap/plan9/_dirconv.c - 664 sys sys 1014921985 1419
-sys/src/ape/lib/ap/plan9/_envsetup.c - 664 sys sys 1014921984 2203
+sys/src/ape/lib/ap/plan9/_envsetup.c - 664 sys sys 1048644333 2198
 sys/src/ape/lib/ap/plan9/_errno.c - 664 sys sys 1014921985 3909
 sys/src/ape/lib/ap/plan9/_exit.c - 664 sys sys 1014921983 875
 sys/src/ape/lib/ap/plan9/_fcall.c - 664 sys sys 1014921983 6036
@@ -5810,10 +5820,10 @@ sys/src/ape/lib/ap/plan9/creat.c - 664 sys sys 1014921984 226
 sys/src/ape/lib/ap/plan9/ctermid.c - 664 sys sys 1014921983 191
 sys/src/ape/lib/ap/plan9/ctime.c - 664 sys sys 1014921983 4916
 sys/src/ape/lib/ap/plan9/cuserid.c - 664 sys sys 1014921983 343
-sys/src/ape/lib/ap/plan9/dir.h - 664 sys sys 1014921984 2062
+sys/src/ape/lib/ap/plan9/dir.h - 664 sys sys 1048644334 2092
 sys/src/ape/lib/ap/plan9/dirread.c - 664 sys sys 1014921986 1659
 sys/src/ape/lib/ap/plan9/dirstat.c - 664 sys sys 1014921986 1698
-sys/src/ape/lib/ap/plan9/dirtostat.c - 664 sys sys 1014921985 1002
+sys/src/ape/lib/ap/plan9/dirtostat.c - 664 sys sys 1048644334 1081
 sys/src/ape/lib/ap/plan9/dup.c - 664 sys sys 1014921984 339
 sys/src/ape/lib/ap/plan9/execl.c - 664 sys sys 1014921984 138
 sys/src/ape/lib/ap/plan9/execle.c - 664 sys sys 1014921984 188
@@ -5849,7 +5859,7 @@ sys/src/ape/lib/ap/plan9/malloc.c - 664 sys sys 1014921985 1957
 sys/src/ape/lib/ap/plan9/mkdir.c - 664 sys sys 1014921984 353
 sys/src/ape/lib/ap/plan9/mkfile - 664 sys sys 1030558746 1320
 sys/src/ape/lib/ap/plan9/nan.c - 664 sys sys 1014921985 614
-sys/src/ape/lib/ap/plan9/open.c - 664 sys sys 1038237527 1143
+sys/src/ape/lib/ap/plan9/open.c - 664 sys sys 1048644335 1088
 sys/src/ape/lib/ap/plan9/opendir.c - 664 sys sys 1014921984 1881
 sys/src/ape/lib/ap/plan9/pause.c - 664 sys sys 1014921985 124
 sys/src/ape/lib/ap/plan9/pipe.c - 664 sys sys 1014921984 476
@@ -5869,10 +5879,10 @@ sys/src/ape/lib/ap/plan9/sigsuspend.c - 664 sys sys 1014921985 132
 sys/src/ape/lib/ap/plan9/sleep.c - 664 sys sys 1014921985 222
 sys/src/ape/lib/ap/plan9/sqrt.c - 664 sys sys 1014921985 759
 sys/src/ape/lib/ap/plan9/stat.c - 664 sys sys 1014921984 284
-sys/src/ape/lib/ap/plan9/sys9.h - 664 sys sys 1014921983 4287
+sys/src/ape/lib/ap/plan9/sys9.h - 664 sys sys 1048644336 4251
 sys/src/ape/lib/ap/plan9/system.c - 664 sys sys 1014921983 582
 sys/src/ape/lib/ap/plan9/tcgetattr.c - 664 sys sys 1038237528 3070
-sys/src/ape/lib/ap/plan9/time.c - 664 sys sys 1014921983 380
+sys/src/ape/lib/ap/plan9/time.c - 664 sys sys 1048644336 380
 sys/src/ape/lib/ap/plan9/times.c - 664 sys sys 1014921984 730
 sys/src/ape/lib/ap/plan9/tmpfile.c - 664 sys sys 1014921985 744
 sys/src/ape/lib/ap/plan9/ttyname.c - 664 sys sys 1014921985 133
@@ -6017,7 +6027,7 @@ sys/src/ape/lib/bsd/inet_ntoa.c - 664 sys sys 1014921995 382
 sys/src/ape/lib/bsd/ioctl.c - 664 sys sys 1014921995 561
 sys/src/ape/lib/bsd/listen.c - 664 sys sys 1014921995 2908
 sys/src/ape/lib/bsd/lstat.c - 664 sys sys 1014921995 282
-sys/src/ape/lib/bsd/mkfile - 664 sys sys 1014921995 791
+sys/src/ape/lib/bsd/mkfile - 664 sys sys 1048644340 810
 sys/src/ape/lib/bsd/mktemp.c - 664 sys sys 1014921995 526
 sys/src/ape/lib/bsd/nptohl.c - 664 sys sys 1014921995 140
 sys/src/ape/lib/bsd/ntohl.c - 664 sys sys 1014921995 592
@@ -6392,7 +6402,7 @@ sys/src/cmd/9660srv/fns.h - 664 sys sys 1019425186 428
 sys/src/cmd/9660srv/iobuf.c - 664 sys sys 1022085197 3125
 sys/src/cmd/9660srv/iso9660.h - 664 sys sys 1014924873 2607
 sys/src/cmd/9660srv/main.c - 664 sys sys 1020313483 9680
-sys/src/cmd/9660srv/mkfile - 664 sys sys 1032059105 275
+sys/src/cmd/9660srv/mkfile - 664 sys sys 1048644372 238
 sys/src/cmd/9660srv/xfile.c - 664 sys sys 1019425187 2725
 sys/src/cmd/9a - 20000000775 sys sys 954034958 0
 sys/src/cmd/9a/a.h - 664 sys sys 944960735 2875
@@ -6531,6 +6541,7 @@ sys/src/cmd/astro/uran.c - 664 sys sys 964307357 3291
 sys/src/cmd/astro/venus.c - 664 sys sys 944960761 2417
 sys/src/cmd/astro/venust.c - 664 sys sys 944960761 739
 sys/src/cmd/auth - 20000000775 sys sys 1015008432 0
+sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
 sys/src/cmd/auth/authcmdlib.h - 664 sys sys 1032497636 1438
 sys/src/cmd/auth/authsrv.c - 664 sys sys 1045504853 18391
 sys/src/cmd/auth/challenge.c - 664 sys sys 1015008432 980
@@ -6543,24 +6554,24 @@ sys/src/cmd/auth/debug.c - 664 sys sys 1044839697 7324
 sys/src/cmd/auth/disable - 775 sys sys 1015008431 146
 sys/src/cmd/auth/enable - 775 sys sys 1015008430 134
 sys/src/cmd/auth/factotum - 20000000775 sys sys 1017165894 0
-sys/src/cmd/auth/factotum/apop.c - 664 sys sys 1044829586 5985
+sys/src/cmd/auth/factotum/apop.c - 664 sys sys 1048614971 5995
 sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1044829586 5324
 sys/src/cmd/auth/factotum/confirm.c - 664 sys sys 1044829586 3103
-sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1044829587 4814
+sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1048614970 4773
 sys/src/cmd/auth/factotum/fgui.c - 664 sys sys 1044829587 15948
-sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1044829588 10363
+sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1048614987 10353
 sys/src/cmd/auth/factotum/log.c - 664 sys sys 1046655068 1781
-sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1044829592 512
-sys/src/cmd/auth/factotum/p9any.c - 664 sys sys 1044829588 8207
-sys/src/cmd/auth/factotum/p9cr.c - 664 sys sys 1044829589 6618
-sys/src/cmd/auth/factotum/p9sk1.c - 664 sys sys 1044829589 9475
-sys/src/cmd/auth/factotum/pass.c - 664 sys sys 1044829590 1501
+sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1048614969 493
+sys/src/cmd/auth/factotum/p9any.c - 664 sys sys 1048614972 8219
+sys/src/cmd/auth/factotum/p9cr.c - 664 sys sys 1048614973 6628
+sys/src/cmd/auth/factotum/p9sk1.c - 664 sys sys 1048614974 9606
+sys/src/cmd/auth/factotum/pass.c - 664 sys sys 1048614974 1511
 sys/src/cmd/auth/factotum/rpc.c - 664 sys sys 1044829590 11147
-sys/src/cmd/auth/factotum/rsa.c - 664 sys sys 1044829590 3460
-sys/src/cmd/auth/factotum/secretpem.c - 664 sys sys 1017679313 1627
-sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1044829591 14898
-sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1044829591 3394
-sys/src/cmd/auth/factotum/util.c - 664 sys sys 1044829592 17015
+sys/src/cmd/auth/factotum/rsa.c - 664 sys sys 1048614986 3462
+sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1048614989 14894
+sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1048614985 3396
+sys/src/cmd/auth/factotum/util.c - 664 sys sys 1048614988 17031
+sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1048614986 2205
 sys/src/cmd/auth/guard.srv.c - 664 sys sys 1032497638 2334
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
 sys/src/cmd/auth/keyfs.c - 664 sys sys 1032497639 17288
@@ -6581,19 +6592,29 @@ sys/src/cmd/auth/lib/readln.c - 664 sys sys 1015008430 2040
 sys/src/cmd/auth/lib/readn.c - 664 sys sys 1015008430 247
 sys/src/cmd/auth/lib/readwrite.c - 664 sys sys 1015008430 1424
 sys/src/cmd/auth/lib/wrbio.c - 664 sys sys 1015008430 755
-sys/src/cmd/auth/login.c - 664 sys sys 1045524275 3959
-sys/src/cmd/auth/mkfile - 664 sys sys 1035833798 1737
+sys/src/cmd/auth/login.c - 664 sys sys 1048614961 3963
+sys/src/cmd/auth/mkfile - 664 sys sys 1048644402 1978
 sys/src/cmd/auth/netkey.c - 664 sys sys 1015008431 741
-sys/src/cmd/auth/newns.c - 664 sys sys 1046644507 421
+sys/src/cmd/auth/newns.c - 664 sys sys 1048614962 486
 sys/src/cmd/auth/passwd.c - 664 sys sys 1022163987 2902
+sys/src/cmd/auth/pemdecode.c - 664 sys sys 1048614962 942
+sys/src/cmd/auth/pemencode.c - 664 sys sys 1048614963 998
 sys/src/cmd/auth/printnetkey.c - 664 sys sys 1015008430 732
 sys/src/cmd/auth/respond.c - 664 sys sys 1015008432 472
+sys/src/cmd/auth/rsa2any.c - 664 sys sys 1048615896 3326
+sys/src/cmd/auth/rsa2any.h - 664 sys sys 1048616450 43
+sys/src/cmd/auth/rsa2csr.c - 664 sys sys 1048614963 621
+sys/src/cmd/auth/rsa2pub.c - 664 sys sys 1048614964 651
+sys/src/cmd/auth/rsa2ssh.c - 664 sys sys 1048614964 483
+sys/src/cmd/auth/rsa2x509.c - 664 sys sys 1048614964 794
+sys/src/cmd/auth/rsafill.c - 664 sys sys 1048614963 747
+sys/src/cmd/auth/rsagen.c - 664 sys sys 1048614963 992
 sys/src/cmd/auth/secstore - 20000000775 sys sys 1017337838 0
 sys/src/cmd/auth/secstore/SConn.c - 664 sys sys 1041890053 4381
 sys/src/cmd/auth/secstore/SConn.h - 664 sys sys 1015008431 955
 sys/src/cmd/auth/secstore/aescbc.c - 664 sys sys 1045504879 3920
 sys/src/cmd/auth/secstore/dirls.c - 664 sys sys 1015008431 2106
-sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1035833808 873
+sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1048615193 844
 sys/src/cmd/auth/secstore/pak.c - 664 sys sys 1041890053 9353
 sys/src/cmd/auth/secstore/password.c - 664 sys sys 1041890053 2698
 sys/src/cmd/auth/secstore/secacct.c - 644 sys sys 1015008431 755
@@ -6611,9 +6632,8 @@ sys/src/cmd/auth/warning.c - 664 sys sys 1015008431 5287
 sys/src/cmd/auth/wrkey.c - 664 sys sys 1019058717 176
 sys/src/cmd/aux - 20000000775 sys sys 1015008975 0
 sys/src/cmd/aux/9pcon.c - 664 sys sys 1032059259 6283
-sys/src/cmd/aux/X509gen.c - 664 sys sys 1037575307 1763
 sys/src/cmd/aux/accupoint.c - 664 sys sys 985124882 2166
-sys/src/cmd/aux/acidleak.c - 664 sys sys 1014925120 5664
+sys/src/cmd/aux/acidleak.c - 664 sys sys 1048644418 5919
 sys/src/cmd/aux/apm.c - 664 sys sys 1046654953 20263
 sys/src/cmd/aux/astarld.c - 664 sys sys 1015008684 4638
 sys/src/cmd/aux/cddb.c - 664 sys sys 1032059267 4303
@@ -6684,11 +6704,11 @@ sys/src/cmd/aux/vga/clgd546x.c - 664 sys sys 1014925007 7996
 sys/src/cmd/aux/vga/ct65540.c - 664 sys sys 1014925007 5355
 sys/src/cmd/aux/vga/cyber938x.c - 664 sys sys 1045505008 6440
 sys/src/cmd/aux/vga/data.c - 664 sys sys 1019498850 2200
-sys/src/cmd/aux/vga/db.c - 664 sys sys 1014925008 9202
+sys/src/cmd/aux/vga/db.c - 664 sys sys 1048636615 9349
 sys/src/cmd/aux/vga/error.c - 664 sys sys 1014925008 745
 sys/src/cmd/aux/vga/et4000.c - 664 sys sys 1014925008 6720
 sys/src/cmd/aux/vga/et4000hwgc.c - 664 sys sys 1014925008 552
-sys/src/cmd/aux/vga/hiqvideo.c - 664 sys sys 1014925008 9141
+sys/src/cmd/aux/vga/hiqvideo.c - 664 sys sys 1048635653 9211
 sys/src/cmd/aux/vga/i81x.c - 664 sys sys 1045505005 4692
 sys/src/cmd/aux/vga/ibm8514.c - 664 sys sys 1014925009 2389
 sys/src/cmd/aux/vga/icd2061a.c - 664 sys sys 1014925009 2152
@@ -6701,10 +6721,10 @@ sys/src/cmd/aux/vga/mach64xx.c - 664 sys sys 1014925009 30254
 sys/src/cmd/aux/vga/main.c - 664 sys sys 1014925010 8154
 sys/src/cmd/aux/vga/mga2164w.c - 664 sys sys 1014925010 13196
 sys/src/cmd/aux/vga/mga4xx.c - 664 sys sys 1014925010 35895
-sys/src/cmd/aux/vga/mkfile - 664 sys sys 1026337536 793
+sys/src/cmd/aux/vga/mkfile - 664 sys sys 1048636613 905
 sys/src/cmd/aux/vga/neomagic.c - 664 sys sys 1014925010 8801
 sys/src/cmd/aux/vga/notes.txt - 664 sys sys 1028334647 14376
-sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1027050588 12277
+sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1048636618 11638
 sys/src/cmd/aux/vga/palette.c - 664 sys sys 1014925010 2201
 sys/src/cmd/aux/vga/pci.c - 664 sys sys 1014925011 8659
 sys/src/cmd/aux/vga/pci.h - 664 sys sys 1014925011 3290
@@ -6714,7 +6734,7 @@ sys/src/cmd/aux/vga/riva_tbl.h - 664 sys sys 1020313484 30063
 sys/src/cmd/aux/vga/s3801.c - 664 sys sys 1014925011 1674
 sys/src/cmd/aux/vga/s3928.c - 664 sys sys 1014925011 2380
 sys/src/cmd/aux/vga/s3clock.c - 664 sys sys 1014925011 6566
-sys/src/cmd/aux/vga/s3generic.c - 664 sys sys 1014925012 7094
+sys/src/cmd/aux/vga/s3generic.c - 664 sys sys 1048640344 7472
 sys/src/cmd/aux/vga/s3hwgc.c - 664 sys sys 1014925012 1359
 sys/src/cmd/aux/vga/sc15025.c - 664 sys sys 1014925012 1876
 sys/src/cmd/aux/vga/stg1702.c - 664 sys sys 1014925012 3263
@@ -6728,7 +6748,7 @@ sys/src/cmd/aux/vga/tvp3026.c - 664 sys sys 1014925013 3580
 sys/src/cmd/aux/vga/tvp3026clock.c - 664 sys sys 1014925013 1960
 sys/src/cmd/aux/vga/vga.c - 664 sys sys 1014925013 9305
 sys/src/cmd/aux/vga/vga.h - 664 sys sys 1025416295 10154
-sys/src/cmd/aux/vga/virge.c - 664 sys sys 1046203911 17106
+sys/src/cmd/aux/vga/virge.c - 664 sys sys 1048640341 17860
 sys/src/cmd/aux/vga/vision864.c - 664 sys sys 1014925014 2325
 sys/src/cmd/aux/vga/vision964.c - 664 sys sys 1014925014 3426
 sys/src/cmd/aux/vga/vision968.c - 664 sys sys 1014925014 3959
@@ -6813,7 +6833,7 @@ sys/src/cmd/cc/compat - 664 sys sys 1014925177 684
 sys/src/cmd/cc/compat.c - 664 sys sys 944960869 266
 sys/src/cmd/cc/con.c - 664 sys sys 944960808 8349
 sys/src/cmd/cc/dcl.c - 664 sys sys 1039910271 25755
-sys/src/cmd/cc/dpchk.c - 664 sys sys 1014925177 6368
+sys/src/cmd/cc/dpchk.c - 664 sys sys 1048644435 6368
 sys/src/cmd/cc/funct.c - 664 sys sys 984718510 6167
 sys/src/cmd/cc/lex.c - 664 sys sys 1014925177 23722
 sys/src/cmd/cc/lexbody - 664 sys sys 1014925177 8726
@@ -6875,7 +6895,7 @@ sys/src/cmd/cpp/mkfile - 664 sys sys 944960879 178
 sys/src/cmd/cpp/nlist.c - 664 sys sys 944960879 4631
 sys/src/cmd/cpp/test.c - 664 sys sys 944960879 47
 sys/src/cmd/cpp/tokens.c - 664 sys sys 944960879 6755
-sys/src/cmd/cpu.c - 664 sys sys 1042571397 20349
+sys/src/cmd/cpu.c - 664 sys sys 1048644441 20353
 sys/src/cmd/crop.c - 664 sys sys 1039753034 4136
 sys/src/cmd/date.c - 664 sys sys 944961351 449
 sys/src/cmd/db - 20000000775 sys sys 988249965 0
@@ -7058,7 +7078,7 @@ sys/src/cmd/eqn/tuning.c - 664 sys sys 944960989 4353
 sys/src/cmd/execnet - 20000000775 sys sys 1019855745 0
 sys/src/cmd/execnet/client.c - 664 sys sys 1045505082 6794
 sys/src/cmd/execnet/dat.h - 664 sys sys 1032059544 988
-sys/src/cmd/execnet/fs.c - 664 sys sys 1019855740 6934
+sys/src/cmd/execnet/fs.c - 664 sys sys 1048644451 6952
 sys/src/cmd/execnet/main.c - 664 sys sys 1019861330 657
 sys/src/cmd/execnet/mkfile - 664 sys sys 1032059543 208
 sys/src/cmd/execnet/note.c - 664 sys sys 1019855740 2315
@@ -7071,7 +7091,7 @@ sys/src/cmd/faces - 20000000775 sys sys 952888246 0
 sys/src/cmd/faces/dblook.c - 664 sys sys 944961084 359
 sys/src/cmd/faces/facedb.c - 664 sys sys 1021579994 8976
 sys/src/cmd/faces/faces.h - 664 sys sys 1045419243 1071
-sys/src/cmd/faces/main.c - 664 sys sys 1046643825 13572
+sys/src/cmd/faces/main.c - 664 sys sys 1048644465 13572
 sys/src/cmd/faces/mkfile - 664 sys sys 1035698248 378
 sys/src/cmd/faces/plumb.c - 664 sys sys 1045505116 7132
 sys/src/cmd/faces/util.c - 664 sys sys 1035698250 569
@@ -7089,7 +7109,7 @@ sys/src/cmd/fax/receive.c - 664 sys sys 944960990 1097
 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/subr.c - 664 sys sys 1015090401 1245
-sys/src/cmd/file.c - 664 sys sys 1044560289 20196
+sys/src/cmd/file.c - 664 sys sys 1048635557 20358
 sys/src/cmd/fmt.c - 664 sys sys 1025298248 3897
 sys/src/cmd/fortune.c - 664 sys sys 1035832953 1674
 sys/src/cmd/fossil - 20000000775 sys sys 1042005512 0
@@ -7100,7 +7120,7 @@ sys/src/cmd/fossil/9excl.c - 664 sys sys 1042005502 1887
 sys/src/cmd/fossil/9fid.c - 664 sys sys 1045600016 5521
 sys/src/cmd/fossil/9fsys.c - 664 sys sys 1044906157 26913
 sys/src/cmd/fossil/9lstn.c - 664 sys sys 1042005503 2865
-sys/src/cmd/fossil/9p.c - 664 sys sys 1046782756 21345
+sys/src/cmd/fossil/9p.c - 664 sys sys 1048644482 21360
 sys/src/cmd/fossil/9ping.c - 664 sys sys 1042005503 1563
 sys/src/cmd/fossil/9proc.c - 664 sys sys 1045576808 13707
 sys/src/cmd/fossil/9srv.c - 664 sys sys 1045600018 3291
@@ -7128,7 +7148,7 @@ sys/src/cmd/fossil/flproto - 664 sys sys 1042005508 210
 sys/src/cmd/fossil/fns.h - 664 sys sys 1042311690 2958
 sys/src/cmd/fossil/fossil-acid - 664 sys sys 1042005508 3965
 sys/src/cmd/fossil/fossil.c - 664 sys sys 1045600029 1267
-sys/src/cmd/fossil/fs.c - 664 sys sys 1045600030 17059
+sys/src/cmd/fossil/fs.c - 664 sys sys 1048644483 17084
 sys/src/cmd/fossil/fs.h - 664 sys sys 1042005509 1222
 sys/src/cmd/fossil/history - 664 sys sys 1045600133 1150
 sys/src/cmd/fossil/invariants - 664 sys sys 1042005509 4073
@@ -9277,7 +9297,7 @@ sys/src/cmd/mkmany - 664 sys sys 1022112160 1196
 sys/src/cmd/mkone - 664 sys sys 1022112160 792
 sys/src/cmd/mkstate.c - 664 sys sys 1014926695 2995
 sys/src/cmd/mksyslib - 664 sys sys 1022112160 660
-sys/src/cmd/mntgen.c - 664 sys sys 1037327201 3734
+sys/src/cmd/mntgen.c - 664 sys sys 1048644521 3365
 sys/src/cmd/mount.c - 664 sys sys 1034195354 1508
 sys/src/cmd/ms2html.c - 664 sys sys 1045505445 40080
 sys/src/cmd/mtime.c - 664 sys sys 1036172302 450
@@ -9288,7 +9308,7 @@ sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1021579992 6684
 sys/src/cmd/ndb/cs.c - 664 sys sys 1032060499 32345
 sys/src/cmd/ndb/csgetval.c - 664 sys sys 957402051 1051
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1014926159 1062
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1032060502 18296
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1048644530 18341
 sys/src/cmd/ndb/dn.c - 664 sys sys 1032060501 25175
 sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1045505455 15249
 sys/src/cmd/ndb/dns.c - 664 sys sys 1032060500 14957
@@ -9307,9 +9327,9 @@ sys/src/cmd/ndb/query.c - 664 sys sys 957402054 1133
 sys/src/cmd/ndb/time.c - 664 sys sys 957402055 321
 sys/src/cmd/netstat.c - 664 sys sys 1038237140 3796
 sys/src/cmd/news.c - 664 sys sys 1014926614 3778
-sys/src/cmd/nfs.c - 664 sys sys 1046367340 30488
+sys/src/cmd/nfs.c - 664 sys sys 1048644535 30830
 sys/src/cmd/nm.c - 664 sys sys 1014926696 4908
-sys/src/cmd/nntpfs.c - 664 sys sys 1037404000 18808
+sys/src/cmd/nntpfs.c - 664 sys sys 1048644540 18869
 sys/src/cmd/ns.c - 664 sys sys 984717934 3558
 sys/src/cmd/p.c - 664 sys sys 1043516305 1497
 sys/src/cmd/page - 20000000775 sys sys 956344628 0
@@ -9332,7 +9352,7 @@ sys/src/cmd/paqfs/mkpaqfs.c - 664 sys sys 1032060367 8509
 sys/src/cmd/paqfs/paqfs.c - 664 sys sys 1032060367 18320
 sys/src/cmd/paqfs/paqfs.h - 664 sys sys 1018721430 966
 sys/src/cmd/pbd.c - 664 sys sys 944961351 247
-sys/src/cmd/pcc.c - 664 sys sys 1042640611 5937
+sys/src/cmd/pcc.c - 664 sys sys 1048644546 5994
 sys/src/cmd/pic - 20000000775 sys sys 954037275 0
 sys/src/cmd/pic/arcgen.c - 664 sys sys 944961042 5999
 sys/src/cmd/pic/blockgen.c - 664 sys sys 944961042 5209
@@ -9765,7 +9785,7 @@ sys/src/cmd/rtstats - 20000000775 sys sys 1018897680 0
 sys/src/cmd/rtstats/edfproc.c - 664 sys sys 1037669163 2977
 sys/src/cmd/rtstats/mkfile - 664 sys sys 1038425447 425
 sys/src/cmd/rtstats/resproc.c - 664 sys sys 1037669163 2287
-sys/src/cmd/rtstats/rtstats.c - 664 sys sys 1037669162 13204
+sys/src/cmd/rtstats/rtstats.c - 664 sys sys 1048644563 13224
 sys/src/cmd/rtstats/time.c - 664 sys sys 1038425433 2094
 sys/src/cmd/rtstats/time.h - 664 sys sys 1038425434 164
 sys/src/cmd/rx.c - 664 sys sys 1046668081 3266
@@ -9912,12 +9932,12 @@ sys/src/cmd/srvold9p/fcall.c - 664 sys sys 1016921010 2571
 sys/src/cmd/srvold9p/mkfile - 664 sys sys 1016921011 132
 sys/src/cmd/srvold9p/srvold9p.c - 664 sys sys 1045505578 19752
 sys/src/cmd/ssh - 20000000775 sys sys 1016927305 0
-sys/src/cmd/ssh/agent.c - 664 sys sys 1048179624 9079
+sys/src/cmd/ssh/agent.c - 664 sys sys 1048644598 9085
 sys/src/cmd/ssh/authpasswd.c - 664 sys sys 1016466378 758
-sys/src/cmd/ssh/authrsa.c - 664 sys sys 1048179608 2649
+sys/src/cmd/ssh/authrsa.c - 664 sys sys 1048644598 2646
 sys/src/cmd/ssh/authsrvpasswd.c - 664 sys sys 1016466379 296
 sys/src/cmd/ssh/authsrvtis.c - 664 sys sys 1048179599 931
-sys/src/cmd/ssh/authtis.c - 664 sys sys 1016466379 1013
+sys/src/cmd/ssh/authtis.c - 664 sys sys 1048644598 1064
 sys/src/cmd/ssh/cipher3des.c - 664 sys sys 1016466379 836
 sys/src/cmd/ssh/cipherblowfish.c - 664 sys sys 1016466379 631
 sys/src/cmd/ssh/cipherdes.c - 664 sys sys 1016466379 567
@@ -9928,14 +9948,13 @@ sys/src/cmd/ssh/cmsg.c - 664 sys sys 1038371942 8382
 sys/src/cmd/ssh/mkfile - 664 sys sys 1048179592 1045
 sys/src/cmd/ssh/msg.c - 664 sys sys 1048179596 7876
 sys/src/cmd/ssh/pubkey.c - 664 sys sys 1019928902 3974
-sys/src/cmd/ssh/scp.c - 664 sys sys 1046643068 13708
-sys/src/cmd/ssh/smsg.c - 664 sys sys 1048179694 4225
+sys/src/cmd/ssh/scp.c - 664 sys sys 1048644598 13757
+sys/src/cmd/ssh/smsg.c - 664 sys sys 1048644598 6167
 sys/src/cmd/ssh/ssh.c - 664 sys sys 1046654892 9615
 sys/src/cmd/ssh/ssh.h - 664 sys sys 1048179595 6054
-sys/src/cmd/ssh/ssh_genkey.c - 664 sys sys 1016466380 1563
 sys/src/cmd/ssh/sshnet.c - 664 sys sys 1046655072 17660
-sys/src/cmd/ssh/sshserve.c - 664 sys sys 1048179703 5940
-sys/src/cmd/ssh/util.c - 664 sys sys 1048179672 5506
+sys/src/cmd/ssh/sshserve.c - 664 sys sys 1048639835 5784
+sys/src/cmd/ssh/util.c - 664 sys sys 1048644598 4478
 sys/src/cmd/stats.c - 664 sys sys 1045059499 26965
 sys/src/cmd/strings.c - 664 sys sys 944961364 1216
 sys/src/cmd/strip.c - 664 sys sys 1014926661 3306
@@ -10311,7 +10330,7 @@ sys/src/cmd/upas/common/aux.c - 664 sys sys 1019498851 2300
 sys/src/cmd/upas/common/become.c - 664 sys sys 1015009623 430
 sys/src/cmd/upas/common/common.h - 664 sys sys 1015009623 1921
 sys/src/cmd/upas/common/config.c - 664 sys sys 944961316 254
-sys/src/cmd/upas/common/libsys.c - 664 sys sys 1046643066 13823
+sys/src/cmd/upas/common/libsys.c - 664 sys sys 1048644621 13814
 sys/src/cmd/upas/common/mail.c - 664 sys sys 944961315 1346
 sys/src/cmd/upas/common/makefile - 664 sys sys 944961315 366
 sys/src/cmd/upas/common/mkfile - 664 sys sys 1031707285 251
@@ -10319,9 +10338,9 @@ sys/src/cmd/upas/common/process.c - 664 sys sys 1015009624 2984
 sys/src/cmd/upas/common/sys.h - 664 sys sys 1015009624 2195
 sys/src/cmd/upas/filterkit - 20000000775 sys sys 1018549521 0
 sys/src/cmd/upas/filterkit/dat.h - 664 sys sys 1018549520 107
-sys/src/cmd/upas/filterkit/deliver.c - 664 sys sys 1047490349 1415
+sys/src/cmd/upas/filterkit/deliver.c - 664 sys sys 1048644629 1372
 sys/src/cmd/upas/filterkit/list.c - 664 sys sys 1020313488 4751
-sys/src/cmd/upas/filterkit/mkfile - 664 sys sys 1047490348 266
+sys/src/cmd/upas/filterkit/mkfile - 664 sys sys 1048645255 264
 sys/src/cmd/upas/filterkit/pipefrom.sample - 775 sys sys 1041184939 380
 sys/src/cmd/upas/filterkit/pipeto.sample - 664 sys sys 1045505695 1765
 sys/src/cmd/upas/filterkit/pipeto.sample-hold - 664 sys sys 1019837081 872
@@ -10334,7 +10353,7 @@ sys/src/cmd/upas/fs/imap4.c - 664 sys sys 1047490338 16071
 sys/src/cmd/upas/fs/mbox.c - 664 sys sys 1047490342 28282
 sys/src/cmd/upas/fs/mkfile - 664 sys sys 1047490336 321
 sys/src/cmd/upas/fs/plan9.c - 664 sys sys 1047490343 7464
-sys/src/cmd/upas/fs/pop3.c - 664 sys sys 1047490344 11465
+sys/src/cmd/upas/fs/pop3.c - 664 sys sys 1048645264 11514
 sys/src/cmd/upas/fs/readdir.c - 664 sys sys 944961331 203
 sys/src/cmd/upas/fs/strtotm.c - 664 sys sys 1041137528 1904
 sys/src/cmd/upas/fs/tester.c - 664 sys sys 985037420 1418
@@ -10375,7 +10394,7 @@ sys/src/cmd/upas/q/runq.c - 664 sys sys 1038186990 11851
 sys/src/cmd/upas/scanmail - 20000000775 sys sys 988250021 0
 sys/src/cmd/upas/scanmail/common.c - 664 sys sys 1015013177 12385
 sys/src/cmd/upas/scanmail/mkfile - 664 sys sys 1031707308 362
-sys/src/cmd/upas/scanmail/scanmail.c - 664 sys sys 1045505931 8656
+sys/src/cmd/upas/scanmail/scanmail.c - 664 sys sys 1048645272 8717
 sys/src/cmd/upas/scanmail/spam.h - 664 sys sys 988225303 1131
 sys/src/cmd/upas/scanmail/testscan.c - 664 sys sys 988225303 3497
 sys/src/cmd/upas/send - 20000000775 sys sys 1016904916 0
@@ -10456,7 +10475,7 @@ sys/src/cmd/vac/cache.c - 664 sys sys 1039797583 15878
 sys/src/cmd/vac/dat.h - 664 sys sys 1036006061 3997
 sys/src/cmd/vac/error.c - 664 sys sys 1036006057 633
 sys/src/cmd/vac/error.h - 664 sys sys 1036024048 327
-sys/src/cmd/vac/file.c - 664 sys sys 1039797584 18962
+sys/src/cmd/vac/file.c - 664 sys sys 1048645298 18984
 sys/src/cmd/vac/fns.h - 664 sys sys 1036006061 1746
 sys/src/cmd/vac/fs.c - 664 sys sys 1036006058 2880
 sys/src/cmd/vac/mkfile - 664 sys sys 1036024045 434
@@ -10499,7 +10518,7 @@ sys/src/cmd/venti/clump.c - 664 sys sys 1019678877 4148
 sys/src/cmd/venti/clumpstats.c - 664 sys sys 1019678877 2234
 sys/src/cmd/venti/config.c - 664 sys sys 1019678878 2917
 sys/src/cmd/venti/conv.c - 664 sys sys 1019678878 8202
-sys/src/cmd/venti/copy.c - 664 sys sys 1039743543 3405
+sys/src/cmd/venti/copy.c - 664 sys sys 1048645305 3440
 sys/src/cmd/venti/dat.h - 664 sys sys 1043176100 15228
 sys/src/cmd/venti/dcache.c - 664 sys sys 1019678878 7374
 sys/src/cmd/venti/dump.c - 664 sys sys 1043176101 1565
@@ -10535,8 +10554,8 @@ sys/src/cmd/venti/syncindex.c - 664 sys sys 1036470212 978
 sys/src/cmd/venti/syncindex0.c - 664 sys sys 1036470283 3044
 sys/src/cmd/venti/unittoull.c - 664 sys sys 1019678881 398
 sys/src/cmd/venti/unwhack.c - 664 sys sys 1019678881 3191
-sys/src/cmd/venti/utils.c - 664 sys sys 1019678881 4567
-sys/src/cmd/venti/venti.c - 664 sys sys 1036470211 4000
+sys/src/cmd/venti/utils.c - 664 sys sys 1048645318 4596
+sys/src/cmd/venti/venti.c - 664 sys sys 1048638713 4172
 sys/src/cmd/venti/venti.conf - 664 sys sys 1019867537 397
 sys/src/cmd/venti/ventifs.c - 664 sys sys 1044475553 6160
 sys/src/cmd/venti/verifyarena.c - 664 sys sys 1019678881 2705
@@ -10779,7 +10798,7 @@ sys/src/lib9p/post.c - 664 sys sys 1044429937 364
 sys/src/lib9p/post.h - 664 sys sys 1029850260 201
 sys/src/lib9p/ramfs.c - 664 sys sys 1030450927 2534
 sys/src/lib9p/req.c - 664 sys sys 1044429938 1551
-sys/src/lib9p/srv.c - 664 sys sys 1044826785 16792
+sys/src/lib9p/srv.c - 664 sys sys 1048645335 16699
 sys/src/lib9p/tpost.c - 664 sys sys 1044429939 324
 sys/src/lib9p/uid.c - 664 sys sys 1015023311 517
 sys/src/lib9p/util.c - 664 sys sys 1017679319 465
@@ -10812,7 +10831,7 @@ sys/src/libauth/auth_getkey.c - 664 sys sys 1038605082 865
 sys/src/libauth/auth_getuserpasswd.c - 664 sys sys 1014929317 1363
 sys/src/libauth/auth_proxy.c - 664 sys sys 1019058720 3595
 sys/src/libauth/auth_respond.c - 664 sys sys 1044828825 1420
-sys/src/libauth/auth_rpc.c - 664 sys sys 1014929317 1960
+sys/src/libauth/auth_rpc.c - 664 sys sys 1048645351 2064
 sys/src/libauth/auth_userpasswd.c - 664 sys sys 1014929317 1097
 sys/src/libauth/authlocal.h - 664 sys sys 1014929317 87
 sys/src/libauth/httpauth.c - 664 sys sys 1017166331 1059
@@ -10982,7 +11001,7 @@ sys/src/libc/9sys/convM2S.c - 664 sys sys 1017679320 4969
 sys/src/libc/9sys/convS2M.c - 664 sys sys 1021580001 5014
 sys/src/libc/9sys/cputime.c - 664 sys sys 944961712 191
 sys/src/libc/9sys/ctime.c - 664 sys sys 944961712 4919
-sys/src/libc/9sys/dial.c - 664 sys sys 1014927336 3606
+sys/src/libc/9sys/dial.c - 664 sys sys 1048645360 3625
 sys/src/libc/9sys/dirfstat.c - 664 sys sys 1041363499 676
 sys/src/libc/9sys/dirfwstat.c - 664 sys sys 1014927336 242
 sys/src/libc/9sys/dirmodefmt.c - 664 sys sys 1014927337 581
@@ -11005,7 +11024,7 @@ sys/src/libc/9sys/privalloc.c - 664 sys sys 984709402 606
 sys/src/libc/9sys/pushssl.c - 664 sys sys 1014927338 905
 sys/src/libc/9sys/pushtls.c - 664 sys sys 1014927338 2009
 sys/src/libc/9sys/putenv.c - 664 sys sys 985023079 398
-sys/src/libc/9sys/qlock.c - 664 sys sys 1045502963 3793
+sys/src/libc/9sys/qlock.c - 664 sys sys 1048645387 3793
 sys/src/libc/9sys/read.c - 664 sys sys 1014927339 108
 sys/src/libc/9sys/read9pmsg.c - 664 sys sys 1014927339 462
 sys/src/libc/9sys/readv.c - 664 sys sys 1014927339 645
@@ -11764,18 +11783,18 @@ sys/src/libsunrpc/authunix.c - 664 sys sys 1045589219 1477
 sys/src/libsunrpc/client.c - 664 sys sys 1046367118 8960
 sys/src/libsunrpc/emalloc.c - 664 sys sys 1045589220 397
 sys/src/libsunrpc/error.c - 664 sys sys 1045589221 819
-sys/src/libsunrpc/fd.c - 664 sys sys 1045589221 1734
+sys/src/libsunrpc/fd.c - 664 sys sys 1048645436 1734
 sys/src/libsunrpc/fmt.c - 664 sys sys 1045589222 1146
 sys/src/libsunrpc/mkfile - 664 sys sys 1046367118 331
 sys/src/libsunrpc/mount3.c - 664 sys sys 1045589223 15217
-sys/src/libsunrpc/net.c - 664 sys sys 1045589223 792
-sys/src/libsunrpc/nfs3.c - 664 sys sys 1045589224 93376
+sys/src/libsunrpc/net.c - 664 sys sys 1048645436 793
+sys/src/libsunrpc/nfs3.c - 664 sys sys 1048645438 93386
 sys/src/libsunrpc/portmap.c - 664 sys sys 1045589224 9758
 sys/src/libsunrpc/prog.c - 664 sys sys 1046367120 1704
 sys/src/libsunrpc/rpc.c - 664 sys sys 1045589225 9235
-sys/src/libsunrpc/server.c - 664 sys sys 1046367121 5227
+sys/src/libsunrpc/server.c - 664 sys sys 1048645438 5237
 sys/src/libsunrpc/suncall.c - 664 sys sys 1046367121 257
-sys/src/libsunrpc/udp.c - 664 sys sys 1045589225 2158
+sys/src/libsunrpc/udp.c - 664 sys sys 1048645439 2161
 sys/src/libthread - 20000000775 sys sys 1014928161 0
 sys/src/libthread/386.c - 664 sys sys 1014928156 448
 sys/src/libthread/alpha.c - 664 sys sys 1014928156 664
@@ -11815,7 +11834,7 @@ sys/src/libthread/xincalpha.s - 664 sys sys 1015088758 344
 sys/src/libthread/xincarm.c - 664 sys sys 1014928160 22
 sys/src/libthread/xincmips.s - 664 sys sys 1014928160 674
 sys/src/libthread/xincport.h - 664 sys sys 1014928161 211
-sys/src/libthread/xincpower.c - 664 sys sys 1014928161 22
+sys/src/libthread/xincpower.s - 664 sys sys 1048645448 342
 sys/src/libventi - 20000000775 sys sys 947360466 0
 sys/src/libventi/client.c - 664 sys sys 1045502093 5265
 sys/src/libventi/debug.c - 664 sys sys 1045502093 1258

+ 172 - 0
dist/replica/plan9.log

@@ -18662,3 +18662,175 @@
 1048343456 9 c 386/bin/tlssrv - 775 sys sys 1048341829 194978
 1048343456 10 c 386/lib/libmp.a - 664 sys sys 1048341830 77064
 1048534262 0 c sys/games/lib/fortunes - 664 sys sys 1048532597 239637
+1048584715 0 c sys/src/9/port/devroot.c - 664 sys sys 1048583810 3730
+1048615282 0 c sys/include/auth.h - 664 sys sys 1048614957 3469
+1048615282 1 a sys/man/8/rsa - 664 sys sys 1048614939 4620
+1048615282 2 a sys/src/cmd/auth/asn12rsa.c - 664 sys sys 1048614959 1192
+1048615282 3 c sys/src/cmd/auth/factotum/apop.c - 664 sys sys 1048614971 5995
+1048615282 4 c sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1048614970 4773
+1048615282 5 c sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1048614987 10353
+1048615282 6 c sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1048614969 493
+1048615282 7 c sys/src/cmd/auth/factotum/p9any.c - 664 sys sys 1048614972 8219
+1048615282 8 c sys/src/cmd/auth/factotum/p9cr.c - 664 sys sys 1048614973 6628
+1048615282 9 c sys/src/cmd/auth/factotum/p9sk1.c - 664 sys sys 1048614974 9606
+1048615282 10 c sys/src/cmd/auth/factotum/pass.c - 664 sys sys 1048614974 1511
+1048615282 11 c sys/src/cmd/auth/factotum/rsa.c - 664 sys sys 1048614986 3462
+1048615282 12 c sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1048614989 14894
+1048615282 13 c sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1048614985 3396
+1048615282 14 c sys/src/cmd/auth/factotum/util.c - 664 sys sys 1048614988 17031
+1048615282 15 a sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1048614986 2205
+1048615282 16 c sys/src/cmd/auth/login.c - 664 sys sys 1048614961 3963
+1048615282 17 c sys/src/cmd/auth/mkfile - 664 sys sys 1048614956 1953
+1048615282 18 c sys/src/cmd/auth/newns.c - 664 sys sys 1048614962 486
+1048615282 19 a sys/src/cmd/auth/pemdecode.c - 664 sys sys 1048614962 942
+1048615282 20 a sys/src/cmd/auth/pemencode.c - 664 sys sys 1048614963 998
+1048615282 21 a sys/src/cmd/auth/rsa2csr.c - 664 sys sys 1048614963 621
+1048615282 22 a sys/src/cmd/auth/rsa2pub.c - 664 sys sys 1048614964 651
+1048615282 23 a sys/src/cmd/auth/rsa2ssh.c - 664 sys sys 1048614964 483
+1048615282 24 a sys/src/cmd/auth/rsa2x509.c - 664 sys sys 1048614964 794
+1048615282 25 a sys/src/cmd/auth/rsafill.c - 664 sys sys 1048614963 747
+1048615282 26 a sys/src/cmd/auth/rsagen.c - 664 sys sys 1048614963 992
+1048615282 27 c sys/src/cmd/auth/secstore/mkfile - 664 sys sys 1048615193 844
+1048615910 0 c sys/src/cmd/auth/mkfile - 664 sys sys 1048615895 1966
+1048615910 1 a sys/src/cmd/auth/rsa2any.c - 664 sys sys 1048615896 3326
+1048616458 0 a sys/src/cmd/auth/rsa2any.h - 664 sys sys 1048616450 43
+1048616938 0 c sys/include/libsec.h - 664 sys sys 1048616895 8914
+1048624291 0 a 386/bin/auth/asn12rsa - 775 sys sys 1048622916 117753
+1048624291 1 c 386/bin/auth/factotum - 775 sys sys 1048622917 307859
+1048624291 2 c 386/bin/auth/login - 775 sys sys 1048622917 100746
+1048624291 3 a 386/bin/auth/newns - 775 sys sys 1048622918 85710
+1048624291 4 a 386/bin/auth/pemdecode - 775 sys sys 1048622918 59616
+1048624291 5 a 386/bin/auth/pemencode - 775 sys sys 1048622919 58345
+1048624291 6 a 386/bin/auth/rsa2csr - 775 sys sys 1048622919 177865
+1048624291 7 a 386/bin/auth/rsa2pub - 775 sys sys 1048622920 141752
+1048624291 8 a 386/bin/auth/rsa2ssh - 775 sys sys 1048622920 137257
+1048624291 9 a 386/bin/auth/rsa2x509 - 775 sys sys 1048622921 181871
+1048624291 10 a 386/bin/auth/rsafill - 775 sys sys 1048622922 141820
+1048624291 11 a 386/bin/auth/rsagen - 775 sys sys 1048622922 152103
+1048624291 12 c 386/lib/lib9p.a - 664 sys sys 1048622923 80508
+1048624291 13 c 386/lib/libauth.a - 664 sys sys 1048622923 52988
+1048624291 14 c 386/lib/libauthsrv.a - 664 sys sys 1048622923 33706
+1048624291 15 c 386/lib/libc.a - 664 sys sys 1048622925 496970
+1048624291 16 c 386/lib/libdisk.a - 664 sys sys 1048622925 43692
+1048624291 17 c 386/lib/libhttpd.a - 664 sys sys 1048622926 98914
+1048624291 18 c 386/lib/libmp.a - 664 sys sys 1048622926 77064
+1048624291 19 c 386/lib/libsec.a - 664 sys sys 1048622928 642760
+1048624291 20 c 386/lib/libventi.a - 664 sys sys 1048622928 97938
+1048635103 0 c sys/src/9/pc/pcmciamodem.c - 664 sys sys 1048635123 1545
+1048636905 0 c lib/vgadb - 664 sys sys 1048636622 27466
+1048636905 1 c rc/bin/ps2pdf - 775 sys sys 1048636764 646
+1048636905 2 c sys/src/9/pc/vgahiqvideo.c - 664 sys sys 1048635701 5033
+1048636905 3 c sys/src/9/pc/vganvidia.c - 664 sys sys 1048636683 6305
+1048636905 4 c sys/src/cmd/aux/vga/db.c - 664 sys sys 1048636615 9349
+1048636905 5 c sys/src/cmd/aux/vga/hiqvideo.c - 664 sys sys 1048635653 9211
+1048636905 6 c sys/src/cmd/aux/vga/mkfile - 664 sys sys 1048636613 905
+1048636905 7 c sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1048636618 11638
+1048636905 8 c sys/src/cmd/file.c - 664 sys sys 1048635557 20358
+1048638707 0 c sys/lib/acid/leak - 664 sys sys 1048637057 2185
+1048638707 1 c sys/lib/sysconfig/fl/boot - 775 sys sys 1048637071 773
+1048638707 2 c sys/lib/sysconfig/fl/flproto - 664 sys sys 1048637070 137
+1048638707 3 c sys/man/2/fgetc - 664 sys sys 1048637163 3983
+1048638707 4 c sys/man/2/fopen - 664 sys sys 1048637159 7770
+1048638707 5 c sys/man/2/fprintf - 664 sys sys 1048637160 9726
+1048638707 6 c sys/man/2/fscanf - 664 sys sys 1048637160 10550
+1048638707 7 c sys/man/2/tmpfile - 664 sys sys 1048637161 1157
+1048638707 8 c sys/man/2/9pfid - 664 sys sys 1048637158 3626
+1048638707 9 c sys/man/2/9pfile - 664 sys sys 1048637158 4408
+1048638707 10 c sys/man/6/namespace - 664 sys sys 1048637182 1576
+1048638707 11 c sys/man/8/venti - 664 sys sys 1048637200 5194
+1048638707 12 c sys/src/9/pc/devarch.c - 664 sys sys 1048637309 17462
+1048638707 13 c sys/src/9/pc/devfloppy.c - 664 sys sys 1048637319 20016
+1048638707 14 c sys/src/9/pc/i8253.c - 664 sys sys 1048637309 6257
+1048638707 15 c sys/src/9/port/devmouse.c - 664 sys sys 1048637374 11460
+1048638707 16 c sys/src/cmd/venti/venti.c - 664 sys sys 1048638713 4172
+1048640509 0 c sys/man/4/factotum - 664 sys sys 1048639180 14728
+1048640509 1 c sys/src/9/pc/vgas3.c - 664 sys sys 1048640451 12064
+1048640509 2 c sys/src/cmd/aux/vga/s3generic.c - 664 sys sys 1048640344 7472
+1048640509 3 c sys/src/cmd/aux/vga/virge.c - 664 sys sys 1048640341 17860
+1048640509 4 c sys/src/cmd/ssh/sshserve.c - 664 sys sys 1048639835 5784
+1048644113 0 c sys/man/1/ssh - 664 sys sys 1048643947 6622
+1048644113 1 c sys/man/2/lock - 664 sys sys 1048643958 4692
+1048644113 2 c sys/man/2/rsa - 664 sys sys 1048643959 4151
+1048644113 3 c sys/man/4/fossil - 664 sys sys 1048643971 8463
+1048644113 4 c sys/man/4/lnfs - 664 sys sys 1048643973 1215
+1048644113 5 c sys/src/9/mtx/dat.h - 664 sys sys 1048644012 3731
+1048644113 6 c sys/src/9/mtx/devether.c - 664 sys sys 1048644013 9279
+1048644113 7 c sys/src/9/pc/dat.h - 664 sys sys 1048644041 6068
+1048644113 8 c sys/src/9/pc/devether.c - 664 sys sys 1048644042 10178
+1048644113 9 c sys/src/9/pc/devpccard.c - 664 sys sys 1048644060 39977
+1048644113 10 c sys/src/9/pc/devusb.c - 664 sys sys 1048644072 17991
+1048644113 11 c sys/src/9/pc/ethersink.c - 664 sys sys 1048644103 1076
+1048644113 12 c sys/src/9/pc/main.c - 664 sys sys 1048644107 14454
+1048644113 13 c sys/src/9/pc/mp.c - 664 sys sys 1048644112 16928
+1048644113 14 c sys/src/9/pc/pccpu - 664 sys sys 1048644120 804
+1048644113 15 c sys/src/9/pc/screen.h - 664 sys sys 1048644129 3760
+1048644113 16 c sys/src/9/pc/sdata.c - 664 sys sys 1048644136 45225
+1048644113 17 c sys/src/9/pc/vgamach64xx.c - 664 sys sys 1048644147 29112
+1048645915 0 c sys/src/9/pc/vganvidia.c - 664 sys sys 1048644159 6306
+1048645915 1 c sys/src/9/pc/wavelan.c - 664 sys sys 1048644170 27255
+1048645915 2 c sys/src/9/pc/wavelan.h - 664 sys sys 1048644171 6166
+1048645915 3 c sys/src/9/port/chan.c - 664 sys sys 1048644187 29000
+1048645915 4 c sys/src/9/port/dev.c - 664 sys sys 1048644191 8241
+1048645915 5 c sys/src/9/port/devaudio.c - 664 sys sys 1048644215 21133
+1048645915 6 c sys/src/9/port/devcap.c - 664 sys sys 1048644215 4113
+1048645915 7 c sys/src/9/port/devcons.c - 664 sys sys 1048644216 20917
+1048645915 8 c sys/src/9/port/devenv.c - 664 sys sys 1048644225 6992
+1048645915 9 c sys/src/9/port/portdat.h - 664 sys sys 1048644230 21247
+1048645915 10 c sys/src/9/port/proc.c - 664 sys sys 1048644240 24347
+1048645915 11 c sys/src/9/port/sysfile.c - 664 sys sys 1048644253 15992
+1048645915 12 c sys/src/ape/cmd/make/mkfile - 664 sys sys 1048644265 343
+1048645915 13 c sys/src/ape/cmd/mkfile - 664 sys sys 1048644277 537
+1048645915 14 c sys/src/ape/cmd/pdksh/mkfile - 664 sys sys 1048644309 549
+1048645915 15 c sys/src/ape/lib/ap/gen/strxfrm.c - 664 sys sys 1048644320 308
+1048645915 16 c sys/src/ape/lib/ap/plan9/_buf.c - 664 sys sys 1048644332 9661
+1048645915 17 c sys/src/ape/lib/ap/plan9/_envsetup.c - 664 sys sys 1048644333 2198
+1048645915 18 c sys/src/ape/lib/ap/plan9/dir.h - 664 sys sys 1048644334 2092
+1048645915 19 c sys/src/ape/lib/ap/plan9/open.c - 664 sys sys 1048644335 1088
+1048645915 20 c sys/src/ape/lib/ap/plan9/sys9.h - 664 sys sys 1048644336 4251
+1048645915 21 c sys/src/ape/lib/ap/plan9/time.c - 664 sys sys 1048644336 380
+1048645915 22 c sys/src/ape/lib/ap/plan9/dirtostat.c - 664 sys sys 1048644334 1081
+1048645915 23 c sys/src/ape/lib/bsd/mkfile - 664 sys sys 1048644340 810
+1048645915 24 c sys/src/cmd/9660srv/mkfile - 664 sys sys 1048644372 238
+1048645915 25 c sys/src/cmd/auth/mkfile - 664 sys sys 1048644402 1978
+1048645915 26 c sys/src/cmd/aux/acidleak.c - 664 sys sys 1048644418 5919
+1048645915 27 c sys/src/cmd/cc/dpchk.c - 664 sys sys 1048644435 6368
+1048645915 28 c sys/src/cmd/ndb/dblookup.c - 664 sys sys 1048644530 18341
+1048645915 29 c sys/src/cmd/execnet/fs.c - 664 sys sys 1048644451 6952
+1048645915 30 c sys/src/cmd/faces/main.c - 664 sys sys 1048644465 13572
+1048645915 31 c sys/src/cmd/nntpfs.c - 664 sys sys 1048644540 18869
+1048645915 32 c sys/src/cmd/rtstats/rtstats.c - 664 sys sys 1048644563 13224
+1048645915 33 c sys/src/cmd/ssh/agent.c - 664 sys sys 1048644598 9085
+1048645915 34 c sys/src/cmd/ssh/authrsa.c - 664 sys sys 1048644598 2646
+1048645915 35 c sys/src/cmd/ssh/authtis.c - 664 sys sys 1048644598 1064
+1048645915 36 c sys/src/cmd/ssh/scp.c - 664 sys sys 1048644598 13757
+1048645915 37 c sys/src/cmd/ssh/smsg.c - 664 sys sys 1048644598 6167
+1048645915 38 c sys/src/cmd/ssh/util.c - 664 sys sys 1048644598 4478
+1048645915 39 c sys/src/cmd/upas/common/libsys.c - 664 sys sys 1048644621 13814
+1048645915 40 c sys/src/cmd/upas/filterkit/deliver.c - 664 sys sys 1048644629 1372
+1048645915 41 c sys/src/cmd/upas/filterkit/mkfile - 664 sys sys 1048645255 264
+1048645915 42 c sys/src/cmd/upas/fs/pop3.c - 664 sys sys 1048645264 11514
+1048645915 43 c sys/src/cmd/upas/scanmail/scanmail.c - 664 sys sys 1048645272 8717
+1048645915 44 c sys/src/cmd/vac/file.c - 664 sys sys 1048645298 18984
+1048645915 45 c sys/src/cmd/venti/copy.c - 664 sys sys 1048645305 3440
+1048645915 46 c sys/src/cmd/venti/utils.c - 664 sys sys 1048645318 4596
+1048645915 47 c sys/src/cmd/cpu.c - 664 sys sys 1048644441 20353
+1048645915 48 c sys/src/cmd/fossil/9p.c - 664 sys sys 1048644482 21360
+1048645915 49 c sys/src/cmd/fossil/fs.c - 664 sys sys 1048644483 17084
+1048645915 50 c sys/src/cmd/mntgen.c - 664 sys sys 1048644521 3365
+1048645915 51 c sys/src/cmd/nfs.c - 664 sys sys 1048644535 30830
+1048645915 52 c sys/src/cmd/pcc.c - 664 sys sys 1048644546 5994
+1048645915 53 c sys/src/lib9p/srv.c - 664 sys sys 1048645335 16699
+1048645915 54 c sys/src/libauth/auth_rpc.c - 664 sys sys 1048645351 2064
+1048645915 55 c sys/src/libc/9sys/dial.c - 664 sys sys 1048645360 3625
+1048645915 56 c sys/src/libc/9sys/qlock.c - 664 sys sys 1048645387 3793
+1048645915 57 c sys/src/libsunrpc/fd.c - 664 sys sys 1048645436 1734
+1048645915 58 c sys/src/libsunrpc/net.c - 664 sys sys 1048645436 793
+1048645915 59 c sys/src/libsunrpc/nfs3.c - 664 sys sys 1048645438 93386
+1048645915 60 c sys/src/libsunrpc/server.c - 664 sys sys 1048645438 5237
+1048645915 61 c sys/src/libsunrpc/udp.c - 664 sys sys 1048645439 2161
+1048645915 62 a sys/src/libthread/xincpower.s - 664 sys sys 1048645448 342
+1048645915 63 d sys/src/ape/cmd/pdksh/missing.c - 664 sys sys 1014921977 0
+1048645915 64 d sys/src/cmd/auth/factotum/secretpem.c - 664 sys sys 1017679313 0
+1048645915 65 d sys/src/cmd/aux/X509gen.c - 664 sys sys 1037575307 0
+1048645915 66 d sys/src/cmd/ssh/ssh_genkey.c - 664 sys sys 1016466380 0
+1048645915 67 d sys/src/libthread/xincpower.c - 664 sys sys 1014928161 0

+ 1 - 18
lib/vgadb

@@ -357,24 +357,7 @@ ctlr
 	ctlr=3dfx linear=1
 	hwgc=3dfxhwgc
 ctlr
-	vid=0x10DE did=0x0020		# Riva TNT
-	vid=0x10DE did=0x0028		# Riva TNT2
-	vid=0x10DE did=0x0029		# Riva TNT2 Ultra
-	vid=0x10DE did=0x002C		# Riva TNT2 Vanta
-	vid=0x10DE did=0x002D		# Riva TNT2 M64
-	vid=0x10DE did=0x00A0		# Riva TNT2 Integrated
-	vid=0x10DE did=0x0100		# GeForce 256
-	vid=0x10DE did=0x0101		# GeForce DDR
-	vid=0x10DE did=0x0103		# Quadro
-	vid=0x10DE did=0x0110		# GeForce2 MMX
-	vid=0x10DE did=0x0111		# GeForce2 MMX DDR
-	vid=0x10DE did=0x0112		# GeForce2 Go
-	vid=0x10DE did=0x0113		# Quadro 2 MXR
-	vid=0x10DE did=0x0150		# GeForce2 GTS
-	vid=0x10DE did=0x0151		# GeForce2 GTS (rev 1)
-	vid=0x10DE did=0x0152		# GeForce2 Ultra
-	vid=0x10DE did=0x0153		# Quadro 2 Pro	
-	vid=0x10DE did=0x0200		# GeForce3
+	vid=0x10DE did=*			# NVidia cards all talk the same
 	link=vga
 	ctlr=nvidia linear=1
 	hwgc=nvidiahwgc

+ 4 - 7
rc/bin/ps2pdf

@@ -32,15 +32,12 @@ case *
 	usage
 }
 
-if(~ $fin -)
-	fin=/fd/0
-if(~ $fout -)
-	fout=/fd/1
-
 # We have to include the options twice because -I only takes effect
 # if it appears before other options.
 
-exec gs $opt -dSAFER -dNOPAUSE -dBATCH -q -s'DEVICE=pdfwrite' \
+gscmd=( gs $opt -dSAFER -dNOPAUSE -dBATCH -q -s'DEVICE=pdfwrite' \
 	$opt $compat \
-	-s'OutputFile='$fout -c .setpdfwrite -f $fin
+	-s'OutputFile='$fout -c .setpdfwrite -f $fin)
+exec $gscmd
+
 

+ 1 - 0
sys/include/auth.h

@@ -137,6 +137,7 @@ extern AuthRpc*		auth_allocrpc(int afd);
 extern Attr*		auth_attr(AuthRpc *rpc);
 extern void		auth_freerpc(AuthRpc *rpc);
 extern uint		auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
+extern int		auth_wep(char*, char*, ...);
 #pragma varargck argpos auth_proxy 3
 #pragma varargck argpos auth_challenge 1
 #pragma varargck argpos auth_respond 3

+ 2 - 1
sys/include/libsec.h

@@ -229,8 +229,9 @@ RSApriv*	asn1toRSApriv(uchar*, int);
 void		asn1dump(uchar *der, int len);
 uchar*		decodepem(char *s, char *type, int *len);
 uchar*		X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
+uchar*		X509req(RSApriv *priv, char *subj, int *certlen);
 char*		X509verify(uchar *cert, int ncert, RSApub *pk);
-
+void		X509dump(uchar *cert, int ncert);
 /////////////////////////////////////////////////////////
 // elgamal
 /////////////////////////////////////////////////////////

+ 19 - 9
sys/lib/acid/leak

@@ -9,7 +9,7 @@ dumppool(p)
 	complex Pool p;
 	a = p.arenalist;
 
-	while a != 0 do {
+	while a != 0 && a < 0x60000000 do {
 		complex Arena a;
 		dumparena(a);
 		a = a.down;
@@ -24,19 +24,24 @@ dumparena(arena)
 	atail = A2TB(arena);
 	complex Bhdr arena;
 	b = a;
-	while b.magic != ARENATAIL_MAGIC && b < atail do {
+	while b < atail && b.magic != ARENATAIL_MAGIC do {
 		dumpblock(b);
 		nb = B2NB(b);
 		if nb == b then {
 			print("B2NB(", b\X, ") = b\n");
 			b = atail;	// end loop
 		}
-		b = nb;
+		if nb > atail then {
+			b = (Bhdr)(b+4);
+			print("lost at block ", (b-4)\X, ", scanning forward\n");
+			while b < atail && b.magic != KEMPT_MAGIC && b.magic != FREE_MAGIC do
+				b = (Bhdr)(b+4);
+			print("stopped at ", b\X, " ", *b\X, "\n");
+		}else
+			b = nb;
 	}
-
-	dumpblock(b);
 	if b != atail then
-		print("found wrong tail to arena ", arena\X, "\n");
+		print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n");
 }
 
 defn
@@ -54,14 +59,19 @@ dumpblock(addr)
 {
 	complex Bhdr addr;
 
-	if addr.magic == KEMPT_MAGIC then {
-		local a, x;
+	if addr.magic == KEMPT_MAGIC || addr.magic == FREE_MAGIC then {
+		local a, x, s;
 
 		a = addr;
 		complex Alloc a;
 
 		x = addr+8;
-		print("block ", addr\X, " ", a.size\X, " ", *(addr+8)\X, " ", *(addr+12)\X, "\n");
+		if addr.magic == KEMPT_MAGIC then
+			s = "block";
+		else
+			s = "free";
+		print(s, " ", addr\X, " ", a.size\X, " ");
+		print(*(addr+8)\X, " ", *(addr+12)\X, "\n");
 	}
 }
 

+ 1 - 1
sys/lib/sysconfig/fl/boot

@@ -19,7 +19,7 @@ if not{
 	# remove this key once factotum is initialized with other keys
 	factotum -g 'proto=p9sk1 user=rsc dom=localhost !password=localhost'
 }
-venti -c venti.conf -B 8m -C 8m -h tcp!127.1!8000 -I 8m -w -a tcp!127.1!17034 &
+venti -c venti.conf -B 1m -C 1m -h tcp!127.1!8000 -I 1m -w -a tcp!127.1!17034 &
 sleep 10
 venti=tcp!127.0.0.1!17034
 fossil -c '. flproto'

+ 1 - 1
sys/lib/sysconfig/fl/flproto

@@ -1,7 +1,7 @@
 srv -p fscons
 srv boot
 fsys main config /dev/sdC0/fossil
-fsys main open
+fsys main open -c 3000
 fsys main
 users /active/adm/users
 snaptime -s 60 -a 0500

+ 24 - 37
sys/man/1/ssh

@@ -1,6 +1,6 @@
 .TH SSH 1
 .SH NAME
-ssh, sshnet, scp, sshserve, ssh_genkey \- secure login and file copy from/to Unix or Plan 9
+ssh, sshnet, scp, sshserve \- secure login and file copy from/to Unix or Plan 9
 .SH SYNOPSIS
 .B ssh
 [
@@ -55,11 +55,6 @@ ssh, sshnet, scp, sshserve, ssh_genkey \- secure login and file copy from/to Uni
 .B -p
 ]
 .I address
-.PP
-.B aux/ssh_genkey
-[
-.I basename
-]
 .SH DESCRIPTION
 .I Ssh
 allows authenticated login over an encrypted channel to hosts that
@@ -312,44 +307,36 @@ by
 because many Unix clients present
 this capability in an insecure manner.
 .PP
-.I Ssh_genkey
-generates an RSA key set, writing the
-private key to
-.IB basename .secret
-and the public key to
-.IB basename .public\fR.
-.I Ssh_genkey
-also writes
-a secret key in the style expected by factotum
-to
-.IB basename .secret.factotum\fR.
-The default 
-.B basename
-is 
-.BR /sys/lib/ssh/hostkey ,
-so running it with no arguments
-will generate an RSA key set
-for the file server in use.
+.I Sshserve
+requires that
+.IR factotum (4)
+hold the host key,
+identified by having attributes
+.B proto=rsa
+.BR service=sshserve .
+To generate a host key:
+.IP
+.EX
+auth/rsagen -t 'service=sshserve' >/mnt/factotum/ctl
+.EE
+.LP
+To extract the public part of the host key in the form
+used by SSH key rings:
+.IP
+.EX
+grep 'service=sshserve' /mnt/factotum/ctl | auth/rsa2ssh
+.EE
 .SH FILES
-.TF /sys/lib/ssh/hostkey.public
-.TP
-.B /sys/lib/ssh/hostkey.public
-Public key for the host on which the program runs.
-.TP
-.B /sys/lib/ssh/hostkey.secret
-Secret key for the host on which the program runs.  This file must
-be owned and be readable by bootes only.
 .TP
 .B /sys/lib/ssh/keyring
-System keyring file containing public keys for remote ssh clients and servers.
+System key ring file containing public keys for remote ssh clients and servers.
 .TP
 .B /usr/\fIuser\fP/lib/keyring
-Personal keyring file containing public keys for remote ssh clients and
+Personal key ring file containing public keys for remote ssh clients and
 servers.
 .SH SOURCE
 .B /sys/src/cmd/ssh
 .SH "SEE ALSO"
-.IR /sys/src/cmd/ssh/RFC*
-.br
 .IR factotum (4),
-.IR authsrv (6)
+.IR authsrv (6),
+.IR rsa (8)

+ 0 - 1
sys/man/2/9pfid

@@ -7,7 +7,6 @@ Req, Reqpool, allocreqpool, freereqpool, allocreq, closereq, lookupreq, removere
 .nf
 #include <u.h>
 #include <libc.h>
-#include <auth.h>
 #include <fcall.h>
 #include <thread.h>
 #include <9p.h>

+ 0 - 1
sys/man/2/9pfile

@@ -8,7 +8,6 @@ opendirfile, readdirfile, closedirfile, hasperm \- in-memory file hierarchy
 .nf
 #include <u.h>
 #include <libc.h>
-#include <auth.h>
 #include <fcall.h>
 #include <thread.h>
 #include <9p.h>

+ 2 - 0
sys/man/2/fgetc

@@ -2,6 +2,8 @@
 .SH NAME
 fgetc, getc, getchar, fputc, putc, putchar, ungetc, fgets, gets, fputs, puts, fread, fwrite \- Stdio input and output
 .SH SYNOPSIS
+.B #include <u.h>
+.br
 .B #include <stdio.h>
 .ta \w'\fLlong 'u
 .PP

+ 2 - 0
sys/man/2/fopen

@@ -2,6 +2,8 @@
 .SH NAME
 fopen, freopen, fdopen, fileno, fclose, sopenr, sopenw, sclose, fflush, setvbuf, setbuf, fgetpos, ftell, fsetpos, fseek, rewind, feof, ferror, clearerr \- standard buffered input/output package
 .SH SYNOPSIS
+.B #include <u.h>
+.br
 .B #include <stdio.h>
 .PP
 .ta \w'\fLFILE 'u

+ 2 - 0
sys/man/2/fprintf

@@ -2,6 +2,8 @@
 .SH NAME
 fprintf, printf, sprintf, snprintf, vfprintf, vprintf, vsprintf, vsnprintf \- print formatted output
 .SH SYNOPSIS
+.B #include <u.h>
+.br
 .B #include <stdio.h>
 .PP
 .B

+ 2 - 0
sys/man/2/fscanf

@@ -2,6 +2,8 @@
 .SH NAME
 fscanf, scanf, sscanf, vfscanf \- scan formatted input
 .SH SYNOPSIS
+.B "#include <u.h>
+.br
 .B "#include <stdio.h>"
 .PP
 .B

+ 116 - 64
sys/man/2/lock

@@ -2,106 +2,90 @@
 .SH NAME
 lock, canlock, unlock,
 qlock, canqlock, qunlock,
-rlock, runlock, canrlock,
-wlock, wunlock, canwlock,
+rlock, canrlock, runlock,
+wlock, canwlock, wunlock,
+rsleep, rwakeup, rwakeupall
 incref, decref
-\- shared memory spin locks, rendez-vous locks, reader-writer locks, and
-atomic increment and decrement
+\- spin locks, queueing rendezvous locks, reader-writer locks, rendezvous points, and reference counts
 .SH SYNOPSIS
-.B
+.ft L
+.nf
 #include <u.h>
-.br
-.B
 #include <libc.h>
 .PP
-.B
+.ft L
+.nf
 void	lock(Lock *l)
-.PP
-.B
 int	canlock(Lock *l)
-.PP
-.B
 void	unlock(Lock *l)
 .PP
-.B
+.ft L
+.nf
 void	qlock(QLock *l)
-.PP
-.B
-void	qunlock(QLock *l)
-.PP
-.B
 int	canqlock(QLock *l)
+void	qunlock(QLock *l)
 .PP
-.B
+.ft L
+.nf
 void	rlock(RWLock *l)
-.PP
-.B
-void	runlock(RWLock *l)
-.PP
-.B
 int	canrlock(RWLock *l)
+void	runlock(RWLock *l)
 .PP
-.B
+.ft L
+.nf
 void	wlock(RWLock *l)
-.PP
-.B
+int	canwlock(RWLock *l)
 void	wunlock(RWLock *l)
 .PP
-.B
-int	canwlock(RWLock *l)
+.ft L
+.nf
+typedef struct Rendez {
+	QLock *l;
+	\fI...\fP
+} Rendez;
 .PP
+.ft L
+.nf
+void	rsleep(Rendez *r)
+int	rwakeup(Rendez *r)
+int	rwakeupall(Rendez *r)
 .PP
-.B
+.ft L
 #include <thread.h>
 .PP
-.B
+.ft L
+.nf
 typedef struct Ref {
-.br
-.B
 	long ref;
-.br
-.B
 } Ref;
 .PP
-.B
+.ft L
+.nf
 void incref(Ref*)
-.PP
-.B
 long decref(Ref*)
+.fi
 .SH DESCRIPTION
 These routines are used  to synchronize processes sharing memory.
 .PP
-The first group
-.RI ( lock ,
-.IR canlock , 
-.IR unlock )
-uses spin locks in shared memory.
-The second group
-.RI ( qlock ,
-.IR canqlock ,
-.IR qunlock ),
-uses rendezvous locks in shared
-memory.
-The third group
-.RI ( rlock ,
-.IR runlock ,
-.IR canrlock ,
-.IR wlock ,
-.IR wunlock ,
-.IR canwlock ),
-also uses rendezvous locks but has slightly different
-semantics.
-.PP
-Locks work in regular programs as well as programs that use the thread library
+.B Locks
+are spin locks,
+.B QLocks
+and
+.B RWLocks
+are different types of queueing rendezvous locks,
+and
+.B Rendezes
+are rendezvous points.
+.PP
+Locks and rendezvous points work in regular programs as
+well as programs that use the thread library
 (see
 .IR thread (2)).
 The thread library replaces the
-.B rendezvous
+.IR rendezvous (2)
 system call
-(see
-.IR rendezvous (2))
 with its own implementation,
-.BR threadrendezvous ,
+.IR threadrendezvous ,
 so that threads as well as processes may be synchronized by locking calls
 in threaded programs.
 .PP
@@ -155,6 +139,52 @@ read access until write access is released.
 All types of lock should be initialized to all zeros before use; this
 puts them in the unlocked state.
 .PP
+.B Rendezes
+are rendezvous points.  Each
+.B Rendez
+.I r
+is protected by a
+.B QLock
+.IB r -> l \fR,
+which must be held by the callers of
+.IR rsleep ,
+.IR rwakeup ,
+and
+.IR rwakeupall .
+.I Rsleep
+atomically releases
+.IB r -> l
+and suspends execution of the calling task.
+After resuming execution,
+.I rsleep
+will reacquire
+.IB r -> l
+before returning.
+If any processes are sleeping on
+.IR r ,
+.I rwakeup
+wakes one of them.
+it returns 1 if a process was awakened, 0 if not.
+.I Rwakeupall
+wakes all processes sleeping on
+.IR r ,
+returning the number of processes awakened.
+.I Rwakeup
+and
+.I rwakeupall
+do not release
+.IB r -> l
+and do not suspend execution of the current task.
+.PP
+Before use,
+.B Rendezes
+should be initialized to all zeros except for
+.IB r -> l
+pointer, which should point at the
+.B QLock
+that will guard
+.IR r .
+.PP
 A
 .B Ref
 contains a
@@ -178,3 +208,25 @@ and returns zero if the resulting value is zero, non-zero otherwise.
 .I rfork
 in
 .IR fork (2)
+.SH BUGS
+.B Locks
+are not strictly spin locks.
+After each unsuccessful attempt,
+.I lock
+calls
+.B sleep(0)
+to yield the CPU; this handles the common case
+where some other process holds the lock.
+After a thousand unsuccessful attempts,
+.I lock
+sleeps for 100ms between attempts.
+Another another thousand unsuccessful attempts,
+.I lock
+sleeps for a full second between attempts.
+.B Locks
+are not intended to be held for long periods of time.
+The 100ms and full second sleeps are only heuristics to
+avoid tying up the CPU when a process deadlocks.
+As discussed above,
+if a lock is to be held for much more than a few instructions,
+the queueing lock types should be almost always be used.

+ 3 - 0
sys/man/2/rsa

@@ -63,6 +63,9 @@ uchar*	decodepem(char *s, char *type, int *len)
 uchar*	X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
 .PP
 .B
+uchar*	X509req(RSApriv *priv, char *subj, int *certlen);
+.PP
+.B
 char* X509verify(uchar *cert, int ncert, RSApub *pk)
 .SH DESCRIPTION
 .PP

+ 2 - 0
sys/man/2/tmpfile

@@ -2,6 +2,8 @@
 .SH NAME
 tmpfile, tmpnam \- Stdio temporary files
 .SH SYNOPSIS
+.B #include <u.h>
+.br
 .B #include <stdio.h>
 .PP
 .ta \w'\fLFILE 'u

+ 55 - 13
sys/man/4/factotum

@@ -1,6 +1,6 @@
 .TH FACTOTUM 4
 .SH NAME
-factotum, fgui, secretpem\- authentication agent and its graphical interface
+factotum, fgui, secretpem \- authentication agent
 .SH SYNOPSIS
 .B auth/factotum
 [
@@ -14,6 +14,10 @@ factotum, fgui, secretpem\- authentication agent and its graphical interface
 .B -m
 .I mtpt
 ]
+[
+.B -o
+.I owner
+]
 .PP
 .B auth/factotum
 .B -g
@@ -23,9 +27,6 @@ factotum, fgui, secretpem\- authentication agent and its graphical interface
 .B ...
 .PP
 .B auth/fgui
-.PP
-.B auth/secretpem
-.I key.pem
 .SH DESCRIPTION
 .I Factotum
 is a user-level file system that
@@ -126,8 +127,8 @@ the challenge/response protocols used by PPP and PPTP.
 .B mschap
 a proprietary Microsoft protocol also used by PPP and PPTP.
 .TP
-.B sshrsa
-an public key protocol used by ssh.
+.B rsa
+RSA public key decryption, used by SSH and TLS.
 .TP
 .B pass
 passwords in the clear.
@@ -135,6 +136,9 @@ passwords in the clear.
 .B vnc
 .IR vnc (1)'s
 challenge/response.
+.TP
+.B wep
+WEP passwords for wireless ethernet cards.
 .PD
 .PP
 The options are:
@@ -211,6 +215,17 @@ and
 .BR \-S .
 This option is typically used by
 the kernel at boot time.
+.TP
+.B \-o
+causes the agent to set the owner to
+.I owner
+(by default, the user invoking
+.IR factotum ).
+This allows
+.I owner
+to use the keys stored in that instance of the factotum,
+and is useful for setting up a factotum to be used by
+.BR none .
 .PD
 .PP
 .I Fgui
@@ -293,9 +308,9 @@ attributes; e.g.
     proto=pass user=tb !password=does.it.matter
 .EE
 .PP
-.B Sshrsa
+.B Rsa
 requires a key with
-.B proto=sshrsa
+.B proto=rsa
 in addition to all the hex attributes defining an RSA key:
 .BR ek ,
 .BR n ,
@@ -306,12 +321,44 @@ in addition to all the hex attributes defining an RSA key:
 .BR !c2 ,
 and
 .BR !dk .
+By convention, programs using the RSA protocol also require a
+.B service
+attribute set to
+.BR ssh ,
+.BR sshserve ,
+or
+.BR tls .
+.PP
+.B Wep
+requires a
+.BR key1 ,
+.BR key2 ,
+or
+.BR key3
+set to the password to be used.
+Starting the protocol causes
+.I factotum
+to configure the wireless ethernet card
+.B #l/ether0
+for WEP encryption with the given password.
 .PP
 All keys can have additional attibutes that act either as comments
 or as selectors to distinguish them in the
 .IR auth (2)
 library calls.
 .PP
+The factotum owner can use any key stored by factotum.
+Any key may have one or more
+.B owner
+attributes listing the users who can use the key
+as though they were the owner.
+For example, the TLS and SSH host keys on a server
+often have an attribute
+.B owner=*
+to allow any user (and in particular,
+.L none )
+to run the TLS or SSH server-side protocol.
+.PP
 Any key may have a
 .B role
 attribute for restricting how it can be used.
@@ -675,10 +722,5 @@ where
 is the reason for the error.
 .PD
 .RE
-.PP
-.I Secretpem
-copies a PEM-format RSA private key onto standard output in sshrsa key syntax,
-suitable for writing to
-.IR /mnt/factotum/ctl .
 .SH SOURCE
 .B /sys/src/cmd/auth/factotum

+ 0 - 9
sys/man/4/fossil

@@ -417,12 +417,3 @@ but note that this will preserve most of the file system
 (all but
 .B /snapshot
 ) with little effort.
-.LP
-The implementation of
-.IR flush (5)
-has a race that will be fixed shortly.
-It is possible (though, in practice, it happens
-very rarely) that 
-.I fossil
-will respond to a message after responding
-to a flush of that message.

+ 8 - 0
sys/man/4/lnfs

@@ -11,6 +11,8 @@ lnfs \- long name file system
 .I srvname
 ]
 .I mountpoint
+.B unlnfs
+.I mountpoint
 .SH DESCRIPTION
 .I Lnfs
 starts a process that mounts itself (see
@@ -46,10 +48,16 @@ provide a service name,
 to post in
 .BR /srv .
 Without this option, no posting is performed.
+.PP
+.I Unlnfs
+renames files with shortened names to their actual long names.
+It is useful once you have moved to a file server with true long name support.
 .SH FILES
 .B .longnames
 .SH SOURCE
 .B /sys/src/cmd/lnfs.c
+.PP
+.B /sys/src/cmd/unlnfs.c
 .SH BUGS
 This exists only to shame us into getting a real long
 name file server working.

+ 14 - 1
sys/man/6/namespace

@@ -5,7 +5,9 @@ namespace \- name space description file
 Namespace files describe how to construct a name space from scratch,
 an operation normally performed by the
 .I newns
-subroutine
+or
+.I addns
+subroutines
 (see
 .IR auth (2))
 which is typically called by
@@ -65,6 +67,17 @@ or everything mounted on
 if
 .I new
 is missing.
+.TP
+.BR clear
+Clear the name space with
+.BR rfork(RFCNAMEG) .
+.TP
+.BI . \ path
+Execute the namespace file 
+.IR path .
+Note that
+.I path
+must be present in the name space being built.
 .PD
 .PP
 The options for

+ 241 - 0
sys/man/8/rsa

@@ -0,0 +1,241 @@
+.TH RSA 8
+.SH NAME
+rsagen, rsafill, asn12rsa, rsa2pub, rsa2ssh, rsa2x509 \- generate and format rsa keys
+.SH SYNOPSIS
+.PP
+.B rsagen
+[
+.B -b
+.I nbits
+]
+[
+.B -t
+.I tag
+]
+.PP
+.B rsafill
+[
+.I file
+]
+.PP
+.B asn12rsa
+[
+.B -t
+.I tag
+]
+[
+.I file
+]
+.PP
+.B rsa2pub
+[
+.I file
+]
+.PP
+.B rsa2ssh
+[
+.I file
+]
+.PP
+.B rsa2x509
+[
+.B -e
+.I expiretime
+]
+.I certinfo
+[
+.I file
+]
+.SH DESCRIPTION
+Plan 9 represents an RSA key as an attribute-value pair list
+prefixed with the string
+.BR key ;
+this is the generic key format used by
+.IR factotum (4).
+A full RSA private key has the following attributes:
+.TP
+.B proto
+must be
+.B rsa
+.TP
+.B size
+the number of significant bits in
+.B n
+.TP
+.B ek
+the encryption exponent
+.TP
+.B n
+the product of
+.B !p
+and
+.B !q
+.TP
+.B !dk
+the decryption exponent
+.TP
+.B !p
+a large prime
+.TP
+.B !q
+another large prime
+.TP
+.B "!kp\fR, \fL!kq\fR, \fL!c2
+parameters derived from the other attributes, cached to speed decryption
+.PD
+.LP
+All the numbers are in hexadecimal except
+.I size ,
+which is decimal.
+An RSA public key omits the attributes beginning with
+.L ! .
+A key may have other attributes as well (for example, a
+.B service
+attribute identifying how this key is typically used),
+but to these utilities such attributes are merely comments.
+.PP
+For example, a very small (and thus insecure) private key and corresponding
+public key might be:
+.IP
+.EX
+key proto=rsa size=8 ek=7 n=8F !dk=67 !p=B !q=D !kp=3 !kq=7 !c2=6
+key proto=rsa size=8 ek=7 n=8F
+.EE
+.LP
+Note that the order of the attributes does not matter.
+.PP
+.I Rsagen
+prints a randomly generated RSA private key
+whose
+.B n
+has exactly
+.I nbits
+(default 1024)
+significant bits.
+If
+.I tag
+is specified, it is printed between
+.B key
+and
+.BR proto=rsa ;
+typically,
+.I tag
+is a sequence of attribute-value comments describing the key.
+.PP
+.I Rsafill
+reads a private key,
+recomputes the
+.BR !kp ,
+.BR !kq ,
+and
+.BR !c2
+attributes if they are missing,
+and prints a full key.
+.PP
+.I Asn12rsa
+reads an RSA private key stored as ASN.1
+encoded in the binary Distinguished Encoding Rules (DER)
+and prints a Plan 9 RSA key,
+inserting
+.I tag
+exactly as
+.I rsagen
+does.
+ASN.1/DER is a popular key format on Unix and Windows;
+it is often encoded in text form using the Privacy Enhanced Mail (PEM) format
+in a section labeled as an
+.RB `` RSA
+.B PRIVATE
+.BR KEY .''
+The command:
+.IP
+.EX
+auth/pemdecode 'RSA PRIVATE KEY' | auth/asn12rsa
+.EE
+.LP
+extracts the key section from a textual ASN.1/DER/PEM key
+into binary ASN.1/DER format and then
+converts it to a Plan 9 RSA key.
+.PP
+.I Rsa2pub
+reads a Plan 9 RSA public or private key,
+removes the private attributes, and prints the resulting public key.
+Comment attributes are preserved.
+.PP
+.I Rsa2ssh
+reads a Plan 9 RSA public or private key and prints the public portion 
+in the format used by SSH: three space-separated decimal numbers
+.BR size ,
+.BR ek ,
+and
+.BR n .
+For compatibility with external SSH implementations, the public keys in
+.B /sys/lib/ssh/keyring
+and
+.B $home/lib/keyring
+are stored in this format.
+.PP
+.I Rsa2x509
+reads a Plan 9 RSA private key and writes a self-signed X.509 certificate
+encoded in ASN.1/DER format to standard output.
+(Note that ASN.1/DER X.509 certificates are different from ASN.1/DER private keys).
+The certificate uses the current time as its start time and expires
+.I expiretime
+seconds
+(default 3 years)
+later.
+It contains the public half of the key
+and includes
+.I certinfo
+as the issuer/subject string (also known as a ``Distinguished Name'').
+This info is typically in the form:
+.IP
+.EX
+C=US ST=NJ L=07974 O=Lucent OU='Bell Labs' CN=G.R.Emlin
+.EE
+.LP
+The X.509 ASN.1/DER format is often encoded in text using a PEM section
+labeled as a
+.RB `` CERTIFICATE .''
+The command:
+.IP
+.EX
+auth/rsa2x509 'C=US OU=''Bell Labs''' file |
+auth/pemencode CERTIFICATE
+.EE
+.LP
+generates such a textual certificate.
+Applications that serve TLS-encrypted sessions (for example,
+.IR httpd (8),
+.IR pop3 (8),
+and
+.IR tlssrv (8))
+expect certificates in ASN.1/DER/PEM format.
+.SH EXAMPLES
+Generate a fresh key and use it to start a TLS-enabled web server:
+.IP
+.EX
+auth/rsagen -t 'service=tls' >key
+auth/rsa2x509 'C=US CN=*.cs.bell-labs.com' key |
+	auth/pemencode CERTIFICATE >cert
+cat key >/mnt/factotum/ctl
+ip/httpd/httpd -c cert
+.EE
+.PP
+Generate a fresh key and configure a remote Unix system to
+allow use of that key for logins:
+.IP
+.EX
+auth/rsagen -t 'service=ssh' >key
+auth/rsa2ssh key | ssh unix 'cat >>.ssh/authorized_keys'
+cat key >/mnt/factotum/ctl
+ssh unix
+.EE
+.SH SOURCE
+.B /sys/src/cmd/auth
+.SH "SEE ALSO
+.IR factotum (4),
+.IR pem (8),
+.IR ssh (1)
+.SH BUGS
+There are too many key formats.

+ 3 - 1
sys/man/8/venti

@@ -218,4 +218,6 @@ time the command was issued are now on disk.
 .IR vacfs (4).
 .br
 Sean Quinlan and Sean Dorward,
-``Venti: a new approach to archival storage''.
+``Venti: a new approach to archival storage'',
+.I "Usenix Conference on File and Storage Technologies" ,
+2002.

+ 1 - 1
sys/src/9/mtx/dat.h

@@ -183,7 +183,7 @@ struct
 struct ISAConf {
 	char		*type;
 	ulong	port;
-	ulong	irq;
+	int	irq;
 	ulong	dma;
 	ulong	mem;
 	ulong	size;

+ 3 - 3
sys/src/9/mtx/devether.c

@@ -387,13 +387,13 @@ etherreset(void)
 			snprint(name, sizeof(name), "ether%d", ctlrno);
 
 			/*
-			 * If ether->irq is 0, it is a hack to indicate no interrupt
+			 * If ether->irq is <0, it is a hack to indicate no interrupt
 			 * used by ethersink.
 			 */
-			if(ether->irq > 0)
+			if(ether->irq >= 0)
 				intrenable(ether->irq, ether->interrupt, ether, ether->tbdf, name);
 
-			i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %lud",
+			i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d",
 				ctlrno, ether->type, ether->mbps, ether->port, ether->irq);
 			if(ether->mem)
 				i += sprint(buf+i, " addr 0x%luX", PADDR(ether->mem));

+ 1 - 1
sys/src/9/pc/dat.h

@@ -253,7 +253,7 @@ struct PCArch
 struct ISAConf {
 	char	*type;
 	ulong	port;
-	ulong	irq;
+	int	irq;
 	ulong	dma;
 	ulong	mem;
 	ulong	size;

+ 80 - 25
sys/src/9/pc/devarch.c

@@ -55,6 +55,7 @@ int narchdir = Qbase;
 int (*_pcmspecial)(char*, ISAConf*);
 void (*_pcmspecialclose)(int);
 
+extern int i8253dotimerset;
 
 /*
  * Add a file to the #P listing.  Once added, you can't delete it.
@@ -498,7 +499,15 @@ nop(void)
 {
 }
 
-void (*coherence)(void) = nop;
+/*
+ * On a uniprocessor, you'd think that coherence could be nop,
+ * but it can't.  We still need wbflush when using coherence() in
+ * device drivers.
+ *
+ * On VMware, it's safe (and a huge win) to set this to nop.
+ * Aux/vmware does this via the #P/archctl file.
+ */
+void (*coherence)(void) = wbflush;
 
 PCArch* arch;
 extern PCArch* knownarch[];
@@ -732,31 +741,80 @@ cputyperead(Chan*, void *a, long n, vlong offset)
 }
 
 static long
-pgewrite(Chan*, void *a, long n, vlong)
+archctlread(Chan*, void *a, long nn, vlong offset)
 {
-	if(!m->havepge)
-		error("processor does not support pge");
-
-	if(n==3 && memcmp(a, "off", 3)==0){
-		putcr4(getcr4() & ~0x80);
-		return n;
-	}
-	if(n==2 && memcmp(a, "on", 2)==0){
-		putcr4(getcr4() | 0x80);
-		return n;
-	}
-	error("invalid control message");
-	return -1;
+	char buf[256];
+	int n;
+	
+	n = snprint(buf, sizeof buf, "cpu %s %lud%s\n",
+		cputype->name, (ulong)(m->cpuhz+999999)/1000000,
+		m->havepge ? " pge" : "");
+	n += snprint(buf+n, sizeof buf-n, "pge %s\n", getcr4()&0x80 ? "on" : "off");
+	n += snprint(buf+n, sizeof buf-n, "coherence %s\n",
+		coherence==wbflush ? "wbflush" : "nop");
+	buf[n] = 0;
+	return readstr(offset, a, nn, buf);
 }
 
+enum
+{
+	CMpge,
+	CMcoherence,
+	CMi8253set,
+};
+
+static Cmdtab archctlmsg[] =
+{
+	CMpge,		"pge",		2,
+	CMcoherence,	"coherence",	2,
+	CMi8253set,	"i8253set",	2,
+};
+
 static long
-pgeread(Chan*, void *a, long n, vlong offset)
+archctlwrite(Chan*, void *a, long n, vlong)
 {
-	if(n < 16)
-		error("need more room");
-	if(offset)
-		return 0;
-	n = snprint(a, n, "%s pge; %s", m->havepge ? "have" : "no", getcr4()&0x80 ? "on" : "off");
+	Cmdbuf *cb;
+	Cmdtab *ct;
+
+	cb = parsecmd(a, n);
+	if(waserror()){
+		free(cb);
+		nexterror();
+	}
+	ct = lookupcmd(cb, archctlmsg, nelem(archctlmsg));
+	switch(ct->index){
+	case CMpge:
+		if(!m->havepge)
+			error("processor does not support pge");
+		if(strcmp(cb->f[1], "on") == 0)
+			putcr4(getcr4() | 0x80);
+		else if(strcmp(cb->f[1], "off") == 0)
+			putcr4(getcr4() & ~0x80);
+		else
+			cmderror(cb, "invalid pge ctl");
+		break;
+	case CMcoherence:
+		if(strcmp(cb->f[1], "wbflush") == 0)
+			coherence = wbflush;
+		else if(strcmp(cb->f[1], "nop") == 0){
+			/* only safe on vmware */
+			if(conf.nmach > 1)
+				error("cannot disable coherence on a multiprocessor");
+			coherence = nop;
+		}else
+			cmderror(cb, "invalid coherence ctl");
+		break;
+	case CMi8253set:
+		if(strcmp(cb->f[1], "on") == 0)
+			i8253dotimerset = 1;
+		else if(strcmp(cb->f[1], "off") == 0)
+			i8253dotimerset = 0;
+		else
+			cmderror(cb, "invalid i2853set ctl");
+		break;
+	}
+	free(cb);
+	poperror();
 	return n;
 }
 
@@ -797,11 +855,8 @@ archinit(void)
 	if(X86FAMILY(m->cpuidax) == 3)
 		conf.copymode = 1;
 
-//	if(X86FAMILY(m->cpuidax) >= 5 && conf.nmach > 1)
-		coherence = wbflush;
-
 	addarchfile("cputype", 0444, cputyperead, nil);
-	addarchfile("pge", 0664, pgeread, pgewrite);
+	addarchfile("archctl", 0664, archctlread, archctlwrite);
 }
 
 /*

+ 14 - 6
sys/src/9/pc/devether.c

@@ -241,17 +241,25 @@ etherwrite(Chan* chan, void* buf, long n, vlong)
 {
 	Ether *ether;
 	Block *bp;
-	int nn;
+	int nn, onoff;
+	Cmdbuf *cb;
 
 	ether = etherxx[chan->dev];
 	if(NETTYPE(chan->qid.path) != Ndataqid) {
 		nn = netifwrite(ether, chan, buf, n);
 		if(nn >= 0)
 			return nn;
-		if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){
-			qnoblock(ether->oq, 1);
+		cb = parsecmd(buf, n);
+		if(strcmp(cb->f[0], "nonblocking") == 0){
+			if(cb->nf <= 1)
+				onoff = 1;
+			else
+				onoff = atoi(cb->f[1]);
+			qnoblock(ether->oq, onoff);
+			free(cb);
 			return n;
 		}
+		free(cb);
 		if(ether->ctl!=nil)
 			return ether->ctl(ether,buf,n);
 			
@@ -399,13 +407,13 @@ etherprobe(int cardno, int ctlrno)
 	snprint(name, sizeof(name), "ether%d", ctlrno);
 
 	/*
-	 * If ether->irq is 0, it is a hack to indicate no interrupt
+	 * If ether->irq is <0, it is a hack to indicate no interrupt
 	 * used by ethersink.
 	 */
-	if(ether->irq > 0)
+	if(ether->irq >= 0)
 		intrenable(ether->irq, ether->interrupt, ether, ether->tbdf, name);
 
-	i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %lud",
+	i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d",
 		ctlrno, cards[cardno].type, ether->mbps, ether->port, ether->irq);
 	if(ether->mem)
 		i += sprint(buf+i, " addr 0x%luX", PADDR(ether->mem));

+ 5 - 0
sys/src/9/pc/devfloppy.c

@@ -119,6 +119,7 @@ Dirtab floppydir[]={
 enum
 {
 	CMdebug,
+	CMnodebug,
 	CMeject,
 	CMformat,
 	CMreset,
@@ -127,6 +128,7 @@ enum
 static Cmdtab floppyctlmsg[] =
 {
 	CMdebug,	"debug",	1,
+	CMnodebug,	"nodebug", 1,
 	CMeject,	"eject",	1,
 	CMformat,	"format",	0,
 	CMreset,	"reset",	1,
@@ -474,6 +476,9 @@ floppywrite(Chan *c, void *a, long n, vlong off)
 		case CMdebug:
 			floppydebug = 1;
 			break;
+		case CMnodebug:
+			floppydebug = 0;
+			break;
 		}
 		poperror();
 		qunlock(&fl);

+ 1 - 1
sys/src/9/pc/devpccard.c

@@ -1136,7 +1136,7 @@ pccard_pcmspecial(char *idstr, ISAConf *isa)
 	pi->irq = isa->irq;
 	unlock(cb);
 
-	print("#Y%d: %s irq %ld, port %lX\n", (int)(cb - cbslots), pi->verstr, isa->irq, isa->port);
+	print("#Y%d: %s irq %d, port %lX\n", (int)(cb - cbslots), pi->verstr, isa->irq, isa->port);
 	return (int)(cb - cbslots);
 }
 

+ 1 - 1
sys/src/9/pc/devusb.c

@@ -429,7 +429,7 @@ usbprobe(int cardno, int ctlrno)
 	intrenable(uh->irq, uh->interrupt, uh, uh->tbdf, name);
 
 	ebuf = buf + sizeof buf;
-	p = seprint(buf, ebuf, "#U/usb%d: %s: port 0x%luX irq %lud", ctlrno, usbtypes[cardno].type, uh->port, uh->irq);
+	p = seprint(buf, ebuf, "#U/usb%d: %s: port 0x%luX irq %d", ctlrno, usbtypes[cardno].type, uh->port, uh->irq);
 	if(uh->mem)
 		p = seprint(p, ebuf, " addr 0x%luX", PADDR(uh->mem));
 	if(uh->size)

+ 1 - 1
sys/src/9/pc/ethersink.c

@@ -48,7 +48,7 @@ reset(Ether* ether)
 	ether->mbps = 1000;
 	ether->attach = nop;
 	ether->transmit = nop;
-	ether->irq = 0;
+	ether->irq = -1;
 	ether->interrupt = nil;
 	ether->ifstat = nil;
 	ether->ctl = ctl;

+ 0 - 29
sys/src/9/pc/i8253.c

@@ -243,38 +243,9 @@ i8253enable(void)
 	intrenable(IrqCLOCK, i8253clock, 0, BUSUNKNOWN, "clock");
 }
 
-static long
-i8253timerread(Chan*, void *a, long n, vlong offset)
-{
-	if(n < 16)
-		error("need more room");
-	if(offset)
-		return 0;
-	return snprint(a, n, "timerset %s", i8253dotimerset ? "on" : "off");
-}
-
-static long
-i8253timerwrite(Chan*, void *a, long n, vlong)
-{
-	if(n==3 && memcmp(a, "off", 3) == 0){
-		i8253dotimerset = 0;
-		outb(Tmode, Load0|Square);
-		outb(T0cntr, (Freq/HZ));
-		outb(T0cntr, (Freq/HZ)>>8);
-		return n;
-	}
-	if(n==2 && memcmp(a, "on", 2) == 0){
-		i8253dotimerset = 1;
-		return n;
-	}
-	error("invalid control message");
-	return -1;
-}
-
 void
 i8253link(void)
 {
-	addarchfile("i8253timerset", 0664, i8253timerread, i8253timerwrite);
 }
 
 /*

+ 4 - 1
sys/src/9/pc/main.c

@@ -30,7 +30,6 @@ char *confval[MAXCONF];
 int nconf;
 uchar *sp;	/* user stack of init proc */
 
-
 static void
 options(void)
 {
@@ -584,6 +583,10 @@ procsave(Proc *p)
 	 * the free list where they could be reallocated and overwritten.
 	 * When this processor eventually has to get an entry from the
 	 * trashed page tables it will crash.
+	 *
+	 * If there's only one processor, this can't happen.
+	 * You might think it would be a win not to do this in that case,
+	 * especially on VMware, but it turns out not to matter.
 	 */
 	mmuflushtlb(PADDR(m->pdb));
 }

+ 0 - 5
sys/src/9/pc/mp.c

@@ -581,14 +581,9 @@ mpinit(void)
 	 *
 	 *  set conf.copymode here if nmach > 1.
 	 *  Should look for an ExtINT line and enable it.
-	 *
-	 *  also need to flush write buffer to make things
-	 *  visible to other processors.
 	 */
 	if(X86FAMILY(m->cpuidax) == 3 || conf.nmach > 1)
 		conf.copymode = 1;
-	if(X86FAMILY(m->cpuidax) >= 5 && conf.nmach > 1)
-		coherence = wbflush;
 }
 
 static int

+ 1 - 0
sys/src/9/pc/pccpu

@@ -46,6 +46,7 @@ misc
 	archmp		mp apic
 
 	uarti8250
+	uartpci		pci
 
 	sdata		pci sdscsi
 	sd53c8xx	pci sdscsi

+ 2 - 1
sys/src/9/pc/pcmciamodem.c

@@ -28,6 +28,7 @@ static char* modems[] = {
 	"REM10",
 	"GSM/GPRS",
 	"AirCard 555",
+	"Gold Card Global",		/* Psion V90 Gold card */
 	0,
 };
 
@@ -67,7 +68,7 @@ pcmciamodemlink(void)
 				com2used = 1;
 			if(ioalloc(isa.port, 8, 0, modems[j]) < 0)
 				print("%s port %lux already in use\n", modems[j], isa.port);
-			print("%s in pcmcia slot %d port 0x%lux irq %lud\n",
+			print("%s in pcmcia slot %d port 0x%lux irq %d\n",
 				modems[j], slot, isa.port, isa.irq);
 		}
 	}

+ 1 - 0
sys/src/9/pc/screen.h

@@ -116,6 +116,7 @@ struct VGAscr {
 	void	(*blank)(VGAscr*, int);
 	ulong	id;	/* internal identifier for driver use */
 	int isblank;
+	int overlayinit;
 };
 
 extern VGAscr vgascreen[];

+ 9 - 0
sys/src/9/pc/sdata.c

@@ -1704,8 +1704,17 @@ atapnp(void)
 			break;
 		case (0x4D38<<16)|0x105A:	/* Promise PDC20262 */
 		case (0x4D30<<16)|0x105A:	/* Promise PDC202xx */
+			pi = 0x85;
+			break;
 		case (0x0004<<16)|0x1103:	/* HighPoint HPT-370 */
 			pi = 0x85;
+			/*
+			 * Turn off fast interrupt prediction.
+			 */
+			if((r = pcicfgr8(p, 0x51)) & 0x80)
+				pcicfgw8(p, 0x51, r & ~0x80);
+			if((r = pcicfgr8(p, 0x55)) & 0x80)
+				pcicfgw8(p, 0x55, r & ~0x80);
 			break;
 		case (0x0640<<16)|0x1095:	/* CMD 640B */
 			/*

+ 2 - 0
sys/src/9/pc/vgahiqvideo.c

@@ -51,6 +51,7 @@ hiqvideolinear(VGAscr* scr, int* size, int* align)
 		case 0x00C0:		/* 69000 HiQVideo */
 		case 0x00E0:		/* 65550 HiQV32 */
 		case 0x00E4:		/* 65554 HiQV32 */
+		case 0x00E5:		/* 65555 HiQV32 */
 			aperture = p->mem[0].bar & ~0x0F;
 			*size = p->mem[0].size;
 			break;
@@ -100,6 +101,7 @@ hiqvideoenable(VGAscr* scr)
 			break;
 		case 0x00E0:		/* 65550 HiQV32 */
 		case 0x00E4:		/* 65554 HiQV32 */
+		case 0x00E5:		/* 65555 HiQV32 */
 			switch((hiqvideoxi(Xrx, 0x43)>>1) & 0x03){
 			default:
 			case 0:

+ 5 - 2
sys/src/9/pc/vgamach64xx.c

@@ -831,7 +831,6 @@ initengine(VGAscr *scr)
 			break;
 	}
 
-	init_overlayclock(scr);
 	waitforidle(scr);
 }
 
@@ -1175,9 +1174,13 @@ mach64xxovlctl(VGAscr *scr, Chan *c, void *a, int n)
 	Cmdbuf *cb;
 	Cmdtab *ct;
 
-	if (!mach64type->m64_vtgt) 
+	if(!mach64type->m64_vtgt) 
 		error(Enodev);
 
+	if(!scr->overlayinit){
+		scr->overlayinit = 1;
+		init_overlayclock(scr);
+	}
 	cb = parsecmd(a, n);
 	if(waserror()){
 		free(cb);

+ 13 - 40
sys/src/9/pc/vganvidia.c

@@ -24,47 +24,20 @@ enum {
 	hwCurImage = Pramin + (0x00010000 - 0x0800),
 };
 
-static ushort nvidiadid[] = {
-	0x0020,		/* Riva TNT */
-	0x0028,		/* Riva TNT2 */
-	0x0029,		/* Riva TNT2 (Ultra)*/
-	0x002C,		/* Riva TNT2 (Vanta) */
-	0x002D,		/* Riva TNT2 M64 */
-	0x00A0,		/* Riva TNT2 (Integrated) */
-	0x0100,		/* GeForce 256 */
-	0x0101,		/* GeForce DDR */
-	0x0103,		/* Quadro */
-	0x0110,		/* GeForce2 MX */
-	0x0111,		/* GeForce2 MX DDR */
-	0x0112,		/* GeForce 2 Go */
-	0x0113,		/* Quadro 2 MXR */
-	0x0150,		/* GeForce2 GTS */
-	0x0151,		/* GeForce2 GTS (rev 1) */
-	0x0152,		/* GeForce2 Ultra */
-	0x0153,		/* Quadro 2 Pro */
-	0x0200,		/* GeForce3 */
-	0x0201,
-	0x0202,
-	0,
-};
-
+/* Nvidia is good about backwards compatibility -- any did > 0x20 is fine */
 static Pcidev*
 nvidiapci(void)
 {
 	Pcidev *p;
 	ushort *did;
 
-	if((p = pcimatch(nil, 0x10DE, 0)) == nil)
-		return nil;
-	for(did = nvidiadid; *did; did++){
-		if(*did == p->did)
+	p = nil;
+	while((p = pcimatch(p, 0x10DE, 0)) != nil)
+		if(p->did > 0x20 && p->ccrp == 3)	/* video card */
 			return p;
-	}
-
 	return nil;
 }
 
-
 static ulong
 nvidialinear(VGAscr* scr, int* size, int* align)
 {
@@ -82,7 +55,7 @@ nvidialinear(VGAscr* scr, int* size, int* align)
 		*size = p->mem[1].size;
 	}
 
-	if(wasupamem) {
+	if(wasupamem){
 		if(oaperture == aperture)
 			return oaperture;
 		upafree(oaperture, oapsize);
@@ -123,14 +96,14 @@ nvidiaenable(VGAscr* scr)
 		return;
 
 	scr->io = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
-	if (scr->io == 0)
+	if(scr->io == 0)
 		return;
 	addvgaseg("nvidiammio", scr->io, p->mem[0].size);
 
 	size = p->mem[1].size;
 	align = 0;
 	aperture = nvidialinear(scr, &size, &align);
-	if(aperture) {
+	if(aperture){
 		scr->aperture = aperture;
 		scr->apsize = size;
 		addvgaseg("nvidiascreen", aperture, size);
@@ -161,16 +134,16 @@ nvidiacurload(VGAscr* scr, Cursor* curs)
 
 	p = KADDR(scr->io + hwCurImage);
 
-	for (i=0; i<16; i++) {
+	for(i=0; i<16; i++) {
 		c = (curs->clr[2 * i] << 8) | curs->clr[2 * i+1];
 		s = (curs->set[2 * i] << 8) | curs->set[2 * i+1];
 		tmp = 0;
-		for (j=0; j<16; j++) {
+		for (j=0; j<16; j++){
 			if(s&0x8000)
 				tmp |= 0x80000000;
 			else if(c&0x8000)
 				tmp |= 0xFFFF0000;
-			if (j&0x1) {
+			if (j&0x1){
 				*p++ = tmp;
 				tmp = 0;
 			} else {
@@ -258,7 +231,7 @@ waitforidle(VGAscr *scr)
 	pgraph = KADDR(scr->io + Pgraph);
 
 	x = 0;
-	while (pgraph[0x00000700/4] & 0x01 && x++ < 1000000)
+	while(pgraph[0x00000700/4] & 0x01 && x++ < 1000000)
 		;
 
 	if(x >= 1000000)
@@ -274,7 +247,7 @@ waitforfifo(VGAscr *scr, int fifo, int entries)
 	x = 0;
 	fifofree = KADDR(scr->io + Fifo + fifo + 0x10);
 
-	while (((*fifofree >> 2) < entries) && x++ < 1000000)
+	while(((*fifofree >> 2) < entries) && x++ < 1000000)
 		;
 
 	if(x >= 1000000)
@@ -328,7 +301,7 @@ nvidiablank(VGAscr*, int blank)
 	seq1 = vgaxi(Seqx, 1) & ~0x20;
 	crtc1A = vgaxi(Crtx, 0x1A) & ~0xC0;
 
-	if(blank) {
+	if(blank){
 		seq1 |= 0x20;
 //		crtc1A |= 0xC0;
 		crtc1A |= 0x80;

+ 2 - 0
sys/src/9/pc/vgas3.c

@@ -409,6 +409,8 @@ waitforlinearfifo(VGAscr *scr)
 	switch(scr->id){
 	default:
 		panic("unknown scr->id in s3 waitforlinearfifo");
+	case 0x8A01:	/* ViRGE/[DG]X.  XFree86 says no waiting necessary */
+		return;
 	case 0x5631:	/* ViRGE */
 	case 0x883D:	/* ViRGE/VX */
 		mask = 0x0F<<6;

+ 18 - 7
sys/src/9/pc/wavelan.c

@@ -557,11 +557,20 @@ w_scaninfo(Ether* ether, Ctlr *ctlr, int len)
 	Netfile **ep, *f, **fp;
 	Block *bp;
 	WScan *wsp;
+	ushort *scanbuf;
 
+	scanbuf = malloc(len*2);
+	if(scanbuf == nil)
+		return;
+	
 	for (i = 0; i < len ; i++)
-		ctlr->scanbuf[i] = csr_ins(ctlr, WR_Data1);
+		scanbuf[i] = csr_ins(ctlr, WR_Data1);
+
+	/* calculate number of samples */
+	len /= 25;
+	if(len == 0)
+		goto out;
 
-	len *= 2;
 	i = ether->scan;
 	ep = &ether->f[Ntypes];
 	for(fp = ether->f; fp < ep && i > 0; fp++){
@@ -569,14 +578,14 @@ w_scaninfo(Ether* ether, Ctlr *ctlr, int len)
 		if(f == nil || f->scan == 0)
 			continue;
 
-		bp = iallocb(2048);
+		bp = iallocb(100*len);
 		if(bp == nil)
 			break;
-		for(j = 0; j < len/(2*25); j++){
-			wsp = (WScan*)(&ctlr->scanbuf[j*25]);
+		for(j = 0; j < len; j++){
+			wsp = (WScan*)(&scanbuf[j*25]);
 			if(wsp->ssid_len > 32)
 				wsp->ssid_len = 32;
-			bp->wp += snprint((char*)bp->wp, 2048,
+			bp->wp = (uchar*)seprint((char*)bp->wp, (char*)bp->lim,
 				"ssid=%.*s;bssid=%E;signal=%d;noise=%d;chan=%d%s\n",
 				wsp->ssid_len, wsp->ssid, wsp->bssid, wsp->signal,
 				wsp->noise, wsp->chan, (wsp->capinfo&(1<<4))?";wep":"");
@@ -584,6 +593,8 @@ w_scaninfo(Ether* ether, Ctlr *ctlr, int len)
 		qpass(f->in, bp);
 		i--;
 	}
+out:
+	free(scanbuf);
 }
 
 static int
@@ -1197,7 +1208,7 @@ wavelanreset(Ether* ether, Ctlr *ctlr)
 	ether->scanbs = w_scanbs;
 	ether->arg = ether;
 
-	DEBUG("#l%d: irq %ld port %lx type %s",
+	DEBUG("#l%d: irq %d port %lx type %s",
 		ether->ctlrno, ether->irq, ether->port,	ether->type);
 	DEBUG(" %2.2uX%2.2uX%2.2uX%2.2uX%2.2uX%2.2uX\n",
 		ether->ea[0], ether->ea[1], ether->ea[2],

+ 0 - 2
sys/src/9/pc/wavelan.h

@@ -305,8 +305,6 @@ struct Ctlr
 
 	Stats;
 	WStats;
-
-	ushort	scanbuf[25*4];		// buffer for base station scan info
 };
 
 extern char* wavenames[];

+ 35 - 15
sys/src/9/port/chan.c

@@ -81,6 +81,7 @@ struct Elemlist
 	int	nelems;
 	char	**elems;
 	int	*off;
+	int	mustbedir;
 };
 
 #define SEP(c) ((c) == 0 || (c) == '/')
@@ -974,6 +975,10 @@ growparse(Elemlist *e)
  * The name is known to be valid.
  * Copy the name so slashes can be overwritten.
  * An empty string will set nelem=0.
+ * A path ending in / or /. or /.//./ etc. will have
+ * e.mustbedir = 1, so that we correctly
+ * reject, e.g., "/adm/users/." when /adm/users is a file
+ * rather than a directory.
  */
 static void
 parsename(char *name, Elemlist *e)
@@ -985,17 +990,19 @@ parsename(char *name, Elemlist *e)
 	e->nelems = 0;
 	e->elems = nil;
 	e->off = smalloc(sizeof(int));
-	e->off[0] = 0;
+	e->off[0] = skipslash(name) - name;
 	for(;;){
 		name = skipslash(name);
-		if(*name=='\0')
+		if(*name=='\0'){
+			e->mustbedir = 1;
 			break;
+		}
 		growparse(e);
-		
 		e->elems[e->nelems++] = name;
 		slash = utfrune(name, '/');
 		if(slash == nil){
 			e->off[e->nelems] = name+strlen(name) - e->name;
+			e->mustbedir = 0;
 			break;
 		}
 		e->off[e->nelems] = slash - e->name;
@@ -1059,7 +1066,6 @@ namec(char *aname, int amode, int omode, ulong perm)
 	case '/':
 		c = up->slash;
 		incref(c);
-		name = skipslash(name);
 		break;
 	
 	case '#':
@@ -1099,7 +1105,6 @@ namec(char *aname, int amode, int omode, ulong perm)
 	default:
 		c = up->dot;
 		incref(c);
-		name = skipslash(name);
 		break;
 	}
 	prefix = name - aname;
@@ -1123,11 +1128,19 @@ namec(char *aname, int amode, int omode, ulong perm)
 	parsename(name, &e);
 
 	/*
-	 * On create, don't try to walk the last path element just yet.
+	 * On create, ....
 	 */
 	if(amode == Acreate){
+		/* perm must have DMDIR if last element is / or /. */
+		if(e.mustbedir && !(perm&DMDIR)){
+			npath = e.nelems;
+			strcpy(tmperrbuf, "create without DMDIR");
+			goto NameError;
+		}
+
+		/* don't try to walk the last path element just yet. */
 		if(e.nelems == 0)
-			error(Eisdir);
+			error(Eexist);
 		e.nelems--;
 	}
 
@@ -1136,8 +1149,9 @@ namec(char *aname, int amode, int omode, ulong perm)
 			print("namec %s walk error npath=%d\n", aname, npath);
 			nexterror();
 		}
-		len = prefix+e.off[npath];
 		strcpy(tmperrbuf, up->errstr);
+	NameError:
+		len = prefix+e.off[npath];
 		if(len < ERRMAX/3 || (name=memrchr(aname, '/', len))==nil || name==aname)
 			snprint(up->genbuf, sizeof up->genbuf, "%.*s", len, aname);
 		else
@@ -1146,6 +1160,17 @@ namec(char *aname, int amode, int omode, ulong perm)
 		nexterror();
 	}
 
+	if(e.mustbedir && !(c->qid.type&QTDIR)){
+		npath = e.nelems;
+		strcpy(tmperrbuf, "not a directory");
+		goto NameError;
+	}
+
+	if(amode == Aopen && (omode&3) == OEXEC && (c->qid.type&QTDIR)){
+		npath = e.nelems;
+		error("cannot exec directory");
+	}
+
 	switch(amode){
 	case Aaccess:
 		if(!nomount)
@@ -1356,18 +1381,13 @@ if(c->umh != nil){
 }
 
 /*
- * name is valid. skip leading / and ./ and trailing .
+ * name is valid. skip leading / and ./ as much as possible
  */
 char*
 skipslash(char *name)
 {
-    Again:
-	while(*name == '/')
-		name++;
-	if(*name=='.' && (name[1]=='\0' || name[1]=='/')){
+	while(name[0]=='/' || (name[0]=='.' && (name[1]==0 || name[1]=='/')))
 		name++;
-		goto Again;
-	}
 	return name;
 }
 

+ 11 - 2
sys/src/9/port/dev.c

@@ -83,11 +83,20 @@ devdir(Chan *c, Qid qid, char *n, vlong length, char *user, long perm, Dir *db)
  * the zeroth element of the table MUST be the directory itself for ..
 */
 int
-devgen(Chan *c, char*, Dirtab *tab, int ntab, int i, Dir *dp)
+devgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
 {
 	if(tab == 0)
 		return -1;
-	if(i != DEVDOTDOT){
+	if(i == DEVDOTDOT){
+		/* nothing */
+	}else if(name){
+		for(i=1; i<ntab; i++)
+			if(strcmp(tab[i].name, name) == 0)
+				break;
+		if(i==ntab)
+			return -1;
+		tab += i;
+	}else{
 		/* skip over the first element, that for . itself */
 		i++;
 		if(i >= ntab)

+ 2 - 2
sys/src/9/port/devaudio.c

@@ -692,7 +692,7 @@ ess1688(ISAConf* sbconf)
 		i = 0x50|(3<<2);
 		break;
 	default:
-		print("#A: bad ESS1688 irq %lud\n", sbconf->irq);
+		print("#A: bad ESS1688 irq %d\n", sbconf->irq);
 		return 1;
 	}
 	ess1688w(0xB1, i);
@@ -766,7 +766,7 @@ audioinit(void)
 	case 10:
 		break;
 	default:
-		print("#A: bad irq %lud\n", sbconf.irq);
+		print("#A: bad irq %d\n", sbconf.irq);
 		iofree(sbconf.port);
 		iofree(sbconf.port+0x100);
 		return;

+ 30 - 18
sys/src/9/port/devcap.c

@@ -105,6 +105,18 @@ capopen(Chan *c, int omode)
 	return c;
 }
 
+static char*
+hashstr(uchar *hash)
+{
+	static char buf[256];
+	int i;
+
+	for(i = 0; i < Hashlen; i++)
+		sprint(buf+2*i, "%2.2ux", hash[i]);
+	buf[2*Hashlen] = 0;
+	return buf;
+}
+
 static Caphash*
 remcap(uchar *hash)
 {
@@ -250,22 +262,22 @@ capwrite(Chan *c, void *va, long n, vlong)
 }
 
 Dev capdevtab = {
-.dc=		L'¤',
-.name=		"cap",
-
-.reset=		devreset,
-.init=		devinit,
-.shutdown=	devshutdown,
-.attach=	capattach,
-.walk=		capwalk,
-.stat=		capstat,
-.open=		capopen,
-.create=	devcreate,
-.close=		capclose,
-.read=		capread,
-.bread=		devbread,
-.write=		capwrite,
-.bwrite=	devbwrite,
-.remove=	capremove,
-.wstat=		devwstat,
+	L'¤',
+	"cap",
+
+	devreset,
+	devinit,
+	devshutdown,
+	capattach,
+	capwalk,
+	capstat,
+	capopen,
+	devcreate,
+	capclose,
+	capread,
+	devbread,
+	capwrite,
+	devbwrite,
+	capremove,
+	devwstat
 };

+ 2 - 2
sys/src/9/port/devcons.c

@@ -15,9 +15,9 @@ Queue*	lineq;			/* processed console input */
 Queue*	serialoq;		/* serial console output */
 Queue*	kprintoq;		/* console output, for /dev/kprint */
 ulong	kprintinuse;		/* test and set whether /dev/kprint is open */
-int		iprintscreenputs = 1;
+int	iprintscreenputs = 1;
 
-int		panicking;
+int	panicking;
 
 static struct
 {

+ 63 - 41
sys/src/9/port/devenv.c

@@ -15,8 +15,22 @@ static int	envwriteable(Chan *c);
 
 static Egrp	confegrp;	/* global environment group containing the kernel configuration */
 
+static Evalue*
+envlookup(Egrp *eg, char *name, ulong qidpath)
+{
+	Evalue *e;
+	int i;
+
+	for(i=0; i<eg->nent; i++){
+		e = eg->ent[i];
+		if(e->qid.path == qidpath || (name && e->name[0]==name[0] && strcmp(e->name, name) == 0))
+			return e;
+	}
+	return nil;
+}
+
 static int
-envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp)
+envgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp)
 {
 	Egrp *eg;
 	Evalue *e;
@@ -28,8 +42,11 @@ envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp)
 
 	eg = envgrp(c);
 	rlock(eg);
-	for(e = eg->entries; e && s; e = e->link)
-		s--;
+	e = 0;
+	if(name)
+		e = envlookup(eg, name, -1);
+	else if(s < eg->nent)
+		e = eg->ent[s];
 
 	if(e == 0) {
 		runlock(eg);
@@ -43,16 +60,6 @@ envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp)
 	return 1;
 }
 
-static Evalue*
-envlookup(Egrp *eg, char *name, ulong qidpath)
-{
-	Evalue *e;
-	for(e = eg->entries; e; e = e->link)
-		if(e->qid.path == qidpath || (name && strcmp(e->name, name) == 0))
-			return e;
-	return nil;
-}
-
 static Chan*
 envattach(char *spec)
 {
@@ -135,6 +142,7 @@ envcreate(Chan *c, char *name, int omode, ulong)
 {
 	Egrp *eg;
 	Evalue *e;
+	Evalue **ent;
 
 	if(c->qid.type != QTDIR)
 		error(Eperm);
@@ -155,11 +163,18 @@ envcreate(Chan *c, char *name, int omode, ulong)
 	e->name = smalloc(strlen(name)+1);
 	strcpy(e->name, name);
 
+	if(eg->nent == eg->ment){
+		eg->ment += 32;
+		ent = smalloc(sizeof(eg->ent[0])*eg->ment);
+		if(eg->nent)
+			memmove(ent, eg->ent, sizeof(eg->ent[0])*eg->nent);
+		free(eg->ent);
+		eg->ent = ent;
+	}
 	e->qid.path = ++eg->path;
 	e->qid.vers = 0;
 	eg->vers++;
-	e->link = eg->entries;
-	eg->entries = e;
+	eg->ent[eg->nent++] = e;
 	c->qid = e->qid;
 
 	wunlock(eg);
@@ -173,29 +188,28 @@ envcreate(Chan *c, char *name, int omode, ulong)
 static void
 envremove(Chan *c)
 {
+	int i;
 	Egrp *eg;
-	Evalue *e, **l;
+	Evalue *e;
 
 	if(c->qid.type & QTDIR)
 		error(Eperm);
 
 	eg = envgrp(c);
 	wlock(eg);
-	l = &eg->entries;
-	for(e = *l; e; e = e->link) {
-		if(e->qid.path == c->qid.path)
+	e = 0;
+	for(i=0; i<eg->nent; i++){
+		if(eg->ent[i]->qid.path == c->qid.path){
+			e = eg->ent[i];
+			eg->nent--;
+			eg->ent[i] = eg->ent[eg->nent];
+			eg->vers++;
 			break;
-		l = &e->link;
-	}
-
-	if(e == 0) {
-		wunlock(eg);
-		error(Enonexist);
+		}
 	}
-
-	*l = e->link;
-	eg->vers++;
 	wunlock(eg);
+	if(e == 0)
+		error(Enonexist);
 	free(e->name);
 	if(e->value)
 		free(e->value);
@@ -308,39 +322,44 @@ Dev envdevtab = {
 void
 envcpy(Egrp *to, Egrp *from)
 {
-	Evalue **l, *ne, *e;
+	int i;
+	Evalue *ne, *e;
 
-	l = &to->entries;
 	rlock(from);
-	for(e = from->entries; e; e = e->link) {
+	to->ment = (from->nent+31)&~31;
+	to->ent = smalloc(to->ment*sizeof(to->ent[0]));
+	for(i=0; i<from->nent; i++){
+		e = from->ent[i];
 		ne = smalloc(sizeof(Evalue));
 		ne->name = smalloc(strlen(e->name)+1);
 		strcpy(ne->name, e->name);
-		if(e->value) {
+		if(e->value){
 			ne->value = smalloc(e->len);
 			memmove(ne->value, e->value, e->len);
 			ne->len = e->len;
 		}
 		ne->qid.path = ++to->path;
-		*l = ne;
-		l = &ne->link;
+		to->ent[i] = ne;
 	}
+	to->nent = from->nent;
 	runlock(from);
 }
 
 void
 closeegrp(Egrp *eg)
 {
-	Evalue *e, *next;
+	int i;
+	Evalue *e;
 
-	if(decref(eg) == 0) {
-		for(e = eg->entries; e; e = next) {
-			next = e->link;
+	if(decref(eg) == 0){
+		for(i=0; i<eg->nent; i++){
+			e = eg->ent[i];
 			free(e->name);
 			if(e->value)
 				free(e->value);
 			free(e);
 		}
+		free(eg->ent);
 		free(eg);
 	}
 }
@@ -385,7 +404,7 @@ getconfenv(void)
 	Egrp *eg = &confegrp;
 	Evalue *e;
 	char *p, *q;
-	int n;
+	int i, n;
 
 	rlock(eg);
 	if(waserror()) {
@@ -395,13 +414,16 @@ getconfenv(void)
 	
 	/* determine size */
 	n = 0;
-	for(e=eg->entries; e; e=e->link)
+	for(i=0; i<eg->nent; i++){
+		e = eg->ent[i];
 		n += strlen(e->name) + e->len + 2;
+	}
 	p = malloc(n + 1);
 	if(p == nil)
 		error(Enomem);
 	q = p;
-	for(e=eg->entries; e; e=e->link) {
+	for(i=0; i<eg->nent; i++){
+		e = eg->ent[i];
 		strcpy(q, e->name);
 		q += strlen(q) + 1;
 		memmove(q, e->value, e->len);

+ 2 - 0
sys/src/9/port/devmouse.c

@@ -107,6 +107,8 @@ mouseinit(void)
 	if(!conf.monitor)
 		return;
 
+	curs = arrow;
+	Cursortocursor(&arrow);
 	cursoron(1);
 }
 

+ 12 - 4
sys/src/9/port/devroot.c

@@ -121,6 +121,10 @@ rootgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp)
 
 	switch((int)c->qid.path){
 	case Qdir:
+		if(s == DEVDOTDOT){
+			devdir(c, (Qid){Qdir, 0, QTDIR}, "#/", 0, eve, 0555, dp);
+			return 1;
+		}
 		return devgen(c, name, rootlist.dir, rootlist.ndir, s, dp);
 	case Qboot:
 		if(s == DEVDOTDOT){
@@ -129,6 +133,8 @@ rootgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp)
 		}
 		return devgen(c, name, bootlist.dir, bootlist.ndir, s, dp);
 	default:
+		if(s != 0)
+			return -1;
 		if((int)c->qid.path < Qboot){
 			t = c->qid.path-1;
 			l = &rootlist;
@@ -138,8 +144,6 @@ rootgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp)
 		}
 		if(t >= l->ndir)
 			return -1;
-		if(s != 0)
-			return -1;
 		d = &l->dir[t];
 		devdir(c, d->qid, d->name, d->length, eve, d->perm, dp);
 		return 1;
@@ -196,8 +200,12 @@ rootread(Chan *c, void *buf, long n, vlong off)
 		l = &bootlist;
 	}
 
-	d = &l->dir[t-1];
-	data = l->data[t-1];
+	t--;
+	if(t >= l->ndir)
+		error(Egreg);
+
+	d = &l->dir[t];
+	data = l->data[t];
 	if(offset >= d->length)
 		return 0;
 	if(offset+n > d->length)

+ 4 - 1
sys/src/9/port/portdat.h

@@ -441,7 +441,9 @@ struct Egrp
 {
 	Ref;
 	RWlock;
-	Evalue	*entries;
+	Evalue	**ent;
+	int nent;
+	int ment;
 	ulong	path;	/* qid.path of next Evalue to be allocated */
 	ulong	vers;	/* of Egrp */
 };
@@ -461,6 +463,7 @@ struct Fgrp
 	Chan	**fd;
 	int	nfd;			/* number allocated */
 	int	maxfd;			/* highest fd in use */
+	int	exceed;			/* debugging */
 };
 
 enum

+ 5 - 0
sys/src/9/port/proc.c

@@ -334,6 +334,9 @@ rebalance(void)
 			continue;
 		if(p->priority == p->basepri)
 			continue;
+
+		/* this comparison is too arbitrary - need a better one */
+		/* presotto */
 		if(m->ticks - p->readytime < quanta[p->priority]/4)
 			continue;
 		splhi();
@@ -362,6 +365,8 @@ runproc(void)
 	if ((p = edf->edfrunproc()) != nil)
 		return p;
 
+	/* 10 is completely arbitrary - it interacts with the comparison in rebalance */
+	/* presotto */
 	if(m->fairness++ == 10){
 		m->fairness = 0;
 		rebalance();

+ 23 - 10
sys/src/9/port/sysfile.c

@@ -9,6 +9,18 @@
  * The sys*() routines needn't poperror() as they return directly to syscall().
  */
 
+static void
+unlockfgrp(Fgrp *f)
+{
+	int ex;
+
+	ex = f->exceed;
+	f->exceed = 0;
+	unlock(f);
+	if(ex)
+		pprint("warning: process exceeds %d file descriptors\n", ex);
+}
+
 int
 growfd(Fgrp *f, int fd)	/* fd is always >= 0 */
 {
@@ -18,8 +30,6 @@ growfd(Fgrp *f, int fd)	/* fd is always >= 0 */
 		return 0;
 	if(fd >= f->nfd+DELTAFD)
 		return -1;	/* out of range */
-	if(fd % 100 == 0)
-		pprint("warning: process exceeds %d file descriptors\n", fd);
 	/*
 	 * Unbounded allocation is unwise; besides, there are only 16 bits
 	 * of fid in 9P
@@ -37,8 +47,11 @@ growfd(Fgrp *f, int fd)	/* fd is always >= 0 */
 	f->fd = newfd;
 	free(oldfd);
 	f->nfd += DELTAFD;
-	if(fd > f->maxfd)
+	if(fd > f->maxfd){
+		if(fd/100 > f->maxfd/100)
+			f->exceed = (fd/100)*100;
 		f->maxfd = fd;
+	}
 	return 1;
 }
 
@@ -68,13 +81,13 @@ newfd(Chan *c)
 	lock(f);
 	fd = findfreefd(f, 0);
 	if(fd < 0){
-		unlock(f);
+		unlockfgrp(f);
 		return -1;
 	}
 	if(fd > f->maxfd)
 		f->maxfd = fd;
 	f->fd[fd] = c;
-	unlock(f);
+	unlockfgrp(f);
 	return fd;
 }
 
@@ -87,19 +100,19 @@ newfd2(int fd[2], Chan *c[2])
 	lock(f);
 	fd[0] = findfreefd(f, 0);
 	if(fd[0] < 0){
-		unlock(f);
+		unlockfgrp(f);
 		return -1;
 	}
 	fd[1] = findfreefd(f, fd[0]+1);
 	if(fd[1] < 0){
-		unlock(f);
+		unlockfgrp(f);
 		return -1;
 	}
 	if(fd[1] > f->maxfd)
 		f->maxfd = fd[1];
 	f->fd[fd[0]] = c[0];
 	f->fd[fd[1]] = c[1];
-	unlock(f);
+	unlockfgrp(f);
 
 	return 0;
 }
@@ -227,7 +240,7 @@ sysdup(ulong *arg)
 	if(fd != -1){
 		lock(f);
 		if(fd<0 || growfd(f, fd)<0) {
-			unlock(f);
+			unlockfgrp(f);
 			cclose(c);
 			error(Ebadfd);
 		}
@@ -236,7 +249,7 @@ sysdup(ulong *arg)
 
 		oc = f->fd[fd];
 		f->fd[fd] = c;
-		unlock(f);
+		unlockfgrp(f);
 		if(oc)
 			cclose(oc);
 	}else{

+ 1 - 1
sys/src/ape/cmd/make/mkfile

@@ -22,5 +22,5 @@ YFLAGS=-S
 gram.c:	y.tab.c
 	mv $prereq $target
 
-nuke:V:
+nuke clean:V:
 	rm -f *.[$OS] [$OS].out y.tab.? y.debug y.output $TARG gram.c

+ 2 - 0
sys/src/ape/cmd/mkfile

@@ -8,8 +8,10 @@ TARG=basename\
 	uname
 
 DIRS=\
+	diff\
 	expr\
 	make\
+	patch\
 	pdksh\
 	sed\
 

+ 0 - 293
sys/src/ape/cmd/pdksh/missing.c

@@ -1,293 +0,0 @@
-/*
- * Routines which may be missing on some machines
- */
-
-#include "sh.h"
-#include "ksh_stat.h"
-#include "ksh_dir.h"
-
-
-#ifndef HAVE_MEMSET
-void *
-memset(d, c, n)
-	void *d;
-	int c;
-	size_t n;
-{
-	unsigned char *p = (unsigned char *) d;
-
-	/* Not amazingly fast.. */
-	for (; n > 0; --n)
-		*p++ = c;
-	return d;
-}
-#endif /* !HAVE_MEMSET */
-
-#if !defined(HAVE_MEMMOVE) && !defined(HAVE_BCOPY)
-void *
-memmove(d, s, n)
-	void *d;
-	const void *s;
-	size_t n;
-{
-	char *dp = (char *) d, *sp = (char *) s;
-
-	if (n <= 0)
-		;
-	else if (dp < sp)
-		do
-			*dp++ = *sp++;
-		while (--n > 0);
-	else if (dp > sp) {
-		dp += n;
-		sp += n;
-		do
-			*--dp = *--sp;
-		while (--n > 0);
-	}
-	return d;
-}
-#endif /* !HAVE_MEMMOVE && !HAVE_BCOPY */
-
-
-#ifndef HAVE_STRCASECMP
-/*
- * Case insensitive string compare routines, same semantics as str[n]cmp()
- * (assumes ASCII..).
- */
-static const char ichars[256] = {
-		   0,  0x1,  0x2,  0x3,  0x4,  0x5,  0x6,  0x7,
-		 0x8,  0x9,  0xa,  0xb,  0xc,  0xd,  0xe,  0xf,
-		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-		0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-		0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-		0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		0x40,  'a',  'b',  'c',  'd',  'e',  'f',  'g',
-		 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
-		 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
-		 'x',  'y',  'z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-		0x60,  'a',  'b',  'c',  'd',  'e',  'f',  'g',
-		 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
-		 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
-		 'x',  'y',  'z', 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-		0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-		0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-		0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-		0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-		0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-		0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
-		0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
-		0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
-		0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-		0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
-		0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
-	};
-
-int
-strcasecmp(s1, s2)
-	const char *s1;
-	const char *s2;
-{
-	const unsigned char *us1 = (const unsigned char *) s1;
-	const unsigned char *us2 = (const unsigned char *) s2;
-
-	while (ichars[*us1] == ichars[*us2++])
-		if (!*us1++)
-			return 0;
-
-	return ichars[*us1] - ichars[*--us2];
-}
-
-int
-strncasecmp(s1, s2, n)
-	const char *s1;
-	const char *s2;
-	int n;
-{
-	const unsigned char *us1 = (const unsigned char *) s1;
-	const unsigned char *us2 = (const unsigned char *) s2;
-
-	while (--n >= 0 && ichars[*us1] == ichars[*us2++])
-		if (!*us1++)
-			return 0;
-
-	return n < 0 ? 0 : ichars[*us1] - ichars[*--us2];
-}
-#endif /* HAVE_STRCASECMP */
-
-
-#ifndef HAVE_STRSTR
-char *
-strstr(s, p)
-	const char *s;
-	const char *p;
-{
-	int len;
-
-	if (s && p)
-		for (len = strlen(p); *s; s++)
-			if (*s == *p && strncmp(s, p, len) == 0)
-				return (char *) s;
-
-	return 0;
-}
-#endif /* HAVE_STRSTR */
-
-
-#ifndef HAVE_STRERROR
-char *
-strerror(err)
-	int err;
-{
-	static char	buf[64];
-# ifdef HAVE_SYS_ERRLIST
-#  ifndef SYS_ERRLIST_DECLARED
-	extern int	sys_nerr;
-	extern char	*sys_errlist[];
-#  endif
-	char		*p;
-
-	if (err < 0 || err >= sys_nerr)
-		shf_snprintf(p = buf, sizeof(buf), "Unknown system error %d",
-			err);
-	else
-		p = sys_errlist[err];
-	return p;
-# else /* HAVE_SYS_ERRLIST */
-	switch (err) {
-	  case EINVAL:
-		return "Invalid argument";
-	  case EACCES:
-		return "Permission denied";
-	  case ESRCH:
-		return "No such process";
-	  case EPERM:
-		return "Not owner";
-	  case ENOENT:
-		return "No such file or directory";
-	  case ENOTDIR:
-		return "Not a directory";
-	  case ENOEXEC:
-		return "Exec format error";
-	  case ENOMEM:
-		return "Not enough memory";
-	  case E2BIG:
-		return "Argument list too long";
-	  default:
-		shf_snprintf(buf, sizeof(buf), "Unknown system error %d", err);
-		return buf;
-	}
-# endif /* HAVE_SYS_ERRLIST */
-}
-#endif /* !HAVE_STRERROR */
-
-
-#ifdef TIMES_BROKEN
-# include "ksh_time.h"
-# include "ksh_times.h"
-# ifdef HAVE_GETRUSAGE
-#  include <sys/resource.h>
-# else /* HAVE_GETRUSAGE */
-#  include <sys/timeb.h>
-# endif /* HAVE_GETRUSAGE */
-
-clock_t
-ksh_times(tms)
-	struct tms *tms;
-{
-	static clock_t base_sec;
-	clock_t rv;
-
-# ifdef HAVE_GETRUSAGE
-	{
-		struct timeval tv;
-		struct rusage ru;
-
-		getrusage(RUSAGE_SELF, &ru);
-		tms->tms_utime = ru.ru_utime.tv_sec * CLK_TCK
-			+ ru.ru_utime.tv_usec * CLK_TCK / 1000000;
-		tms->tms_stime = ru.ru_stime.tv_sec * CLK_TCK
-			+ ru.ru_stime.tv_usec * CLK_TCK / 1000000;
-
-		getrusage(RUSAGE_CHILDREN, &ru);
-		tms->tms_cutime = ru.ru_utime.tv_sec * CLK_TCK
-			+ ru.ru_utime.tv_usec * CLK_TCK / 1000000;
-		tms->tms_cstime = ru.ru_stime.tv_sec * CLK_TCK
-			+ ru.ru_stime.tv_usec * CLK_TCK / 1000000;
-
-		gettimeofday(&tv, (struct timezone *) 0);
-		if (base_sec == 0)
-			base_sec = tv.tv_sec;
-		rv = (tv.tv_sec - base_sec) * CLK_TCK;
-		rv += tv.tv_usec * CLK_TCK / 1000000;
-	}
-# else /* HAVE_GETRUSAGE */
-	/* Assume times() available, but always returns 0
-	 * (also assumes ftime() available)
-	 */
-	{
-		struct timeb tb;
-
-		if (times(tms) == (clock_t) -1)
-			return (clock_t) -1;
-		ftime(&tb);
-		if (base_sec == 0)
-			base_sec = tb.time;
-		rv = (tb.time - base_sec) * CLK_TCK;
-		rv += tb.millitm * CLK_TCK / 1000;
-	}
-# endif /* HAVE_GETRUSAGE */
-	return rv;
-}
-#endif /* TIMES_BROKEN */
-
-#ifdef OPENDIR_DOES_NONDIR
-/* Prevent opendir() from attempting to open non-directories.  Such
- * behavior can cause problems if it attempts to open special devices...
- */
-DIR *
-ksh_opendir(d)
-	const char *d;
-{
-	struct stat statb;
-
-	if (stat(d, &statb) != 0)
-		return (DIR *) 0;
-	if (!S_ISDIR(statb.st_mode)) {
-		errno = ENOTDIR;
-		return (DIR *) 0;
-	}
-	return opendir(d);
-}
-#endif /* OPENDIR_DOES_NONDIR */
-
-#ifndef HAVE_DUP2
-int
-dup2(oldd, newd)
-	int oldd;
-	int newd;
-{
-	int old_errno;
-
-	if (fcntl(oldd, F_GETFL, 0) == -1)
-		return -1;	/* errno == EBADF */
-
-	if (oldd == newd)
-		return newd;
-
-	old_errno = errno;
-
-	close(newd);	/* in case its open */
-
-	errno = old_errno;
-
-	return fcntl(oldd, F_DUPFD, newd);
-}
-#endif /* !HAVE_MEMSET */

+ 0 - 1
sys/src/ape/cmd/pdksh/mkfile

@@ -19,7 +19,6 @@ OFILES=\
 	mail.$O\
 	main.$O\
 	misc.$O\
-	missing.$O\
 	path.$O\
 	shf.$O\
 	syn.$O\

+ 3 - 1
sys/src/ape/lib/ap/gen/strxfrm.c

@@ -10,6 +10,8 @@ strxfrm(char *s1, const char *s2, size_t n)
 	 */
 
 	size_t xn = strlen(s2);
-	memcpy(s1, s2, xn>n? n : xn);
+	if(n > xn)
+		n = xn;
+	memcpy(s1, s2, n);
 	return xn;
 }

+ 5 - 0
sys/src/ape/lib/ap/plan9/_buf.c

@@ -67,6 +67,9 @@ _startbuf(int fd)
 		atexit(_killmuxsid);
 	}
 
+	if(fd == -1)
+		return 0;
+
 	slot = mux->curfds++;
 	if(mux->curfds > INITBUFS) {
 		if(_SEGBRK(mux, mux->bufs+mux->curfds) < 0){
@@ -275,6 +278,8 @@ select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeo
 		return 0;
 	}
 
+	_startbuf(-1);
+
 	/* make sure all requested rfds and efds are buffered */
 	if(nfds >= OPEN_MAX)
 		nfds = OPEN_MAX-1;

+ 16 - 16
sys/src/ape/lib/ap/plan9/_envsetup.c

@@ -32,21 +32,21 @@ enum {
 void
 _envsetup(void)
 {
-	DIR *d;
+	int dfd;
 	struct dirent *de;
-	int n, m, i, f;
+	int n, nd, m, i, j, f;
 	int psize, cnt;
 	int nohandle;
 	int fdinited;
 	char *ps, *p;
 	char **pp;
-	Dir *d9;
+	Dir *d9, *d9a;
 
 	nohandle = 0;
 	fdinited = 0;
 	cnt = 0;
-	d = opendir(name);
-	if(!d) {
+	dfd = _OPEN(name, 0);
+	if(dfd < 0) {
 		static char **emptyenvp = 0;
 		environ = emptyenvp;
 		return;
@@ -54,21 +54,21 @@ _envsetup(void)
 	name[2] = '/';
 	ps = p = malloc(Envhunk);
 	psize = Envhunk;
-	while((de = readdir(d)) != NULL){
-		strcpy(name+3, de->d_name);
-		if((d9 = _dirstat(name)) == nil)
-			continue;
-		n = strlen(de->d_name);
+	nd = _dirreadall(dfd, &d9a);
+	_CLOSE(dfd);
+	for(j=0; j<nd; j++){
+		d9 = &d9a[j];
+		n = strlen(d9->name);
 		m = d9->length;
-		free(d9);
 		i = p - ps;
 		if(i+n+1+m+1 > psize) {
 			psize += (n+m+2 < Envhunk)? Envhunk : n+m+2;
 			ps = realloc(ps, psize);
 			p = ps + i;
 		}
-		memcpy(p, de->d_name, n);
+		memcpy(p, d9->name, n);
 		p[n] = '=';
+		strcpy(name+3, d9->name);
 		f = _OPEN(name, O_RDONLY);
 		if(f < 0 || _READ(f, p+n+1, m) != m)
 			m = 0;
@@ -79,17 +79,17 @@ _envsetup(void)
 			if(p[n+1+i] == 0)
 				p[n+1+i] = 1;
 		p[n+1+m] = 0;
-		if(strcmp(de->d_name, "_fdinfo") == 0) {
+		if(strcmp(d9->name, "_fdinfo") == 0) {
 			_fdinit(p+n+1, p+n+1+m);
 			fdinited = 1;
-		} else if(strcmp(de->d_name, "_sighdlr") == 0)
+		} else if(strcmp(d9->name, "_sighdlr") == 0)
 			sigsetup(p+n+1, p+n+1+m);
-		else if(strcmp(de->d_name, "nohandle") == 0)
+		else if(strcmp(d9->name, "nohandle") == 0)
 			nohandle = 1;
 		p += n+m+2;
 		cnt++;
 	}
-	closedir(d);
+	free(d9a);
 	if(!fdinited)
 		_fdinit(0, 0);
 	environ = pp = malloc((1+cnt)*sizeof(char *));

+ 1 - 0
sys/src/ape/lib/ap/plan9/dir.h

@@ -71,6 +71,7 @@ int	_dirwstat(char*, Dir*);
 Dir	*_dirfstat(int);
 int	_dirfwstat(int, Dir*);
 long	_dirread(int, Dir**);
+long _dirreadall(int, Dir**);
 void _nulldir(Dir*);
 uint _sizeD2M(Dir*);
 

+ 5 - 1
sys/src/ape/lib/ap/plan9/dirtostat.c

@@ -34,7 +34,7 @@ _dirtostat(struct stat *s, Dir *d, Fdinfo *fi)
 	s->st_atime = d->atime;
 	s->st_mtime = d->mtime;
 	s->st_ctime = d->mtime;
-	if(fi){
+	if(fi && fi->uid != -2){
 		s->st_uid = fi->uid;
 		s->st_gid = fi->gid;
 	} else {
@@ -44,5 +44,9 @@ _dirtostat(struct stat *s, Dir *d, Fdinfo *fi)
 		nam = d->gid;
 		if(_getpw(&num, &nam, 0))
 			s->st_gid = num;
+		if(fi){
+			fi->uid = s->st_uid;
+			fi->gid = s->st_gid;
+		}
 	}
 }

+ 2 - 4
sys/src/ape/lib/ap/plan9/open.c

@@ -50,10 +50,8 @@ open(const char *path, int flags, ...)
 		fi = &_fdinfo[n];
 		fi->flags = FD_ISOPEN;
 		fi->oflags = flags&(O_ACCMODE|O_NONBLOCK|O_APPEND);
-		if(stat(path, &sbuf) >= 0) {
-			fi->uid = sbuf.st_uid;
-			fi->gid = sbuf.st_gid;
-		}
+		fi->uid = -2;
+		fi->gid = -2;
 		fi->name = malloc(strlen(path)+1);
 		if(fi->name)
 			strcpy(fi->name, path);

+ 0 - 1
sys/src/ape/lib/ap/plan9/sys9.h

@@ -93,7 +93,6 @@ extern	int	_MOUNT(int, int, const char*, int, const char*);
 extern	int	_NOTED(int);
 extern	int	_NOTIFY(int(*)(void*, char*));
 extern	int	_OPEN(const char*, int);
-extern	long	_OSEEK(int, long, int);
 extern	int	_PIPE(int*);
 extern	long	_PREAD(int, void*, long, long long);
 extern	long	_PWRITE(int, void*, long, long long);

+ 4 - 4
sys/src/ape/lib/ap/plan9/time.c

@@ -5,6 +5,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
+#include "sys9.h"
 
 time_t
 time(time_t *tp)
@@ -14,11 +15,10 @@ time(time_t *tp)
 	time_t t;
 
 	memset(b, 0, sizeof(b));
-	f = open("/dev/time", O_RDONLY);
+	f = _OPEN("/dev/time", 0);
 	if(f >= 0) {
-		lseek(f, 0, 0);
-		read(f, b, sizeof(b));
-		close(f);
+		_PREAD(f, b, sizeof(b), 0);
+		_CLOSE(f);
 	}
 	t = atol(b);
 	if(tp)

+ 1 - 0
sys/src/ape/lib/bsd/mkfile

@@ -16,6 +16,7 @@ OFILES=\
 	getopt.$O\
 	getpeername.$O\
 	getprotobyname.$O\
+	getservbyaddr.$O\
 	getservbyname.$O\
 	getsockname.$O\
 	gettimeofday.$O\

+ 0 - 2
sys/src/cmd/9660srv/mkfile

@@ -14,8 +14,6 @@ BIN=/$objtype/bin
 
 UPDATE=\
 	mkfile\
-	/sys/man/4/dossrv\
-	/386/bin/$TARG\
 	${OFILES:%.$O=%.c}\
 	$HFILES\
 

+ 71 - 0
sys/src/cmd/auth/asn12rsa.c

@@ -0,0 +1,71 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <mp.h>
+#include <libsec.h>
+
+void
+usage(void)
+{
+	fprint(2, "auth/asn12rsa [-t tag] [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	char *s;
+	uchar *buf;
+	int fd;
+	long n, tot;
+	char *tag, *file;
+	RSApriv *key;
+
+	fmtinstall('B', mpfmt);
+
+	tag = nil;
+	ARGBEGIN{
+	case 't':
+		tag = EARGF(usage());
+		break;
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 0 && argc != 1)
+		usage();
+
+	if(argc == 1)
+		file = argv[0];
+	else
+		file = "#d/0";
+
+	if((fd = open(file, OREAD)) < 0)
+		sysfatal("open %s: %r", file);
+	buf = nil;
+	tot = 0;
+	for(;;){
+		buf = realloc(buf, tot+8192);
+		if(buf == nil)
+			sysfatal("realloc: %r");
+		if((n = read(fd, buf+tot, 8192)) < 0)
+			sysfatal("read: %r");
+		if(n == 0)
+			break;
+		tot += n;
+	}
+
+	key = asn1toRSApriv(buf, tot);
+	if(key == nil)
+		sysfatal("couldn't parse asn1 key");
+
+	s = smprint("key proto=rsa %s%ssize=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+		tag ? tag : "", tag ? " " : "",
+		mpsignif(key->pub.n), key->pub.ek,
+		key->dk, key->pub.n, key->p, key->q,
+		key->kp, key->kq, key->c2);
+	if(s == nil)
+		sysfatal("smprint: %r");
+	write(1, s, strlen(s));
+	exits(0);
+}

+ 1 - 1
sys/src/cmd/auth/factotum/apop.c

@@ -105,7 +105,7 @@ apopwrite(Fsstate *fss, void *va, uint n)
 		return phaseerror(fss, "write");
 
 	case CNeedChal:
-		ret = findkey(&k, fss, Kuser, 0, fss->attr, "%s", fss->proto->keyprompt);
+		ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "%s", fss->proto->keyprompt);
 		if(ret != RpcOk)
 			return ret;
 		v = _strfindattr(k->privattr, "!password");

+ 6 - 11
sys/src/cmd/auth/factotum/dat.h

@@ -29,12 +29,6 @@ enum
 	RpcToosmall,
 	RpcPhase,
 	RpcConfirm,
-
-	/* key lookup */
-	Kowner = 1<<0,
-	Kuser = 1<<1,
-	Kwho = 3<<0,
-	Knoconf = 1<<2,
 };
 
 typedef struct Attr Attr;
@@ -180,7 +174,7 @@ int secstorefetch(char*);
 #define estrdup estrdup9p
 #define erealloc erealloc9p
 #pragma varargck argpos failure 2
-#pragma varargck argpos findkey 6
+#pragma varargck argpos findkey 7
 #pragma varargck argpos setattr 2
 
 int		_authdial(char*, char*);
@@ -193,7 +187,7 @@ int		ctlwrite(char*);
 char		*estrappend(char*, char*, ...);
 #pragma varargck argpos estrappend 2
 int		failure(Fsstate*, char*, ...);
-int		findkey(Key**, Fsstate*, int, int, Attr*, char*, ...);
+int		findkey(Key**, Fsstate*, char*, int, int, Attr*, char*, ...);
 int		findp9authkey(Key**, Fsstate*);
 Proto	*findproto(char*);
 char		*getnvramkey(int, char**);
@@ -221,8 +215,9 @@ void		writehostowner(char*);
 /* protocols */
 extern Proto apop, cram;		/* apop.c */
 extern Proto p9any, p9sk1, p9sk2;	/* p9sk.c */
-extern Proto chap, mschap;	/* chap.c */
-extern Proto p9cr, vnc;		/* p9cr.c */
+extern Proto chap, mschap;		/* chap.c */
+extern Proto p9cr, vnc;			/* p9cr.c */
 extern Proto pass;			/* pass.c */
 extern Proto sshrsa;			/* sshrsa.c */
-extern Proto rsa;				/* rsa.c */
+extern Proto rsa;			/* rsa.c */
+extern Proto wep;			/* wep.c */

+ 17 - 20
sys/src/cmd/auth/factotum/fs.c

@@ -5,7 +5,6 @@ char		*authaddr;
 int		debug;
 int		gflag;
 char		*owner;
-char		*invoker;
 int		kflag;
 char		*mtpt = "/mnt";
 Keyring	*ring;
@@ -38,6 +37,7 @@ prototab[] =
 	&sshrsa,
 	&rsa,
 	&vnc,
+	&wep,
 	nil,
 };
 
@@ -88,9 +88,6 @@ main(int argc, char **argv)
 	case 'n':
 		trysecstore = 0;
 		break;
-	case 'o':
-		owner = EARGF(usage());
-		break;
 	case 's':		/* set service name */
 		service = EARGF(usage());
 		break;
@@ -150,9 +147,7 @@ main(int argc, char **argv)
 		free(s);
 	} else if(uflag)
 		promptforhostowner();
-	invoker = getuser();
-	if(owner == nil)
-		owner = invoker;
+	owner = getuser();
 	notify(notifyf);
 
 	if(trysecstore){
@@ -259,7 +254,7 @@ static struct {
 } dirtab[] = {
 	"confirm",	Qconfirm,	0600|DMEXCL,		/* we know this is slot #0 below */
 	"needkey", Qneedkey,	0600|DMEXCL,		/* we know this is slot #1 below */
-	"ctl",		Qctl,			0600,
+	"ctl",		Qctl,			0644,
 	"rpc",	Qrpc,		0666,
 	"proto",	Qprotolist,	0444,
 	"log",	Qlog,		0400|DMEXCL,
@@ -272,8 +267,8 @@ static void
 fillstat(Dir *dir, char *name, int type, int path, ulong perm)
 {
 	dir->name = estrdup(name);
-	dir->uid = estrdup(invoker);
-	dir->gid = estrdup(invoker);
+	dir->uid = estrdup(owner);
+	dir->gid = estrdup(owner);
 	dir->mode = perm;
 	dir->length = 0;
 	dir->qid = mkqid(type, path);
@@ -375,7 +370,7 @@ fsopen(Req *r)
 	if(i < nelem(dirtab)){
 		if(dirtab[i].perm & DMEXCL)
 			p = &inuse[i];
-		if(strcmp(r->fid->uid, invoker) == 0)
+		if(strcmp(r->fid->uid, owner) == 0)
 			perm = dirtab[i].perm>>6;
 		else
 			perm = dirtab[i].perm;
@@ -425,7 +420,7 @@ fsdestroyfid(Fid *fid)
 }
 
 static int
-readlist(int off, int (*gen)(int, char*, uint), Req *r)
+readlist(int off, int (*gen)(int, char*, uint, Fsstate*), Req *r, Fsstate *fss)
 {
 	char *a, *ea;
 	int n;
@@ -433,7 +428,7 @@ readlist(int off, int (*gen)(int, char*, uint), Req *r)
 	a = r->ofcall.data;
 	ea = a+r->ifcall.count;
 	for(;;){
-		n = (*gen)(off, a, ea-a);
+		n = (*gen)(off, a, ea-a, fss);
 		if(n == 0){
 			r->ofcall.count = a - (char*)r->ofcall.data;
 			return off;
@@ -445,16 +440,16 @@ readlist(int off, int (*gen)(int, char*, uint), Req *r)
 }
 
 static int
-keylist(int i, char *a, uint n)
+keylist(int i, char *a, uint n, Fsstate *fss)
 {
 	char buf[512];
 	Key *k;
 
-	if(i >= ring->nkey)
+	k = nil;
+	if(findkey(&k, fss, fss->sysuser, 0, i, nil, "") != RpcOk)
 		return 0;
-	k = ring->key[i];
-	k->attr = sortattr(k->attr);
 	snprint(buf, sizeof buf, "key %A %N\n", k->attr, k->privattr);
+	closekey(k);
 	strcpy(buf+sizeof buf-2, "\n");	/* if line is really long, just truncate */
 	if(strlen(buf) > n)
 		return 0;
@@ -464,8 +459,10 @@ keylist(int i, char *a, uint n)
 }
 
 static int
-protolist(int i, char *a, uint n)
+protolist(int i, char *a, uint n, Fsstate *fss)
 {
+	USED(fss);
+
 	if(i >= nelem(prototab)-1)
 		return 0;
 	if(strlen(prototab[i]->name)+1 > n)
@@ -507,11 +504,11 @@ fsread(Req *r)
 		logread(r);
 		break;
 	case Qctl:
-		s->listoff = readlist(s->listoff, keylist, r);
+		s->listoff = readlist(s->listoff, keylist, r, s);
 		respond(r, nil);
 		break;
 	case Qprotolist:
-		s->listoff = readlist(s->listoff, protolist, r);
+		s->listoff = readlist(s->listoff, protolist, r, s);
 		respond(r, nil);
 		break;
 	}

+ 1 - 1
sys/src/cmd/auth/factotum/mkfile

@@ -12,6 +12,7 @@ PROTO=\
 	pass.$O\
 	sshrsa.$O\
 	rsa.$O\
+	wep.$O\
 
 FOFILES=\
 	$PROTO\
@@ -33,7 +34,6 @@ UPDATE=\
 	$HFILES\
 	${FOFILES:%.$O=%.c}\
 	fgui.c\
-	${TARG:%=/386/bin/auth/%}\
 
 </sys/src/cmd/mkmany
 

+ 5 - 5
sys/src/cmd/auth/factotum/p9any.c

@@ -157,7 +157,7 @@ p9anyread(Fsstate *fss, void *a, uint *n)
 		negstr = s_new();
 		for(i=0; i<nelem(negotiable); i++){
 			anew = setattr(_copyattr(fss->attr), "proto=%q dom?", negotiable[i]->name);
-			for(j=0; findkey(&k, fss, Knoconf|Kowner, j, anew, nil)==RpcOk; j++){
+			for(j=0; findkey(&k, fss, nil, 1, j, anew, nil)==RpcOk; j++){
 				if(m++)
 					s_append(negstr, " ");
 				s_append(negstr, negotiable[i]->name);
@@ -285,11 +285,11 @@ p9anywrite(Fsstate *fss, void *va, uint n)
 			dom = getdom(token[i]);
 			ret = RpcFailure;
 			if(user==nil || strcmp(user, fss->sysuser)==0)
-				ret = findkey(&k, fss, Kowner, 0, anewsf,
+				ret = findkey(&k, fss, nil, 0, 0, anewsf,
 						"proto=%q dom=%q role=speakfor %s",
 						p->name, dom, p->keyprompt);
 			if(ret == RpcFailure)
-				ret = findkey(&k, fss, Kuser, 0, anew,
+				ret = findkey(&k, fss, fss->sysuser, 0, 0, anew,
 					"proto=%q dom=%q role=client %s",
 					p->name, dom, p->keyprompt);
 			if(ret == RpcConfirm){
@@ -313,7 +313,7 @@ p9anywrite(Fsstate *fss, void *va, uint n)
 					continue;
 				}
 				dom = getdom(token[s->keyasked]);
-				ret = findkey(&k, fss, Kuser, 0, anew,
+				ret = findkey(&k, fss, fss->sysuser, 0, 0, anew,
 					"proto=%q dom=%q role=client %s",
 					p->name, dom, p->keyprompt);
 				s->keyasked++;
@@ -360,7 +360,7 @@ p9anywrite(Fsstate *fss, void *va, uint n)
 			return failure(fss, Enegotiation);
 		}
 		attr = _delattr(_copyattr(fss->attr), "proto");
-		ret = findkey(&k, fss, Kowner, 0, attr, "proto=%q dom=%q role=server", token[0], token[1]);
+		ret = findkey(&k, fss, nil, 0, 0, attr, "proto=%q dom=%q role=server", token[0], token[1]);
 		free(a);
 		_freeattr(attr);
 		if(ret == RpcConfirm)

+ 1 - 1
sys/src/cmd/auth/factotum/p9cr.c

@@ -95,7 +95,7 @@ p9crinit(Proto *p, Fsstate *fss)
 			attr = setattr(_copyattr(fss->attr), "proto=p9sk1");
 		else
 			attr = nil;
-		ret = findkey(&s->key, fss, Kuser, 0, attr ? attr : fss->attr,
+		ret = findkey(&s->key, fss, fss->sysuser, 0, 0, attr ? attr : fss->attr,
 			"role=client %s", p->keyprompt);
 		_freeattr(attr);
 		if(ret != RpcOk){

+ 8 - 4
sys/src/cmd/auth/factotum/p9sk1.c

@@ -96,7 +96,7 @@ p9skinit(Proto *p, Fsstate *fss)
 	}else{
 		s->tr.type = AuthTreq;
 		attr = setattr(_copyattr(fss->attr), "proto=p9sk1");
-		ret = findkey(&k, fss, Kowner, 0, attr, "user? dom?");
+		ret = findkey(&k, fss, nil, 0, 0, attr, "user? dom?");
 		_freeattr(attr);
 		if(ret != RpcOk){
 			free(s);
@@ -221,18 +221,18 @@ p9skwrite(Fsstate *fss, void *a, uint n)
 		 * If, on the other hand, we're speaking on behalf of someone else,
 		 * we will only vouch for their name on the local system.
 		 *
-		 * We do the Kuser findkey second so that if we return RpcNeedkey,
+		 * We do the sysuser findkey second so that if we return RpcNeedkey,
 		 * the correct key information gets asked for.
 		 */
 		srvkey = nil;
 		s->speakfor = 0;
 		sret = RpcFailure;
 		if(user==nil || strcmp(user, fss->sysuser) == 0)
-			sret = findkey(&srvkey, fss, Kowner, 0, attr,
+			sret = findkey(&srvkey, fss, nil, 0, 0, attr,
 				"role=speakfor dom=%q user?", s->tr.authdom);
 		if(user != nil)
 			attr = setattr(attr, "user=%q", user);
-		ret = findkey(&s->key, fss, Kuser, 0, attr,
+		ret = findkey(&s->key, fss, fss->sysuser, 0, 0, attr,
 			"role=client dom=%q %s", s->tr.authdom, p9sk1.keyprompt);
 		if(ret == RpcOk)
 			closekey(srvkey);
@@ -425,6 +425,10 @@ mkserverticket(State *s, char *tbuf)
 
 	if(strcmp(tr->authid, tr->hostid) != 0)
 		return -1;
+/* this keeps creating accounts on martha from working.  -- presotto
+	if(strcmp(tr->uid, "none") == 0)
+		return -1;
+*/
 	memset(&t, 0, sizeof(t));
 	memmove(t.chal, tr->chal, CHALLEN);
 	strcpy(t.cuid, tr->uid);

+ 1 - 1
sys/src/cmd/auth/factotum/pass.c

@@ -30,7 +30,7 @@ passinit(Proto *p, Fsstate *fss)
 	Key *k;
 	State *s;
 
-	ret = findkey(&k, fss, Kuser, 0, fss->attr, "%s", p->keyprompt);
+	ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "%s", p->keyprompt);
 	if(ret != RpcOk)
 		return ret;
 	setattrs(fss->attr, k->attr);

+ 1 - 1
sys/src/cmd/auth/factotum/rsa.c

@@ -99,7 +99,7 @@ rsaread(Fsstate *fss, void *va, uint *n)
 			closekey(s->key);
 			s->key = nil;
 		}
-		if(findkey(&s->key, fss, Knoconf|Kuser, s->off, fss->attr, nil) != RpcOk)
+		if(findkey(&s->key, fss, fss->sysuser, 1, s->off, fss->attr, nil) != RpcOk)
 			return failure(fss, nil);
 		s->off++;
 		priv = s->key->priv;

+ 0 - 88
sys/src/cmd/auth/factotum/secretpem.c

@@ -1,88 +0,0 @@
-// load PEM-format RSA private key into factotum
-
-#include <u.h>
-#include <libc.h>
-#include <auth.h>
-#include <mp.h>
-#include <libsec.h>
-
-char*
-readfile(char *name)
-{
-	int fd;
-	char *s;
-	Dir *d;
-
-	fd = open(name, OREAD);
-	if(fd < 0)
-		return nil;
-	if((d = dirfstat(fd)) == nil)
-		return nil;
-	s = malloc(d->length + 1);
-	if(s == nil || readn(fd, s, d->length) != d->length){
-		free(s);
-		free(d);
-		close(fd);
-		return nil;
-	}
-	close(fd);
-	s[d->length] = '\0';
-	free(d);
-	return s;
-}
-
-int
-factotum_rsa_setpriv(int fd, char *keypem)
-{
-	int len, n;
-	char *pem, *factotum;
-	uchar *binary;
-	RSApriv *p;
-
-	pem = readfile(keypem);
-	if(pem == nil){
-		werrstr("can't read %s", keypem);
-		return -1;
-	}
-	binary = decodepem(pem, "RSA PRIVATE KEY", &len);
-	free(pem);
-	if(binary == nil){
-		werrstr("can't parse %s", keypem);
-		return -1;
-	}
-	p = asn1toRSApriv(binary, len);
-	free(binary);
-	if(p == nil){
-		werrstr("bad rsa private key in %s", keypem);
-		return -1;
-	}
-
-	factotum = smprint("key proto=sshrsa size=%d ek=%B n=%B"
-		" !dk=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
-		mpsignif(p->pub.n), p->pub.ek, p->pub.n,
-		p->dk, p->p, p->q, p->kp, p->kq, p->c2);
-	len = strlen(factotum);
-	rsaprivfree(p);
-	if(factotum == nil)
-		return -1;
-	n = write(fd, factotum, len);
-	free(factotum);
-	if(n != len){
-		werrstr("write error %d %d", len, n);
-		return -1;
-	}
-	return 0;
-}
-
-void
-main(int argc, char **argv)
-{
-	if(argc != 2 || argv[1][0]=='-'){
-		fprint(2, "usage: %s key.pem > /mnt/factotum/ctl\n", argv[0]);
-		exits("usage");
-	}
-	fmtinstall('B', mpfmt);
-	if(factotum_rsa_setpriv(1, argv[1]) != 0)
-		sysfatal("%s: %r", argv[0]);
-	exits(0);
-}

+ 2 - 2
sys/src/cmd/auth/factotum/secstore.c

@@ -22,7 +22,7 @@ havesecstore(void)
 	int m, n, fd;
 	uchar buf[500];
 
-	n = snprint((char*)buf, sizeof buf, testmess, invoker);
+	n = snprint((char*)buf, sizeof buf, testmess, owner);
 	hnputs(buf, 0x8000+n-2);
 
 	fd = secdial();
@@ -586,7 +586,7 @@ secstorefetch(char *password)
 		goto Out;
 	if((conn = newSConn(fd)) == nil)
 		goto Out;
-	if(PAKclient(conn, invoker, pass, nil) < 0){
+	if(PAKclient(conn, owner, pass, nil) < 0){
 		werrstr("password mistyped?");
 		goto Out;
 	}

+ 1 - 1
sys/src/cmd/auth/factotum/sshrsa.c

@@ -96,7 +96,7 @@ sshrsaread(Fsstate *fss, void *va, uint *n)
 			closekey(s->key);
 			s->key = nil;
 		}
-		if(findkey(&s->key, fss, Knoconf|Kuser, s->off, fss->attr, nil) != RpcOk)
+		if(findkey(&s->key, fss, fss->sysuser, 1, s->off, fss->attr, nil) != RpcOk)
 			return failure(fss, nil);
 		s->off++;
 		priv = s->key->priv;

+ 19 - 21
sys/src/cmd/auth/factotum/util.c

@@ -298,30 +298,15 @@ ignoreattr(char *s)
 }
 
 int
-findkey(Key **ret, Fsstate *fss, int who, int skip, Attr *attr0, char *fmt, ...)
+findkey(Key **ret, Fsstate *fss, char *who, int noconf, int skip, Attr *attr0, char *fmt, ...)
 {
 	int i, s, nmatch;
 	char buf[1024], *p;
 	va_list arg;
-	Attr *a, *attr1, **l;
+	Attr *a, *attr1, *attr2, *attr3, **l;
 	Key *k;
 
 	*ret = nil;
-	switch(who&Kwho){
-	default:
-		werrstr("bad who %d", who);
-		failure(fss, nil);
-		return failure(fss, nil);
-	case Kowner:
-		break;
-	case Kuser:
-		if(strcmp(fss->sysuser, owner) != 0
-		&& strcmp(fss->sysuser, invoker) != 0){
-			werrstr("%q can't use %q's keys", fss->sysuser, owner);
-			return failure(fss, nil);
-		}
-		break;
-	}
 
 	if(fmt){
 		va_start(arg, fmt);
@@ -331,6 +316,16 @@ findkey(Key **ret, Fsstate *fss, int who, int skip, Attr *attr0, char *fmt, ...)
 	}else
 		attr1 = nil;
 
+	if(who && strcmp(who, owner) == 0)
+		who = nil;
+
+	if(who){
+		snprint(buf, sizeof buf, "owner=%q", who);
+		attr2 = _parseattr(buf);
+		attr3 = _parseattr("owner=*");
+	}else
+		attr2 = attr3 = nil;
+
 	p = _strfindattr(attr0, "proto");
 	if(p == nil)
 		p = _strfindattr(attr1, "proto");
@@ -344,9 +339,12 @@ findkey(Key **ret, Fsstate *fss, int who, int skip, Attr *attr0, char *fmt, ...)
 	for(i=0; i<ring->nkey; i++){
 		k = ring->key[i];
 		if(matchattr(attr0, k->attr, k->privattr) && matchattr(attr1, k->attr, k->privattr)){
+			/* check ownership */
+			if(!matchattr(attr2, k->attr, nil) && !matchattr(attr3, k->attr, nil))
+				continue;
 			if(nmatch++ < skip)
 				continue;
-			if(!(who&Knoconf)){
+			if(!noconf){
 				switch(canusekey(fss, k)){
 				case -1:
 					_freeattr(attr1);
@@ -366,7 +364,7 @@ findkey(Key **ret, Fsstate *fss, int who, int skip, Attr *attr0, char *fmt, ...)
 	flog("%d: no key matches %A %A", fss->seqnum, attr0, attr1);
 	werrstr("no key matches %A %A", attr0, attr1);
 	s = RpcFailure;
-	if(askforkeys && (hasqueries(attr0) || hasqueries(attr1))){
+	if(askforkeys && who==nil && (hasqueries(attr0) || hasqueries(attr1))){
 		if(nmatch == 0){
 			attr0 = _copyattr(attr0);
 			for(l=&attr0; *l; l=&(*l)->next)
@@ -405,9 +403,9 @@ findp9authkey(Key **k, Fsstate *fss)
 	 * care about what the user name is set to, for instance.
 	 */
 	if(dom = _strfindattr(fss->attr, "dom"))
-		return findkey(k, fss, Kowner, 0, nil, "proto=p9sk1 dom=%q role=server user?", dom);
+		return findkey(k, fss, nil, 0, 0, nil, "proto=p9sk1 dom=%q role=server user?", dom);
 	else
-		return findkey(k, fss, Kowner, 0, nil, "proto=p9sk1 role=server dom? user?");
+		return findkey(k, fss, nil, 0, 0, nil, "proto=p9sk1 role=server dom? user?");
 }
 
 Proto*

+ 126 - 0
sys/src/cmd/auth/factotum/wep.c

@@ -0,0 +1,126 @@
+/*
+ *  The caller supplies the device, we do the flavoring.  There
+ *  are no phases, everything happens in the init routine.
+ */
+
+#include "dat.h"
+
+typedef struct State State;
+struct State 
+{
+	Key *key;
+};
+
+enum
+{
+	HavePass,
+};
+
+static int
+wepinit(Proto*, Fsstate *fss)
+{
+	int ret;
+	Key *k;
+	State *s;
+
+	/* find a key with at least one password */
+	ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "!key1?");
+	if(ret != RpcOk)
+		ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "%s", "!key2?");
+	if(ret != RpcOk)
+		ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "%s", "!key3?");
+	if(ret != RpcOk)
+		return ret;
+
+	setattrs(fss->attr, k->attr);
+	s = emalloc(sizeof(*s));
+	s->key = k;
+	fss->ps = s;
+	fss->phase = HavePass;
+
+	return RpcOk;
+}
+
+static void
+wepclose(Fsstate *fss)
+{
+	State *s;
+
+	s = fss->ps;
+	if(s->key)
+		closekey(s->key);
+	free(s);
+}
+
+static int
+wepread(Fsstate *fss, void*, uint*)
+{
+	return phaseerror(fss, "read");
+}
+
+static int
+wepwrite(Fsstate *fss, void *va, uint n)
+{
+	char *data = va;
+	State *s;
+	char dev[64];
+	int fd, cfd;
+	int rv;
+	char *p;
+
+	/* get the device */
+	if(n > sizeof(dev)-5){
+		werrstr("device too long");
+		return RpcErrstr;
+	}
+	memmove(dev, data, n);
+	dev[n] = 0;
+	s = fss->ps;
+
+	/* legal? */
+	if(dev[0] != '#' || dev[1] != 'l'){
+		werrstr("%s not an ether device", dev);
+		return RpcErrstr;
+	}
+	strcat(dev, "!0");
+	fd = dial(dev, 0, 0, &cfd);
+	if(fd < 0)
+		return RpcErrstr;
+
+	/* flavor it with passwords, essid, and turn on wep */
+	rv = RpcErrstr;
+	p = _strfindattr(s->key->privattr, "!key1");
+	if(p != nil)
+		if(fprint(cfd, "key1 %s", p) < 0)
+			goto out;
+	p = _strfindattr(s->key->privattr, "!key2");
+	if(p != nil)
+		if(fprint(cfd, "key2 %s", p) < 0)
+			goto out;
+	p = _strfindattr(s->key->privattr, "!key3");
+	if(p != nil)
+		if(fprint(cfd, "key3 %s", p) < 0)
+			goto out;
+	p = _strfindattr(fss->attr, "essid");
+	if(p != nil)
+		if(fprint(cfd, "essid %s", p) < 0)
+			goto out;
+	if(fprint(cfd, "crypt on") < 0)
+		goto out;
+	rv = RpcOk;
+out:
+	close(fd);
+	close(cfd);
+	return rv;
+}
+
+Proto wep =
+{
+.name=		"wep",
+.init=		wepinit,
+.write=		wepwrite,
+.read=		wepread,
+.close=		wepclose,
+.addkey=	replacekey,
+.keyprompt=	"!key1? !key2? !key3? essid?",
+};

+ 1 - 1
sys/src/cmd/auth/login.c

@@ -125,7 +125,7 @@ startfactotum(char *user, char *password, char *srvname)
 	case -1:
 		sysfatal("can't start factotum: %r");
 	case 0:
-		execl("/factotum", "loginfactotum", "-dns", srvname+5, 0);
+		execl("/boot/factotum", "loginfactotum", "-ns", srvname+5, 0);
 		sysfatal("starting factotum: %r");
 		break;
 	}

+ 17 - 2
sys/src/cmd/auth/mkfile

@@ -3,6 +3,7 @@
 #		programs
 #
 TARG=\
+	asn12rsa\
 	authsrv\
 	changeuser\
 	convkeys\
@@ -14,8 +15,17 @@ TARG=\
 	keyfs\
 	login\
 	netkey\
+	newns\
 	passwd\
+	pemdecode\
+	pemencode\
 	printnetkey\
+	rsagen\
+	rsafill\
+	rsa2csr\
+	rsa2pub\
+	rsa2ssh\
+	rsa2x509\
 	uniq\
 	warning\
 	wrkey\
@@ -28,6 +38,7 @@ OTHEROFILES=\
 	challenge.$O\
 	convbio.$O\
 	respond.$O\
+	rsa2any.$O\
 	secureidcheck.$O\
 	userpasswd.$O\
 
@@ -40,9 +51,9 @@ CLIB=`{ls lib/*.c}
 UPDATE=\
 	mkfile\
 	$HFILES\
+	rsa2any.h\
 	${OTHEROFILES:%.$O=%.c}\
 	${TARG:%=%.c}\
-	${TARG:%=/386/bin/auth/%}\
 
 </sys/src/cmd/mkmany
 
@@ -55,7 +66,7 @@ $DIRS:V:
 		mk all
 	}
 
-lib.$O.a:V:
+lib.$O.a:	$CLIB
 	cd lib
 	mk
 
@@ -127,3 +138,7 @@ $BIN/enable:V:
 
 $BIN/disable:V:
 	cp disable $target
+
+$O.rsa2ssh $O.rsafill $O.rsa2x509 $O.rsa2pub $O.rsa2csr: rsa2any.$O
+rsa2ssh.$O rsafill.$O rsa2x509.$O rsa2pub.$O rsa2csr.$O: rsa2any.h
+

+ 4 - 3
sys/src/cmd/auth/newns.c

@@ -5,7 +5,7 @@
 void
 usage(void)
 {
-	fprint(2, "usage: newns [-f file] command\n");
+	fprint(2, "usage: newns [-n namespace] [cmd [args...]]\n");
 	exits("usage");
 }
 
@@ -13,10 +13,11 @@ void
 main(int argc, char **argv)
 {
 	char *nsfile;
+	char *defargv[] = { "/bin/rc", "-i", nil };
 
 	nsfile = "/lib/namespace";
 	ARGBEGIN{
-	case 'f':
+	case 'n':
 		nsfile = ARGF();
 		break;
 	default:
@@ -24,7 +25,7 @@ main(int argc, char **argv)
 		break;
 	}ARGEND
 	if(argc == 0)
-		usage();
+		argv = defargv;
 	newns(getuser(), nsfile);
 	exec(argv[0], argv);
 	sysfatal("exec: %s: %r", argv[0]);

+ 59 - 0
sys/src/cmd/auth/pemdecode.c

@@ -0,0 +1,59 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <mp.h>
+#include <libsec.h>
+
+void
+usage(void)
+{
+	fprint(2, "auth/pemdecode section [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	char *buf;
+	uchar *bin;
+	int fd;
+	long n, tot;
+	int len;
+	char *tag, *file;
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 1 && argc != 2)
+		usage();
+
+	tag = argv[0];
+	if(argc == 2)
+		file = argv[1];
+	else
+		file = "#d/0";
+
+	if((fd = open(file, OREAD)) < 0)
+		sysfatal("open %s: %r", file);
+	buf = nil;
+	tot = 0;
+	for(;;){
+		buf = realloc(buf, tot+8192);
+		if(buf == nil)
+			sysfatal("realloc: %r");
+		if((n = read(fd, buf+tot, 8192)) < 0)
+			sysfatal("read: %r");
+		if(n == 0)
+			break;
+		tot += n;
+	}
+	buf[tot] = 0;
+	bin = decodepem(buf, tag, &len);
+	if(bin == nil)
+		sysfatal("cannot extract section '%s' from pem", tag);
+	if((n=write(1, bin, len)) != len)
+		sysfatal("writing %d bytes got %ld: %r", len, n);
+	exits(0);
+}

+ 64 - 0
sys/src/cmd/auth/pemencode.c

@@ -0,0 +1,64 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <mp.h>
+#include <libsec.h>
+
+void
+usage(void)
+{
+	fprint(2, "auth/pemdecode section [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	char *buf, *cbuf;
+	int fd;
+	long n, tot;
+	int len;
+	char *tag, *file;
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 1 && argc != 2)
+		usage();
+
+	tag = argv[0];
+	if(argc == 2)
+		file = argv[1];
+	else
+		file = "#d/0";
+
+	if((fd = open(file, OREAD)) < 0)
+		sysfatal("open %s: %r", file);
+	buf = nil;
+	tot = 0;
+	for(;;){
+		buf = realloc(buf, tot+8192);
+		if(buf == nil)
+			sysfatal("realloc: %r");
+		if((n = read(fd, buf+tot, 8192)) < 0)
+			sysfatal("read: %r");
+		if(n == 0)
+			break;
+		tot += n;
+	}
+	buf[tot] = 0;
+	cbuf = malloc(2*tot);
+	if(cbuf == nil)
+		sysfatal("malloc: %r");
+	len = enc64(cbuf, 2*tot, (uchar*)buf, tot);
+	print("-----BEGIN %s-----\n", tag);
+	while(len > 0){
+		print("%.64s\n", cbuf);
+		cbuf += 64;
+		len -= 64;
+	}
+	print("-----END %s-----\n", tag);
+	exits(0);
+}

+ 160 - 0
sys/src/cmd/auth/rsa2any.c

@@ -0,0 +1,160 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+RSApriv*
+getkey(int argc, char **argv, int needprivate, Attr **pa)
+{
+	char *file, *s, *p;
+	int sz;
+	RSApriv *key;
+	Biobuf *b;
+	int regen;
+	Attr *a;
+
+	if(argc == 0)
+		file = "#d/0";
+	else
+		file = argv[0];
+
+	key = mallocz(sizeof(RSApriv), 1);
+	if(key == nil)
+		return nil;
+
+	if((b = Bopen(file, OREAD)) == nil){
+		werrstr("open %s: %r", file);
+		return nil;
+	}
+	s = Brdstr(b, '\n', 1);
+	if(s == nil){
+		werrstr("read %s: %r", file);
+		return nil;
+	}
+	if(strncmp(s, "key ", 4) != 0){
+		werrstr("bad key format");
+		return nil;
+	}
+
+	regen = 0;
+	a = _parseattr(s+4);
+	if(a == nil){
+		werrstr("empty key");
+		return nil;
+	}
+	if((p = _strfindattr(a, "proto")) == nil){
+		werrstr("no proto");
+		return nil;
+	}
+	if(strcmp(p, "rsa") != 0){
+		werrstr("proto not rsa");
+		return nil;
+	}
+	if((p = _strfindattr(a, "ek")) == nil){
+		werrstr("no ek");
+		return nil;
+	}
+	if((key->pub.ek = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		werrstr("bad ek");
+		return nil;
+	}
+	if((p = _strfindattr(a, "n")) == nil){
+		werrstr("no n");
+		return nil;
+	}
+	if((key->pub.n = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		werrstr("bad n");
+		return nil;
+	}
+	if((p = _strfindattr(a, "size")) == nil)
+		fprint(2, "warning: missing size; will add\n");
+	else if((sz = strtol(p, &p, 10)) == 0 || *p != 0)
+		fprint(2, "warning: bad size; will correct\n");
+	else if(sz != mpsignif(key->pub.n))
+		fprint(2, "warning: wrong size (got %d, expected %d); will correct\n",
+			sz, mpsignif(key->pub.n));
+	if(!needprivate)
+		goto call;
+	if((p = _strfindattr(a, "!dk")) == nil){
+		werrstr("no !dk");
+		return nil;
+	}
+	if((key->dk = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		werrstr("bad !dk");
+		return nil;
+	}
+	if((p = _strfindattr(a, "!p")) == nil){
+		werrstr("no !p");
+		return nil;
+	}
+	if((key->p = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		werrstr("bad !p");
+		return nil;
+	}
+	if((p = _strfindattr(a, "!q")) == nil){
+		werrstr("no !q");
+		return nil;
+	}
+	if((key->q = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		werrstr("bad !q");
+		return nil;
+	}
+	if((p = _strfindattr(a, "!kp")) == nil){
+		fprint(2, "warning: no !kp\n");
+		regen = 1;
+		goto regen;
+	}
+	if((key->kp = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		fprint(2, "warning: bad !kp\n");
+		regen = 1;	
+		goto regen;
+	}
+	if((p = _strfindattr(a, "!kq")) == nil){
+		fprint(2, "warning: no !kq\n");
+		regen = 1;	
+		goto regen;
+	}
+	if((key->kq = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		fprint(2, "warning: bad !kq\n");
+		regen = 1;	
+		goto regen;
+	}
+	if((p = _strfindattr(a, "!c2")) == nil){
+		fprint(2, "warning: no !c2\n");
+		regen = 1;	
+		goto regen;
+	}
+	if((key->c2 = strtomp(p, &p, 16, nil)) == nil || *p != 0){
+		fprint(2, "warning: bad !c2\n");
+		regen = 1;	
+		goto regen;
+	}
+regen:
+	if(regen){
+		RSApriv *k2;
+
+		k2 = rsafill(key->pub.n, key->pub.ek, key->dk, key->p, key->q);
+		if(k2 == nil){
+			werrstr("regenerating chinese-remainder parts failed: %r");
+			return nil;
+		}
+		key = k2;
+	}
+call:
+	a = _delattr(a, "ek");
+	a = _delattr(a, "n");
+	a = _delattr(a, "size");
+	a = _delattr(a, "!dk");
+	a = _delattr(a, "!p");
+	a = _delattr(a, "!q");
+	a = _delattr(a, "!c2");
+	a = _delattr(a, "!kp");
+	a = _delattr(a, "!kq");
+	if(pa)
+		*pa = a;
+	return key;
+}
+

+ 1 - 0
sys/src/cmd/auth/rsa2any.h

@@ -0,0 +1 @@
+RSApriv *getkey(int, char**, int, Attr**);

+ 43 - 0
sys/src/cmd/auth/rsa2csr.c

@@ -0,0 +1,43 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: aux/rsa2csr 'C=US ...CN=xxx' [key]");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	int len;
+	uchar *cert;
+	RSApriv *key;
+
+	fmtinstall('B', mpfmt);
+	fmtinstall('H', encodefmt);
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 1 && argc != 2)
+		usage();
+
+	if((key = getkey(argc-1, argv+1, 1, nil)) == nil)
+		sysfatal("%r");
+
+	cert = X509req(key, argv[0], &len);
+	if(cert == nil)
+		sysfatal("X509req: %r");
+
+	write(1, cert, len);
+	exits(0);
+}

+ 44 - 0
sys/src/cmd/auth/rsa2pub.c

@@ -0,0 +1,44 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: auth/rsa2pub [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	RSApriv *key;
+	Attr *a;
+	char *s;
+
+	fmtinstall('A', _attrfmt);
+	fmtinstall('B', mpfmt);
+	quotefmtinstall();
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc > 1)
+		usage();
+
+	if((key = getkey(argc, argv, 0, &a)) == nil)
+		sysfatal("%r");
+
+	s = smprint("key %A size=%d ek=%B n=%B\n",
+		a, 
+		mpsignif(key->pub.n), key->pub.ek, key->pub.n);
+	if(s == nil)
+		sysfatal("smprint: %r");
+	write(1, s, strlen(s));
+	exits(nil);
+}

+ 35 - 0
sys/src/cmd/auth/rsa2ssh.c

@@ -0,0 +1,35 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: auth/rsa2ssh [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	RSApriv *k;
+
+	fmtinstall('B', mpfmt);
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc > 1)
+		usage();
+
+	if((k = getkey(argc, argv, 0, nil)) == nil)
+		sysfatal("%r");
+
+	print("%d %.10B %.10B\n", mpsignif(k->pub.n), k->pub.ek, k->pub.n);
+	exits(nil);
+}

+ 50 - 0
sys/src/cmd/auth/rsa2x509.c

@@ -0,0 +1,50 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: aux/rsa2x509 [-e expireseconds] 'C=US ...CN=xxx' [key]");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	int len;
+	uchar *cert;
+	ulong valid[2];
+	RSApriv *key;
+
+	fmtinstall('B', mpfmt);
+	fmtinstall('H', encodefmt);
+
+	valid[0] = time(0);
+	valid[1] = valid[0] + 3*366*24*60*60;
+
+	ARGBEGIN{
+	default:
+		usage();
+	case 'e':
+		valid[1] = valid[0] + strtoul(ARGF(), 0, 10);
+		break;
+	}ARGEND
+
+	if(argc != 1 && argc != 2)
+		usage();
+
+	if((key = getkey(argc-1, argv+1, 1, nil)) == nil)
+		sysfatal("%r");
+
+	cert = X509gen(key, argv[0], valid, &len);
+	if(cert == nil)
+		sysfatal("X509gen: %r");
+
+	write(1, cert, len);
+	exits(0);
+}

+ 46 - 0
sys/src/cmd/auth/rsafill.c

@@ -0,0 +1,46 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: auth/rsafill [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	RSApriv *key;
+	Attr *a;
+	char *s;
+
+	fmtinstall('A', _attrfmt);
+	fmtinstall('B', mpfmt);
+	quotefmtinstall();
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc > 1)
+		usage();
+
+	if((key = getkey(argc, argv, 1, &a)) == nil)
+		sysfatal("%r");
+
+	s = smprint("key %A size=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+		a, 
+		mpsignif(key->pub.n), key->pub.ek,
+		key->dk, key->pub.n, key->p, key->q,
+		key->kp, key->kq, key->c2);
+	if(s == nil)
+		sysfatal("smprint: %r");
+	write(1, s, strlen(s));
+	exits(nil);
+}

+ 60 - 0
sys/src/cmd/auth/rsagen.c

@@ -0,0 +1,60 @@
+#include <u.h>
+#include <libc.h>
+#include <mp.h>
+#include <libsec.h>
+
+void
+usage(void)
+{
+	fprint(2, "usage: auth/rsagen [-b bits] [-t 'attr=value attr=value ...']\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	char *s;
+	int bits;
+	char *tag;
+	RSApriv *key;
+
+	bits = 1024;
+	tag = nil;
+	key = nil;
+	fmtinstall('B', mpfmt);
+
+	ARGBEGIN{
+	case 'b':
+		bits = atoi(EARGF(usage()));
+		if(bits == 0)
+			usage();
+		break;
+	case 't':
+		tag = EARGF(usage());
+		break;
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 0)
+		usage();
+
+	do{
+		if(key)
+			rsaprivfree(key);
+		key = rsagen(bits, 6, 0);
+	}while(mpsignif(key->pub.n) != bits);
+
+	s = smprint("key proto=rsa %s%ssize=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+		tag ? tag : "", tag ? " " : "",
+		mpsignif(key->pub.n), key->pub.ek,
+		key->dk, key->pub.n, key->p, key->q,
+		key->kp, key->kq, key->c2);
+	if(s == nil)
+		sysfatal("smprint: %r");
+
+	if(write(1, s, strlen(s)) != strlen(s))
+		sysfatal("write: %r");
+	
+	exits(nil);
+}

Some files were not shown because too many files changed in this diff