Browse Source

Plan 9 from Bell Labs 2005-05-28

David du Colombier 19 years ago
parent
commit
fab58a9a87

+ 49 - 9
dist/replica/_plan9.db

@@ -253,6 +253,7 @@
 386/bin/games/memo - 775 sys sys 1115950076 157374
 386/bin/games/playlistfs - 775 sys sys 1105589129 148484
 386/bin/games/sokoban - 775 sys sys 1115950076 163388
+386/bin/games/sudoku - 775 sys sys 1117226504 171666
 386/bin/getmap - 775 sys sys 1115950076 65180
 386/bin/gif - 775 sys sys 1115950077 158063
 386/bin/grap - 775 sys sys 1116903733 280310
@@ -5757,7 +5758,7 @@ sys/doc/venti/venti.pdf - 755 sys sys 1020384352 139090
 sys/doc/venti/venti.ps - 664 sys sys 1019852320 2012620
 sys/games - 20000000775 sys sys 952648872 0
 sys/games/lib - 20000000775 sys sys 952648879 0
-sys/games/lib/fortunes - 664 sys sys 1116855350 253868
+sys/games/lib/fortunes - 664 sys sys 1117193231 253904
 sys/games/lib/mahjongg - 20000000775 sys sys 1095792278 0
 sys/games/lib/mahjongg/backgrounds - 20000000775 sys sys 1095792293 0
 sys/games/lib/mahjongg/backgrounds/default.bit - 664 sys sys 1095792293 346803
@@ -5782,6 +5783,29 @@ sys/games/lib/sokoban/images/win.bit - 664 sys sys 1095792098 572
 sys/games/lib/sokoban/levels - 20000000775 sys sys 1095792098 0
 sys/games/lib/sokoban/levels/easy.slc - 644 sys sys 1095792098 19839
 sys/games/lib/sokoban/levels/hard.slc - 644 sys sys 1095792098 17051
+sys/games/lib/sudoku - 20000000775 sys sys 1117225971 0
+sys/games/lib/sudoku/boards - 20000000775 sys sys 1117226433 0
+sys/games/lib/sudoku/boards/easy000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/easy001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/easy002.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/hard000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium002.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium003.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/veasy000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/veasy001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/images - 20000000775 sys sys 1117226542 0
+sys/games/lib/sudoku/images/1.bit - 664 sys sys 1117226542 352
+sys/games/lib/sudoku/images/2.bit - 664 sys sys 1117226542 412
+sys/games/lib/sudoku/images/3.bit - 664 sys sys 1117226542 463
+sys/games/lib/sudoku/images/4.bit - 664 sys sys 1117226542 416
+sys/games/lib/sudoku/images/5.bit - 664 sys sys 1117226542 401
+sys/games/lib/sudoku/images/6.bit - 664 sys sys 1117226542 527
+sys/games/lib/sudoku/images/7.bit - 664 sys sys 1117226542 403
+sys/games/lib/sudoku/images/8.bit - 664 sys sys 1117226542 528
+sys/games/lib/sudoku/images/9.bit - 664 sys sys 1117226542 537
+sys/games/sudoku - 20000000775 sys sys 1117225532 0
 sys/include - 20000000775 sys sys 1016902416 0
 sys/include/9p.h - 664 sys sys 1091904420 4392
 sys/include/String.h - 664 sys sys 1091904425 1319
@@ -7122,7 +7146,7 @@ sys/man/1/filter - 664 sys sys 1041108741 4403
 sys/man/1/fmt - 664 sys sys 1070032221 1557
 sys/man/1/fortune - 664 sys sys 944959673 449
 sys/man/1/freq - 664 sys sys 944959673 735
-sys/man/1/games - 664 sys sys 1096308821 2280
+sys/man/1/games - 664 sys sys 1117225790 3968
 sys/man/1/grap - 664 sys sys 944959675 6417
 sys/man/1/graph - 664 sys sys 944959673 2858
 sys/man/1/grep - 664 sys sys 969512677 2224
@@ -7537,7 +7561,7 @@ sys/man/8/mkpaqfs - 664 sys sys 1018386778 892
 sys/man/8/mksacfs - 664 sys sys 964886843 710
 sys/man/8/mouse - 664 sys sys 971455511 2476
 sys/man/8/na - 664 sys sys 958527089 859
-sys/man/8/ndb - 664 sys sys 1108476849 9939
+sys/man/8/ndb - 664 sys sys 1117227905 9941
 sys/man/8/newuser - 664 sys sys 1116954242 2418
 sys/man/8/nfsserver - 664 sys sys 1017251291 3397
 sys/man/8/pcmcia - 664 sys sys 944959679 408
@@ -7897,7 +7921,7 @@ sys/src/9/port/devfs.c - 664 sys sys 1105799131 10783
 sys/src/9/port/devkbmap.c - 644 sys sys 1079463756 2774
 sys/src/9/port/devkprof.c - 664 sys sys 1014931173 3111
 sys/src/9/port/devloopback.c - 664 sys sys 1076612248 14573
-sys/src/9/port/devmnt.c - 664 sys sys 1099760932 21561
+sys/src/9/port/devmnt.c - 664 sys sys 1117197997 21545
 sys/src/9/port/devmntstats.c - 664 sys sys 1014931173 4039
 sys/src/9/port/devmouse.c - 664 sys sys 1099760452 12504
 sys/src/9/port/devnmouse.c - 664 sys sys 1036812999 3738
@@ -9292,7 +9316,7 @@ sys/src/cmd/auth/factotum/rpc.c - 664 sys sys 1107633794 11167
 sys/src/cmd/auth/factotum/rsa.c - 664 sys sys 1107706104 3416
 sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1107633794 14935
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
-sys/src/cmd/auth/factotum/util.c - 664 sys sys 1107833785 17917
+sys/src/cmd/auth/factotum/util.c - 664 sys sys 1117193215 17915
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
 sys/src/cmd/auth/guard.srv.c - 664 sys sys 1032497638 2334
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
@@ -13751,7 +13775,7 @@ sys/src/games/music/jukefs/fs.c - 664 sys sys 1103793920 12708
 sys/src/games/music/jukefs/mk.dep - 664 sys sys 1103793920 759
 sys/src/games/music/jukefs/mkfile - 664 sys sys 1103793920 225
 sys/src/games/music/jukefs/object.h - 664 sys sys 1113342073 2067
-sys/src/games/music/jukefs/parse.c - 664 sys sys 1113342059 14073
+sys/src/games/music/jukefs/parse.c - 664 sys sys 1117199631 14121
 sys/src/games/music/jukefs/parse.h - 664 sys sys 1103793921 418
 sys/src/games/music/jukefs/print.c - 664 sys sys 1103793921 9016
 sys/src/games/music/jukefs/print.h - 664 sys sys 1103793921 174
@@ -13781,6 +13805,12 @@ sys/src/games/sokoban/move.c - 664 sys sys 1095792097 2671
 sys/src/games/sokoban/route.c - 664 sys sys 1102439103 3684
 sys/src/games/sokoban/sokoban.c - 664 sys sys 1102439104 5540
 sys/src/games/sokoban/sokoban.h - 664 sys sys 1102439105 1876
+sys/src/games/sudoku - 20000000775 sys sys 1117225572 0
+sys/src/games/sudoku/game.c - 664 sys sys 1117226433 7788
+sys/src/games/sudoku/levels.c - 664 sys sys 1117226433 3186
+sys/src/games/sudoku/mkfile - 664 sys sys 1117226432 218
+sys/src/games/sudoku/sudoku.c - 664 sys sys 1117226433 7805
+sys/src/games/sudoku/sudoku.h - 664 sys sys 1117226432 1159
 sys/src/lib9p - 20000000775 sys sys 1015023311 0
 sys/src/lib9p/_post.c - 664 sys sys 1103565871 1642
 sys/src/lib9p/dirread.c - 664 sys sys 1015023310 641
@@ -13854,7 +13884,7 @@ sys/src/libauthsrv/mkfile - 664 sys sys 1035389776 409
 sys/src/libauthsrv/nvcsum.c - 664 sys sys 1015091654 192
 sys/src/libauthsrv/opasstokey.c - 664 sys sys 1015091654 448
 sys/src/libauthsrv/passtokey.c - 664 sys sys 1015091654 517
-sys/src/libauthsrv/readnvram.c - 664 sys sys 1106063383 8622
+sys/src/libauthsrv/readnvram.c - 664 sys sys 1117193209 8752
 sys/src/libbin - 20000000775 sys sys 984777332 0
 sys/src/libbin/bin.c - 664 sys sys 1045502972 1811
 sys/src/libbin/mkfile - 664 sys sys 1035389776 197
@@ -13983,7 +14013,7 @@ sys/src/libc/9sys/abort.c - 664 sys sys 944961712 75
 sys/src/libc/9sys/access.c - 664 sys sys 1019498851 421
 sys/src/libc/9sys/announce.c - 664 sys sys 1084468743 4614
 sys/src/libc/9sys/consctl.c - 664 sys sys 984709400 1487
-sys/src/libc/9sys/convD2M.c - 664 sys sys 1014927336 1398
+sys/src/libc/9sys/convD2M.c - 664 sys sys 1117193453 1399
 sys/src/libc/9sys/convM2D.c - 664 sys sys 1014927336 1419
 sys/src/libc/9sys/convM2S.c - 664 sys sys 1017679320 4969
 sys/src/libc/9sys/convS2M.c - 664 sys sys 1021580001 5014
@@ -14163,7 +14193,7 @@ sys/src/libc/port/lock.c - 664 sys sys 1014927398 493
 sys/src/libc/port/log.c - 664 sys sys 1014927398 1026
 sys/src/libc/port/lrand.c - 664 sys sys 1035832917 1109
 sys/src/libc/port/malloc.acid - 664 sys sys 1014927398 6227
-sys/src/libc/port/malloc.c - 664 sys sys 1109250219 5713
+sys/src/libc/port/malloc.c - 664 sys sys 1117193316 5713
 sys/src/libc/port/memccpy.c - 664 sys sys 1014927398 216
 sys/src/libc/port/memchr.c - 664 sys sys 1014927398 182
 sys/src/libc/port/memcmp.c - 664 sys sys 1014927398 259
@@ -14885,3 +14915,13 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
+386/bin/games/sudoku - 775 sys sys 1117249746 171666
+386/bin/auth/aescbc - 775 sys sys 1117249742 140735
+386/bin/auth/convkeys - 775 sys sys 1117249742 87396
+386/bin/auth/convkeys2 - 775 sys sys 1117249742 87447
+386/bin/auth/factotum - 775 sys sys 1117249743 312399
+386/bin/auth/keyfs - 775 sys sys 1117249744 115539
+386/bin/auth/secstore - 775 sys sys 1117249744 195275
+386/bin/auth/wrkey - 775 sys sys 1117249745 75165
+386/bin/disk/kfs - 775 sys sys 1117249746 248958
+386/lib/libauthsrv.a - 664 sys sys 1117249746 34098

+ 48 - 18
dist/replica/plan9.db

@@ -43,21 +43,21 @@
 386/bin/ascii - 775 sys sys 1115950026 64668
 386/bin/astro - 775 sys sys 1115950027 138803
 386/bin/auth - 20000000775 sys sys 1016920815 0
-386/bin/auth/aescbc - 775 sys sys 1115950027 140626
+386/bin/auth/aescbc - 775 sys sys 1117249742 140735
 386/bin/auth/asn12rsa - 775 sys sys 1115950027 119644
 386/bin/auth/authsrv - 775 sys sys 1115950028 165463
 386/bin/auth/changeuser - 775 sys sys 1115950028 97026
-386/bin/auth/convkeys - 775 sys sys 1115950028 87287
-386/bin/auth/convkeys2 - 775 sys sys 1115950028 87338
+386/bin/auth/convkeys - 775 sys sys 1117249742 87396
+386/bin/auth/convkeys2 - 775 sys sys 1117249742 87447
 386/bin/auth/cron - 775 sys sys 1115950029 142890
 386/bin/auth/debug - 775 sys sys 1115950029 101064
 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 1115950029 312290
+386/bin/auth/factotum - 775 sys sys 1117249743 312399
 386/bin/auth/fgui - 775 sys sys 1115950030 217869
 386/bin/auth/guard.srv - 775 sys sys 1115950030 142850
 386/bin/auth/iam - 775 sys sys 1085076981 50791
-386/bin/auth/keyfs - 775 sys sys 1115950031 115430
+386/bin/auth/keyfs - 775 sys sys 1117249744 115539
 386/bin/auth/login - 775 sys sys 1115950031 103379
 386/bin/auth/newns - 775 sys sys 1115950031 87950
 386/bin/auth/none - 775 sys sys 1116903728 87947
@@ -71,13 +71,13 @@
 386/bin/auth/rsafill - 775 sys sys 1115950034 143416
 386/bin/auth/rsagen - 775 sys sys 1115950034 153041
 386/bin/auth/secretpem - 775 sys sys 1045537944 118526
-386/bin/auth/secstore - 775 sys sys 1115950035 195166
+386/bin/auth/secstore - 775 sys sys 1117249744 195275
 386/bin/auth/secstored - 775 sys sys 1115950035 196858
 386/bin/auth/secuser - 775 sys sys 1115950035 152808
 386/bin/auth/status - 775 sys sys 1020319060 738
 386/bin/auth/uniq - 775 sys sys 1115950036 63052
 386/bin/auth/warning - 775 sys sys 1115950036 99559
-386/bin/auth/wrkey - 775 sys sys 1115950036 75056
+386/bin/auth/wrkey - 775 sys sys 1117249745 75165
 386/bin/aux - 20000000775 sys sys 1016920817 0
 386/bin/aux/9pcon - 775 sys sys 1115950037 94925
 386/bin/aux/LOCK - 775 sys sys 1115950037 59908
@@ -203,7 +203,7 @@
 386/bin/disk/exsort - 775 sys sys 1115950063 60210
 386/bin/disk/fdisk - 775 sys sys 1115950063 103794
 386/bin/disk/format - 775 sys sys 1115950063 89534
-386/bin/disk/kfs - 775 sys sys 1115950064 248849
+386/bin/disk/kfs - 775 sys sys 1117249746 248958
 386/bin/disk/kfscmd - 775 sys sys 1115950064 38222
 386/bin/disk/ksync - 775 sys sys 1020319074 302
 386/bin/disk/mbr - 775 sys sys 1115950064 73689
@@ -253,6 +253,7 @@
 386/bin/games/memo - 775 sys sys 1115950076 157374
 386/bin/games/playlistfs - 775 sys sys 1105589129 148484
 386/bin/games/sokoban - 775 sys sys 1115950076 163388
+386/bin/games/sudoku - 775 sys sys 1117249746 171666
 386/bin/getmap - 775 sys sys 1115950076 65180
 386/bin/gif - 775 sys sys 1115950077 158063
 386/bin/grap - 775 sys sys 1116903733 280310
@@ -534,7 +535,7 @@
 386/lib/lib9p.a - 664 sys sys 1115950150 79300
 386/lib/libString.a - 664 sys sys 1115950150 22184
 386/lib/libauth.a - 664 sys sys 1115950150 56134
-386/lib/libauthsrv.a - 664 sys sys 1115950150 33778
+386/lib/libauthsrv.a - 664 sys sys 1117249746 34098
 386/lib/libbin.a - 664 sys sys 1115950150 2534
 386/lib/libbio.a - 664 sys sys 1115950150 26078
 386/lib/libc.a - 664 sys sys 1115950151 502284
@@ -5757,7 +5758,7 @@ sys/doc/venti/venti.pdf - 755 sys sys 1020384352 139090
 sys/doc/venti/venti.ps - 664 sys sys 1019852320 2012620
 sys/games - 20000000775 sys sys 952648872 0
 sys/games/lib - 20000000775 sys sys 952648879 0
-sys/games/lib/fortunes - 664 sys sys 1116855350 253868
+sys/games/lib/fortunes - 664 sys sys 1117193231 253904
 sys/games/lib/mahjongg - 20000000775 sys sys 1095792278 0
 sys/games/lib/mahjongg/backgrounds - 20000000775 sys sys 1095792293 0
 sys/games/lib/mahjongg/backgrounds/default.bit - 664 sys sys 1095792293 346803
@@ -5782,6 +5783,29 @@ sys/games/lib/sokoban/images/win.bit - 664 sys sys 1095792098 572
 sys/games/lib/sokoban/levels - 20000000775 sys sys 1095792098 0
 sys/games/lib/sokoban/levels/easy.slc - 644 sys sys 1095792098 19839
 sys/games/lib/sokoban/levels/hard.slc - 644 sys sys 1095792098 17051
+sys/games/lib/sudoku - 20000000775 sys sys 1117225971 0
+sys/games/lib/sudoku/boards - 20000000775 sys sys 1117226433 0
+sys/games/lib/sudoku/boards/easy000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/easy001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/easy002.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/hard000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium002.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/medium003.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/veasy000.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/boards/veasy001.su - 664 sys sys 1117226433 180
+sys/games/lib/sudoku/images - 20000000775 sys sys 1117226542 0
+sys/games/lib/sudoku/images/1.bit - 664 sys sys 1117226542 352
+sys/games/lib/sudoku/images/2.bit - 664 sys sys 1117226542 412
+sys/games/lib/sudoku/images/3.bit - 664 sys sys 1117226542 463
+sys/games/lib/sudoku/images/4.bit - 664 sys sys 1117226542 416
+sys/games/lib/sudoku/images/5.bit - 664 sys sys 1117226542 401
+sys/games/lib/sudoku/images/6.bit - 664 sys sys 1117226542 527
+sys/games/lib/sudoku/images/7.bit - 664 sys sys 1117226542 403
+sys/games/lib/sudoku/images/8.bit - 664 sys sys 1117226542 528
+sys/games/lib/sudoku/images/9.bit - 664 sys sys 1117226542 537
+sys/games/sudoku - 20000000775 sys sys 1117225532 0
 sys/include - 20000000775 sys sys 1016902416 0
 sys/include/9p.h - 664 sys sys 1091904420 4392
 sys/include/String.h - 664 sys sys 1091904425 1319
@@ -7122,7 +7146,7 @@ sys/man/1/filter - 664 sys sys 1041108741 4403
 sys/man/1/fmt - 664 sys sys 1070032221 1557
 sys/man/1/fortune - 664 sys sys 944959673 449
 sys/man/1/freq - 664 sys sys 944959673 735
-sys/man/1/games - 664 sys sys 1096308821 2280
+sys/man/1/games - 664 sys sys 1117225790 3968
 sys/man/1/grap - 664 sys sys 944959675 6417
 sys/man/1/graph - 664 sys sys 944959673 2858
 sys/man/1/grep - 664 sys sys 969512677 2224
@@ -7537,7 +7561,7 @@ sys/man/8/mkpaqfs - 664 sys sys 1018386778 892
 sys/man/8/mksacfs - 664 sys sys 964886843 710
 sys/man/8/mouse - 664 sys sys 971455511 2476
 sys/man/8/na - 664 sys sys 958527089 859
-sys/man/8/ndb - 664 sys sys 1108476849 9939
+sys/man/8/ndb - 664 sys sys 1117227905 9941
 sys/man/8/newuser - 664 sys sys 1116954242 2418
 sys/man/8/nfsserver - 664 sys sys 1017251291 3397
 sys/man/8/pcmcia - 664 sys sys 944959679 408
@@ -7897,7 +7921,7 @@ sys/src/9/port/devfs.c - 664 sys sys 1105799131 10783
 sys/src/9/port/devkbmap.c - 644 sys sys 1079463756 2774
 sys/src/9/port/devkprof.c - 664 sys sys 1014931173 3111
 sys/src/9/port/devloopback.c - 664 sys sys 1076612248 14573
-sys/src/9/port/devmnt.c - 664 sys sys 1099760932 21561
+sys/src/9/port/devmnt.c - 664 sys sys 1117197997 21545
 sys/src/9/port/devmntstats.c - 664 sys sys 1014931173 4039
 sys/src/9/port/devmouse.c - 664 sys sys 1099760452 12504
 sys/src/9/port/devnmouse.c - 664 sys sys 1036812999 3738
@@ -9292,7 +9316,7 @@ sys/src/cmd/auth/factotum/rpc.c - 664 sys sys 1107633794 11167
 sys/src/cmd/auth/factotum/rsa.c - 664 sys sys 1107706104 3416
 sys/src/cmd/auth/factotum/secstore.c - 664 sys sys 1107633794 14935
 sys/src/cmd/auth/factotum/sshrsa.c - 664 sys sys 1107633793 3416
-sys/src/cmd/auth/factotum/util.c - 664 sys sys 1107833785 17917
+sys/src/cmd/auth/factotum/util.c - 664 sys sys 1117193215 17915
 sys/src/cmd/auth/factotum/wep.c - 664 sys sys 1107706104 2140
 sys/src/cmd/auth/guard.srv.c - 664 sys sys 1032497638 2334
 sys/src/cmd/auth/iam.c - 664 sys sys 1015008430 841
@@ -13751,7 +13775,7 @@ sys/src/games/music/jukefs/fs.c - 664 sys sys 1103793920 12708
 sys/src/games/music/jukefs/mk.dep - 664 sys sys 1103793920 759
 sys/src/games/music/jukefs/mkfile - 664 sys sys 1103793920 225
 sys/src/games/music/jukefs/object.h - 664 sys sys 1113342073 2067
-sys/src/games/music/jukefs/parse.c - 664 sys sys 1113342059 14073
+sys/src/games/music/jukefs/parse.c - 664 sys sys 1117199631 14121
 sys/src/games/music/jukefs/parse.h - 664 sys sys 1103793921 418
 sys/src/games/music/jukefs/print.c - 664 sys sys 1103793921 9016
 sys/src/games/music/jukefs/print.h - 664 sys sys 1103793921 174
@@ -13781,6 +13805,12 @@ sys/src/games/sokoban/move.c - 664 sys sys 1095792097 2671
 sys/src/games/sokoban/route.c - 664 sys sys 1102439103 3684
 sys/src/games/sokoban/sokoban.c - 664 sys sys 1102439104 5540
 sys/src/games/sokoban/sokoban.h - 664 sys sys 1102439105 1876
+sys/src/games/sudoku - 20000000775 sys sys 1117225572 0
+sys/src/games/sudoku/game.c - 664 sys sys 1117226433 7788
+sys/src/games/sudoku/levels.c - 664 sys sys 1117226433 3186
+sys/src/games/sudoku/mkfile - 664 sys sys 1117226432 218
+sys/src/games/sudoku/sudoku.c - 664 sys sys 1117226433 7805
+sys/src/games/sudoku/sudoku.h - 664 sys sys 1117226432 1159
 sys/src/lib9p - 20000000775 sys sys 1015023311 0
 sys/src/lib9p/_post.c - 664 sys sys 1103565871 1642
 sys/src/lib9p/dirread.c - 664 sys sys 1015023310 641
@@ -13854,7 +13884,7 @@ sys/src/libauthsrv/mkfile - 664 sys sys 1035389776 409
 sys/src/libauthsrv/nvcsum.c - 664 sys sys 1015091654 192
 sys/src/libauthsrv/opasstokey.c - 664 sys sys 1015091654 448
 sys/src/libauthsrv/passtokey.c - 664 sys sys 1015091654 517
-sys/src/libauthsrv/readnvram.c - 664 sys sys 1106063383 8622
+sys/src/libauthsrv/readnvram.c - 664 sys sys 1117193209 8752
 sys/src/libbin - 20000000775 sys sys 984777332 0
 sys/src/libbin/bin.c - 664 sys sys 1045502972 1811
 sys/src/libbin/mkfile - 664 sys sys 1035389776 197
@@ -13983,7 +14013,7 @@ sys/src/libc/9sys/abort.c - 664 sys sys 944961712 75
 sys/src/libc/9sys/access.c - 664 sys sys 1019498851 421
 sys/src/libc/9sys/announce.c - 664 sys sys 1084468743 4614
 sys/src/libc/9sys/consctl.c - 664 sys sys 984709400 1487
-sys/src/libc/9sys/convD2M.c - 664 sys sys 1014927336 1398
+sys/src/libc/9sys/convD2M.c - 664 sys sys 1117193453 1399
 sys/src/libc/9sys/convM2D.c - 664 sys sys 1014927336 1419
 sys/src/libc/9sys/convM2S.c - 664 sys sys 1017679320 4969
 sys/src/libc/9sys/convS2M.c - 664 sys sys 1021580001 5014
@@ -14163,7 +14193,7 @@ sys/src/libc/port/lock.c - 664 sys sys 1014927398 493
 sys/src/libc/port/log.c - 664 sys sys 1014927398 1026
 sys/src/libc/port/lrand.c - 664 sys sys 1035832917 1109
 sys/src/libc/port/malloc.acid - 664 sys sys 1014927398 6227
-sys/src/libc/port/malloc.c - 664 sys sys 1109250219 5713
+sys/src/libc/port/malloc.c - 664 sys sys 1117193316 5713
 sys/src/libc/port/memccpy.c - 664 sys sys 1014927398 216
 sys/src/libc/port/memchr.c - 664 sys sys 1014927398 182
 sys/src/libc/port/memcmp.c - 664 sys sys 1014927398 259

+ 50 - 0
dist/replica/plan9.log

@@ -19258,3 +19258,53 @@
 1117035104 0 c sys/man/2/thread - 664 sys sys 1117034202 11640
 1117056708 0 c sys/src/9/port/error.h - 664 sys sys 1117055493 2637
 1117108920 0 c lib/ndb/auth - 664 sys sys 1117108784 572
+1117193418 0 c sys/games/lib/fortunes - 664 sys sys 1117193231 253904
+1117193418 1 c sys/src/cmd/auth/factotum/util.c - 664 sys sys 1117193215 17915
+1117193418 2 c sys/src/libauthsrv/readnvram.c - 664 sys sys 1117193209 8752
+1117193418 3 c sys/src/libc/9sys/convD2M.c - 664 sys sys 1117193453 1399
+1117193418 4 c sys/src/libc/port/malloc.c - 664 sys sys 1117193316 5713
+1117198818 0 c sys/src/9/port/devmnt.c - 664 sys sys 1117197997 21545
+1117198818 1 c sys/src/games/music/jukefs/parse.c - 664 sys sys 1117197996 14107
+1117200620 0 c sys/src/games/music/jukefs/parse.c - 664 sys sys 1117199631 14121
+1117225825 0 a sys/games/sudoku - 20000000775 sys sys 1117225532 0
+1117225825 1 c sys/man/1/games - 664 sys sys 1117225790 3968
+1117225825 2 a sys/src/games/sudoku - 20000000775 sys sys 1117225572 0
+1117227626 0 a 386/bin/games/sudoku - 775 sys sys 1117226504 171666
+1117227626 1 a sys/games/lib/sudoku - 20000000775 sys sys 1117225971 0
+1117227626 2 a sys/games/lib/sudoku/boards - 20000000775 sys sys 1117226433 0
+1117227626 3 a sys/games/lib/sudoku/boards/easy000.su - 664 sys sys 1117226433 180
+1117227626 4 a sys/games/lib/sudoku/boards/easy001.su - 664 sys sys 1117226433 180
+1117227626 5 a sys/games/lib/sudoku/boards/easy002.su - 664 sys sys 1117226433 180
+1117227626 6 a sys/games/lib/sudoku/boards/hard000.su - 664 sys sys 1117226433 180
+1117227626 7 a sys/games/lib/sudoku/boards/medium000.su - 664 sys sys 1117226433 180
+1117227626 8 a sys/games/lib/sudoku/boards/medium001.su - 664 sys sys 1117226433 180
+1117227626 9 a sys/games/lib/sudoku/boards/medium002.su - 664 sys sys 1117226433 180
+1117227626 10 a sys/games/lib/sudoku/boards/medium003.su - 664 sys sys 1117226433 180
+1117227626 11 a sys/games/lib/sudoku/boards/veasy000.su - 664 sys sys 1117226433 180
+1117227626 12 a sys/games/lib/sudoku/boards/veasy001.su - 664 sys sys 1117226433 180
+1117227626 13 a sys/games/lib/sudoku/images - 20000000775 sys sys 1117226542 0
+1117227626 14 a sys/games/lib/sudoku/images/1.bit - 664 sys sys 1117226542 352
+1117227626 15 a sys/games/lib/sudoku/images/2.bit - 664 sys sys 1117226542 412
+1117227626 16 a sys/games/lib/sudoku/images/3.bit - 664 sys sys 1117226542 463
+1117227626 17 a sys/games/lib/sudoku/images/4.bit - 664 sys sys 1117226542 416
+1117227626 18 a sys/games/lib/sudoku/images/5.bit - 664 sys sys 1117226542 401
+1117227626 19 a sys/games/lib/sudoku/images/6.bit - 664 sys sys 1117226542 527
+1117227626 20 a sys/games/lib/sudoku/images/7.bit - 664 sys sys 1117226542 403
+1117227626 21 a sys/games/lib/sudoku/images/8.bit - 664 sys sys 1117226542 528
+1117227626 22 a sys/games/lib/sudoku/images/9.bit - 664 sys sys 1117226542 537
+1117227626 23 a sys/src/games/sudoku/game.c - 664 sys sys 1117226433 7788
+1117227626 24 a sys/src/games/sudoku/levels.c - 664 sys sys 1117226433 3186
+1117227626 25 a sys/src/games/sudoku/mkfile - 664 sys sys 1117226432 218
+1117227626 26 a sys/src/games/sudoku/sudoku.c - 664 sys sys 1117226433 7805
+1117227626 27 a sys/src/games/sudoku/sudoku.h - 664 sys sys 1117226432 1159
+1117229425 0 c sys/man/8/ndb - 664 sys sys 1117227905 9941
+1117251030 0 c 386/bin/games/sudoku - 775 sys sys 1117249746 171666
+1117251030 1 c 386/bin/auth/aescbc - 775 sys sys 1117249742 140735
+1117251030 2 c 386/bin/auth/convkeys - 775 sys sys 1117249742 87396
+1117251030 3 c 386/bin/auth/convkeys2 - 775 sys sys 1117249742 87447
+1117251030 4 c 386/bin/auth/factotum - 775 sys sys 1117249743 312399
+1117251030 5 c 386/bin/auth/keyfs - 775 sys sys 1117249744 115539
+1117251030 6 c 386/bin/auth/secstore - 775 sys sys 1117249744 195275
+1117251030 7 c 386/bin/auth/wrkey - 775 sys sys 1117249745 75165
+1117251030 8 c 386/bin/disk/kfs - 775 sys sys 1117249746 248958
+1117251030 9 c 386/lib/libauthsrv.a - 664 sys sys 1117249746 34098

+ 1 - 0
sys/games/lib/fortunes

@@ -4065,3 +4065,4 @@ setenv I_WANT_A_BROKEN_PS
 It's the ship that made the Kessel run in less than twelve parsecs.
 CPU0 states:   0.0% user, 150.0% system,   0.0%nice,   0.0% idle
 i know what jmk did.  he added reentrancy for threads.  - boyd, about uintptr
+i hate all sorts of zealots  - boyd

+ 18 - 0
sys/games/lib/sudoku/boards/easy000.su

@@ -0,0 +1,18 @@
+.8...5...
+.....3457
+....7.8.9
+.6.4..9.3
+..7.1.5..
+4.8..7.2.
+9.1.2....
+8423.....
+...1...8.
+786945312
+219863457
+534271869
+165482973
+327619548
+498537126
+951728634
+842356791
+673194285

+ 18 - 0
sys/games/lib/sudoku/boards/easy001.su

@@ -0,0 +1,18 @@
+..35.29..
+....4....
+1.6...3.5
+9..251..8
+.7.4.8.3.
+8..763..1
+3.8...1.4
+....2....
+..51.48..
+743512986
+589346217
+126987345
+934251768
+671498532
+852763491
+398675124
+417829653
+265134879

+ 18 - 0
sys/games/lib/sudoku/boards/easy002.su

@@ -0,0 +1,18 @@
+.........
+..98.51..
+.519.742.
+29.4.1.65
+.........
+14.5.8.93
+.267.958.
+..51.36..
+.........
+782614359
+439825176
+651937428
+293471865
+568392714
+147568293
+326749581
+975183642
+814256937

+ 18 - 0
sys/games/lib/sudoku/boards/hard000.su

@@ -0,0 +1,18 @@
+36..2..89
+...361...
+.........
+8.3...6.2
+4..6.3..7
+6.7...1.8
+.........
+...418...
+97..3..14
+361524789
+789361425
+524879361
+893157642
+412683597
+657942138
+148796253
+235418976
+976235814

+ 18 - 0
sys/games/lib/sudoku/boards/medium000.su

@@ -0,0 +1,18 @@
+.2..3..9.
+...9.7...
+9..2.8..5
+..48.65..
+6.7...2.8
+..31.29..
+8..6.5..7
+...3.9...
+.3..2..5.
+428531796
+365947182
+971268435
+214896573
+697453218
+583172964
+849615327
+752389641
+136724859

+ 18 - 0
sys/games/lib/sudoku/boards/medium001.su

@@ -0,0 +1,18 @@
+..5.....6
+.7...9.2.
+...5..1.7
+8.415....
+...8.3...
+....928.5
+9.7..6...
+.3.4...1.
+2.....6..
+425781936
+178369524
+369524187
+894157362
+652843791
+713692845
+987216453
+536478219
+241935678

+ 18 - 0
sys/games/lib/sudoku/boards/medium002.su

@@ -0,0 +1,18 @@
+.4.....5.
+..19436..
+..9...3..
+6...5...2
+1.3...5.6
+8...2...7
+..5...2..
+..24367..
+.3.....4.
+348267951
+571943628
+269185374
+697351482
+123874596
+854629137
+415798263
+982436715
+736512849

+ 18 - 0
sys/games/lib/sudoku/boards/medium003.su

@@ -0,0 +1,18 @@
+..4......
+....3...2
+39.7...8.
+4....9..1
+2.98.13.7
+6..2....8
+.1...8.53
+9...4....
+......8..
+124986735
+867435912
+395712684
+478359261
+259861347
+631274598
+712698453
+983547126
+546123879

+ 18 - 0
sys/games/lib/sudoku/boards/veasy000.su

@@ -0,0 +1,18 @@
+361.259..
+.8.96..1.
+4......57
+..8...471
+...6.3...
+259...8..
+74......5
+.2..18.6.
+..547.329
+361725948
+587964213
+492831657
+638259471
+174683592
+259147836
+746392185
+923518764
+815476329

+ 18 - 0
sys/games/lib/sudoku/boards/veasy001.su

@@ -0,0 +1,18 @@
+.5.8.7.2.
+6...1..9.
+7.254...6
+.7..2.3.1
+5.4...9.8
+1.3.8..7.
+9...762.5
+.6..9...3
+.8.1.3.4.
+359867124
+648312597
+712549836
+876924351
+524731968
+193685472
+931476285
+465298713
+287153649

BIN
sys/games/lib/sudoku/images/1.bit


BIN
sys/games/lib/sudoku/images/2.bit


BIN
sys/games/lib/sudoku/images/3.bit


BIN
sys/games/lib/sudoku/images/4.bit


BIN
sys/games/lib/sudoku/images/5.bit


BIN
sys/games/lib/sudoku/images/6.bit


BIN
sys/games/lib/sudoku/images/7.bit


BIN
sys/games/lib/sudoku/images/8.bit


BIN
sys/games/lib/sudoku/images/9.bit


+ 65 - 1
sys/man/1/games

@@ -1,6 +1,6 @@
 .TH GAMES 1
 .SH NAME
-mahjongg, sokoban \- time wasters
+mahjongg, sokoban, sudoku \- time wasters
 .SH SYNOPSIS
 .B games/juggle
 [
@@ -32,6 +32,8 @@ mahjongg, sokoban \- time wasters
 [
 .I level
 ]
+.br
+.B games/sudoku
 .SH DESCRIPTION
 There are a few games in
 .BR /bin/games :
@@ -100,6 +102,64 @@ quit.  The right mouse button invokes a menu to restart the current level or loa
 level sets.  The middle mouse button lets you change between levels. 
 .I Sokoban
 accepts a level file as its argument.
+.TP
+.B sudoku
+.I Sudoku
+is a puzzle game from Japan.  The goal of the game is to
+fill the numbers 1 to 9 in all squares of the 9x9 board following a
+few simple rules: no digit should repeat on the same row and column,
+and no digit should repeat in the same 3x3 boxes outlined with thicker
+lines.  The board is initially filled with a partial solution which
+can be used for inferring digits for the empty squares.  The top row
+of the board contains the digits 1 through 9, clicking on one of those
+digits selects that number for placement on the board, clicking it
+again will deselect that digit.  Clicking on an empty square will then
+affix the square with the selected digit or, if no digit is selected
+empty the square.
+.IP
+The left mouse button presents a menu with the following options:
+.RS \w'\fLfireworksXX'u
+.TP \w'\fLOffsetXX'u
+.B New
+autogenerate a new, random board
+.TP
+.B Check
+mark in red any digits not placed according to the rules
+.TP
+.B Solve
+present the board's solution
+.TP
+.B Clear
+clear the board to its starting (or last loaded) state
+.TP
+.B Save
+save the current board to
+.I /tmp/sudoku-save
+.TP
+.B Load
+load the last saved board from
+.I /tmp/sudoku-save
+.TP
+.B Print
+print the current board and solution in a format
+suitable for addition in the sudoku library to
+.I /tmp/sudoku-board
+.TP
+.B Offline
+pretty-print the board for off-line solving to
+.I /tmp/sudoku-print
+.TP
+.B Exit
+quit the game
+.RE
+.IP
+The middle mouse button presents a list of sudoku boards from
+.I /sys/games/lib/sudoku/boards
+with varying degree of difficulty.
+.IP
+Pressing the
+.B Q
+key quits sudoku
 .SH FILES
 .TP
 .B /sys/games/lib/mahjongg/*
@@ -109,5 +169,9 @@ image sprites, levels and backgrounds used by
 .B /sys/games/lib/sokoban/*
 image sprites and levels used by
 .I sokoban
+.TP
+.B /sys/games/lib/sudoku/*
+images and boards used by
+.I sudoku
 .SH SOURCE
 .B /sys/src/games

+ 1 - 1
sys/man/8/ndb

@@ -308,7 +308,7 @@ address range you are serving reversed and with
 appended.  This is a standard form for a domain name in an IPv4 PTR record.
 .PP
 If such an entry exists in the database, reverse addresses will
-automaticly be generated from any IP addresses in the database
+automatically be generated from any IP addresses in the database
 that are under this root.  For example
 .EX
 

+ 8 - 8
sys/src/9/port/devmnt.c

@@ -196,7 +196,8 @@ mntversion(Chan *c, char *version, int msize, int returnlen)
 		error("server tries to increase msize in fversion");
 	if(f.msize<256 || f.msize>1024*1024)
 		error("nonsense value of msize in fversion");
-	if(strncmp(f.version, v, strlen(f.version)) != 0)
+	k = strlen(f.version);
+	if(strncmp(f.version, v, k) != 0)
 		error("bad 9P version returned from server");
 
 	/* now build Mnt associated with this connection */
@@ -220,6 +221,12 @@ mntversion(Chan *c, char *version, int msize, int returnlen)
 	m->msize = f.msize;
 	unlock(&mntalloc);
 
+	if(returnlen > 0){
+		if(returnlen < k)
+			error(Eshort);
+		memmove(version, f.version, k);
+	}
+
 	poperror();	/* msg */
 	free(msg);
 
@@ -235,13 +242,6 @@ mntversion(Chan *c, char *version, int msize, int returnlen)
 	poperror();	/* c */
 	qunlock(&c->umqlock);
 
-	k = strlen(f.version);
-	if(returnlen > 0){
-		if(returnlen < k)
-			error(Eshort);
-		memmove(version, f.version, k);
-	}
-
 	return k;
 }
 

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

@@ -454,7 +454,7 @@ getnvramkey(int flag, char **secstorepw)
 	 * readnvram can return -1 meaning nvram wasn't written,
 	 * but safe still holds good data.
 	 */
-	if(readnvram(&safe, flag)<0 && safe.authid[0]=='0') 
+	if(readnvram(&safe, flag)<0 && safe.authid[0]==0) 
 		return nil;
 
 	/*

+ 5 - 4
sys/src/games/music/jukefs/parse.c

@@ -33,7 +33,7 @@ Token tokenlistinit[] = {
 	{ "work",	Obj,	Work		, "title"	, {nil,0}},
 };
 Token *tokenlist;
-int ntoken = Ntoken;
+int ntoken = nelem(tokenlistinit);
 int catnr = 0;
 
 Cmdlist cmdlist[] = {
@@ -49,9 +49,10 @@ inittokenlist(void)
 {
 	int i;
 
-	tokenlist = malloc(ntoken*sizeof(Token));
-	memmove(tokenlist, tokenlistinit, ntoken*sizeof(Token));
-	for(i = 0; i< Ntoken; i++){
+	ntoken = nelem(tokenlistinit);
+	tokenlist = malloc(sizeof(tokenlistinit));
+	memmove(tokenlist, tokenlistinit, sizeof(tokenlistinit));
+	for(i = 0; i< ntoken; i++){
 		tokenlist[i].name = strdup(tokenlist[i].name);
 		catsetinit(&tokenlist[i].categories, tokenlist[i].value);
 	}

+ 436 - 0
sys/src/games/sudoku/game.c

@@ -0,0 +1,436 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+
+#include "sudoku.h"
+
+int allowbits[Brdsize] = {
+	0x00100,
+	0x00200,
+	0x00400,
+	0x00800,
+	0x01000,
+	0x02000,
+	0x04000,
+	0x08000,
+	0x10000
+};
+
+int boxind[Brdsize][Brdsize] = {
+	{0,1,2,9,10,11,18,19,20},
+	{3,4,5,12,13,14,21,22,23},
+	{6,7,8,15,16,17,24,25,26},
+	{27,28,29,36,37,38,45,46,47},
+	{30,31,32,39,40,41,48,49,50},
+	{33,34,35,42,43,44,51,52,53},
+	{54,55,56,63,64,65,72,73,74},
+	{57,58,59,66,67,68,75,76,77},
+	{60,61,62,69,70,71,78,79,80},
+};
+int colind[Brdsize][Brdsize] = {
+	{0,9,18,27,36,45,54,63,72},
+	{1,10,19,28,37,46,55,64,73},
+	{2,11,20,29,38,47,56,65,74},
+	{3,12,21,30,39,48,57,66,75},
+	{4,13,22,31,40,49,58,67,76},
+	{5,14,23,32,41,50,59,68,77},
+	{6,15,24,33,42,51,60,69,78},
+	{7,16,25,34,43,52,61,70,79},
+	{8,17,26,35,44,53,62,71,80},
+};
+int rowind[Brdsize][Brdsize] = {
+	{0,1,2,3,4,5,6,7,8},
+	{9,10,11,12,13,14,15,16,17},
+	{18,19,20,21,22,23,24,25,26},
+	{27,28,29,30,31,32,33,34,35},
+	{36,37,38,39,40,41,42,43,44},
+	{45,46,47,48,49,50,51,52,53},
+	{54,55,56,57,58,59,60,61,62},
+	{63,64,65,66,67,68,69,70,71},
+	{72,73,74,75,76,77,78,79,80},
+};
+
+static int maxlevel;
+static int solved;
+
+void
+printbrd(int *board)
+{
+	int i;
+
+	for(i = 0; i < Psize; i++) {
+		if(i > 0 && i % Brdsize == 0) 
+			print("\n");
+		print("%2.2d ", board[i] & Digit);
+	}
+	print("\n");
+}
+
+int
+getrow(int cell)
+{
+	return cell/9;
+}
+
+int
+getcol(int cell)
+{
+	return cell%9;
+}
+
+int
+getbox(int cell)
+{
+	int row = getrow(cell);
+	int col = getcol(cell);
+
+	return 3*(row/3)+ col/3;
+}
+
+void
+setdigit(int cc, int num)
+{
+	board[cc] = (board[cc] & ~Digit) | num;
+}
+
+int
+boxcheck(int *board)
+{
+	int i,j,d,sum,last,last2;
+
+	for (i = 0; i < 9; i++) {
+		for (d = 0;d < 9; d++) {
+			sum=0;
+			last=-1;
+			last2=-1;
+			for (j = 0; j < 9; j++) {
+				if (board[boxind[i][j]] & allowbits[d]) {
+					sum++;
+					last2=last;
+					last=boxind[i][j];
+				} else
+					sum += ((board[boxind[i][j]] & Solve)==(d << 4)) ? 1: 0;
+			}
+			if (sum==0) 
+				return(0);
+			if ((sum==1)&&(last>=0))
+				if (!setallowed(board,last,d)) 
+					return(0);
+
+			if((sum == 2) && (last >= 0) && ( last2 >= 0) && 
+					(getrow(last) == getrow(last2))) {
+				for (j = 0; j < 9; j++) {
+					int c = rowind[getrow(last)][j];
+					if ((c != last)&&(c != last2)) {
+						if (board[c] & allowbits[d]) {
+							board[c] &= ~allowbits[d];
+							if ((board[c] & Allow)==0) 
+								return(0);
+						}
+					}
+				}
+			}
+			if((sum == 2) && (last >= 0) && (last2 >= 0) &&
+					(getcol(last) == getcol(last2))) {
+				for (j = 0;j  <9;j++) {
+					int c = colind[getcol(last)][j];
+					if ((c != last) && (c != last2)) {
+						if (board[c] & allowbits[d]) {
+							board[c] &= ~allowbits[d];
+							if ((board[c] & Allow) == 0) 
+								return(0);
+						}
+					}
+				}
+			}
+		}
+	}
+	return(1);
+}
+
+int
+rowcheck(int *board)
+{
+	int i,j,d,sum,last;
+
+	for (i = 0; i < 9; i++) {
+		for (d = 0; d < 9; d++) {
+			sum = 0;
+			last = -1;
+			for (j = 0; j <9 ; j++) {
+				if (board[rowind[i][j]] & allowbits[d]) {
+					sum++;
+					last = j;
+				} else
+					sum += ((board[rowind[i][j]] & Solve) == (d << 4)) ? 1: 0;
+			}
+			if (sum == 0) 
+				return(0);
+			if ((sum == 1) && (last >= 0)) {
+				if (!setallowed(board, rowind[i][last], d)) 
+						return(0);
+			}
+		}
+	}
+	return(1);
+}
+
+int
+colcheck(int *board)
+{
+	int i,j,d,sum,last;
+
+	for (i = 0; i < 9; i++) {
+		for (d = 0; d < 9; d++) {
+			sum = 0;
+			last = -1;
+			for (j = 0;j < 9;j++) {
+				if (board[colind[i][j]] & allowbits[d]) {
+					sum++;
+					last = j;
+				} else
+					sum += ((board[colind[i][j]] & Solve) == (d << 4)) ? 1: 0;
+			}
+			if (sum == 0) 
+				return(0);
+			if ((sum == 1) && (last >= 0)) {
+				if (!setallowed(board, colind[i][last], d)) 
+					return(0);
+			}
+		}
+	}
+	return(1);
+}
+
+int
+setallowed(int *board, int cc, int num)
+{
+	int j, d;
+	int row, col, box;
+
+	board[cc] &= ~Allow;
+	board[cc] = (board[cc] & ~Solve) | (num << 4);
+
+	row = getrow(cc);
+	for (j = 0; j < 9; j++) {
+		if (board[rowind[row][j]] & allowbits[num]) {
+			board[rowind[row][j]] &= ~allowbits[num];
+			if ((board[rowind[row][j]] & Allow) == 0) 
+				return(0);
+		}
+	}
+
+	col = getcol(cc);
+	for (j = 0; j < 9; j++) {
+		if (board[colind[col][j]] & allowbits[num]) {
+			board[colind[col][j]] &= ~allowbits[num];
+			if ((board[colind[col][j]] & Allow) == 0) 
+				return(0);
+		}
+	}
+
+	box = getbox(cc);
+	for (j = 0;j < 9;j++) {
+		if (board[boxind[box][j]] & allowbits[num]) {
+			board[boxind[box][j]] &= ~allowbits[num];
+			if ((board[boxind[box][j]] & Allow)==0) 
+				return(0);
+		}
+	}
+
+	for (j = 0;j < 81; j++)
+		for (d = 0; d < 9; d++)
+			if ((board[j] & Allow) == allowbits[d])
+				if (!setallowed(board, j, d)) 
+					return(0);
+
+	if (!boxcheck(board)||!rowcheck(board)||!colcheck(board))
+		return(0);
+
+	for (j = 0; j < 81; j++)
+		for (d = 0; d < 9; d++)
+			if ((board[j] & Allow) == allowbits[d])
+				if (!setallowed(board, j, d)) 
+					return(0);
+
+	return(1);
+}
+
+int
+chksolved(int *board)
+{
+	int i;
+
+	for (i = 0; i < Psize; i++)
+		if ((board[i] & Allow) != 0)
+			return 0;
+
+	solved = 1;
+	return solved;
+}
+
+int
+findmove(int *board)
+{
+	int i, d;
+	int s;
+
+	s = nrand(Psize);
+	for (i=(s+1)%81;i!=s;i=(i+1)%81) {
+		if (!(board[i] & Allow)) {
+			d=(board[i] & Solve) >> 4;
+			if ((board[i] & Digit)!=d) 
+				return(i);
+		}
+	}
+	return(-1);
+}
+
+void
+attempt(int *pboard, int level)
+{
+	int tb[Psize];
+	int i, j, k;
+	int s, e;
+
+	if (level > maxlevel)
+		maxlevel = level;
+
+	if (level > 25) 
+		exits("level");	/* too much */
+
+	s = nrand(Psize);
+	for (i = (s + 1) % Psize; i != s; i = (i + 1) % Psize) {
+		if ((pboard[i] & Allow) != 0) {
+			e=nrand(9);
+			for (j = (e + 1) % 9; j != e; j = (j + 1) % 9) {
+				if (pboard[i] & allowbits[j]) {
+					for (k = 0; k < Psize; k++) 
+						tb[k] = pboard[k];
+
+					if (setallowed(tb, i, j)) {
+						tb[i] = (tb[i] & ~Digit) | j;
+						if (chksolved(tb)) {
+							for (k = 0;k < Psize; k++) 
+								pboard[k] = tb[k];
+							return;	/* bad! */
+						}
+
+						attempt(tb, level + 1);
+						if (chksolved(tb)) {
+							for (k = 0; k < Psize; k++) 
+								pboard[k] = tb[k];
+							return;
+						}
+						tb[i] |= Digit;
+						if (level > 25) 
+							return;
+					}
+				}
+			}
+		}
+	}
+}
+
+void
+solve(void)
+{
+	int pboard[Psize];
+	int	i, c;
+
+	if (!solved) {
+		for (i = 0; i < Psize; i++) 
+			pboard[i] = Allow | Solve | Digit;
+
+		for (i = 0; i < Psize; i++) {
+
+			c = board[i] & Digit;
+			if ((0 <= c) && (c < 9)) {
+				if (!setallowed(pboard,i,c)) {
+					print("starting position impossible... failed at cell %d char: %d\n", i, c + 1);
+					return;
+				}
+			}
+		}
+		attempt(pboard,0);
+
+		for (i = 0; i < Psize; i++)
+			board[i] = (board[i] & ~Solve) | (pboard[i] & Solve);
+	}
+}
+
+int
+checklegal(int cc, int d)
+{
+	int hold = board[cc];
+	int j, row, col, box;
+	board[cc] |= Digit;
+
+	row = getrow(cc);
+	for (j = 0; j < Brdsize; j++)
+		if ((board[rowind[row][j]] & Digit) == d) {
+			board[cc] = hold;
+			return(0);
+		}
+
+	col = getcol(cc);
+	for (j = 0; j < Brdsize; j++)
+		if ((board[colind[col][j]] & Digit) == d) {
+			board[cc] = hold;
+			return(0);
+		}
+
+	box = getbox(cc);
+	for (j = 0; j < Brdsize; j++)
+		if ((board[boxind[box][j]] & Digit) == d) {
+			board[cc] = hold;
+			return(0);
+		}
+
+	board[cc]=hold;
+	return(1);
+}
+
+void
+clearp(void)
+{
+	int i;
+	for(i = 0; i < Psize; i++) {
+		board[i] = (Allow | Solve | Digit);
+	}
+	solved = 0;
+}
+
+void
+makep(void)
+{
+	int i,d;
+
+	do {
+		clearp();
+		maxlevel=0;
+
+		for (d = 0; d < Brdsize; d++) {
+			i = nrand(Psize);
+			if (board[i] & allowbits[d]) {
+				setallowed(board, i, d);
+				board[i] = (board[i] & ~Digit) | d;
+			}
+		}
+
+		attempt(board, 0);
+
+		for (i = 0; i < Psize; i++) {
+			if ((0 <= (board[i] & Digit)) && ((board[i] & Digit) < 9))
+				board[i] |= MLock;
+			setdigit(i, board[i] & Digit);
+		}
+
+		if (!solved) {
+			fprint(2, "failed to make puzzle\n");
+			exits("failed to make puzzle");
+		}
+
+	} while (!solved);
+
+}

+ 200 - 0
sys/src/games/sudoku/levels.c

@@ -0,0 +1,200 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <draw.h>
+
+#include "sudoku.h"
+
+void
+consumeline(Biobuf *b)
+{
+	while(Bgetc(b) != '\n')
+		;
+}
+
+void
+fprettyprintbrd(Cell *board)
+{
+	int x, y, fd;
+
+	fd = create("/tmp/sudoku-print", OWRITE|OTRUNC, 0600);
+	if(fd < 0) {
+		perror("can not open save file /tmp/sudoku-save");
+		return;
+	}
+
+	for(x = 0; x < Brdsize; x++) {
+		for(y = 0; y < Brdsize; y++) {
+			fprint(fd, " ");
+			if(board[y*Brdsize + x].digit == -1)
+				fprint(fd, ".");
+			else
+				fprint(fd, "%d", board[y*Brdsize + x].digit+1);
+
+			if(((x*Brdsize + y + 1) % Brdsize) == 0 || (x*Brdsize + y + 1) == Psize)
+				fprint(fd, "\n");
+
+			if(((x*Brdsize + y + 1) % 3) == 0 && ((x*Brdsize + y + 1) % Brdsize) != 0)
+				fprint(fd, "|");
+
+			if(((x*Brdsize + y + 1) % 27) == 0 && ((x*Brdsize + y + 1) % Psize) != 0)
+				fprint(fd, " -------------------\n");
+
+		}
+	}
+	close(fd);
+}
+
+void
+fprintbrd(int fd, Cell *board)
+{
+	int i;
+	
+	for(i = 0; i < Psize; i++) {
+		if(board[i].digit == -1)
+			fprint(fd, ".");
+		else
+			fprint(fd, "%d", board[i].digit+1);
+
+		if((i + 1) % Brdsize == 0)
+			fprint(fd, "\n");
+	}
+	for(i = 0; i < Psize; i++) {
+		fprint(fd, "%d", board[i].solve+1);
+		if((i + 1) % Brdsize == 0)
+			fprint(fd, "\n");
+	}
+
+	close(fd);
+}
+
+int
+loadlevel(char *name, Cell *board)
+{
+	Biobuf *b;
+	char c;
+	int i;
+	
+	b = Bopen(name, OREAD);
+	if(b == nil) {
+		fprint(2, "could not open file %s: %r\n", name);
+		return -1;
+	}
+
+	i = 0;
+	while((c = Bgetc(b)) > 0) {
+		switch(c) {
+		case '.':
+			board[i].digit = -1;
+			board[i].locked = 0;
+			if(++i == 81)
+				goto next;
+			break;
+		case 0x31:
+		case 0x32:
+		case 0x33:
+		case 0x34:
+		case 0x35:
+		case 0x36:
+		case 0x37:
+		case 0x38:
+		case 0x39:
+			board[i].digit = c - 0x31;
+			board[i].locked = 1;
+			if(++i == 81)
+				goto next;
+			break;
+		case '\n':
+			break;
+		default:
+			fprint(2, "unknown character in initial board: %c\n", c);
+			goto done;
+		}
+	}
+next:
+	i = 0;
+	while((c = Bgetc(b)) > 0) {
+		switch(c) {
+		case 0x31:
+		case 0x32:
+		case 0x33:
+		case 0x34:
+		case 0x35:
+		case 0x36:
+		case 0x37:
+		case 0x38:
+		case 0x39:
+			board[i].solve = c - 0x31;
+			if(++i == 81)
+				goto done;
+			break;
+		case '\n':
+			break;
+		default:
+			fprint(2, "unknown character in board solution: %c\n", c);
+			goto done;
+		}
+	}
+
+done:
+	Bterm(b);
+
+	return i < 81 ? 0 : 1;
+}
+
+void
+printboard(Cell *board)
+{
+	int fd;
+	
+	fd = create("/tmp/sudoku-board", OWRITE|OTRUNC, 0600);
+	if(fd < 0) {
+		perror("can not open save file /tmp/sudoku-save");
+		return;
+	}
+
+	fprintbrd(fd, board);
+
+	close(fd);
+}
+
+void
+savegame(Cell *board)
+{
+	int fd;
+	
+	fd = create("/tmp/sudoku-save", OWRITE|OTRUNC, 0600);
+	if(fd < 0) {
+		perror("can not open save file /tmp/sudoku-save");
+		return;
+	}
+
+	if(write(fd, board, Psize * sizeof(Cell)) != Psize * sizeof(Cell)) {
+		perror("could not save to file");
+		close(fd);
+	}
+
+	close(fd);
+}
+
+int
+loadgame(Cell *board)
+{
+	int fd;
+
+	fd = open("/tmp/sudoku-save", OREAD);
+	if(fd < 0) {
+		perror("can not open save file /tmp/sudoku-save");
+		return -1;
+	}
+
+	if(read(fd, board, Psize * sizeof(Cell)) != Psize * sizeof(Cell)) {
+		perror("insufficient data in save file");
+		close(fd);
+		return -1;
+	}
+	
+	close(fd);
+
+	return 1;
+}

+ 18 - 0
sys/src/games/sudoku/mkfile

@@ -0,0 +1,18 @@
+</$objtype/mkfile
+BIN=/$objtype/bin/games
+
+TARG=sudoku
+OFILES=\
+	sudoku.$O\
+	levels.$O\
+	game.$O\
+
+HFILES=sudoku.h\
+
+UPDATE=\
+	mkfile\
+	$HFILES\
+	${OFILES:%.$O=%.c}\
+	`{ls /sys/games/lib/sudoku/*}
+
+</sys/src/cmd/mkone

+ 422 - 0
sys/src/games/sudoku/sudoku.c

@@ -0,0 +1,422 @@
+/* code from mark huckvale: http://www.phon.ucl.ac.uk/home/mark/sudoku/ */
+
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <event.h>
+
+#include "sudoku.h"
+
+char *imgdir = "/sys/games/lib/sudoku/images";
+char *lvldir = "/sys/games/lib/sudoku/boards";	/* level library dir */
+
+int selected;	/* which digit do we have selected? */
+
+Image *background;	/* DPaleyellow */
+Image *backselect;	/* DPalebluegreen */
+Image *blink;		/* DDarkyellow */
+Image *brdr;		/* 0x55555555 */
+Image *fixed;		/* DBlue */
+Image *wrong;		/* DRed */
+Image *dig[10];		/* digit masks */
+
+Dir *dir;
+int numlevels;
+int curlevel;
+
+char *buttons[] = 
+{
+	"new",
+	"check",
+	"solve",
+	"clear",
+	"save",
+	"load",
+	"print",
+	"offline",
+	"exit",
+	0
+};
+
+Menu menu = 
+{
+	buttons
+};
+
+Menu lmenu =
+{
+	nil,
+	genlevels,
+	0,
+};
+
+int
+readlevels(char *leveldir)
+{
+	int fd, n;
+
+	if((fd = open(leveldir, OREAD)) < 0)
+		return -1;
+
+	n = dirreadall(fd, &dir);
+	close(fd);
+
+	return n;	
+}
+
+char *
+genlevels(int i)
+{
+	if(numlevels == 0)
+		numlevels = readlevels(lvldir);
+	
+	if(numlevels > 0 && i < numlevels)
+		return (dir+i)->name;
+
+	return nil;
+}
+
+void
+convert(Cell *brd, int *board)
+{
+	int i;
+	
+	for(i = 0; i < Psize; i++) {
+		brd[i].digit = board[i] & Digit;
+		if(brd[i].digit < 0 || brd[i].digit > 9)
+			brd[i].digit = -1;
+		brd[i].solve = (board[i] & Solve) >> 4;
+		brd[i].locked = board[i] & MLock;
+	}
+	memcpy(obrd, brd, Psize * sizeof(Cell));
+}
+
+Image *
+eallocimage(Rectangle r, int repl, uint color)
+{
+	Image *tmp;
+
+	tmp = allocimage(display, r, screen->chan, repl, color);
+	if(tmp == nil)
+		sysfatal("cannot allocate buffer image: %r");
+
+	return tmp;
+}
+
+Image *
+eloadfile(char *path)
+{
+	Image *img;
+	int fd;
+
+	fd = open(path, OREAD);
+	if(fd < 0) {
+		fprint(2, "cannot open image file %s: %r\n", path);
+		exits("image");
+	}
+	img = readimage(display, fd, 0);
+	if(img == nil)
+		sysfatal("cannot load image: %r");
+	close(fd);
+	
+	return img;
+}
+
+
+void
+clearboard(Cell *board)
+{
+	int i;
+	
+	for(i = 0; i < Psize; i++) {
+		board[i].digit = -1;
+		board[i].solve = 0;
+		board[i].locked = 0;
+	}
+}
+
+void
+solveboard(Cell *board)
+{
+	int i;
+
+	for(i = 0; i < Psize; i++) {
+		board[i].digit = board[i].solve;
+	}
+}
+
+
+int
+checkpossible(Cell *board, int x, int y, int num)
+{
+	int i, j;
+
+	for(i = 0; i < Brdsize; i++) {
+		if(board[i*Brdsize + y].digit == num && i != x)
+			return 0;
+		if(board[x*Brdsize + i].digit == num && i != y)	
+			return 0;
+	}
+
+	for(i = x - (x%3); i < x - (x%3) + 3; i++)
+		for(j = y - (y%3); j < y - (y%3) + 3; j++)
+			if((i != x && j != y) && board[i*Brdsize + j].digit == num)
+				return 0;
+
+	return 1;
+}
+
+void
+resize(void)
+{
+	int fd;
+
+	fd = open("/dev/wctl", OWRITE);
+	if(fd >= 0){
+		fprint(fd, "resize -dx %d -dy %d", Maxx, Maxy);
+		close(fd);
+	}
+
+}
+
+void
+drawcell(int x, int y, int num, Image *col)
+{
+	Rectangle r = Rect(x*Square, y*Square, (x+1)*Square, (y+1)*Square);
+
+	if(num < 0 || num > 9)
+		return;
+
+	r = insetrect(r, Border);
+	r = rectaddpt(r, Pt(0, Square));
+	r.max = addpt(r.max, Pt(2, 2));
+	
+	draw(screen, rectaddpt(r, screen->r.min), col, dig[num], ZP);
+}
+
+void
+drawboard(void)
+{
+	int i;
+
+	for(i = 0; i < Psize; i++) {
+		drawcell(i / Brdsize, i % Brdsize, brd[i].digit, brd[i].locked ? fixed : display->black);
+	}
+}
+
+void
+drawchecked(Cell *brd)
+{
+	int i;
+
+	for(i = 0; i < Psize; i++) {
+		if(brd[i].locked)
+			drawcell(i / Brdsize, i % Brdsize, brd[i].digit, fixed);
+		else 
+			drawcell(i / Brdsize, i % Brdsize, brd[i].digit, 
+					checkpossible(brd, i / Brdsize, i % Brdsize, brd[i].digit) ? display->black : wrong);
+	}
+}
+
+void
+drawscreen(void)
+{
+	Point l1, l2;
+	int i;
+
+	draw(screen, screen->r, brdr, nil, ZP);
+	draw(screen, insetrect(screen->r, Border), background, nil, ZP);
+	for(i = 0; i < Brdsize; i++) {
+		l1 = addpt(screen->r.min, Pt(i*Square, Square));
+		l2 = addpt(screen->r.min, Pt(i*Square, Maxy));
+		line(screen, l1, l2, Endsquare, Endsquare, (i%3) == 0 ? Thickline : Line, brdr, ZP); 
+		l1 = addpt(screen->r.min, Pt(0, (i+1)*Square));
+		l2 = addpt(screen->r.min, Pt(Maxx, (i+1)*Square));
+		line(screen, l1, l2, Endsquare, Endsquare, (i%3) == 0 ? Thickline : Line, brdr, ZP); 
+	}
+	for(i = 1; i < 10; i++) {
+		drawbar(i, (selected == i) ? 1 : 0);
+	}
+	drawboard();
+	flushimage(display, 1);
+}
+
+
+void
+drawbar(int digit, int selected)
+{
+	Rectangle r = Rect((digit - 1)*Square, 0, digit*Square, Square);
+
+	if(digit < 1 || digit > 9)
+		return;
+
+	r = insetrect(r, Border);
+	r.max = addpt(r.max, Pt(2, 2));
+	draw(screen, rectaddpt(r, screen->r.min), selected ? backselect : background, nil, ZP);
+	draw(screen, rectaddpt(r, screen->r.min), display->black, dig[digit-1], ZP);
+}
+
+void
+eresized(int new)
+{
+	Point p;
+	char path[256];
+	int i;
+
+	if(new && getwindow(display, Refnone) < 0)
+		sysfatal("can't reattach to window");
+	
+	if(background == nil) 
+		background = eallocimage(Rect(0, 0, 1, 1), 1, DPaleyellow);
+	if(backselect == nil) 
+		backselect = eallocimage(Rect(0, 0, 1, 1), 1, DPalebluegreen);
+	if(blink == nil) 
+		blink = eallocimage(Rect(0, 0, 1, 1), 1, DDarkyellow);
+	if(brdr == nil)
+		brdr = eallocimage(Rect(0, 0, 1, 1), 1, 0x55555555);
+	if(fixed == nil)
+		fixed = eallocimage(Rect(0, 0, 1, 1), 1, DBlue);
+	if(wrong == nil)
+		wrong = eallocimage(Rect(0, 0, 1, 1), 1, DRed);
+	if(dig[0] == nil) {
+		for(i = 0; i < 9; i++) {
+			snprint(path, 256, "%s/%d.bit", imgdir, i+1);
+			dig[i] = eloadfile(path);
+		}
+	}
+
+	p = Pt(Dx(screen->r), Dy(screen->r));
+	if(!new || !eqpt(p, Pt(Maxx, Maxy))) {
+		resize();
+	}
+	drawscreen();
+}
+
+void
+main(int argc, char *argv[])
+{
+	Mouse m;
+	Event e;
+	Point p;
+	int last1 = 0;	/* was the button clicked last time? */
+
+	USED(argc, argv);
+
+	if(initdraw(nil, nil, "sudoku") < 0)
+		sysfatal("initdraw failed: %r");
+
+	einit(Emouse|Ekeyboard);
+
+
+	clearboard(brd);
+	eresized(0);
+
+	srand(time(0)*getpid());
+	makep();
+	convert(brd, board);
+
+	drawscreen();
+	for(;;) {
+		switch(event(&e)) {
+		case Emouse:
+			m = e.mouse;
+			if(m.buttons&1) {
+				if(last1 == 0) {
+					last1 = 1;
+					p = subpt(m.xy, screen->r.min);
+					if(ptinrect(p, Rect(0, 0, Maxx, Square+Border))) {
+						if(p.x/Square == selected - 1) {
+							drawbar(selected, 0);
+							selected = 0;
+						} else {
+							selected = p.x/Square + 1;
+						}
+					} else {
+						Point lp = divpt(p, Square);
+						lp.y--;
+
+						if(brd[lp.x * Brdsize + lp.y].locked)
+							break;
+
+						if(selected) {
+							brd[lp.x * Brdsize + lp.y].digit = selected - 1;
+						} else {
+							brd[lp.x * Brdsize + lp.y].digit = -1;
+						}			
+					}
+					drawscreen();
+				}
+			} else {
+				last1 = 0;
+			}
+
+			if(m.buttons&2) {
+				char *str;
+				int l;
+				/* levels start from 1 */
+				lmenu.lasthit = curlevel;
+				l = emenuhit(2, &m, &lmenu);
+				if(l >= 0){
+					curlevel = l;
+					str = smprint("%s/%s", lvldir, (dir+curlevel)->name);
+					if(loadlevel(str, brd) < 0)
+						clearboard(brd);
+					memcpy(obrd, brd, Psize * sizeof(Cell));
+					free(str);
+				}
+				drawscreen();
+			}
+			if(m.buttons&4) {
+				switch(emenuhit(3, &m, &menu)) {
+				case 0: 	/* new */
+					makep();
+					convert(brd, board);
+					drawscreen();
+					break;
+				case 1:		/* solve */
+					drawchecked(brd);
+					break;
+				case 2:		/* solve */
+					solveboard(brd);
+					drawscreen();
+					break;
+				case 3:		/* clear */
+					memcpy(brd, obrd, Psize * sizeof(Cell));
+					drawscreen();
+					break;
+				case 4:		/* save */
+					savegame(brd);
+					drawscreen();
+					break;
+				case 5:		/* load */
+					if(loadgame(brd) < 0) {
+						clearboard(brd);
+					}
+					memcpy(obrd, brd, Psize * sizeof(Cell));
+					drawscreen();
+					break;
+				case 6:		/* print */
+					printboard(brd);
+					break;
+				case 7:		/* offline */
+					fprettyprintbrd(brd);
+					break;
+				case 8:		/* exit */
+					exits(nil);
+				}
+			}
+			break;
+
+		case Ekeyboard:
+			switch(e.kbdc) {
+			case 127:
+			case 'q':
+			case 'Q':
+				exits(nil);
+			default:
+				break;
+			}
+			break;
+		}
+	}
+}

+ 55 - 0
sys/src/games/sudoku/sudoku.h

@@ -0,0 +1,55 @@
+enum{
+	Brdsize 	= 9,
+	Psize 		= Brdsize * Brdsize,
+	Alldigits 	= 0x1FF,
+	Digit 		= 0x0000000F,
+	Solve 		= 0x000000F0,
+	Allow 		= 0x0001FF00,
+	MLock 		= 0x00020000,
+
+	Line 		= 0,
+	Thickline 	= 1,
+	Border 		= Thickline*4,
+	Square 		= 48,
+	Maxx 		= Square*9 + 2*Border,
+	Maxy 		= Maxx + Square,
+};
+
+typedef struct Cell {
+	int digit;
+	int solve;
+	int locked;
+} Cell;
+
+Cell	brd[Psize];
+Cell	obrd[Psize];
+int		board[Psize];
+
+/* game.c */
+int getrow(int cell);
+int getcol(int cell);
+int getbox(int cell);
+void setdigit(int cc, int num);
+int boxcheck(int *board);
+int rowcheck(int *board);
+int colcheck(int *board);
+int setallowed(int *board, int cc, int num);
+int chksolved(int *board);
+void attempt(int *pboard, int level);
+void clearp(void);
+void makep(void);
+
+/* sudoku.c */
+void drawbar(int digit, int selected);
+void drawcell(int x, int y, int num, Image *col);
+void drawblink(int cell);
+char *genlevels(int i);
+
+/* levels.c */
+void fprettyprintbrd(Cell *board);
+void fprintbrd(int fd, Cell *board);
+void floadbrd(int fd, Cell *board);
+void printboard(Cell *board);
+int loadlevel(char *name, Cell *board);
+void savegame(Cell *board);
+int loadgame(Cell *board);

+ 6 - 0
sys/src/libauthsrv/readnvram.c

@@ -209,6 +209,12 @@ readnvram(Nvrsafe *safep, int flag)
 //		err |= check(safe->config, CONFIGLEN, safe->configsum, "bad secstore key");
 		err |= check(safe->authid, ANAMELEN, safe->authidsum, "bad authentication id");
 		err |= check(safe->authdom, DOMLEN, safe->authdomsum, "bad authentication domain");
+
+		if(err == 0)
+		if(safe->authid[0]==0 || safe->authdom[0]==0){
+			fprint(2, "empty nvram authid or authdom\n");
+			err = 1;
+		}
 	}
 
 	if((flag&NVwrite) || (err && (flag&NVwriteonerr))){

+ 1 - 1
sys/src/libc/9sys/convD2M.c

@@ -50,7 +50,7 @@ convD2M(Dir *d, uchar *buf, uint nbuf)
 
 	ss = STATFIXLEN + ns;
 
-	/* set size befor erroring, so user can know how much is needed */
+	/* set size before erroring, so user can know how much is needed */
 	/* note that length excludes count field itself */
 	PBIT16(p, ss-BIT16SZ);
 	p += BIT16SZ;