Changeset f356618 in mainline for uspace/app/dltest/dltest.c
- Timestamp:
- 2016-05-22T21:05:55Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b3364b7c
- Parents:
- af2254ec (diff), 3a9414e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/dltest/dltest.c
raf2254ec rf356618 43 43 44 44 /** libdltest library handle */ 45 void *handle; 45 static void *handle; 46 47 /** If true, do not run dlfcn tests */ 48 static bool no_dlfcn = false; 46 49 47 50 /** Test dlsym() function */ … … 93 96 { 94 97 int (*p_dl_get_private_var)(void); 98 int *(*p_dl_get_private_var_addr)(void); 95 99 int val; 96 100 … … 103 107 } 104 108 109 p_dl_get_private_var_addr = dlsym(handle, "dl_get_private_var_addr"); 110 if (p_dl_get_private_var_addr == NULL) { 111 printf("FAILED\n"); 112 return false; 113 } 114 105 115 val = p_dl_get_private_var(); 106 116 107 117 printf("Got %d, expected %d... ", val, dl_private_var_val); 108 118 if (val != dl_private_var_val) { 119 printf("dl_get_private_var_addr -> %p\n", 120 p_dl_get_private_var_addr()); 109 121 printf("FAILED\n"); 110 122 return false; … … 121 133 { 122 134 int (*p_dl_get_private_uvar)(void); 135 int *(*p_dl_get_private_uvar_addr)(void); 123 136 int val; 124 137 … … 131 144 } 132 145 146 p_dl_get_private_uvar_addr = dlsym(handle, "dl_get_private_uvar_addr"); 147 if (p_dl_get_private_uvar_addr == NULL) { 148 printf("FAILED\n"); 149 return false; 150 } 151 133 152 val = p_dl_get_private_uvar(); 134 153 135 154 printf("Got %d, expected %d... ", val, 0); 136 155 if (val != 0) { 156 printf("dl_get_private_uvar_addr -> %p\n", 157 p_dl_get_private_uvar_addr()); 137 158 printf("FAILED\n"); 138 159 return false; … … 149 170 { 150 171 int (*p_dl_get_public_var)(void); 172 int *(*p_dl_get_public_var_addr)(void); 151 173 int val; 152 174 … … 159 181 } 160 182 183 p_dl_get_public_var_addr = dlsym(handle, "dl_get_public_var_addr"); 184 if (p_dl_get_public_var_addr == NULL) { 185 printf("FAILED\n"); 186 return false; 187 } 188 161 189 val = p_dl_get_public_var(); 162 190 163 191 printf("Got %d, expected %d... ", val, dl_public_var_val); 164 192 if (val != dl_public_var_val) { 193 printf("dl_get_public_var_addr -> %p\n", 194 p_dl_get_public_var_addr()); 165 195 printf("FAILED\n"); 166 196 return false; … … 177 207 { 178 208 int (*p_dl_get_public_uvar)(void); 209 int *(*p_dl_get_public_uvar_addr)(void); 179 210 int val; 180 211 … … 187 218 } 188 219 220 p_dl_get_public_uvar_addr = dlsym(handle, "dl_get_public_uvar_addr"); 221 if (p_dl_get_public_uvar_addr == NULL) { 222 printf("FAILED\n"); 223 return false; 224 } 225 189 226 val = p_dl_get_public_uvar(); 190 227 191 228 printf("Got %d, expected %d... ", val, 0); 192 229 if (val != 0) { 230 printf("dl_get_public_uvar_addr -> %p\n", 231 p_dl_get_public_uvar_addr()); 193 232 printf("FAILED\n"); 194 233 return false; … … 205 244 { 206 245 int *p_dl_public_var; 246 int *(*p_dl_get_public_var_addr)(void); 207 247 int val; 208 248 … … 215 255 } 216 256 257 p_dl_get_public_var_addr = dlsym(handle, "dl_get_public_var_addr"); 258 if (p_dl_get_public_var_addr == NULL) { 259 printf("FAILED\n"); 260 return false; 261 } 262 217 263 val = *p_dl_public_var; 218 264 219 265 printf("Got %d, expected %d... ", val, dl_public_var_val); 220 266 if (val != dl_public_var_val) { 267 printf("&dl_public_var = %p, " 268 "dl_get_public_var_addr -> %p\n", 269 p_dl_public_var, p_dl_get_public_var_addr()); 221 270 printf("FAILED\n"); 222 271 return false; … … 233 282 { 234 283 int *p_dl_public_uvar; 284 int *(*p_dl_get_public_uvar_addr)(void); 235 285 int val; 236 286 … … 243 293 } 244 294 295 p_dl_get_public_uvar_addr = dlsym(handle, "dl_get_public_uvar_addr"); 296 if (p_dl_get_public_uvar_addr == NULL) { 297 printf("FAILED\n"); 298 return false; 299 } 300 245 301 val = *p_dl_public_uvar; 246 302 247 303 printf("Got %d, expected %d... ", val, 0); 248 304 if (val != 0) { 249 printf("FAILED\n"); 250 return false; 251 } 252 253 printf("Passed\n"); 254 return true; 255 } 256 257 int main(int argc, char *argv[]) 258 { 259 260 printf("Dynamic linking test\n"); 261 305 printf("&dl_public_uvar = %p, " 306 "dl_get_public_uvar_addr -> %p\n", 307 p_dl_public_uvar, p_dl_get_public_uvar_addr()); 308 printf("FAILED\n"); 309 return false; 310 } 311 312 printf("Passed\n"); 313 return true; 314 } 315 316 #ifndef STATIC_EXE 317 318 /** Test calling a function that returns contents of a private initialized 319 * fibril-local variable. 320 */ 321 static bool test_dlfcn_dl_get_private_fib_var(void) 322 { 323 int (*p_dl_get_private_fib_var)(void); 324 int *(*p_dl_get_private_fib_var_addr)(void); 325 int val; 326 327 printf("Call dlsym/dl_get_private_fib_var...\n"); 328 329 p_dl_get_private_fib_var = dlsym(handle, "dl_get_private_fib_var"); 330 if (p_dl_get_private_fib_var == NULL) { 331 printf("FAILED\n"); 332 return false; 333 } 334 335 p_dl_get_private_fib_var_addr = dlsym(handle, "dl_get_private_fib_var_addr"); 336 if (p_dl_get_private_fib_var_addr == NULL) { 337 printf("FAILED\n"); 338 return false; 339 } 340 341 val = p_dl_get_private_fib_var(); 342 343 printf("Got %d, expected %d... ", val, dl_private_fib_var_val); 344 if (val != dl_private_fib_var_val) { 345 printf("dl_get_private_fib_var_addr -> %p\n", 346 p_dl_get_private_fib_var_addr()); 347 printf("FAILED\n"); 348 return false; 349 } 350 351 printf("Passed\n"); 352 return true; 353 } 354 355 /** Test calling a function that returns contents of a private uninitialized 356 * fibril-local variable. 357 */ 358 static bool test_dlfcn_dl_get_private_fib_uvar(void) 359 { 360 int (*p_dl_get_private_fib_uvar)(void); 361 int *(*p_dl_get_private_fib_uvar_addr)(void); 362 int val; 363 364 printf("Call dlsym/dl_get_private_fib_uvar...\n"); 365 366 p_dl_get_private_fib_uvar = dlsym(handle, "dl_get_private_fib_uvar"); 367 if (p_dl_get_private_fib_uvar == NULL) { 368 printf("FAILED\n"); 369 return false; 370 } 371 372 p_dl_get_private_fib_uvar_addr = dlsym(handle, "dl_get_private_fib_uvar_addr"); 373 if (p_dl_get_private_fib_uvar_addr == NULL) { 374 printf("FAILED\n"); 375 return false; 376 } 377 378 val = p_dl_get_private_fib_uvar(); 379 380 printf("Got %d, expected %d... ", val, 0); 381 if (val != 0) { 382 printf("dl_get_private_fib_uvar_addr -> %p\n", 383 p_dl_get_private_fib_uvar_addr()); 384 printf("FAILED\n"); 385 return false; 386 } 387 388 printf("Passed\n"); 389 return true; 390 } 391 392 /** Test calling a function that returns the contents of a public initialized 393 * fibril-local variable. 394 */ 395 static bool test_dlfcn_dl_get_public_fib_var(void) 396 { 397 int (*p_dl_get_public_fib_var)(void); 398 int *(*p_dl_get_public_fib_var_addr)(void); 399 int val; 400 401 printf("Call dlsym/dl_get_public_fib_var...\n"); 402 403 p_dl_get_public_fib_var = dlsym(handle, "dl_get_public_fib_var"); 404 if (p_dl_get_public_fib_var == NULL) { 405 printf("FAILED\n"); 406 return false; 407 } 408 409 p_dl_get_public_fib_var_addr = dlsym(handle, "dl_get_public_fib_var_addr"); 410 if (p_dl_get_public_fib_var_addr == NULL) { 411 printf("FAILED\n"); 412 return false; 413 } 414 415 val = p_dl_get_public_fib_var(); 416 417 printf("Got %d, expected %d... ", val, dl_public_fib_var_val); 418 if (val != dl_public_fib_var_val) { 419 printf("dl_get_public_fib_var_addr -> %p\n", 420 p_dl_get_public_fib_var_addr()); 421 printf("FAILED\n"); 422 return false; 423 } 424 425 printf("Passed\n"); 426 return true; 427 } 428 429 /** Test calling a function that returns the contents of a public uninitialized 430 * fibril-local variable. 431 */ 432 static bool test_dlfcn_dl_get_public_fib_uvar(void) 433 { 434 int (*p_dl_get_public_fib_uvar)(void); 435 int *(*p_dl_get_public_fib_uvar_addr)(void); 436 int val; 437 438 printf("Call dlsym/dl_get_public_fib_uvar...\n"); 439 440 p_dl_get_public_fib_uvar = dlsym(handle, "dl_get_public_fib_uvar"); 441 if (p_dl_get_public_fib_uvar == NULL) { 442 printf("FAILED\n"); 443 return false; 444 } 445 446 p_dl_get_public_fib_uvar_addr = dlsym(handle, "dl_get_public_fib_uvar_addr"); 447 if (p_dl_get_public_fib_uvar_addr == NULL) { 448 printf("FAILED\n"); 449 return false; 450 } 451 452 val = p_dl_get_public_fib_uvar(); 453 454 printf("Got %d, expected %d... ", val, 0); 455 if (val != 0) { 456 printf("dl_get_public_fib_uvar_addr -> %p\n", 457 p_dl_get_public_fib_uvar_addr()); 458 printf("FAILED\n"); 459 return false; 460 } 461 462 printf("Passed\n"); 463 return true; 464 } 465 466 /** Test directly reading a public initialized fibril-local variable 467 * whose address was obtained using dlsym. 468 */ 469 static bool test_dlfcn_read_public_fib_var(void) 470 { 471 int *p_dl_public_fib_var; 472 int *(*p_dl_get_public_fib_var_addr)(void); 473 int val; 474 475 printf("Read dlsym/dl_public_fib_var...\n"); 476 477 p_dl_public_fib_var = dlsym(handle, "dl_public_fib_var"); 478 if (p_dl_public_fib_var == NULL) { 479 printf("FAILED\n"); 480 return false; 481 } 482 483 p_dl_get_public_fib_var_addr = dlsym(handle, "dl_get_public_fib_var_addr"); 484 if (p_dl_get_public_fib_var_addr == NULL) { 485 printf("FAILED\n"); 486 return false; 487 } 488 489 val = *p_dl_public_fib_var; 490 491 printf("Got %d, expected %d... ", val, dl_public_fib_var_val); 492 if (val != dl_public_fib_var_val) { 493 printf("&dl_public_fib_var = %p, " 494 "dl_get_public_fib_var_addr -> %p\n", 495 p_dl_public_fib_var, p_dl_get_public_fib_var_addr()); 496 printf("FAILED\n"); 497 return false; 498 } 499 500 printf("Passed\n"); 501 return true; 502 } 503 504 /** Test directly reading a public uninitialized fibril-local variable 505 * whose address was obtained using dlsym. 506 */ 507 static bool test_dlfcn_read_public_fib_uvar(void) 508 { 509 int *p_dl_public_fib_uvar; 510 int *(*p_dl_get_public_fib_uvar_addr)(void); 511 int val; 512 513 printf("Read dlsym/dl_public_fib_uvar...\n"); 514 515 p_dl_public_fib_uvar = dlsym(handle, "dl_public_fib_uvar"); 516 if (p_dl_public_fib_uvar == NULL) { 517 printf("FAILED\n"); 518 return false; 519 } 520 521 p_dl_get_public_fib_uvar_addr = dlsym(handle, "dl_get_public_fib_uvar_addr"); 522 if (p_dl_get_public_fib_uvar_addr == NULL) { 523 printf("FAILED\n"); 524 return false; 525 } 526 527 val = *p_dl_public_fib_uvar; 528 529 printf("Got %d, expected %d... ", val, 0); 530 if (val != 0) { 531 printf("&dl_public_fib_uvar = %p, " 532 "dl_get_public_fib_uvar_addr -> %p\n", 533 p_dl_public_fib_uvar, p_dl_get_public_fib_uvar_addr()); 534 printf("FAILED\n"); 535 return false; 536 } 537 538 printf("Passed\n"); 539 return true; 540 } 541 542 #endif /* STATIC_EXE */ 543 544 #ifdef DLTEST_LINKED 545 546 /** Test directly calling function that returns a constant */ 547 static bool test_lnk_dl_get_constant(void) 548 { 549 int val; 550 551 printf("Call linked dl_get_constant...\n"); 552 553 val = dl_get_constant(); 554 555 printf("Got %d, expected %d... ", val, dl_constant); 556 if (val != dl_constant) { 557 printf("FAILED\n"); 558 return false; 559 } 560 561 printf("Passed\n"); 562 return true; 563 } 564 565 /** Test dircetly calling a function that returns contents of a private 566 * initialized variable. 567 */ 568 static bool test_lnk_dl_get_private_var(void) 569 { 570 int val; 571 572 printf("Call linked dl_get_private_var...\n"); 573 574 val = dl_get_private_var(); 575 576 printf("Got %d, expected %d... ", val, dl_private_var_val); 577 if (val != dl_private_var_val) { 578 printf("dl_get_private_var_addr -> %p\n", 579 dl_get_private_var_addr()); 580 printf("FAILED\n"); 581 return false; 582 } 583 584 printf("Passed\n"); 585 return true; 586 } 587 588 /** Test dircetly calling a function that returns contents of a private 589 * uninitialized variable. 590 */ 591 static bool test_lnk_dl_get_private_uvar(void) 592 { 593 int val; 594 595 printf("Call linked dl_get_private_uvar...\n"); 596 597 val = dl_get_private_uvar(); 598 599 printf("Got %d, expected %d... ", val, 0); 600 if (val != 0) { 601 printf("dl_get_private_uvar_addr -> %p\n", 602 dl_get_private_uvar_addr()); 603 printf("FAILED\n"); 604 return false; 605 } 606 607 printf("Passed\n"); 608 return true; 609 } 610 611 /** Test directly calling a function that returns the contents of a public 612 * initialized variable. 613 */ 614 static bool test_lnk_dl_get_public_var(void) 615 { 616 int val; 617 618 printf("Call linked dl_get_public_var...\n"); 619 620 val = dl_get_public_var(); 621 622 printf("Got %d, expected %d... ", val, dl_public_var_val); 623 if (val != dl_public_var_val) { 624 printf("dl_get_public_var_addr -> %p\n", 625 dl_get_public_var_addr()); 626 printf("FAILED\n"); 627 return false; 628 } 629 630 printf("Passed\n"); 631 return true; 632 } 633 634 /** Test directly calling a function that returns the contents of a public 635 * uninitialized variable. 636 */ 637 static bool test_lnk_dl_get_public_uvar(void) 638 { 639 int val; 640 641 printf("Call linked dl_get_public_uvar...\n"); 642 643 val = dl_get_public_uvar(); 644 645 printf("Got %d, expected %d... ", val, 0); 646 if (val != 0) { 647 printf("dl_get_public_uvar_addr -> %p\n", 648 dl_get_public_uvar_addr()); 649 printf("FAILED\n"); 650 return false; 651 } 652 653 printf("Passed\n"); 654 return true; 655 } 656 657 /** Test directly reading a public initialized variable. */ 658 static bool test_lnk_read_public_var(void) 659 { 660 int val; 661 662 printf("Read linked dl_public_var...\n"); 663 664 val = dl_public_var; 665 666 printf("Got %d, expected %d... ", val, dl_public_var_val); 667 if (val != dl_public_var_val) { 668 printf("&dl_public_var = %p, dl_get_public_var_addr -> %p\n", 669 &dl_public_var, dl_get_public_var_addr()); 670 printf("FAILED\n"); 671 return false; 672 } 673 674 printf("Passed\n"); 675 return true; 676 } 677 678 /** Test directly reading a public uninitialized variable. */ 679 static bool test_lnk_read_public_uvar(void) 680 { 681 int val; 682 683 printf("Read linked dl_public_uvar...\n"); 684 685 val = dl_public_uvar; 686 687 printf("Got %d, expected %d... ", val, 0); 688 if (val != 0) { 689 printf("&dl_public_uvar = %p, dl_get_public_uvar_addr -> %p\n", 690 &dl_public_uvar, dl_get_public_uvar_addr()); 691 printf("FAILED\n"); 692 return false; 693 } 694 695 printf("Passed\n"); 696 return true; 697 } 698 699 /** Test dircetly calling a function that returns contents of a private 700 * initialized fibril-local variable. 701 */ 702 static bool test_lnk_dl_get_private_fib_var(void) 703 { 704 int val; 705 706 printf("Call linked dl_get_private_fib_var...\n"); 707 708 val = dl_get_private_fib_var(); 709 710 printf("Got %d, expected %d... ", val, dl_private_fib_var_val); 711 if (val != dl_private_fib_var_val) { 712 printf("dl_get_private_fib_var_addr -> %p\n", 713 dl_get_private_fib_var_addr()); 714 printf("FAILED\n"); 715 return false; 716 } 717 718 printf("Passed\n"); 719 return true; 720 } 721 722 /** Test dircetly calling a function that returns contents of a private 723 * uninitialized fibril-local variable. 724 */ 725 static bool test_lnk_dl_get_private_fib_uvar(void) 726 { 727 int val; 728 729 printf("Call linked dl_get_private_fib_uvar...\n"); 730 731 val = dl_get_private_fib_uvar(); 732 733 printf("Got %d, expected %d... ", val, 0); 734 if (val != 0) { 735 printf("dl_get_private_fib_uvar_addr -> %p\n", 736 dl_get_private_fib_var_addr()); 737 printf("FAILED\n"); 738 return false; 739 } 740 741 printf("Passed\n"); 742 return true; 743 } 744 745 /** Test directly calling a function that returns the contents of a public 746 * initialized fibril-local variable. 747 */ 748 static bool test_lnk_dl_get_public_fib_var(void) 749 { 750 int val; 751 752 printf("Call linked dl_get_public_fib_var...\n"); 753 754 val = dl_get_public_fib_var(); 755 756 printf("Got %d, expected %d... ", val, dl_public_fib_var_val); 757 if (val != dl_public_fib_var_val) { 758 printf("dl_get_public_fib_var_addr -> %p\n", 759 dl_get_public_fib_var_addr()); 760 printf("FAILED\n"); 761 return false; 762 } 763 764 printf("Passed\n"); 765 return true; 766 } 767 768 /** Test directly calling a function that returns the contents of a public 769 * uninitialized fibril-local variable. 770 */ 771 static bool test_lnk_dl_get_public_fib_uvar(void) 772 { 773 int val; 774 775 printf("Call linked dl_get_public_fib_uvar...\n"); 776 777 val = dl_get_public_fib_uvar(); 778 779 printf("Got %d, expected %d... ", val, 0); 780 if (val != 0) { 781 printf("dl_get_public_fib_uvar_addr -> %p\n", 782 dl_get_public_fib_uvar_addr()); 783 printf("FAILED\n"); 784 return false; 785 } 786 787 printf("Passed\n"); 788 return true; 789 } 790 791 /** Test directly reading a public initialized fibril-local variable. */ 792 static bool test_lnk_read_public_fib_var(void) 793 { 794 int val; 795 796 printf("Read linked dl_public_fib_var...\n"); 797 798 val = dl_public_fib_var; 799 800 printf("Got %d, expected %d... ", val, dl_public_fib_var_val); 801 if (val != dl_public_fib_var_val) { 802 printf("&dl_public_fib_var = %p, " 803 "dl_get_public_fib_var_addr -> %p\n", 804 &dl_public_fib_var, dl_get_public_fib_var_addr()); 805 printf("FAILED\n"); 806 return false; 807 } 808 809 printf("Passed\n"); 810 return true; 811 } 812 813 /** Test directly reading a public uninitialized fibril-local variable. */ 814 static bool test_lnk_read_public_fib_uvar(void) 815 { 816 int val; 817 818 printf("Read linked dl_public_fib_uvar...\n"); 819 820 val = dl_public_fib_uvar; 821 822 printf("Got %d, expected %d... ", val, 0); 823 if (val != 0) { 824 printf("&dl_public_fib_uvar = %p, " 825 "dl_get_public_fib_uvar_addr -> %p\n", 826 &dl_public_fib_uvar, dl_get_public_fib_uvar_addr()); 827 printf("FAILED\n"); 828 return false; 829 } 830 831 printf("Passed\n"); 832 return true; 833 } 834 835 #endif /* DLTEST_LINKED */ 836 837 static int test_dlfcn(void) 838 { 262 839 printf("dlopen()... "); 263 840 handle = dlopen("libdltest.so.0", 0); … … 293 870 return 1; 294 871 872 #ifndef STATIC_EXE 873 if (!test_dlfcn_dl_get_private_fib_var()) 874 return 1; 875 876 if (!test_dlfcn_dl_get_private_fib_uvar()) 877 return 1; 878 879 if (!test_dlfcn_dl_get_public_fib_var()) 880 return 1; 881 882 if (!test_dlfcn_dl_get_public_fib_uvar()) 883 return 1; 884 885 if (!test_dlfcn_read_public_fib_var()) 886 return 1; 887 888 if (!test_dlfcn_read_public_fib_uvar()) 889 return 1; 890 #endif /* STATIC_EXE */ 891 295 892 // printf("dlclose()... "); 296 893 // dlclose(handle); 297 894 // printf("Passed\n"); 298 895 896 return 0; 897 } 898 899 #ifdef DLTEST_LINKED 900 901 static int test_lnk(void) 902 { 903 if (!test_lnk_dl_get_constant()) 904 return 1; 905 906 if (!test_lnk_dl_get_private_var()) 907 return 1; 908 909 if (!test_lnk_dl_get_private_uvar()) 910 return 1; 911 912 if (!test_lnk_dl_get_public_var()) 913 return 1; 914 915 if (!test_lnk_dl_get_public_uvar()) 916 return 1; 917 918 if (!test_lnk_read_public_var()) 919 return 1; 920 921 if (!test_lnk_read_public_uvar()) 922 return 1; 923 924 if (!test_lnk_dl_get_private_fib_var()) 925 return 1; 926 927 if (!test_lnk_dl_get_private_fib_uvar()) 928 return 1; 929 930 if (!test_lnk_dl_get_public_fib_var()) 931 return 1; 932 933 if (!test_lnk_dl_get_public_fib_uvar()) 934 return 1; 935 936 if (!test_lnk_read_public_fib_var()) 937 return 1; 938 939 if (!test_lnk_read_public_fib_uvar()) 940 return 1; 941 942 return 0; 943 } 944 945 #endif /* DLTEST_LINKED */ 946 947 static void print_syntax(void) 948 { 949 fprintf(stderr, "syntax: dltest [-n]\n"); 950 fprintf(stderr, "\t-n Do not run dlfcn tests\n"); 951 } 952 953 int main(int argc, char *argv[]) 954 { 955 printf("Dynamic linking test\n"); 956 957 if (argc > 1) { 958 if (argc > 2) { 959 print_syntax(); 960 return 1; 961 } 962 963 if (str_cmp(argv[1], "-n") == 0) { 964 no_dlfcn = true; 965 } else { 966 print_syntax(); 967 return 1; 968 } 969 } 970 971 if (!no_dlfcn) { 972 if (test_dlfcn() != 0) 973 return 1; 974 } 975 976 #ifdef DLTEST_LINKED 977 if (test_lnk() != 0) 978 return 1; 979 #endif 980 299 981 printf("All passed.\n"); 300 982 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.