1b39c5158Smillert#!perl -w 2b39c5158Smillert 3898184e3SsthenBEGIN { 4898184e3Ssthen unshift @INC, 't/compat' if $] < 5.006002; 5898184e3Ssthen}; 6898184e3Ssthen 7b39c5158Smillertuse strict; 8b39c5158Smillertuse Test::More; 9b39c5158Smillertuse Storable qw(store nstore); 10b39c5158Smillertuse Config qw(%Config); 11b39c5158Smillert 12b39c5158Smillert# The @tests array below was create by the following program 13b39c5158Smillertmy $dummy = <<'EOT'; 14b39c5158Smillertuse Storable; 15b39c5158Smillertuse Data::Dump qw(dump); 16b39c5158Smillert 17b39c5158Smillertprint "my \@tests = (\n"; 18b39c5158Smillertfor my $f (<data_*>) { 19b39c5158Smillert print " [\n"; 20b39c5158Smillert print " " . dump(substr(`cat $f`, 0, 32) . "...") , ",\n"; 21b39c5158Smillert 22b39c5158Smillert my $x = dump(Storable::file_magic($f)); 23b39c5158Smillert $x =~ s/^/ /gm; 24b39c5158Smillert print "$x,\n"; 25b39c5158Smillert 26b39c5158Smillert print " ],\n"; 27b39c5158Smillert} 28b39c5158Smillertprint ");\n"; 29b39c5158SmillertEOT 30b39c5158Smillert 31b39c5158Smillertmy @tests = ( 32b39c5158Smillert [ 33b39c5158Smillert "perl-store\x041234\4\4\4\xD4\xC2\32\b\3\13\0\0\0v\b\xC5\32\b...", 34b39c5158Smillert { 35b39c5158Smillert byteorder => 1234, 36b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.1.le32", 37b39c5158Smillert hdrsize => 18, 38b39c5158Smillert intsize => 4, 39b39c5158Smillert longsize => 4, 40b39c5158Smillert netorder => 0, 41b39c5158Smillert ptrsize => 4, 42b39c5158Smillert version => -1, 43b39c5158Smillert version_nv => -1, 44b39c5158Smillert }, 45b39c5158Smillert ], 46b39c5158Smillert [ 47b39c5158Smillert "perl-store\0\x041234\4\4\4\x8Co\34\b\3\13\0\0\0v\x94v\34...", 48b39c5158Smillert { 49b39c5158Smillert byteorder => 1234, 50b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.4_07.le32", 51b39c5158Smillert hdrsize => 19, 52b39c5158Smillert intsize => 4, 53b39c5158Smillert longsize => 4, 54b39c5158Smillert major => 0, 55b39c5158Smillert netorder => 0, 56b39c5158Smillert ptrsize => 4, 57b39c5158Smillert version => 0, 58b39c5158Smillert version_nv => 0, 59b39c5158Smillert }, 60b39c5158Smillert ], 61b39c5158Smillert [ 62b39c5158Smillert "perl-store\1\x8Co\34\b\3\0\0\0\13v\x94v\34\b\1\0\0\4\0\0\0...", 63b39c5158Smillert { 64b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.4_07.neutral", 65b39c5158Smillert hdrsize => 11, 66b39c5158Smillert major => 0, 67b39c5158Smillert netorder => 1, 68b39c5158Smillert version => 0, 69b39c5158Smillert version_nv => 0, 70b39c5158Smillert }, 71b39c5158Smillert ], 72b39c5158Smillert [ 73b39c5158Smillert "pst0\2\x041234\4\4\4\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0\0\0...", 74b39c5158Smillert { 75b39c5158Smillert byteorder => 1234, 76b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.604.le32", 77b39c5158Smillert hdrsize => 13, 78b39c5158Smillert intsize => 4, 79b39c5158Smillert longsize => 4, 80b39c5158Smillert major => 1, 81b39c5158Smillert netorder => 0, 82b39c5158Smillert ptrsize => 4, 83b39c5158Smillert version => 1, 84b39c5158Smillert version_nv => 1, 85b39c5158Smillert }, 86b39c5158Smillert ], 87b39c5158Smillert [ 88b39c5158Smillert "pst0\3\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 89b39c5158Smillert { 90b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.604.neutral", 91b39c5158Smillert hdrsize => 5, 92b39c5158Smillert major => 1, 93b39c5158Smillert netorder => 1, 94b39c5158Smillert version => 1, 95b39c5158Smillert version_nv => 1, 96b39c5158Smillert }, 97b39c5158Smillert ], 98b39c5158Smillert [ 99b39c5158Smillert "pst0\4\0\x041234\4\4\4\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0\0...", 100b39c5158Smillert { 101b39c5158Smillert byteorder => 1234, 102b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.700.le32", 103b39c5158Smillert hdrsize => 14, 104b39c5158Smillert intsize => 4, 105b39c5158Smillert longsize => 4, 106b39c5158Smillert major => 2, 107b39c5158Smillert minor => 0, 108b39c5158Smillert netorder => 0, 109b39c5158Smillert ptrsize => 4, 110b39c5158Smillert version => "2.0", 111b39c5158Smillert version_nv => "2.000", 112b39c5158Smillert }, 113b39c5158Smillert ], 114b39c5158Smillert [ 115b39c5158Smillert "pst0\5\0\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 116b39c5158Smillert { 117b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.700.neutral", 118b39c5158Smillert hdrsize => 6, 119b39c5158Smillert major => 2, 120b39c5158Smillert minor => 0, 121b39c5158Smillert netorder => 1, 122b39c5158Smillert version => "2.0", 123b39c5158Smillert version_nv => "2.000", 124b39c5158Smillert }, 125b39c5158Smillert ], 126b39c5158Smillert [ 127b39c5158Smillert "pst0\4\4\x041234\4\4\4\x08\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0...", 128b39c5158Smillert { 129b39c5158Smillert byteorder => 1234, 130b39c5158Smillert file => "data_perl-5.006001_i686-linux-thread-multi_Storable-1.012.le32", 131b39c5158Smillert hdrsize => 15, 132b39c5158Smillert intsize => 4, 133b39c5158Smillert longsize => 4, 134b39c5158Smillert major => 2, 135b39c5158Smillert minor => 4, 136b39c5158Smillert netorder => 0, 137b39c5158Smillert nvsize => 8, 138b39c5158Smillert ptrsize => 4, 139b39c5158Smillert version => "2.4", 140b39c5158Smillert version_nv => "2.004", 141b39c5158Smillert }, 142b39c5158Smillert ], 143b39c5158Smillert [ 144b39c5158Smillert "pst0\4\3\x044321\4\4\4\x08\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0...", 145b39c5158Smillert { 146b39c5158Smillert byteorder => 4321, 147b39c5158Smillert file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.006.be32", 148b39c5158Smillert hdrsize => 15, 149b39c5158Smillert intsize => 4, 150b39c5158Smillert longsize => 4, 151b39c5158Smillert major => 2, 152b39c5158Smillert minor => 3, 153b39c5158Smillert netorder => 0, 154b39c5158Smillert nvsize => 8, 155b39c5158Smillert ptrsize => 4, 156b39c5158Smillert version => "2.3", 157b39c5158Smillert version_nv => "2.003", 158b39c5158Smillert }, 159b39c5158Smillert ], 160b39c5158Smillert [ 161b39c5158Smillert "pst0\5\3\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 162b39c5158Smillert { 163b39c5158Smillert file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.006.neutral", 164b39c5158Smillert hdrsize => 6, 165b39c5158Smillert major => 2, 166b39c5158Smillert minor => 3, 167b39c5158Smillert netorder => 1, 168b39c5158Smillert version => "2.3", 169b39c5158Smillert version_nv => "2.003", 170b39c5158Smillert }, 171b39c5158Smillert ], 172b39c5158Smillert [ 173b39c5158Smillert "pst0\4\4\x044321\4\4\4\x08\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0...", 174b39c5158Smillert { 175b39c5158Smillert byteorder => 4321, 176b39c5158Smillert file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.012.be32", 177b39c5158Smillert hdrsize => 15, 178b39c5158Smillert intsize => 4, 179b39c5158Smillert longsize => 4, 180b39c5158Smillert major => 2, 181b39c5158Smillert minor => 4, 182b39c5158Smillert netorder => 0, 183b39c5158Smillert nvsize => 8, 184b39c5158Smillert ptrsize => 4, 185b39c5158Smillert version => "2.4", 186b39c5158Smillert version_nv => "2.004", 187b39c5158Smillert }, 188b39c5158Smillert ], 189b39c5158Smillert [ 190b39c5158Smillert "pst0\5\4\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 191b39c5158Smillert { 192b39c5158Smillert file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.012.neutral", 193b39c5158Smillert hdrsize => 6, 194b39c5158Smillert major => 2, 195b39c5158Smillert minor => 4, 196b39c5158Smillert netorder => 1, 197b39c5158Smillert version => "2.4", 198b39c5158Smillert version_nv => "2.004", 199b39c5158Smillert }, 200b39c5158Smillert ], 201b39c5158Smillert [ 202b39c5158Smillert "pst0\4\6\x044321\4\4\4\x08\3\0\0\0\13\n\n4294967296...", 203b39c5158Smillert { 204b39c5158Smillert byteorder => 4321, 205b39c5158Smillert file => "data_perl-5.008001_darwin-thread-multi-2level_Storable-2.08.be32", 206b39c5158Smillert hdrsize => 15, 207b39c5158Smillert intsize => 4, 208b39c5158Smillert longsize => 4, 209b39c5158Smillert major => 2, 210b39c5158Smillert minor => 6, 211b39c5158Smillert netorder => 0, 212b39c5158Smillert nvsize => 8, 213b39c5158Smillert ptrsize => 4, 214b39c5158Smillert version => "2.6", 215b39c5158Smillert version_nv => "2.006", 216b39c5158Smillert }, 217b39c5158Smillert ], 218b39c5158Smillert [ 219b39c5158Smillert "pst0\5\6\3\0\0\0\13\n\n4294967296\0\0\0\bfour_...", 220b39c5158Smillert { 221b39c5158Smillert file => "data_perl-5.008001_darwin-thread-multi-2level_Storable-2.08.neutral", 222b39c5158Smillert hdrsize => 6, 223b39c5158Smillert major => 2, 224b39c5158Smillert minor => 6, 225b39c5158Smillert netorder => 1, 226b39c5158Smillert version => "2.6", 227b39c5158Smillert version_nv => "2.006", 228b39c5158Smillert }, 229b39c5158Smillert ], 230b39c5158Smillert [ 231b39c5158Smillert "pst0\4\6\x044321\4\4\4\x08\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nem...", 232b39c5158Smillert { 233b39c5158Smillert byteorder => 4321, 234b39c5158Smillert file => "data_perl-5.008003_PA-RISC1.1-thread-multi_Storable-2.09.be32", 235b39c5158Smillert hdrsize => 15, 236b39c5158Smillert intsize => 4, 237b39c5158Smillert longsize => 4, 238b39c5158Smillert major => 2, 239b39c5158Smillert minor => 6, 240b39c5158Smillert netorder => 0, 241b39c5158Smillert nvsize => 8, 242b39c5158Smillert ptrsize => 4, 243b39c5158Smillert version => "2.6", 244b39c5158Smillert version_nv => "2.006", 245b39c5158Smillert }, 246b39c5158Smillert ], 247b39c5158Smillert [ 248b39c5158Smillert "pst0\5\6\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 249b39c5158Smillert { 250b39c5158Smillert file => "data_perl-5.008003_PA-RISC1.1-thread-multi_Storable-2.09.neutral", 251b39c5158Smillert hdrsize => 6, 252b39c5158Smillert major => 2, 253b39c5158Smillert minor => 6, 254b39c5158Smillert netorder => 1, 255b39c5158Smillert version => "2.6", 256b39c5158Smillert version_nv => "2.006", 257b39c5158Smillert }, 258b39c5158Smillert ], 259b39c5158Smillert [ 260b39c5158Smillert "pst0\4\6\x0812345678\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0...", 261b39c5158Smillert { 262b39c5158Smillert byteorder => 12_345_678, 263b39c5158Smillert file => "data_perl-5.008004_i86pc-solaris-64int_Storable-2.12.le64", 264b39c5158Smillert hdrsize => 19, 265b39c5158Smillert intsize => 4, 266b39c5158Smillert longsize => 4, 267b39c5158Smillert major => 2, 268b39c5158Smillert minor => 6, 269b39c5158Smillert netorder => 0, 270b39c5158Smillert nvsize => 8, 271b39c5158Smillert ptrsize => 4, 272b39c5158Smillert version => "2.6", 273b39c5158Smillert version_nv => "2.006", 274b39c5158Smillert }, 275b39c5158Smillert ], 276b39c5158Smillert [ 277b39c5158Smillert "pst0\4\6\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 278b39c5158Smillert { 279b39c5158Smillert byteorder => 1234, 280b39c5158Smillert file => "data_perl-5.008006_i686-linux-thread-multi_Storable-2.13.le32", 281b39c5158Smillert hdrsize => 15, 282b39c5158Smillert intsize => 4, 283b39c5158Smillert longsize => 4, 284b39c5158Smillert major => 2, 285b39c5158Smillert minor => 6, 286b39c5158Smillert netorder => 0, 287b39c5158Smillert nvsize => 8, 288b39c5158Smillert ptrsize => 4, 289b39c5158Smillert version => "2.6", 290b39c5158Smillert version_nv => "2.006", 291b39c5158Smillert }, 292b39c5158Smillert ], 293b39c5158Smillert [ 294b39c5158Smillert "pst0\4\6\x0887654321\4\x08\x08\x08\3\0\0\0\13\4\3\0\0\0\0\0\0...", 295b39c5158Smillert { 296b39c5158Smillert byteorder => 87_654_321, 297b39c5158Smillert file => "data_perl-5.008007_IA64.ARCHREV_0-thread-multi-LP64_Storable-2.13.be64", 298b39c5158Smillert hdrsize => 19, 299b39c5158Smillert intsize => 4, 300b39c5158Smillert longsize => 8, 301b39c5158Smillert major => 2, 302b39c5158Smillert minor => 6, 303b39c5158Smillert netorder => 0, 304b39c5158Smillert nvsize => 8, 305b39c5158Smillert ptrsize => 8, 306b39c5158Smillert version => "2.6", 307b39c5158Smillert version_nv => "2.006", 308b39c5158Smillert }, 309b39c5158Smillert ], 310b39c5158Smillert [ 311b39c5158Smillert "pst0\4\x07\x0812345678\4\x08\x08\x08\3\13\0\0\0\4\3\0\0\0\0\n\0...", 312b39c5158Smillert { 313b39c5158Smillert byteorder => 12_345_678, 314b39c5158Smillert file => "data_perl-5.008007_x86-solaris-thread-multi-64_Storable-2.15.le64", 315b39c5158Smillert hdrsize => 19, 316b39c5158Smillert intsize => 4, 317b39c5158Smillert longsize => 8, 318b39c5158Smillert major => 2, 319b39c5158Smillert minor => 7, 320b39c5158Smillert netorder => 0, 321b39c5158Smillert nvsize => 8, 322b39c5158Smillert ptrsize => 8, 323b39c5158Smillert version => "2.7", 324b39c5158Smillert version_nv => "2.007", 325b39c5158Smillert }, 326b39c5158Smillert ], 327b39c5158Smillert [ 328b39c5158Smillert "pst0\5\x07\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 329b39c5158Smillert { 330b39c5158Smillert file => "data_perl-5.008007_x86-solaris-thread-multi-64_Storable-2.15.neutral", 331b39c5158Smillert hdrsize => 6, 332b39c5158Smillert major => 2, 333b39c5158Smillert minor => 7, 334b39c5158Smillert netorder => 1, 335b39c5158Smillert version => "2.7", 336b39c5158Smillert version_nv => "2.007", 337b39c5158Smillert }, 338b39c5158Smillert ], 339b39c5158Smillert [ 340b39c5158Smillert "pst0\4\5\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 341b39c5158Smillert { 342b39c5158Smillert byteorder => 1234, 343b39c5158Smillert file => "data_perl-5.008_i686-linux-thread-multi_Storable-2.04.le32", 344b39c5158Smillert hdrsize => 15, 345b39c5158Smillert intsize => 4, 346b39c5158Smillert longsize => 4, 347b39c5158Smillert major => 2, 348b39c5158Smillert minor => 5, 349b39c5158Smillert netorder => 0, 350b39c5158Smillert nvsize => 8, 351b39c5158Smillert ptrsize => 4, 352b39c5158Smillert version => "2.5", 353b39c5158Smillert version_nv => "2.005", 354b39c5158Smillert }, 355b39c5158Smillert ], 356b39c5158Smillert [ 357b39c5158Smillert "pst0\5\5\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 358b39c5158Smillert { 359b39c5158Smillert file => "data_perl-5.008_i686-linux-thread-multi_Storable-2.04.neutral", 360b39c5158Smillert hdrsize => 6, 361b39c5158Smillert major => 2, 362b39c5158Smillert minor => 5, 363b39c5158Smillert netorder => 1, 364b39c5158Smillert version => "2.5", 365b39c5158Smillert version_nv => "2.005", 366b39c5158Smillert }, 367b39c5158Smillert ], 368b39c5158Smillert [ 369b39c5158Smillert "pst0\4\x07\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 370b39c5158Smillert { 371b39c5158Smillert byteorder => 1234, 372b39c5158Smillert file => "data_perl-5.009003_i686-linux_Storable-2.15.le32", 373b39c5158Smillert hdrsize => 15, 374b39c5158Smillert intsize => 4, 375b39c5158Smillert longsize => 4, 376b39c5158Smillert major => 2, 377b39c5158Smillert minor => 7, 378b39c5158Smillert netorder => 0, 379b39c5158Smillert nvsize => 8, 380b39c5158Smillert ptrsize => 4, 381b39c5158Smillert version => "2.7", 382b39c5158Smillert version_nv => "2.007", 383b39c5158Smillert }, 384b39c5158Smillert ], 385b39c5158Smillert); 386b39c5158Smillert 387b39c5158Smillertplan tests => 31 + 2 * @tests; 388b39c5158Smillert 389b39c5158Smillertmy $file = "xx-$$.pst"; 390b39c5158Smillert 391b39c5158Smillertis(eval { Storable::file_magic($file) }, undef, "empty file give undef"); 392b39c5158Smillertlike($@, qq{/^Can't open '\Q$file\E':/}, "...and croaks"); 393b39c5158Smillertis(Storable::file_magic(__FILE__), undef, "not an image"); 394b39c5158Smillert 395b39c5158Smillertstore({}, $file); 396b39c5158Smillert{ 397b39c5158Smillert my $info = Storable::file_magic($file); 398b39c5158Smillert unlink($file); 399b39c5158Smillert ok($info, "got info"); 400b39c5158Smillert is($info->{file}, $file, "file set"); 401b39c5158Smillert is($info->{hdrsize}, 11 + length($Config{byteorder}), "hdrsize"); 402b39c5158Smillert like($info->{version}, q{/^2\.\d+$/}, "sane version"); 403b39c5158Smillert is($info->{version_nv}, Storable::BIN_WRITE_VERSION_NV, "version_nv match"); 404b39c5158Smillert is($info->{major}, 2, "sane major"); 405b39c5158Smillert ok($info->{minor}, "have minor"); 406b39c5158Smillert ok($info->{minor} >= Storable::BIN_WRITE_MINOR, "large enough minor"); 407b39c5158Smillert 408b39c5158Smillert ok(!$info->{netorder}, "no netorder"); 409b39c5158Smillert 410b39c5158Smillert my %attrs = ( 411b39c5158Smillert nvsize => 5.006, 412b39c5158Smillert ptrsize => 5.005, 413b39c5158Smillert map {$_ => 5.004} qw(byteorder intsize longsize) 414b39c5158Smillert ); 415b39c5158Smillert for my $attr (keys %attrs) { 416b39c5158Smillert SKIP: { 417b39c5158Smillert skip "attribute $attr not available on this version of Perl", 1 if $attrs{$attr} > $]; 418b39c5158Smillert is($info->{$attr}, $Config{$attr}, "$attr match Config"); 419b39c5158Smillert } 420b39c5158Smillert } 421b39c5158Smillert} 422b39c5158Smillert 423b39c5158Smillertnstore({}, $file); 424b39c5158Smillert{ 425b39c5158Smillert my $info = Storable::file_magic($file); 426b39c5158Smillert unlink($file); 427b39c5158Smillert ok($info, "got info"); 428b39c5158Smillert is($info->{file}, $file, "file set"); 429b39c5158Smillert is($info->{hdrsize}, 6, "hdrsize"); 430b39c5158Smillert like($info->{version}, q{/^2\.\d+$/}, "sane version"); 431b39c5158Smillert is($info->{version_nv}, Storable::BIN_WRITE_VERSION_NV, "version_nv match"); 432b39c5158Smillert is($info->{major}, 2, "sane major"); 433b39c5158Smillert ok($info->{minor}, "have minor"); 434b39c5158Smillert ok($info->{minor} >= Storable::BIN_WRITE_MINOR, "large enough minor"); 435b39c5158Smillert 436b39c5158Smillert ok($info->{netorder}, "no netorder"); 437b39c5158Smillert for (qw(byteorder intsize longsize ptrsize nvsize)) { 438b39c5158Smillert ok(!exists $info->{$_}, "no $_"); 439b39c5158Smillert } 440b39c5158Smillert} 441b39c5158Smillert 442b39c5158Smillertfor my $test (@tests) { 443b39c5158Smillert my($data, $expected) = @$test; 444*5759b3d2Safresh1 open(FH, '>', $file) || die "Can't create $file: $!"; 445b39c5158Smillert binmode(FH); 446b39c5158Smillert print FH $data; 447b39c5158Smillert close(FH) || die "Can't write $file: $!"; 448b39c5158Smillert 449b39c5158Smillert my $name = $expected->{file}; 450b39c5158Smillert $expected->{file} = $file; 451b39c5158Smillert 452b39c5158Smillert my $info = Storable::file_magic($file); 453b39c5158Smillert unlink($file); 454b39c5158Smillert 455b39c5158Smillert is_deeply($info, $expected, "file_magic $name"); 456b39c5158Smillert 457b39c5158Smillert $expected->{file} = 1; 458b39c5158Smillert is_deeply(Storable::read_magic($data), $expected, "read magic $name"); 459b39c5158Smillert} 460