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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980
|
This file documents the history of the original LPRng from Patrick Powell.
While this version of lprng was originally based uppon 3.8.28, most of the
changes in 3.8.32 are included. (3.8.29, 3.8.30 and 3.8.31 were never
publically released up to the time of this writing to all of my knowledge,
so things may be attributed to .32 that were actually earlier in other parts
of the documentation). Things documented here but not included in this version
is the support as CUPS-backend server and the corresponding PDEs for that
and changes to the build or install scripts (as those are replaced anyway).
Additional changes not done by Patrick Powell can be found in the ChangeLog
and NEWS files.
Version LPRng-3.8.32 - Thu Sep 6 15:07:19 PDT 2007
added: discard_zero_length_jobs flag
zero length jobs are now discarded rather than trying
to be printed. However, sometimes zero length jobs are
actually MEANT to be printed as the various filters will
expand the zero length job into content. This is the way
to put the name of a file you want printed from an archive
into an option line/flag and then have the back end print
it. Ugly, but it works.
Version LPRng-3.8.31 - Fri Feb 16 17:33:35 PST 2007
postinstall.freebsd: /etc/rc.conf is not truncated
Version LPRng-3.8.30 - Thu Sep 21 11:53:39 PDT 2006
Fixed: If job was forwarded to queue, or redirected to queue, then queue
would not start printing.
Fixed: If job with multiple copies (lpr -Kxxx) was forwarded to queue or redirected to queue,
then forwarded then only a single file copy was printed.
Fixed: If the 'router' or 'chooser' was used, then only 1 copy of file was sent
to destination queue, and job may unexpected die.
Version LPRng-3.8.29 - Fri Jan 28 11:05:58 PST 2005
ATHENTICATION: added k5conn (kerberos 5) method.
This is identical to the kerberos method, but does not do encrypted data transfer.
BUG FIXES:
The authentication information is now saved in the control file.
The status of incoming jobs is now displayed with the LPQ command. Unfortunately,
the incoming job size is displayed as 0 until the entire job file arrives.
The file locking strategy has been modified once more, due to dealing with problems
of HUGE incoming jobs that would cause all the LPD/LPRM/... facilities to lock.
This required the 'Get_hold_file_info' and 'Set_hold_file_info' usage to change.
- job reception: the hold file is created and then modified when all
of the job files have been received.
- job deletion - you can remove an incoming job. The incoming process
is killed as well. If you have 'multiple retries' enabled for job transfer,
then the job will be sent again. Such is life.
- job printing - the job file remains locked until the 'lpd' server
decides what to do with it. This is usually a VERY short period,
but if a process needs to be run to determine the destination of the
job, it may remain locked until the process has completed.
Apple OS-X - LPR+kerberos as backend for CUPS server
Added support for the using LPR+kerberos authentication with CUPS
backend on Apple OS X. See the README.kprPDE file for the gory details.
Basically, OS-X has a 'Printer Driver' set up that specifies the capabilties
of a printer as well as the 'driver' or 'transport program' which will handle
the transfer of the print job to the remote printer. If compiled with the
correct flags, when lpr is invoked as 'klpr', it will assume that it is
being used by OS-X as a 'transport program' and take the necessary steps
to obtain the user Kerberos credentials and then forward the print job
to the LPD server.
Note that much of this code is totally dependent on the OS-X system,
and I (Patrick Powell) do not have access to details of how it is supported
or implemented. The code was supplied by Rich Cochran of Cornell,
and has been added to the LPRng system at his and others request.
If the PDE support changes on OS-X, then it will be necessary to
redo this support. Note that the PDE files are BINARY, and contain
compiled and executable code.
Kerberos, Red Hat Enterprise Linux
The 'com_err.h' file has been removed from some versions
of RHEL. Configure now checks to see if it is found.
This may break if com_err.h is not in one of the 'standard'
locations, or is in a subdirectory such as /usr/kerberos/include,
or some other permutation.
Updated preinstall, postinstall, preremove, postremove, to be more
compatible with package systems such as the FreeBSD 'ports' and
rpms.
Major Installation Change: If you want to have the LPRng install
run a script that stops your current LPD installation, or your
current CUPS installation, you will need to use:
make STARTSERVER=YES install
New Directory:
The /usr/local/share/LPRng/ or ($datadir)/LPRng directory will
now be used for holding sample versions of configuration files.
During the install process these will then be moved to the
appropriate destinations by the 'postinstall' scripts. By doing
this, you can now generate FreeBSD ports/packages that will
have a 'constant' set of locations for files, but then can
move them or copy them to system specific destinations. This
solves a nasty set of problems with FreeBSD ports/packages,
which have a 'fixed' pkg-plist file, but also allows you to
specify the destinations of printcap, lpd.conf, and do forth.
Files:
printcap.sample lpd.conf.sample lpd.perms.sample lprng.sh.sample
(startup script), postinstall
New Installation Assistance File:
/usr/local/share/LPRng/postinstall
This can be used to set the sample versions of configuration
files to their destinations. In addition, you can also
run a set of commands that will attempt to replace your
current LPD system with the LPRng system:
Bourne/bash shells:
STARTSERVER=YES postinstall
Others:
env STARTSERVER=YES postinstall
If you are building a package for mass distribution, then
after installing the package on a host you can run this script:
pkg_add LPRng-<version>.tar
env STARTSERVER=yes /usr/local/share/LPRng/postinstall
Version LPRng-3.8.28 - Fri Jul 23 09:01:55 PDT 2004
MAJOR CHANGES:
The 'hold file' is now referred to as the 'job ticket' file.
This is really what it is. Reference manual, Cookbook, etc.,
will be modified to reflect this change.
incoming_control_filter:
The input to this filter now has the format:
X=option (from original control file)
key=option (options for job)
Output for changes should have the format:
X= (for option deletion)
key= (for option deletion)
X=newvalue (for option modification)
key=newvalue (for option modification)
The following environment variables are also passed, and have
slightly different formats than before.
CONTROL - image of the control file. Note that the
data file entries have the form.
f/path/to/temporary/file
DATAFILES - space separted list of data files. These
are in the format /path/to/temporary/file.
Added translations for German.
(Translations by: Walter Harms <WHarms@bfs.de>)
Fixed yet another silly problem with moving jobs from a queue
while the queue is busy. Now the main server will NOT start
another process to move the job if it can do the work itself.
Added a counter to make sure that if a job is moved more than
a specified number of times, that we catch this and stop moving
the job. This code now works (ahem).
Version LPRng-3.8.27 - Wed Apr 21 11:32:41 PDT 2004
Fixed: 'Missing HOLD_FILE' logic error fixed in lpd_rcvjob.c
(Noted by: Mark Tamisiea <tamisiea@jilau1.Colorado.EDU>)
(And another suggestion by: Christian Reiber <chrei@krischan.org>)
Fixed: configure with-initpath
--with-initpath=PATH now works correctly
(Reported by: Jeff Bastian <jmbastia@ti.com>)
Fixed (well, clarified):
Errormsg() now checks for a 'null' error string and provides
a printable version of errno for logging.
Edited the Scan_queue() function to print error message and removed
some dead code.
(Inspired by comments from: Russell Adams <RLAdams@Kelsey-Seybold.com>)
lpc MOVE could result in endless loop.
(Problem reported by: Wichert Akkerman <wichert@wiggy.net> to
Debian bug list, forwarded by: Craig Small <csmall at : enc.com.au>)
lpc MOVE will now start printing job in destination, rather than just copying
and preserving status of last operation.
Added detailed error message for connection failure.
(Inspired by comments by: Russell Adams <RLAdams@Kelsey-Seybold.com>)
Found a really small (1 byte) memory leak in LPD. Solves the mystery of
the server dying with malloc failed messages.
(Information supplied by: Russell Adams <RLAdams@Kelsey-Seybold.com>)
Version LPRng-3.8.26 - Tue Feb 3 16:58:00 PST 2004
ADDITION to UTILS:
VeryFlexibleChooser.pl script uses SNMP to get printer
status and selects printer.
(Contributed by: Henrik Edlund <henrik@edlund.org>)
Fixed:
--disable-werror configuration option not set correctly.
(Noticed and patched by: Gabriele Balducci <balducci@univ.trieste.it>)
IPP listening enabled by default. Should not be enabled by default.
(ipp_listen_port=0)
Version LPRng-3.8.25 - Wed Jan 7 04:46:12 PST 2004
MAJOR CHANGE in internals:
The legacy 'control file' has been removed from the spool
queue as all of the information is duplicated in the hold
file. The various LPRng documents will be updated to reflect
this. Users who access the control file information external
to LPRng should be warned that this is not a good idea due
to file locking, etc.
MAJOR CHANGE in 'move' operation:
The 'lpc move' is now 'nonblocking'. If you request
a job to be moved, the LPD server will start a process to
(almost) immediately move the job. Until this job is moved,
no other job processing for the queue will be done.
If the move is to a local queue on the same host, then the
job will be copied via a file copy. This action is identical
to the action for sending a job to a 'load balance' queue,
with the difference that the job is immediately marked as done
rather than after the load balance queue has printed it.
Note: if you enter a non-existent remote queue, then the
LPD subserver process trying to move the job will/may sit
in an endless loop trying to move the job.
Added: discard_large_jobs option
discard_large_jobs - if this option is set, large jobs are
accepted and then discarded.
Fixed: Priority and Class
For incoming jobs, the first letter of the C (class) field
in the control file is used to set the priority.
This action is modified by the:
# ignore requested user priority
ignore_requested_user_priority=0
# do not set priority from class name
break_classname_priority_link=0
If not present or the break_classname_priority_link,
the default priority value is used to set the priority.
(C=) and class (class=) values in the control file.
This deals with several lpd print clients that appear to
to assign random control file names and do not have a
C field in the control file. Not to mention users
who try to manipulate queue priorities.
Modified: incoming_control_filter action
This filter is applied to the incoming job control file.
and is used to modify the actions of the LPD server.
options. The output can be in the form:
Xoption X (no option)
Xoption
...
<blank line>
key=value
key=value
The Xoption is equivalent to X=option. The key=value
set of options is separated from the first by a blank line.
If an option is not specified, it is not modified. The
X (no option) or X= (no option) form will remove the
option from the control file. It is dangerous to try to
modify the A (identifier) option unless the user has intimate
knowledge of the LPRng lpd server operation.
Modified: filter environment variables
Filters are now invoked with the HF environment variable
set to the hold file contents. This assists with the
incoming_control_filter and control_filter actions.
Fixed:
The 'Remove_done_jobs' code now removes done and error jobs.
This makes the 'done_jobs' and 'done_jobs_max_age' actions
symmetrical.
Documented: added more details to the -D flags.
debug flag format: num | flag[+num] | flag=str
flag names: print[+N], lpr[+N], lpc[+N], lprm[+N],
lpq[+N], network[+N], database[+N], log[+N],
test=num
use on command line, or in printcap :db=... entry
for server:
print: show queue (printing) actions,
larger number, more information
NUMBER same as print+NUMBER
lpr: show servicing lpr actions
lpq: show servicing lpq actions
lprm: show servicing lprm actions
network: show low level network actions
database: show low level database actions
log: Testing. Don't use this unless you read the code.
test: Testing. don't use this unless you read the code.
for clients (lpr, lpq, etc):
print: show client actions, larger number, more information
NUMBER same as print+NUMBER
network: show low level network actions.
database: show low level database actions.
Modified:
The lpq display now shows Pr/Class (Priority/Class)
information if the priority is different than the
class information. This better shows information on
the class/priority relationshiop.
The Class information is in the 'class=' field in the
control file and the Priority information is in the
priority field.
The 'nonexistent printer message' has been modified to be a little
more helpful, or at least more verbose:
Status Information, attempt 1 of 3:
sending job 'papowell@h110+563' to xx@localhost
connecting to 'localhost', attempt 1
connected to 'localhost'
requesting printer xx@localhost
job 'papowell@h110+563' transfer to xx@localhost failed
error 'NONZERO RFC1179 ERROR CODE FROM SERVER' with ack 'ACK_FAIL'
sending str '^Bxx' to xx@localhost
error msg: 'spool queue for 'xx' does not exist on server h110.private'
error msg: 'check for correct printer name or you may need to run'
error msg: ''checkpc -f' to create queue'
Waiting 10 seconds before retry
Version LPRng-3.8.24 - Fri Dec 12 15:03:02 PST 2003
Small bugfixes
Cygwin patch applied.
(From "Luke Bakken"<Luke.Bakken@getronics.com>
Comment:
I thought I'd check LPRng to make sure that the latest version still
works OK with Cygwin. Everything seems OK except for the checkpc.c
"root" user warning. Will this patch be OK for that file?
GCC 3.xx giveth, GCC 2.95 taketh a hard line.
Patch for - t = 0; char buffer[128]; in user_auth.c
(From: "Marcus Overhagen" <marcus.overhagen@ims.fhg.de> and
Jeff Chua <jchua@fedex.com>)
Version LPRng-3.8.23 - Wed Nov 12 13:32:02 PST 2003
I did not document that the default locations of the lpd.conf and lpd.perms
file are now /etc/lpd/lpd.conf and /etc/lpd/lpd.perms
This change puts all of the lpd files, except /etc/printcap, whose location
is hardwired into too many places, in the /etc/lpd directory. You can
change this:
configure --help
--with-config_subdir=CONFIG_SUBDIR configuration subdirectory (default 'lpd')
--with-lpddir=DIR lpd executable directory (default \${sbindir})
--with-lpd_conf_path=PATH path of lpd.conf (default: \${sysconfdir}/${CONFIG_SUBDIR}/lpd.conf)
--with-lpd_perms_path=PATH path of lpd.perms (default: \${sysconfdir}/${CONFIG_SUBDIR}/lpd/lpd.perms)
--with-printcap_path=PATH path of printcap (default \${sysconfdir}/printcap)
--with-lpd_printcap_path=PATH path of lpd_printcap (default \${sysconfdir}/${CONFIG_SUBDIR}/lpd_printcap)
--with-initpath=PATH path of lpd startup file (default /usr/local/etc/rc.d/lprng.sh)
Also, the postinstall will now copy the old files to the new locations and
issue a warning message.
Fixed up a very subtle problem with 'chooser' functionality.
we now have to find out if we really need to call the chooser
if we are working and have a single queue, then we do not need to call the chooser
if :sv= p1,p2 but none are available then we do not need to call the chooser
if :sv == "" - then we do need to call the chooser
if :sv == p1,p2 and at least one is available - then we do need to call the chooser
Added the 'chooser_scan_queue' flag. If the flag is 1, then we
check all the jobs in the spool queue to see if any can be sent to
any destination. If the flag is 0 (default), then only the first printable
job in the queue is checked. This causes only the first job in the queue
to be tested, which is probably the appropriate behaviour for the majority
of situations.
Determined that it was possible to do a denial of service attack on the LPRng system.
Added a zillion timeouts for reads/writes to socket/pipe connections.
- for 'non-printing' actions, used Send_query_rw_timeout
- for 'printing' actions, used Send_job_rw_timeout
- on initial connections, use Send_job_rw_timeout, then Connect_timeout,
and finally fall back to 10 seconds.
While this does not totally eliminate the attack, it does try to make the LPD
server responsive after the timeout periods. This is better than nothing.
Note that there is a problem when you use these timeouts AND you are connecting
to a slow printer.
This solves the mystery of the 'hanging lpr processes' on some systems where a
connection is made to the lpd server and then nothing is sent so there is no
way to timeout things.
Added a further fallback for missing filters:
job format X - filter is :Xf=/filter if present, else
filter is :filter=/filter if present, else
filter is :if=/filter if present.
Added --with-config_subdir (=lpd) to allow the $sysconfig/$subdir
to be the directory for lpd.conf and lpd.perms files, also SSL
files.
The :ppd=file option now specifies the location of a PPD file. This
is used by foomatic-rip (http://www.linuxprinting.org) to specify
options and by ifhp.
- checkpc -f checks to see if the file is present and readable
- lpc ppd will return the PPD file contents
We can now integrate lrpng into KDE in a straight forward
manner, as the ppd file should be standard. Also, you can specify
a default PPD file in /etc/lpd.conf. This will be added to the
printcap entries shown by lpc printcap and passed to the filters.
Added a 'pc_entries_required' option that will force the specified
printcap entries to be put into the PRINTCAP_ENTRY information if they
have a defined value and are not in the printcap entry. The
current (only) value is ppd, but I suspect others might be nice.
Fixed a bug in the way that the PGP security was implemented.
- removed the PGP* environment variables from the default pass
list for clients
- did sanity checks for PGPPASS, PGPPASSFILE, and PGPPASSFD,
and passed only the correct ones. Also opened the PGPPASSFILE
and passed the file descriptor.
- made sure that the file descriptor specified in PGPPASSFD was
actually connected to the open file.
- only passed PGPPASS if running as a client.
- on clients, passing the PGPPATH environment value, on server
using printcap :pgp_server_pgppath value (if specified).
- updated the Reference (AKA LPRng-HOWTO) manual to reflect these
changes.
In summary, we now use:
lp:
:pgp_path - path of the PGP program
:pgp_id - id for clients to use when sending to server
- id used by server for decoding client requests
:pgp_server_pgppath - PGPPATH environment variable for server
:pgp_server_passphrasefile - file containing passphrase
(must be absolute path name or is relative
to the spool directory)
:pgp_forward_id - for server to server communications
id of the remote server
:pgp_passphrasefile - default client passphrase file
For clients, the following environment variables are used:
PGPPATH - location of PGP configuration and key files
PGPPASS - password
PGPPASSFD - file descriptor to file with password
PGPPASSFILE - file with password
If PGPASSFD and PGPPASSFILE not defined, then
- if PGPPATH defined, look for $PGPPATH/$passphrasefile
- if $HOME defined, look in $HOME/.pgp/$passphrasefile
Error in SSL Support discovered by Geoff Greene and patch
supplied.
(Patch and hard work by: Geoff Greene <ggreene@alum.wpi.edu>)
Amazing speed of some systems is so fast that jobs complete
in less than the resolution of the system clock. This,
needless to say, has some interesting problems with job
order. Added some sequence numbers as well as time to
various places.
Screwed up the patch sent by Henrik Edlund <henrik@edlund.org>. It should
have been:
> for(i = 0; i < listv.count; ++i ){
> s = listv.list[i];
> - if( (t = safestrpbrk(s,File_sep)) ) *t++ = 0;
> + if( (t = safestrpbrk(s,Value_sep)) ) *t++ = 0;
> Free_line_list(&l);
> - Split(&l,t,Value_sep,0,0,0,0,0,0);
> + Split(&l,t,File_sep,0,0,0,0,0,0);
> DEBUGF(DLPQ1)("Job_status: Force_lpq_status '%s'='%s'", s,t);
(Correction by: Henrik Edlund <henrik@edlund.org>)
Misimplemented Hendriks accounting fixes.
- if( Match_ipaddr_value(&l,&RemoteHost_IP) ){
+ if( Match_ipaddr_value(&l,&RemoteHost_IP) == 0 ){
Oooops.
(Correction by: Henrik Edlund <henrik@edlund.org>)
utiltities.c: modified the 'Find_{str,flag,decimal}_value
routines so that they did not take a separator option. This
appears to be an oversite due to the importation from another
set of code. Apparently I wanted to used non-printable characters
as separators, but this turned out to be too hard to debug,
so I used '=', '#', and '@' instead.
Modified the init.freebsd.sh, postinstall.freebsd.sh, and preremove.freebsd.sh
files to be a bit more 'ports' friendly. Updated the STANDARD_install
to be more in line with FreeBSD/NetBSD.
Documented the max_accounting_file_size and min_accounting_file_size option
and changed the lpd.conf comment to indicate a 0 value disables truncation.
(Lack of documentation pointed out by: Jim Trocki <trockij@transmeta.com>)
Fixed typos in INSTALL document.
(Pointed out by: Daniel E Singer <des@cs.duke.edu>)
Version LPRng-3.8.22 - Fri Sep 5 08:45:33 PDT 2003
Updated the LPRng, IFHP, and LPRngTool LICENSE with the new
Artistic License from the www.opensource.org web site.
Updated the DISTRIBUTIONS/FreeBSD port information to meet the current
(new) port format.
Renamed LPRng HOWTO to LPRng Reference Manual. Added notes to the
Printing Cookbook.
lpf.c - removed log() and fatal().
(Suggested by: Torsten Rohlfing <rohlfing@IGL.Stanford.EDU>)
Filter command line options now allows ${X} to reference a control file
option. You can now use:
$X with -X<value> (if present)
$0X with -X <value> (adds space)
$'X with -X'<value>' (adds quotes)
$-X with <value> (drops key)
$0-X with <value> (same as $-X)
$'-X with '<value>' (adds quotes)
${ss} with value of printcap option ss
$'{ss} with quoted value of printcap option ss or job control file option
Example: filter=ifhp -Z '${S},${O}'
This will get the O and S options from the job control file. Note that
$S is the 'printer comment name' and '$P' is the 'actual printer name'.
(prompted by a question from: Paul Armstrong <army@cyber.com.au>)
Fixed vars.c 'fifo' option -
-{ "fifo", 0, STRING_K, &Fifo_DYN,0,0,0},
+{ "fifo", 0, FLAG_K, &Fifo_DYN,0,0,0},
(Thanks to the Debian folks - especially Craig Small <csmall@debian.org>)
Fixed up printer@remotehost%port parsing so you can do:
localhost:lp=pr@%P and it gets expanded to:
localhost:lp=pr@localhost
This is pretty far down the extrema of wierd... But somebody
came up with a use for it. Sigh...
(Lots of head scratching caused by: Michael J. Carter <mcarter@lanl.gov>)
Filters no longer have file descriptor 3 connected to the 'accounting
file'. Since the '-a accounting_file' option provides the name of the
file and this should be used instead.
plp_snprintf now handles '*' in floating precision correctly.
(Patch by: Henrik Edlund <henrik@edlund.org>)
if( Run_OF_filter(), Status_file_DYN ) problem found.
(Thanks to the Debian List: Sam Lown <samuel.lown@cern.ch>
and Craig Small <csmall@debian.org>)
If you want to use force_lpq_status according to the docs (HOWTO), the
following patch has to be applied. Otherwise it doesn't work when you have
several ip netmasks listed as in the example:
force_lpq_status=s=pc*.eng.com,130.192.12.0/24,l=sun*.eng.com
Change is:
- Split(&l,t,Value_sep,0,0,0,0,0,0);
Value_sep DEFINE( = " \t=#@" );
+ Split(&l,t,File_sep,0,0,0,0,0,0);
File_sep DEFINE( = " \t,;:" );
(Pointed out to me by: Henrik Edlund <henrik@edlund.org>)
Updated the configure and src/krb5_auth.c to be consistent with latest Kerberos
releases.
Added 'accounting_namefixup' option as suggested by Henrik Edlund <henrik@edlund.org>
accounting_namefixup=list[,list]*
where list is: host(,host*)[=user(,user*)]
The incoming job is check to see if the originating host (RemoteHost_IP)
is in the list of hosts; the first matching one found is used.
Each host list has the format: host,host... where host has the
same format used for the 'oh' and other host name matching
options. You can use '!host' to invert matching. For example:
host1,127.*,!somehost
When a host match is found, the name to be used for the user
is determined from the user list; if none is specified then no
changes are made. Each entry in the user list has the format
${option} or 'name'; the ${option} values are extracted from
the control file (capital letters) or printcap/configuration
information (lower case letters/names). The first non-empty
value found is used.
For example: ${R},${L},${accounting_name},default
If the control file 'R' option is present, the R option value is used
else if the control file 'L' option is present, the L option value is used,
else if the printcap/config option 'accounting_name' is not empty then
it is used, otherwise the 'default' value is used.
(Original suggestion and patches by: Henrik Edlund <henrik@edlund.org>)
Fought with the various Kerberos distributions and appear to
have a new version that compiles with the Kerberos 1.3.1 release
and with other legacy releases.
Added the "# REJECT NOT SERVER" comment to the lpd.perms file to cause
LPRng to reject all jobs/connections from external (non-localhost)
clients
Version LPRng-3.8.21 - Mon Mar 17 07:06:57 PST 2003
The LPQ 'stalled' indication is now based on status information updates,
rather than the job run time. If there has been no status update for the
specified stall time, i.e. - log file (lf=...) or status file (ps=...) then
the stalled indication will be displayed.
Karol Lewandowski discovered that psbanner, a printer filter that
creates a PostScript format banner and is part of LPRng, insecurely
creates a temporary file for debugging purpose when it is configured
as filter. The program does not check whether this file already
exists or is linked to another place writes its current environment
and called arguments to the file unconditionally with the user
id daemon.
-- reported by security.debian.org
-- Debian Security Advisory DSA 285-1
Fixed.
Version LPRng-3.8.20 - Tue Jan 7 09:18:15 PST 2003
The lpd.conf now uses (EMPTY STRING) for defaults which are
empty strings... Before it was '0'. Oops. Patrick
At the request of Karl Kopper <karl@unfiw.com> I reviewed the issues
of queue starting, polling the queues for done jobs, and other
issues. A small side effect of this is that the LPD server process
now starts printing processes. This is actually beneficial as it can
now limit the total number of printing processes and allow some
LPQ/LPC/LPR etc actions. Here is a summary of the current operation
and the options that control it:
Options:
lpd_force_poll - forces a check of the spool queues, even when there
is most likely no reason to. Used when you have some REALLY odd
programs running that will directly manipulate the LPD spool queues
and you do not want to have to connect to the server.
(default is OFF).
lpd_poll_time - interval in secs between checking queues for work.
Done if there is some reason to suspect that some spool queue
had problems and might need to be restarted. This also handles a
race condition where a job arrives just as the process servicing
the spool queue exits.
(default is 5 minutes or 600 seconds)
lpd_poll_start_interval - if there are spool queues which need service,
fork up to 'lpd_poll_servers_started' processes at a time and then
wait for lpd_poll_start_interval seconds before forking more.
This prevents the deadly situation where the LPD server is started
and in turn starts a gizillion process; the rc starupt scripts
may fail because there are no free processes (I kid you not on this
one, it drove me nuts trying to find out why the system would crash
ONLY when LPD ran with NO debugging - the IO caused it to slow down
enough so that the other scripts could run).
(default now 1 second)
lpd_poll_servers_started - maximum number of processs to fork to be
spool queue servers at a time. this prevents the massive forking a huge
number of processes at once.
(default now 3)
max_servers_active - the maximum number of children of LPD that are handling
spool queues. Since each spool queue process may have up to 5 children,
and these in turn make fork other ones, you should make sure that the
limits for the LPD server are set as high as possible, or use this
value to throttle activity. The actual limit used by LDP value
is the minimum of max_servers_active value and
maximum children processes per process/2
as determined by the getrlimit(), sysconf(), or other appropriate system
calls. Most problems reported by systems with heavy load are caused by
restrictive process limits. Run 'lpd -F -D1 | grep Get_max_servers'
(as an ordinary user) and see the limits for processes and file
descriptors.
Summary:
lpd_force_poll=0
lpd_poll_time=600 (5 minutes)
lpd_poll_start_interval=1 (1 second)
lpd_poll_servers_started=3 (3 per start interval)
max_servers_active=1024
Experiments with heavily loaded systems (FreeBSD 4.7, Solaris
2.8, Linux RedHat 7.3, and Mandrake 8) indicate that these
values should not cause system trauma. Your milage may vary;
if the load average goes up very high, then set lpd_poll_start_interval
to a larger value and/or decrease the lpd_poll_servers_started
value. Both is best. The amount of free memory seems to be
the limiting factor on the system loading.
When you send a job via LPR, the LPD server forks a 'service socket'
process to handle job reception; in previous versions after receiving
the job the process would then call Do_queue_jobs() to take on the
duties of the 'handle the jobs in the spool queue' process. In
this version the 'service socket' process sends a 'start queue'
request to the LPD server and then exits. The LPD service will
then fork a process to become the 'handle the jobs' process.
Similarly, when an lpc operation needs to start a 'handle the jobs'
process, a message is sent to the LPD server to start the process.
While there is no real difference in performance on lightly loaded
systems, there is a big difference on heavily loaded systems. Now
the LPD server can control the total number of active spool queues
much easier, and the system does not get overloaded as easily.
Also, the LPRng server does not clobber the system at startup
time as badly now.
By the way, queues which are started or have jobs put in them
by LPC or LPR have priority over queues that are started by the
LPD process looking for work, and the LPD server will brutally
try to start as many as possible. Thus, if you do an 'lpc start all'
you can bring the system to its knees for a short time until
all of the forking and file reading activity is completed.
Since only the administrator can do an 'lpc start' command,
this should not be an issue...
Keith ("HP Printer Dies Horrible Death") Rinaldo
<rinaldok@egr.unlv.edu> has reported that some HP printers lock
up and do not report status, etc., and display a nasty low level
error message on the printer console such as 7900FE. The IFHP
filter or LPD would sit there waiting for a response. The 'keepalive'
TCP/IP facility does not solve this problem, as sometimes the
TCP/IP stack is OK but the job handling code (i.e. - print engine)
is non-functional. You need to try to get a response from the
printer, which is what the IFHP filter does.
NOTE: send_job_rw_timeout default value is now 0 (no timeout).
In order to not surprise new users, the default value for
send_job_rw_timeout is now 0, i.e.- no timeout. Details below.
The send_job_rw_timeout is now used to set a maximum time that
the printer (network, parallel port or serial port) connection
will be 'inactive', i.e. - no data input and not available for
data output, OR, starting with this release, that the various
filter processes do not update the status file (by default,
${spooldir}/status.printer). When the timeout expires the job
will terminate with a JTIMEOUT status, which will be treated
as a JFAIL status.
/* LPRng internal process exit status */
#define JTIMEOUT 43 /* 12 timeout */
The IFHP filter (ifhp-3.5.11) now has a similar 'send_job_rw_timeout'
option that has the same effect as the LPD 'send_job_rw_timeout'.
If the file descriptor used to communicate with the printer is
inactive for this period of time, then the IFHP filter will
exit with a JTIMEOUT error code, which will be treated as a
JFAIL status.
This will only work if the printer goes totally catatonic and
does not reply with status, or the print filter goes catatonic
and does not update the status file. This situation, unfortunately,
can happen when the printer is taken offline in the middle of
a job in order to put paper in the paper tray. You can't win
them all... but if the time taken to put the paper in the tray
is less than the send_job_rw_timeout then you should be OK.
Version LPRng-3.8.19 - Thu Dec 5 12:34:45 PST 2002
Check_for_missing_files was not writing control file.
(Spotted by Keith ("Wanna bet on that?") Rinaldo <rinaldok@egr.unlv.edu>
Version LPRng-3.8.18 - Mon Dec 2 12:08:34 PST 2002
Added the 'fifo' option - this now makes LPRng handle
one incoming job at a time in FIFO order. If you send
jobs A B C then they get delivered in order A B C.
For users who MUST have sequential delivery of jobs.
Some Linux distributions set 'unlimited' resources for all
parameters, such as user processes. Added limit of 1024
processes for such cases as the system will die a horrible
death at startup.
Version LPRng-3.8.17 - Sat Oct 26 20:11:28 PDT 2002
Found a race condition between LPD printing, LPRM, and LPC actions
that would cause LPD to stop printing if you removed or did
an LPC action on a job. After a bit of thought, decided that
the job would get moved or removed anyways. Sigh...
But you might get a bogus error message about 'cannot
find id' as the job hold file has been removed.
Version LPRng-3.8.16 - Mon Aug 12 15:26:05 PDT 2002
lpr now honors :mx=xx values so you can check job size
before you send it.
(Suggested by: Rick Cochran <rcc2@cornell.edu>)
configure --disable-werror removes the -Werror option from CFLAGS.
(From the wish list of: Rick Cochran <rcc2@cornell.edu>)
Bad incoming jobs are removed. You do not get the jobs
left in the queue as errors. Note - spoolers will
keep trying to send jobs even when they get error and
sit in an endless loop. No solution for this one except
to get a better print spooler or whatever...
Version LPRng-3.8.15 - Sun Aug 11 13:11:48 PDT 2002
Remove_done_jobs
- checks to see if the INCOMING flag is set BEFORE
it checks to see if there is an error and only checks
for the data files if the ERROR or DONE flags are set.
This removes a race condition. It was bloody obvious
when I looked at it... I wonder why I did not see it
before?
Version LPRng-3.8.14 - Tue Aug 6 09:14:06 PDT 2002
man page fixes.
(Spotted by the eagle eyes of: Eric S. Raymond <esr@golux.thyrsus.com>)
Based on third hand reports, some installations of GNU compilers
on HPUX and other systems now have 'fd_set' data types.
I have modified configure so that it checks for 'fd_set' being
present. I wish there was a way to read the man pages and
find out if this was the real case.
The configure 'enable-ssl/disable-ssl/' option was not working.
Once again beating on autoconf 1.53 ... It now understands
'enable-OPTION' and 'disable-OPTION'.
The Samba examples in the LPRNG-Howto were not consistent.
changed
queuepause command = /usr/sbin/lpc -P%p stop
queueresume command = /usr/sbin/lpc -P%p start
to
queuepause command = /usr/local/sbin/lpc stop %p
queueresume command = /usr/local/sbin/lpc start %p
(Suggested by: Jim Van Sickler <vansickj-eodc@Kaman.com>)
Version LPRng-3.8.13 - Mon Jul 22 09:07:57 PDT 2002
Major Enhancement In Printcap and Configuration Functionality
After much consideration, added the 'client.xxx' and 'server.xxx'
facility. Briefly, if you have a printcap entry of the form
client.xxx or server.xxx then this can be used to set the corresponding
xxx variable when the printcap entry is used by the lpd server
or the LPRng client programs lpr, lpq, lprm, checkpc, etc.
Entry Program Type Sets
server.xxx = vvv lpd (server) xxx = vvv
client.xxx = vvv lpr,lpq... (client) xxx = vvv
The purpose of this enhancement is to allow a single printcap
entry to be used for both client and server operation, especially
in situations where the lpd server is forwarding or sending jobs
to another lpd queue.
Example of use:
lp:
# used by clients, forcess them to send to
# specified server
:lp=%P@server.hostname:force_localhost@
# used by lpd server
# the server will now send jobs to the
# specified destination
:server.lp=%P@destination
This is equivalent to and replaces the :client and :server
printcap flags, as shown below:
lp:client
:lp=%P@server.hostname:force_localhost@
lp:server
:lp=%P@destination
This selection operation also works with values in the
lpd.conf file, allowing global overrides for clients and
servers. (I can't imagine a use for this, but it is there
if somebody wants to use it.)
The lpc client and lpc server commands will display the
selected client.xxx and server.xxx values. They are also
propagated to the PRINTCAP_ENTRY environment variables
for filters.
Typo's in documentation corrected.
(Patch by: Stepan Kasal <kasal@math.cas.cz>)
lpr Kerberos authentication failures were not being reported.
(Problem noticed by: Rick Cochran <rcc2@cornell.edu>)
Added SSL authentication. See the README.SSL.SECURITY file for
the truly complicated details. Note that testing with certificates
signed by non-root CA indicates that the client is not sending
a certificate, even though one has been requested and the
certificates and signing certs are in the right places.
lpd.conf did not have 'include' functionality working.
(Patch by: Stepan Kasal <kasal@math.cas.cz>)
Added Yet Another LPRng Option: user_is_authuser
user_is_authuser:
if( header_info && User_is_authuser_DYN
&& (s = Find_str_value(header_info,AUTHUSER,Value_sep)) ){
Set_str_value(&job->info,LOGNAME,s);
DEBUG1("Check_for_missing_files: authuser '%s'", s );
}
printcap:
lp:auth=kerberos5:user_is_authuser:...
Causes the principle name to be used as the user name.
lpq_in_perl was screwed up
(Patches by: Anthony Thyssen <anthony@cit.gu.edu.au>)
generate_banner core dumped. Turned out not to be setting
banner format ("f") when generating entry, so that control
file generation core dumped when generating new control file.
(Problem reported by: "Keith Rinaldo" <rinaldok@egr.unlv.edu>)
Updated Remove_done_jobs to sort jobs by completion time.
Added 'Set_nz_flag_value' function to stop the ERROR_TIME value
from being gratuitously updated by various routines.
Found possible cause of 'job data files not removed' problem
in the Remove_done_jobs() code. There is a possibility of a
data file being orphaned if a 'done job' is removed by the
spooler at the same time that another processes such as lpq
information gathering examines the print job. Rare, but possible.
Put warnings in the LPRng-HOWTO section on Samba about the
done_jobs option and interaction with SAMBA job status.
(Suggested by: Marcus Manske <manske@dramedia.de>)
Added yet another wakeup and kick to the master server process
so that printer pools will respond faster. Sigh...
Version LPRng-3.8.12 - Mon May 6 08:21:49 PDT 2002
patch for TCPWRAPPERS added a gratuitous -lwrap to the src/Makefile.
(Spotted by: Rabellino Sergio <rabellino@di.unito.it>)
Version LPRng-3.8.11 - Thu Apr 4 07:49:30 PST 2002
Subtle problem when a filter fails and produces zero
length file. This is now treated as a JABORT level
error. The problem is that RFC1179 treats a file
length as 0 as a 'read until end of file on socket'.
This means that folks who have filters that WILL produce
zero length files need to do something to produce at
least one byte of 'dummy' output.
(Brought to my attention by:
Sergij Kovalenko <s.kovalenko@drgueldener.de>)
Fixed up a portability issue for Solaris 2.6, in linksupport.c.
Need to do an unsigned long cast to do comparison of INADDR_NONE.
(Original patch from: Dr Andreas F Muller <afm@othello.ch>)
Added patches to support TCP wrappers. Use:
configure --enable-tcpwrappers
(Patch by: Tobias Burnus <burnus@net-b.de>)
Added a 'Linux Standards Base' (LSB) style startup script
for Linux systems.
(Provided by: Tobias Burnus <burnus@net-b.de>)
Missing initialization for statb
(Patch by: Rob Joyce <robjoyce@EE.Princeton.EDU>)
Clobbering Logfile_LPD in common/lpd.c
(Patch by: Hugh McDonald <hugh@gw1.symac.dhs.org>)
Added a call to 'Remove_done_jobs()' in lpd_status.c;
then modified Remove_done_jobs to return indication that
a job was removed so that lpd_status.c would RESCAN
queue... Sigh... OK, but it now works 'right'.
(Stale jobs not getting removed noted by:
Richard Ems <r.ems.mtg@gmx.net>)
The problem of saturating a server when checking for work was
re-examined. The new approach is:
a) if some work was done, then check for success at
lpd_poll_time intervals. If there remains work to
be done and there is no process actively doing the
work, mark the queue as needing service.
b) for the marked queues, start at most 'lpd_poll_servers_started'
queues at once, and start these at intervales of
'lpd_poll_start_interval' seconds.
The effect of this will be to limit the number of processes
that LPD will start at a time.
(Pushed to look at the problem by: Johan Bengtsson <elijah@dd.chalmers.se>)
Found a very odd bug... the escape code for '\:' in printcap entries
appears to be broken. The fix was to assume that the only places where
it would be used was in 'filter' or other options where the 'expand
escape sequences' code would be called and would take care of replacing
"\:" by a ":".
.
The 'Printer_device()' routine, when opening a filter as an output
device, did not provide 'stdout' for the filter. Some filters such
as pap from Appletalk seem to need this as they produce messages
on STDOUT (fd 2) as well as STDERR (fd 3).
Version LPRng-3.8.10 - Sun Mar 31 11:31:19 PST 2002
printcap.5 had :as and :ae examples reversed
(Spotted by the guy with the red pen and the eagle eyes:
Craig Small <csmall@eye-net.com.au>)
Slew of patches sent in by Tim Waugh <twaugh@redhat.com>
- silly little kerberos include file patch
- can't spell printer patch
- si no moleste the files in the spool queue patch
(already done)
- added configure ability to find 'pr' program
- GCC flags -W -Wall -Werror -Wno-unused-parms
- also fixed up &*)*(&)*(& unsigned and signed
integer casts
Added patch to allow tcp wrappers to be used. Configure updated
configure --enable-tcpwrappers use tcp wrappers (-lwrap)
(Patch from: Tobias Burnus <burnus@net-b.de>)
The authentication and connection information for permissions
checking is now recorded so it can be used for permissions checking.
and a couple of new fields have been added.
The following permission tags now have the indicated values
UNIXSOCKET - true (match or 1) if connection was over a UNIX socket,
i.e. - the local host.
When SERVICE=P
REMOTEHOST - the original remotehost from which the job was sent
(previously was the HOST value)
REMOTEPORT - the original port from which the job was sent
(previously was undefined )
AUTH - true (match or 1) if job sent using authentication
AUTHTYPE - authentication type
AUTHUSER - value of authentication key for user who originated
job. For example, for kerberos this is the user's principle value
AUTHFROM - value of authentication key for sender of job. For example,
if the job was from the LPR program, this would have the same
value as AUTHUSER. However, if it was forwarded from a server,
it would have the server's authentication name or value.
lpd.perms.in update to match the new entries
(Requested by: Toby Blake <toby@cogsci.ed.ac.uk>)
Once again the checkpc file creation stuff is modified so that
it can create files in a directory NOT owned by the lpd group/user.
This is necessary for log files and other items. Note that this
MAY cause problems for log file truncation as you need to copy
file contents rather than just renaming them. But it turns out
that I am already doing this so it appears to be OK.
CAVEAT EMPTOR.
(Reported by: Torsten Wiebesiek <wiebesiek@tnt.uni-hannover.de>)
Usage messages now display version information as well as options
and available debug flags. Idea shamelessly swiped from somebody else.
(Stolen from: 'Guido' Van Rossen)
Version LPRng-3.8.9 - Sat Mar 2 15:02:11 PST 2002
The 'unix_socket_path' and 'lpd_port' options have been modified
slightly to correct some ambiguous behaviour, and a 'lpd_listen_port'
option has been added.
lpd -p lpd_listen_port -P unix_socket_path
- the -p and -P command line options override the
lpd.conf lpd_listen_port and unix_socket_path options
- the default values for lpd_listen_port is "", indicating
the use the 'lpd_port' value.
The value "off" suppresses opening a port or socket.
This allows the following operation:
No unix socket:
lpd -Poff (/etc/lpd.conf unix_socket_path=off)
No lpd listening socket:
lpd -poff (/etc/lpd.conf lpd_listen_port=off)
Note that LPD will still open connections to the
remote LPD servers using 'lpd_port'.
If you want to override the destination lpd port, you must
modify the lpd.conf file.
Jeff Chua of FedEx (Federal Express) <jchua@fedex.com>
showed up at my office armed with a set of test scripts and a laptop
running LPRng. He demonstrated the problem of the 'missing datafile'
during job transfers. I have fixed the problem in this release.
See the UTIL/testpr file.
(Thanks to: Jeff Chua: <jchua@fedex.com>)
more autoconf + automake + libtool insanity:
WITH_LINK removed
STRIP now used by libtool, changed to STRIP_OPTION
Added AC_C_VOLATILE (see note on volatile below)
(Reported by: Rick Troxel <rick@helix.nih.gov>)
Forced a rescan of the input queue when the number of done jobs
exceeds 'done_jobs' or the time since the first done job exceeds
done_jobs_max_age . This solves a silly problem that shows up
when you have a slew of jobs in a queue, the subserver is processing
them, and no new jobs arrive while it is processing them. Under these
conditions the 'done jobs' would not have been removed until all were
done. If you were printing 1000 jobs then you could not submit any
new jobs, even though you have done 999 of them... :-)
Sigh... these boundary conditions are the pits.
Added the 'volatile' option to declarations of static and nonstatic
variables updated in signal handlers. You really don't want to
hear the frothing about over-enthusiastic optimizing compilers, do you?
Ran the Kerberos tests, discovered minor definition problems with
krb4_auth.h and Kerberos4 support. Have no way to test this, hope
the problem is resolved.
The AUTHUSER information received at job submission time was not
being stored and used later when printing permissions were checked.
(Discovered by: Toby Blake <toby@cogsci.ed.ac.uk>)
Added a 'UTILS/README.ForKerberosHackers' file so that Kerbero Hackers
can quickly and brutally set up a test LPRng system. Not for the
faint hearted. Carry a dog nummy when you read this stuff...
Some users hit themselves in the head and complain about headaches.
If the 'lpd_port' value is 0, then checkpc and lpd squawk.
(Not telling me who the user was, but reported by:
Craig Small <csmall@eye-net.com.au>)
Version LPRng-3.8.8 - Sat Feb 23 07:35:45 PST 2002
Restored include file functions to lpd.conf. Also put in recursion
depth checks so that it will stop if you have a loop.
Version LPRng-3.8.7 - Fri Feb 22 12:24:38 PST 2002
Modified the wildcard lookup so that it returns some sane
values for defaults, i.e. - '*' is not treated like
a real printer and the first 'real' printer is used.
Sigh...
autoconf, automake, and libtoolize insanity.
Each of these facilities has a different version of the
config.guess and config.sub files, and will brutally copy
them to the distribution directory when you run automake,
autoconf, or libtoolize. Problem sort of solved by
running through the /usr/local/share/{auto*,libtool}
directory and finding latest versions of things. As the
CarTalk guys say, "Bo-0H-OH-OH Gus!". Sigh.
The 'Service_connection: bad request...' error message now has
the IP address of the sender added.
(Good idea from: Rainer Tammer <rainer.tammer@spg.schulergroup.com>)
Makefile.in had the diagnostic options left enabled after
regression tests.
BAD! Bad Programmer! BAD! No coffee for you today.
(Reported by: Petri Kaukasoina <kaukasoi-lprng@elektroni.ee.tut.fi>
among others...)
Portability stuff, // comments, and src/Makefile referencing
${SRC}/../UTILS instead of ../UTILS.
(Reported by: Hans Peter Verne <h.p.verne@usit.uio.no>)
Missing check in lpstat for end of string condition:
for( t = Printer_DYN; t && !isspace(cval(t)); ++t );
=> for( t = Printer_DYN; !ISNULL(t) && !isspace(cval(t)); ++t );
(Reported by: Villy Kruse <vek@pharmapartners.nl>)
psbanner was creating a /tmp/before file.
(Reported by:
Anthony R Iano-Fletcher <Anthony.Iano-Fletcher@cbel.cit.nih.gov>)
Fixed the 'job done' status message so that it shows the job id.
(Suggested by: Christoph Beyer <christoph.beyer@desy.de>)
Added some sanity checks to handle cases when hold files and
control files do not have identifier information in them.
Checkpc now checks for duplicate spool directories.
Version LPRng-3.8.6 - Fri Feb 8 19:31:52 PST 2002
HF_NAME not getting set when hold file read and it is not
in file. This makes updates miserable.
(Problem spotted by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
Fixed typeo in configure where I had unixsocket and unixsocketpath
instead of unix_socket and unix_socket_path...
(Pointed out by: Craig Small csmall@eye-net.com.au)
Modified the host/printer lookup behavior when clients
are using 'force_localhost'. You now use the 'original'
queue name rather than the 'destination' queue name.
Wonder how long this has been there.
(Prompted by a problem report from: Andrew Gray" <grayaw@egr.unlv.edu>)
Missed a 'AF_UNIX' definition. Now guarded with ifdefs.
Corrected LPRngHOWTO accounting information:
(Error reported by: "Dirk Krause" <d.krause@fh-sm.de>)
Example:
lpd generates:
jobstart - from the lpd.conf 'as=' option
jobend - from the lpd.conf 'ae=' option
-H - host name
-n - user name
-P - printer
-k - control file name
-b - byte count of job/file
-t - current printing time
-J - Jobname (if present in control file)
-C - class (if present in control file)
-M - mailname (if present in control file)
ifhp filter generates:
start/end - of filter, for entire job
filestart/fileend - if or other filter, for each file
(options above are same)
-A - identifier information (if present in control file)
-q - process id of filter
-p - current value of page counter, 0 indicates no
page counter on printer or it is not readable
jobstart '-Hh110.private' '-nroot' '-Plp' \
'-kcfA129h110.private' '-b48780' '-t2001-10-19-09:36:36.000'
^^^ bytes in file
start '-q26130' '-p105340' '-t2001-10-19-09:36:38.330' \
^^^^^^^ starting page counter value for job
'-Aroot@h110+129' '-nroot' '-Plp'
filestart '-q26132' '-p105340' '-t2001-10-19-09:36:38.350' \
^^^^^^^ starting page counter value for file
'-Aroot@h110+129' '-nroot' '-Plp'
fileend '-b19' '-T435' '-q26132' '-p105359' '-t2001-10-19-09:43:51.504'
^^^^^^^ ending page countvalue for file
^^^ number of pages printed for this file
'-Aroot@h110+129' '-nroot' '-Plp'
end '-b19' '-T435' '-q26130' '-p105359' '-t2001-10-19-09:43:51.504'
^^^^^^^ ending page countvalue for job
^^^ number of pages printed for this job
'-Aroot@h110+129' '-nroot' '-Plp'
jobend '-Hh110.private' '-nroot' '-Plp' \
'-kcfA129h110.private' '-b48780' '-t2001-10-19-09:43:51.000'
^^^ bytes in file
Version LPRng-3.8.5 - Tue Jan 22 15:58:46 PST 2002
Added a minor fix to lpq so that it will check all queues.
(Courtesy of Jim Trocki <trockij@transmeta.com>)
Version LPRng-3.8.4 - Thu Dec 13 08:25:17 PST 2001
ARGH! ARGH! screwed up lpq -a by forgetting to
get the 'all' printer information. Doh!
(Spotted by and slapped his forehead by:
Patrick Powell <papowell@lprng.com>)
"Why do we need a TCP/IP port?" quoth the raven, I mean
Craig Small <csmall@eye-net.com.au>.
"I have a version that has this facility..." respondeth
Patrick ("Mr. Grumpy") Powell. "But I think you will not
be happy". I merged the two versions. Be Happy.
configure:
Added these options
--enable-unix_socket (default disabled)
--with-unix_socket_path=PATH (default /dev/lprng)
/etc/lpd.conf:
OPTION TYPE DEFAULT PURPOSE
unix_socket FLAG 1 enables/disables the UNIX socket
unix_socket_path STR /dev/lprng path to the pipe using this
Also: lpd_port = 0 will disable the TCP/IP port
lpd -p 0 - disables the TCP/IP port
or /etc/lpd.conf lpd_port=0
lpd -P /path - enables, unix socket specified by path
or /etc/lpd.conf unix_socket@
lpd -P off - disable unix socket
Permissions:
Connections to the UNIX socket will appear to come
from localhost, (127.0.0.1) port 0. You can use the
UNIXSOCKET to check for this condition, or explicitly for
localhost/port 0
ACCEPT/REJECT ... UNIXSOCKET
Also updated the INSTALL note.
checkpc: I was using 'To_daemon()' calls all through the
code. This was not needed and would cause a substantial
slowdown in operation. I now do exactly ONE call at the
start of operations.
updated the config.guess and config.sub to the latest version
provided by autoconf.
Incoming jobs now have a status entry. This is to support IPP
and status reporting for incoming jobs. The idea is that you
can start transferring a job and then, when the whole job is
transferred, the job will be done. To make this happen you
need to put an entry in the queue to act as a place holder and
reserve the job number for this action. When transfering an
IPP job, you can send it in chunks. This now allows the IPP
system to send the job header (request), set up the job status,
and then the job contents. Just to make life interesting...
Found some places where I was using 'sizeof(xxx)' instead of a
passed value for an error message buffer. Very short error
messages - 3 chars long... :-)
LPD now REALLY uses the lock files to prevent multiple
instances from running. This might/will/could break on
systems that NFS mount their lock directories.
Cleaned up the error message about bad print job formats.
Clearly there are some REALLY strange printing systems out there.
(reported by: Phil Moses <pmoses@physics.ucsd.edu>)
Checkpc -A XX -r now has nicer format:
t1: file 'hfA877', age 24.57 hours > 24.00 hours maximum
(Spotted by: (Craig Small) csmall@eye-net.com.au)
Added the following to the pass_env options:
LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
LC_IDENTIFICATION LC_ALL
This should help with LOCALE support.
Version LPRng-3.8.3 - Mon Dec 10 20:40:02 PST 2001
Fixed the operation of 'lpr -Pxx' when printcap for xxx
has the format:
xx:direct:lp=...
Sigh... too many special cases...
(Pointed out at LISA2001, and fixed on site...
Now who was that masked Sysadmin???...)
(From the mailing list:
James Thomas Klaas <jklaas@engin.umich.edu> )
Removed spurious commas in control file Z options.
Configure did not set 'done_jobs_max_age' correctly.
(Patch from: Dejan Ilic <dejan.ilic@home.se>)
lpc flush now cleans out status as it should have done...
GRRR... user pointed this out at LISA 2001...
Fixed up a problem with global variable Name.
From: Rick Cochran <rcc2@cornell.edu>
I got LPRng to build under OSX. It required only one patch which
seems to be due to the fact that "Name" is declared "extern" all
over the place, but is only defined in getopt.c. Since lpstat
doesn't use getopt, ld complains. I'm not sure why GNU ld should
complain under OSX and not on other platforms.
(Patch by: Rick Cochran <rcc2@cornell.edu>)
Editted the lpr man page. Updated the information about
obsolete options.
Updated the installation procedures for FreeBSD, linux, etc.
The STANDARD_configuration script now checks to see if there
is a /usr/share/man and if so, runs configure with
--mandir=/usr/share/man. Man pages now show up in the
right place. This was true on *BSD, various LINUX distros,
and some versions of SunOS/Solaris.
Updated the DISTRIBUTIONS/FreeBSD entry and the postinstall
scripts so that the port stuff works better. Now if you do:
cd LPRng/DISTRIBUTIONS/FreeBSD*
make PREFIX=/usr SYSCONFDIR=/etc
You will get the same effect as:
cd LPRng
sh STANDARD_configuration
make clean all install
But, as you might suspect, there are some minor gotchas.
The man pages usually get installed in /usr/share/man, but
when you use the PORT system and override PREFIX it
insists on installing them in /usr/man... and various
versions of the FreeBSD and OpenPort stuff INSISTS that
when generating a port that the originals of the man pages
are in the ${PREFIX}/man/manX directories.
I gave up and cheated: you get an obnoxious warning to
either create /usr/man or to make a symbolic link from
to /usr/share/man from /usr/man before installation starts.
I know, I know. But I don't have that many brain cells
left to fry...
Version LPRng-3.8.2 - Mon Dec 3 12:26:52 PST 2001
MAJOR CONFIGURATION CHANGE:
LPRng can retain status of last N completed jobs
configure --with-done_jobs=N
- set done_jobs value, default 1
configure --with-done_jobs_max_age =N
- set done_jobs_max_age value, default = 0 (no expiry)
Or in the printcap/lpd.conf:
:done_jobs=1
:done_jobs_max_age=1
Example:
Printer: t1@h110 'Test Printer 1'
Queue: no printable jobs in queue
Server: no server active
Status: job 'cfA231h110.private' removed at 18:25:36.281
Rank Owner/ID Class Job Files Size Time
done papowell A 278 /tmp/hi 3 18:25:31
Controlled by:
:save_on_error - all jobs with error saved, status not removed
:save_when_done - all jobs with no error saved, status not removed
:done_jobs=N - last N jobs completed (error or no error) saved
:done_jobs_max_age=N - jobs with status older than N seconds removed
This is best explained by:
On job completion:
if( (no error && save_when_done)
|| (error && save_on_error)
|| done_jobs > 0 || done_jobs_max_age > 0 ){
do not remove job
}
When queue updated:
if( !(save_on_error || save_when_done) ){
while( done_jobs_max_age >= 0
&& the time since completion of oldest done job > done_jobs_max_age ){
remove the oldest done job
}
while( done_jobs >= 0 && total number of done jobs > done_jobs ){
remove the oldest done job
}
}
Fixed up the order of 'require_explicit_q' in the variable list.
Added 'lpd -p port' so that lpd port can be specified at run time.
(Suggested by: Chris J. Herbst <chris@herbst.com>)
Added 'PrintingCookbook' to the distribution.
The 'shorthost' DNS lookup result was not being set correctly
if DNS lookup failed and you had to drop back to using IP address.
Clearly the shorthost form of IP10.0.0.1 is IP10.0.0.1, not
IP10.
Added patches to help support Win32 porting using Cygwin:
UID 0 is now ROOTUID instead of 0 value.
ROOTUID is set by ifdef in portable.h
checkpc -f no longer puts out the annoying '/var/run/lpd.515
does not exist' message.
List_sep (which is only used in Check_for_rg_group) needs
a comma.
(Discovered by: Graeme Wood <Graeme.Wood@ed.ac.uk>)
Reworked the 'start lpd subprocess' code so that it is a little more
civilized.
Modified portable.h so that LPRng compiles properly on HPUX 11.xx
systems.
lpc help fixed up - 'redo - reprints jobs'
Cleaned up the 'Make_sort_key' code so it does not do needless
malloc.
Version LPRng-3.8.1 - Thu Nov 15 16:08:41 PST 2001
The original default actions and values for the LPD_PRINTCAP_PATH
have been restored, as it broke too many other things. A work around
for the problems with using LPD and database based configuration
has been found... ugly, but it works.
Chooser also now will wait when it cannot find a queue instead of
just exiting. This solves the problem of 'hung' load balance print
queues using 'chooser' support.
Trim the accounting file information. This now solves the 'mysterious
full spool partition' error messages.
'indefinately' is really 'indefinitely' ... so says 'ispell'
The 'remove_z' now really removes 'Z' options.
(Found by: Ryan Lovett <ryan@stat.Berkeley.EDU>)
The 'require_explicit_q' added for those folks who absolutely require
that a queue be specified and do not want them to use a default queue.
(Patch to code supplied by: James Thomas Klaas <jklaas@engin.umich.edu>
with a little help from Dan Escapa)
Grrr... left in a line of code when I was doing some testing of the
setuid functions in Win32 and screwed up the setuid stuff.
Fixed up a silly problem with file descriptor 0 not bound to
/dev/null in lpd subprocesses.
Fixed the 'Trim_status_file' routine so that it now treats file
descriptor 0 and -1 as 'closed' files. This prevents some silly
problems with initialization.
Release LPRng 3.8.0 Mon Oct 15 12:09:13 PDT 2001
At line 174 in accounting.c:
} else if( safestrncasecmp( s, "hold", 4 ) ){
This should be
} else if( !safestrncasecmp( s, "hold", 4 ) ){
otherwise anything send back to lpd from the accounting filter
other than accept will result in a JHOLD!
(Spotted by: "C. L. McAvaney" <chrismc@deakin.edu.au>)
Added :force_ipaddr_hostname option. This causes the IP address of the
remote host to be used for the hostname, overriding the information
in the control file. This can be used when you really need the
IP address rather than the hostname in the control file.
(Needed by: Rick Cochran <rcc2@cornell.edu>)
Release LPRng 3.7.9 Mon Oct 15 06:18:43 PDT 2001
Version control strikes again. Sigh...
Now all the files are carefully put into place
(Fumble fingers by: Patrick Powell <papowell@astart.com>)
Release LPRng 3.7.8 Tue Sep 25 12:35:46 PDT 2001
Can't spell... fixed typos in man pages.
(Corrections from: Karsten Weiss <knweiss@gmx.de>)
lpd_logger.c - free(sp); s=0 ... this sure does make
free() and malloc() unhappy...
(Found totally by accident: Patrick Powell <papowell@astart.com>)
lpr '-Y' (enable lpr_filter) processing fixed up a bit. Now has better
diagnostics and information.
An extremely rare but annoying network condition causes LPQ print
status to fail. When running as root (setuid root), and doing an LPQ
operation, the lpq process will try to bind to a port in the low
port range (512 - 1023). This will sometimes fail with a timeout
if the port has been recently used and bound to. I have put a bit
more 'randomization' into the selection of the port, but there is really
nothing that can be done, as the TCP/IP error status does not distinguish
between 'connection refused because you just connected from this port'
and the remote printer being off line. Sigh... The obvious answer
to this is to bind to the low ports only when needed, but this requires
users to know when to set the option. I give up.
Release LPRng 3.7.7 Fri Sep 14 15:54:48 PDT 2001
checkpc whooped its cookies when running checkpc -f and
the device is /dev/null (lp=/dev/null). Apparently I
cannot set /dev/null to use blocking IO... Sigh... So I
do not count 'changing non-blocking IO to blocking IO'
as an error.
i8n French Translation (gettext) added.
(Supplied by: Francois Mescam <Francois.Mescam@onera.fr>)
The files generated by the 'incoming control filter' were not
being re-read by the LPRng system. Silly me.
(Discovered by: Tuomas Toropainen <tuomas@nic.funet.fi> )
The 'bq_format' option was not being handled correctly
for defaults. This option has the value:
bq_format=IoIo...D
I = original input format (or '*' for wildcard match)
o = filter output format
D = default (if present), otherwise keep original
It now handles the case where no translation is required
correctly.
(Prompted by a question from:
Rainer Tammer <rainer.tammer@spg.schulergroup.com>)
Did not check to see that I was a client before doing
setgroup to daemon. Stupid of me. GRRRR... I now have
a test for this in the code.
(Warning from: Petri Kaukasoina <kaukasoi-lprng@elektroni.ee.tut.fi>)
Release LPRng 3.7.6 Fri Sep 7 05:36:00 PDT 2001
There was no call to Getdaemon_group so the default daemon group
was 0. This, as they say, was double plus ungood.
(Spotted and reported with a cackle of diabolical laughter by:
Petri Kaukasoina <kaukasoi@elektroni.ee.tut.fi> )
I added a 'half_close' flag so that you can force a 'close(fd)'
rather than a 'shutdown(fd,1)' to be done for those problem child
network printers that whoop their TCP/IP stacks and die horrible
deaths when they get a half closed connection. This is, as they
say, a bug in the print server, but I have encountered worse.
The same printers also whoop their cookies when reporting status
but I don't seem to be doing a half-close on 'lpq' connections
so this doesn't seem to be a problem. I have modified the 'lpq'
code so it does not do a 'half-close'.
Example:
lp:lp=host%9100 # happy, well behaved, print spooler box
lpb:lp=host%9100:half_close@ # buggy print spooler box
Grammar fixed in LPRng-HOWTO.
(Red pencil work done by: <Jeffrey.H.Knodel@chase.com>)
Release LPRng 3.7.5 Sun Sep 2 12:43:39 PDT 2001
I was not closing all open file descriptors. This caused checkpc and
lpd (when running as 'spool queue server') to die mysteriously after
processing a couple of jobs.
(Clue to cause supplied by: Heiko Burghardt <burghardt@riege.de>)
The lpc -s status only reported number of jobs. Now it also reports
queue status, as it used to, and should have. And it reports only
the number of printable jobs.
(Patch by: Garry Zacheiss <zacheiss@MIT.EDU>)
Patch to accommodate Broken RFC1179 Implemenation #39 from Apple.
(Gory details and a patch by: Darius Davis <s328919@student.uq.edu.au>)
The 'Read_fd_len_timeout' and 'Write_fd_len_timeout' code would not
pause indefinately if the timeout value was 0.
(Noticed by: David E. Cross <crossd@cs.rpi.edu>)
A slew of patches from Crutcher Dunnavant at redhat.com:
From the LPRng-3.7.4-23.src.rpm at the RedHat ftp site:
LPRng-3.7.4-direct.patch - fixed a typeo in vars.c
LPRng-3.7.4-inet_ntop.patch - conflicting/duplicate
definition of inet_ntop.
NOTE: I also fixed the inet_pton() definition to
be consistent with the patch.
LPRng-3.7.4-jobfilescan.patch, LPRng-3.7.4-lockfile.patch
a little less agressive checkpc operation. Checkpc
now does not NOT update the targets of symbolic links.
This solves the problem of various tools creating
files in the spool directory as well as symbolic links
to filters. The FILES need to be accessible by
filters running as the LPD user, the targets of the
symbolic links should not be touched.
LPRng-3.7.4-kerb5.patch - not used, do not want to hardwire
paths into configure. Modified RPM config file to add
/usr/kerberos/{include,lib} instead
LPRng-3.7.4-lockfile.patch - lockfile created now
LPRng-3.7.4-manpage.patch - typo in lpr.1 fixed
LPRng-3.7.4-nointl.patch - configure using wrong -lintl
value.
LPRng-3.7.4-nonblock.patch - changed some blocking opens
to nonblocking opens in checkpc so that checkpc did not
hang. Silly of me not to have done this, as the
Check_write() routine even had a nonblocking flag just
for this purpose.
LPRng-3.7.4-s390.patch, LPRng-3.7.4-setgroups.patch
This is a fiddle, not a major problem. The only
exploit possible is if the lpd server is started
with "extra" groups besides the default one. If
you do not install lpd SETUID root (which is the default)
then you have to be root to start this (su root OR login
as root), and this means that either login or su is
not setting up the group membership correctly.
But it is better to err on the side of paranoia than
be careless.
LPRng-3.7.4-shutdown.patch
Note: the 'shutdown()' patch was NOT applied as it breaks
a slew of other things. Clearly we have some problem
printers out there that need to be identified.
(Courtesy of: Crutcher Dunnavant <crutcher@redhat.com>)
Updated GETTEXT/i8n support to gettext-0.10.39.
The printcap option 'prefix_option_to_option' is declared as a flag in
src/common/vars.c in both versions 3.7.4 (line 355) and 3.6.26.
{ "prefix_option_to_option", 0, FLAG_K, * &Prefix_option_to_option_DYN,0,0},
should be:
{ "prefix_option_to_option", 0, STRING_K, &Prefix_option_to_option_DYN,0,0},
(From: Anthony R Iano-Fletcher <Anthony.Iano-Fletcher@cbel.cit.nih.gov>)
Redid the authentication documentation and code... cleaned it up a bit.
And comments. And printcap.5 updated, HOWTO updated. Sort of works now.
Fixed up '$a' filter options so that :af=xxx is put on command line only
if it is NOT a filter. This clears up the mysterious Linux Printfilter
deaths.
Permission checking now works for SERVICE=X. You can only do remote host
and port comparisions (REMOTE_IP=, REMOTE_HOST=, PORT=). This was initiated
by a bug report about address mask generation.
(From: Willi Burmeister <wib@cs.uni-kiel.de>)
'lpc client' now displays defaults.
The changes to use the 'initgroups()' call for setting process group and
effective group also cleared up problem reported by some Debian users.
You can now put a colon in printcap entry values using: \:. This makes
life a little easier for some folks who need to have options of the form
"http://...". You can now do: filter=/.../sendftp -d ftp\://some/site
The configure defaults for filter_path (PATH value for filters)
are now /bin:/usr/bin:/usr/local/bin
The configure defaults for filter_ld_path (LD_LIBRARY_PATH value for filters)
are now /lib:/usr/lib:/usr/local/lib
Reviewed LOTS and LOTS of documentation. Fiddles all over the place.
Release LPRng 3.7.4 Wed Dec 27 07:10:27 PST 2000
ARGH ARGH! Distributed the test version and not the release
version for 3.7.3 - this has not been a good week.
The printcap entry '*:client:rm=IPADDR:force_localhost' now works correctly
with lpq -a. Side effect: you do not get status if you do not have a
default printer. i.e. - 'lp|*:client:rm=IPADDR' is better.
I now kill off process by using SIGHUP, SIGINT, SIGQUIT and SIGCONT.
Even Guido thinks this is overkill but expects that there will be
some system where even this does not work.
Added a check for the VERSION of gdbm as well.
ARGH ARGH ARGH... I fixed a problem with signals (SIGINT) killing off
the process waiting for a lock on a file descriptor, but I did
it wrong.
(Pointed out most gleefully, complete with TRUSS output by:
Doug Morris <doug@daynetwork.com>
AND
John Perkins <john@cs.wisc.edu>)
Release LPRng 3.7.3 Sun Dec 24 17:47:52 PST 2000
Updated the default printcap file with a simplified set
of instructions.
There was a 'sleep(1000)' instead of a 'plp_usleep(1000)'.
Needless to say, this did slow things down a bit.
LPRng HOWTO Section on Samba had 'printcap file' instead of 'printcap name'
(Spotted by: Marcel Kunath" <kunathma@pilot.msu.edu>)
HPUX compilation without GCC had a gratuitious CFLAGS=-Aa. I removed the flags.
(Reported by: Ryan Novosielski <novosirj@umdnj.edu>)
Release LPRng 3.7.2 Fri Dec 22 10:45:00 PST 2000
Discovered that job moves were not working correctly. Was
removing the lpd_port value by mistake.
Close_gdbm() was not defined, and the #if HAVE_GDBM_H
confused some compilers.
(Reported by: Shane Voss <Shane.Voss@glg.ed.ac.uk>)
ifhp.conf got the 'reverse_priority' description wrong.
(Proof-reder was: Michael J. Carter <mcarter@lanl.gov>)
When I added the user printcap stuff I did not set a return
value and the 'tc=' broke. Sigh.
(Reported by: gizillions of people, including
Michal Kouril <mkouril@ececs.uc.edu>)
RFC1179 does not ABSOLUTELY PROHIBIT some print spooler
expecting multiple LPQ request. So it does not close
the connection after sending status. So I now do a
shutdown() to cause it to not expect further commands.
(Detective work done by Rainer Tammer <rainer.tammer@spg.schulergroup.com>)
The 'short_status_date' and 'full_time' options seem to conflict
with each other. The 'full_time' means to use full time formats
in LPQ status, and the 'short_status_date' means to use short
date formats. The 'full_time' option now controls both of these,
which is probably what was intended in the first place.
(Pointed out by: Bill Kemp <bkemp@srp.gov>)
Get_all_printcap_entries() was not clearing All_line_list so you
would get duplicate entries. Solved the 'mystery duplicate printer'
problem observed during testing.
Natter in the README and INSTALL for Solaris users.
Release LPRng 3.7.1 - Tue Nov 28 06:33:32 PST 2000
Major Changes That Effect Backwards Compatibility
1. local printcaps for users - ${HOME}/.printcap
This allows users to specify a printcap in their local
directories. Of course, you can use the 'user_printcap@'
option to disable this. But why bother?
2. job file filtering always enabled
The classical 'store and forward' behavior has been changed.
If you have a print queue with filters
AND you have a file with the format specified for a filter
THEN the file is filter and the filtered output is used.
This is CONTRADICTORY to 'vintage' BSD and 'legacy' LPRng
behavior.
If you want to have 'job flattening', that is, to have
the job combined into a single file with all the files
processed, you need to use 'lpd_bounce'. If you are currently
using 'lpd_bounce' you will see no difference in behavior.
The bq_format option is used to get the 'new' formats after
filtering. Bq_format has the form:
OnOnOn...D
where O is the original format, n is new format,
and D is default if there is the original format
is not present.
If no default then original is retained.
The bq_format default is now 'f', not 'l'.
Example:
bq_format=f (default)
all processed files have 'f' format
bq_format=flmf (default)
f -> l, m -> f, others unchanged if processed.
3. lpr -k option is now re-enabled to allow lpr to handle
pipe input without creating large data files. Note
that if you kill programs off then you might end up
with a truncated job.
You can use: cat | lpr -k OR cat | lpr -k -- -
4. You can now have :lpr= Command Line Options
This will prepend the command line option flags to the lpr
command. Note that this now allows you to set up a user printcap
entry that has command line options suitable for lpr.
5. Super lightweight no spooler printing to devices
with filter support.
New command line options: -B, -X filter, -Y
New printcap option: :direct
SEND JOB DIRECTLY TO REMOTE TCP/IP PORT:
lpr -Y -Phost%port file1 file2
OR:
use :direct flag in printcap
In your ${HOME}/.printcap or /etc/printcap file put:
lp:direct:lp=h14%9100:remote_support=R:client
And use:
lpr -Plp file (:direct is effectively the same as -Y)
Effectively:
( for i in file1 file2 ; do ${filter} <$i; done ) > h14%9100
where ${filter} is chosen from the printcap entry.
Note: if you do not specify a file then this reduces to reading
from STDIN, e.g.-
${filter} > h14%9100
NOTE EXTREMELY WELL- for 1 file jobs:
The STDOUT of the filter is the TCP/IP port connection.
This allows the filter to get status and other information from the
remote printer.
SEND JOB VIA A PROGRAM (SAMBA smbclient, for example):
lpr -Y -P '|/smbclient //server/share' file
OR:
lp:direct:lp=|/smbclient //server/share:remote_support=R:client
lpr -Plp file
Effectively:
${filter} <file |/smbclient //server/share
SEND JOB TO LPD SPOOLER (Network Print Server):
Ummm... well we already do this. The :direct flag
and the -Y flag are basically NO-OPS for this.
lpr -Y -P pr@host file == lpr -Ppr@host file
OR:
lp:direct:lp=pr@host:client
== lp:lp=pr@host:client
lpr -Plp file1 file2
Effectively:
for i in file1 file2; do filter $i >temp.$i ; done
lpr -Ppr@host temp.file1 temp.file2 ...
USER SPECIFIED FILTER:
To use a user specified filter: lpr -X filter
Example
lpr -Y -Phost%port -X userfilter file
OR:
lp:direct:...:filter=userfilter:client
Effectively:
cat file | userfilter >host%port
NOTE EXTREMELY WELL- for 1 file jobs:
The STDOUT of the filter is the TCP/IP port connection.
This allows the filter to get status and other information from the
remote printer.
SPECIAL CASE for lp=queue@host:
lpr -X userfilter -Pqueue@host file1 file2
Effectively:
send control file;
for i in file1 file2 ; do
userfilter $i > tempfile
send tempfile;
done
EXTREMELY SPECIAL CASE: -k option
The -k option with RFC1179 spooling AND a single file will
case the following actions to be taken:
send control file
send a 'expect BIG file' command
cat userfile | filter > server
You can also add -X userfilter and get:
send control file
send a 'expect BIG file' command
cat userfile | userfilter > server
This is done so that you could run
lpr as a filter and send HUGE data files to the printer.
This is done by invoking the '0 length file is read to
EOF' facility of RFC1179. Unfortunately, this is
not supported by all network print spooler boxes, so the
'fakelargefile' option allows you to fake this by sending
a very large file number (in K bytes). I suggest using
1000000 - i.e. - a 1 Gigabyte file.
Start of a new branch:
iNTERNATIONALIZATIOn (i18n) Support Revisted
iNTERNATIONALIZATIOn support has been reviewed and incorporated
in a much more stable and maintainable manner. Rewrote the
ABOUT-NLS.LPRng file. Modified the Makefile to update version
information in the po/*.po files as well. Reviewed much of the
error message and status messages, and added them to the translation
list. Added the N_() facility for 'static' messages and tables.
On 4 Sep 2000, a compromise problem with the gettext facility
was announced. This was based on the standard 'fprintf' functions,
which have a '%n' option to allow values to be written to memory.
I have totally eradicated the use of the standard printf, fprintf,
and so forth, and use a safe version of snprintf without this
capability. This allows LPRng to be used on systems where similar
attacks can be launched. In addition, if the executable is running
with uid or euid 0 (i.e. - root), then NLSPATH environment variable
is unset. This may break some of the 'set process name' code on
some systems, but I cannot think of another method that will do this.
You can now use FreeBSD/BSDI/ and most likely some other newer versions
of the BSD Make in addition to GMake. What a pain this was.
If your make supports VPATH it should work. Hopefully.
GDBM used to store information. This now makes handling LARGE numbers
of files, etc., in a spool queue directory feasible. Needless to say,
status generation time is VERY small.
There are several caveats on this. If you kill off the lpd server
when it is in the middle of updating the database file, you will
end up corrupting the database file or having an incomplete one.
To resolve this problem, the 'checkpc -f' command can be used,
as well as the 'lpc flush' command. Also, the initial queue
scan done at system startup will rebuild the databases.
IPV6 portability was not quite there. Some minor fiddles. So I stopped
playing the violin. Maybe some time in the future.
(Fiddling done and patch supplied by: John Perkins <john@cs.wisc.edu>)
Fixed the lpq.c status trimming functions to be a little more robust.
Also, put back the recursive lpq functionality.
(Recursion loss spotted by: Christoph Beyer <christoph.beyer@desy.de>)
The lpraccnt program is removed from the distribution. The 'monitor' program
can be used instead. I wonder why I had two of these in the distribution.
The load balance queues are now treated like 'first class' queues and jobs
moved to them are treated like incoming jobs. This allows all of the
incoming filters to be run, routing to be done, and other abuses
far too esoteric to grace these CHANGES notes. This involved doing some
very odd things with chdir(), etc. to make sure that the filters would
run with the correct directory. Also, status information for load balance
queues changed so that you don't get silly messages about non-existent
jobs which have been moved to the load balance queue. Fixed up problems
when you run out of file space with load balance queues. Fixed up debug
and status file information logging with load balance queues. Fixed
a really silly design flaw in Setup_printer() that closed the status
file just when you did not want it closed - and then truncated it.
Debug file is now closed and opened only ONCE during a call to Do_queue(),
making it possible to debug the queue service. All in all, a really
thorough redoing of the queue handling was necessary to make them
into first class citizens.
(Motivated by the questions of: Jason Keltz <jas@cs.yorku.ca>)
lpd now mumbles at you when you try to start it up and it has
problems. Of course, most folks do 'lpd >/dev/null 2>&1' but
we will ignore them...
(Inspired by the well chosen arguments of:
<eric@lammerts.org> and Craig Small <csmall@eye-net.com.au>)
lpd now CORRECTLY opens output filters - lp=|/path
(Spotted by: Seth Chaiklin <seth@psy.au.dk>)
LPRng-HOWTO - Samba example corrected
(Correction by: Philippe Weill <philippe.weill@aero.jussieu.fr>)
lpd_port=[ipaddr%]port now will cause lpd to bind to the interface with
the specified IP address.
(Prompted by the whingings of some anonymous Debian user and
forwarded by: Craig Small <csmall@eye-net.com.au>)
checkpc runtime help was wrong.
(Spotted by: James P. Dugal <jpd@louisiana.edu>)
INSTALL_PREFIX replaced by DESTDIR to be consistent with other distributions
and packages.
lp -f formname now makes the CLASS information 'formname' as well.
(Inspired by: Dave Lovelace <dave@fci.izzy.net>)
In LPRng/common/linelist.c, many missing checks for null pointers.
(Found in a core dump supplied by: Mike Whitson <mwhitson@MIT.EDU>)
lpr -o option is now the same as lpr -Z option
(Suggestion to save sanity of SYSV users by: Joseph Krahn <jkrahn@nc.rr.com>)
lpq did not always have a space before job file size.
(Noted by: Jonathan Briggs <jbriggs@esoft.com>)
Release LPRng 3.6.26 Fri Oct 13 07:38:38 PDT 2000
unsetenv() is not available on some systems. Fallback
to setenv and then putenv() if not present
(Found by: Niklas Edmundsson <nikke@ing.umu.se>)
Release LPRng 3.6.25 Tue Oct 3 09:19:11 PDT 2000
syslog Compromise -
modified syslog to use 'syslog(xx,"%s", msg).
gettext Compromise -
added the following to Initialize():
if( getuid() == 0 || geteuid() == 0 ) unsetenv("NLSPATH");
IN6_ADDR removed, in fact IPV6 stuff removed.
See the various CERT advisories. Sigh...
Release LPRng 3.6.24 - Fri Aug 11 08:03:23 PDT 2000
LPRng-HOWTO - added update for Samba print queue configuration.
LPRng-HOWTO - added section on how to configure Solaris lp printing
to communicate with LPRng.
(Changes courtesy of: Gerald Damian <gdamian@ford.com>)
Typo in gethostinfo.c spotted.
(Courtesy of the debugging talents of: Robin Sommer <rsommer@uni-paderborn.de>)
And I removed the wrong line so that the data files were not being
deleted when a job was completed. Helps to read the control file and
get the data file names...
(Pointed out by: Thomas Emmel <emmel@mechanik.tu-darmstadt.de>)
There was a 'cut and pasteo' that caused me to use the wrong value
to get trim lpq status.
(Core dump and clues supplied by: John Perkins <john@cs.wisc.edu>)
LPRng HOWTO - added small section on setting up Solaris lp queues to
forward jobs to LPRng/BSD printers.
IPV6 Support fixed up a bit to actually work...
(Spotted during testing, now that we actually have IPV6 working
on our router.)
Added a 'flush cached status' when a spool server exits. Now you
get the correct status when there is no active server.
Modified the 'Read_write_timeout' code to be consistent with reading
status from parallel port printers the way that the ifhp filter
does it.
Found a minor sillyness in the 'send_to_logger()' code - I carefully
format data and then toss it way. Now I do checks first.
Fixed up lpq status generation - only read a small part of the status
file for information.
Release LPRng 3.6.23 - Fri Aug 11 08:03:23 PDT 2000
The Linux Printing Summit was held from July 27-28, 2000
in San Jose, and was Sponsored by VA Linux. There was an
extremely enjoyable interchange of views between all of the
various interested factions. You will see some additional changes
in LPRng as a result of these meetings and the input from users
and developers.
Support for status caching has been incorporated in LPRng.
In addition, 'spool queue lookup throttling' has been
added in order to improve the speed of status gathering.
And there are now facilities to control the format of returned
status.
This is implemented as follows:
a) Each queue has a file containing keys corresponding to
status queries. For example, if you do 'lpq' then the
query key would be "4_" corresponding to the "\004\n"
query sent to the server. If you do 'lpq this that'
you have the key "4_this_that_" and so forth.
b) Corresponding to each query is a file containg the status
for the query. If the status is 'stale', that is,
older than 'lpq_status_stale' seconds, then the lookup
is redone.
c) When a job is submitted to a queue, or the status of a job
changes, or a control operation is performed on the queue,
then the cache is flushed. Currently, this means that
the status has to be regenerated for all queries.
d) If the queue status was changed less than 'lpq_status_interval'
seconds ago, then the cached status (if any) will be used.
e) If the process needs to update the print queue, it will
attempt to lock the status file. This means that at most
one process will be scanning the print queue for status
at a time. This has had an extremely good improvement on
status reporting, especially under high load conditions
and multiple processes attempting to scan the queue.
This locking actually improved throughput much to my
surprise. A careful analysis showed that by having only
one or two processes scanning the directory at a time,
the OS was better able to cache and buffer data. In actual
fact, the second process would then find the files that
it was looking for already in memory or in the buffer cache.
Also, if the two processes were getting the same data
(lpq -a), the first one would set up the data in the cache
and the next one would simply read the cached data.
The 'lpc flush' command has been added to flush all of the
cached status. This was added for testing and for administrative
purposes.
A new Super Secret option (well, it is documented now) has
has been added to the 'lpq' facility. The following
only works with LPRng servers (as of this release, of course):
lpq -- -lines=N (in general: lpq -- -opt=v,opt=v)
The '-lines=N' is passed directly through to the LPRng
lpd server, where used to set the size of the returned status.
It is NOT propagated to other servers, BUT it is used to
truncate status returned from them. This will effectively
give you a VERY compressed status extremely quickly when
combined with the caching facility.
The -- is used to indicate that the -lines=N is actually an
option to be passed through to the server. This capability
has been in LPRng, but this is the first documented use
of it that will be supported.
The addition of this facility has some interesting implications.
You can now have a VERY lightweight lpq facility, for getting
the status of one printer, if you know the server it is on:
echo "\004printer -lines=2 xx xx xx" > nc host 515
(nc is the 'netcat' program written by mudge@avian.org)
Of course you do not have authentication, etc., but this is
One Of Those Tradeoffs. YOU ARE WARNED: USE THE SOCKET CONNECTION
METHOD AT YOUR OWN RISK AND DON'T WHINE WHEN YOU DISCOVER THAT
THE LACK OF AUTHENTICATION IS CAUSING YOU PROBLEMS. If this
is a problem, use the 'lpq' application and turn on authentication.
On the other hand, you can now get printer status WITHOUT the
use of an 'lpq' process to format it. I expect the various
folks building WebServer interfaces for LPRng print status will
be more than happy now, as this works well in a multi-threaded
environment, is strictly socket/connection based.
Another benifit is that NonLPRng (can you say Microsoft?)
based applications can now use the -lines=N entry to select
the amount of status that they want returned. This allows
remote clients not LPRng based to select the level of verbosity.
This work was inspired by the Samba Developers, especially Andrew
Tridgell, John Terpstra, and Jeremy Allison,
<http://www.samba.org/samba/team.html>, and their presentations
and discussions at the Linux Printing Summit held in San Jose,
July 26-31, Sponsored by VALinux.
You can now specify a filter for your input files at the user level.
This is to support the requirements and/or desires of the various
users of print spooling software to have a filter applied at the
application end.
The syntax is:
lpr -X /path file1 file2
equivalent to:
for each file in filelist; do
tempfile=maketempfile;
/path <$file >$tempfile
end
lpr $tempfile1 $tempfile2 ...
The filter is invoked once per job file, on each job file.
The options passed to the filter are the usual ones for all
LPRng filters. Some will not have any meaning, such as job
number, etc., and will not be present or have a '0' value.
The filter will run as the user's id, and will not have root
capabilities. If this is needed, then the filter must have
the capability of acquiring them.
This work was inspired by the GIMP Project presentation of Robert
Krawitz <rlk@alum.mit.edu> http://www.tiac.net/users/rlk/ Project
lead for The Gimp Print -- http://gimp-print.sourceforge.net at
the Linux Printing Summit held in San Jose, July 26-31, Sponsored
by VALinux.
I ran into problems with the SysV to LPRng option passing. Apparently
different versions of SysV printing pass options as S, O, or
whathave you values in the control file. The prefix_o_to_z
option has been replaced by the more general 'prefix_option_to_option'
facililty. This specifies the control file option lines to
prefix to a control file option line. For example:
prefix_option_to_option=S,O Z will prefix S and O to Z
prefix_option_to_option=Z O will prefix Z to O.
This now appears to cover all cases, and the LPRng HOWTO
has been modified as well.
The simple minded 'send mail to user' facility had some problems.
I fixed them up, and added a 'sendmail_to_user' flag that allows
the facility to be disabled for sending mail to users, but still
sends mail to operator. I have also updated the HOWTO with some
notes about using this facility.
(Patches sent by: Maja Gorecka-Wolniewicz <M.Gorecka-Wolniewicz@cc.uni.torun.pl>)
Several calls to Print_job(...) assumed that a file will respond with
status information, as would a real printer. Not a good assumption.
I wonder where my mind is at somedays...
The 'Network Grace' timeout should only be used when a server is trying
to connect - clients should not have to wait.
I have once again changed the checkpc code to be very very very
conservative in what it removes from the spool queues. This will make the
folks who use netatalk, etc. very happy. The bad news is that files
put into these directories by other tools will not get removed. C'est
la vie, C'est la guerre...
(Patches inpiring the changes sent by: "William R. Knox" <wknox@mitre.org>)
pclbanner had a stupid typeo left over from debugging.
It wrote debugging information out to /tmp/before
The 'lpr_bounce' code did not work after the last fix to solve problems
with Print_job closing files. Now you can use filters again from lpr.
I have added the 'wildcard' print queue names and 'incoming_control_filter'
options. Together, they implement a way to put options and
other information into the control file when a job is submitted.
This method was exploited by Adeel Khurshid <kurshid@cs.odu.edu>
while at Fujitsu Network Communications, and is used by the
'apsfilter' by Andreas Klemm and Thomas Bueschgens.
Example:
lp|lp_*:lp=%P@server
lp|lp_*:server
:incoming_control_filter=/.../update_z
:...
When you use lpr -Plp_landscape_ledger you will actually end up
sending the job to the lp queue, with the queue name (Q control
file line) set to lp_landscape_ledger. This information can be
used to update the various control file lines. The LPRng/UTILS/update_z
file has an example of a script that will do this. Note that this
makes the use of the apsfilter utility even easier.
(Inpired by a control filter by: Adeel Khurshid <kurshid@cs.odu.edu>)
I removed a couple of bogus entries that I was putting into the
job control file. These appear to be holdovers from some testing.
They were put in but never used. Strange, that.
The append_z, prefix_z, and other related Z operations are done
only when the job is received. This now allows the job to be
processed by filters and not have the work undone. sigh.
Documentation cleaned up as well.
The control file processing has been cleaned up and the redunant
and erroneous (sigh) copy of the control file in the job{} data
structure has been ruthlessly purged. I sure wish Ruth worked
for me, I seem to be doing so much ruthless cleanup.
I see the hand of testing and debugging in much of this stuff,
and the tracking down of memory leaks as well.
You can now use [^x] in the glob patterns. Sigh... The things
people do when they get the bit in their teeth.
The LPD support for 'lpq' and 'lprm' requests has been modified so that
if there are chained queues and each queue is on the server THEN
I simply call a routine and do not fork a process. This solves a
problem with process exhaustion when somebody had a loop in their
printcap. I also put in some tests for this. However, without
adding Yet Another Option to the LPRM and LPQ stuff I don't see
how I can do it.
You can now send up to 'max_jobfiles' (default 52) to the server.
Note: you can actually only send 52*52 = 2704
The data files are given names
dfAnn -> dfZnn -> dfann -> dfznn ->
dgAnn -> dgZnn -> dgann -> dgznn ->
dzAnn -> dzZnn -> dzann -> dzznn ->
daAnn -> daZnn -> daann -> daznn ->
deAnn -> deZnn -> deann -> deznn ->
dAAnn -> dAZnn -> dAann -> dAznn ->
dZAnn -> dZZnn -> dZann -> dZznn
There is now support for the HP extensions:
(Courtesy of Richard Hart USG <hart@zk3.dec.com>,
who sent me the following information)
Summary of HP's Extensions to RFC-1179
1. 4-Digit Job Numbers
HP preserves the System V-style 4-digit sequence number, or job number, in
file names and attributes, while BSD uses 3-digit job numbers.
2. Control and Data File Naming Conventions
Control files are named in the following format:
cA<seqn><host>
<seqn> is the 4-digit sequence number (aka job number).
<host> is the originating host name.
The data file naming sequence format is:
dA<seqn><host> through dZ<seqn><host> followed by...
da<seqn><host> through dz<seqn><host> followed by...
eA<seqn><host> through eZ<seqn><host> followed by...
ea<seqn><host> through ez<seqn><host> ... etc. ...
So the first data file name in a request begins with "dA", the second with
"dB", the 27th with "da", the 28th with "db", and so forth.
3. HP-Specific BSD Job Attributes (Control File Lines)
The following control file lines are extensions of RFC-1179:
R<login>
Write to the named login's terminal when the job is complete. This is
an alternate to the RFC-1179-style e-mail completion notification.
This notification is selected via the lp "-w" option.
-- R line -> M line
A<priority>
Specifies the System V-style priority of the request, a single digit
from 0-7.
-- A value -> priority
N B<banner>
Note that this line begins with an "N", a space, and then a "B". The
argument is the banner page title requested via the lp "-t" option. If
that option was not given then the argument is null.
-- banner -> T banner
N O<options>
Note that this line begins with an "N", a space, and then an "O". The
argument contains the System V-style "-o" options specified in the lp
command line. The option names appear without a leading "-o". The
first option name begins in the fourth character of the line; each
option is separated by a blank. If no "-o" options were given then the
argument is null.
-- <options> -> appended to Zvalue <options>
The following control file lines are generated differently than in standard
BSD:
J<jobname>
The argument is the System V-style request-ID, for example,
"printer-42". Note that leading zeros are not present in the sequence
number. If a System V-style title is requested then it is sent using a
"N B" attribute, and not the "J" attribute.
There is now a new and improved error message for fumble fingers:
h4: {1185} % lpq -Pxx
Printer: xx@h4 - ERROR: spool queue for 'xx' does not exist on server h4.private
non-existent printer or you need to run 'checkpc -f'
h4: {1186} % lprm -Pxx
ERROR: spool queue for 'xx' does not exist on server h4.private
non-existent printer or you need to run 'checkpc -f'
h4: {1187} % lpc -Pxx status
Printer Printing Spooling Jobs Server Subserver Redirect Status/(Debug)
xx@h4: spool queue for 'xx' does not exist on server h4.private
non-existent printer or you need to run 'checkpc -f'
I hope that this cuts down on the problems reported by people who do not
RTFM about 'checkpc -f'.
I have added code to track the maximum open file descriptor so that
the 'cleanup' code is a little more intelligent.
Release LPRng 3.6.22 - Sun Jul 23 17:37:02 PDT 2000
There is yet one more problem with high load levels -
I did not set the timeout to reasonable value and the lpd server
goes into a tight loop waiting for it.
Release LPRng 3.6.21 - Sun Jul 16 16:58:19 PDT 2000
Clean up some Tru64 system warnings about casts.
(Supplied by: "Justus J. Addiss" <jjaddiss@mmm.com>)
Seemed to have found a solution to the parallel port problem
by brutally using fstat() to see if we have a device, and if
so, then unless it is a tty, assuming that it is a write only
device. This is stupid, and I just KNOW that when somebody
adds a USB device I will suffer for this. When you have a
'write only' file descriptor, you just do a 'write' with timeout.
No select, nothing. Just a write. This seems to solve the
problem. Oh yes. You also make sure the file descriptor
is non-blocking.
(By: Patrick Powell <papowell@lprng.com>)
There is a bizzare problem with doing select for read on some Solaris
systems with certain patch sets on file descriptors that have
been set for non-blocking. The select call will actually return
and indicate that the device can be read... But when you do,
you get -1, and EUNAVAIL or some similar code indicating no data
to be read. This is truly bizzare. To ensure that this does
not happen, you must do a select on a nonblocking file descriptor.
To add injury to insult, this seems to not be reliably reproducible.
You really had to be there for this one. I now set all the file
descriptors into blocking mode and then do select, then put them
in nonblocking mode to do the write or read.
The mysterious 'lpc reread' killing lpd was discovered to be caused
by trying to free an already freed pointer, which was garbage.
This was related to cleaning up the memory leak problem in 3.6.20.
Sigh...
I cannot spell krbros... krb5... or kb5... and thus cannot invoke the
dog in the configuration script.
(Happily pointed out by: John Perkins <john@cs.wisc.edu>)
Release LPRng 3.6.20 - Sat Jul 8 12:32:38 PDT 2000
One of the silly memory leaks that has been reported, tested for,
analyzed, etc., finally was found. The problem was in the
child.c file, where I keep track of children processes
by dynamically allocating a list. While I carefully cleaned
up the list in children of the main LPD process,
I never cleaned up the list in the main LPD process. Thus,
if you created a large number of children the list would grow
a small amount (4 bytes) for each child.
This problem was found by brutally using the 'DMALLOC' debugging
package, finding every 'malloc' call in the main LPD process
and then looking for a matching free call in the main line loop.
When one was not found for the case where I had 0 processes
I knew that I had found the problem. Sigh.
(Stumbled over after staring at the code for a week by:
Patrick Powell <papowell@lprng.com>)
Makefile now checks that POSTINSTALL is 'NO' or 'no'
(Noted by: Craig Small <csmall@eye-net.com.au>)
checkpc -C and checkpc -c file removed. Legacy options and
I don't know why they were still there.
(Noticed by: Jesper Dangaard Brouer <hawk@diku.dk>)
The call to 'Remove_tempfile()' routine was removed from
the 'cleanup()' when trying to find the above mentioned memory
leak and was not put back. Bad Coder! Bad!
(Found by: A Earle <ae@play.psych.mun.ca>)
The pclbanner and psbanner had some errors that showed up under
bash. Very odd that the ksh and /bin/sh did not whoop on them.
(Clever debugging by: David Livingstone <davidl@cn.ca>)
checkpc -r -A was a little too agressive and it blew away all
sorts of files. The -r now only works on job files.
I do NOT remove job files unless the -r -A age options are
given. This prevents some problems with jobs being moved
into a queue just as checkpc is being run from cron. Sigh...
Cron. I forgot all about Cron.
(Noticed by: Craig Small <csmall@eye-net.com.au>)
Release LPRng 3.6.19 - Sun Jun 25 11:13:35 PDT 2000
The filter status was not getting used correctly. This was
a side effect of trying to clean up aborted jobs and
accounting. One step forward, one step back. Sigh.
The Tru64 compiler objects to casting pointers to ints, so
we have to cast to a long THEN to an int.
(Reported by: Justus J. Addiss <jjaddiss@mmm.com>)
Did not update the 'Tempfile' variable when I was checking multiple
print queues. This meant that it was using a stale queue name.
Only shows up if the queue directories are on different
file systems.
(Spotted by the eagle eyes of: Robin Sommer <rsommer@uni-paderborn.de>)
Apparently the CHANGES file had 'z_append' instead of 'append_z'.
So it is changed. Do we need a Meta-CHANGES file to record changes
to the CHANGES file?
(Caused by the readings of: Michael J. Carter <mcarter@lanl.gov>)
Release LPRng 3.6.18 - Mon Jun 19 09:37:04 PDT 2000
The UTILS/accounting.pl script did not handle malformed
lines caused by truncation well. It now does, but
insists that you have lines starting with
start, filestart, end, fileend for status. This ties
into ifhp-3.6.15
Updated the DISTRIBUTIONS/FreeBSD to make the port correctly
Updated the DISTRIBUTIONS/RPM to make the port correctly
Changed the psbanner font to a more readable font
(Artistic criticsm by: Bodo Moeller <moeller@cdc.informatik.tu-darmstadt.de>)
Lowercased DNS lookup return values.
(Need discovered by: Alf Wachsmann <alfw@slac.stanford.edu>)
Tru64 cc compiler whoops its cookies on void * conversions...
(Reported by: Justus J. Addiss <jjaddiss@mmm.com>)
Release LPRng 3.6.17 - Sat Jun 17 15:58:21 PDT 2000
Analysis of the Setuid Compromise for LINUX done; LPRng
is only susceptible if a non-root user manages to run a client
program that in turn runs a program that she has compromised.
Since the programs run by LPRng and other servers should owned
by root and not writable, this would require the compromiser
to have already modified these - by alreadying having root perms.
This means that they have already compromised the system.
Replaced the agressive 'check at all times and costs' with
a) a configure time check for the 'bad linux kernel'
b) a run time check done only by clients for a compromise.
c) not installing LPD setuid ROOT so that it cannot be
started and used as a compromised process.
Release LPRng 3.6.16 - Thu Jun 8 15:24:37 PDT 2000
Long numbers and the silly 'is this really and IP address code'
conflicted. Fixed it again.
(Spotted and reported 32 minutes after the release was out by:
Thomas Vogt <t.vogt@drgueldener.de>)
Did not check for null pointer, the following printcap was not
read correctly:
.junk:
stuff:tc=.junk <- ummm... nothing there, CRASH
(Spotted and reported 30 minutes after the release was out by:
Justus Addiss <jjaddiss@mmm.com>)
Changed :as and :ae checks so that you can use :as=/path as well as
:as=|/path
(Inspired by comments from: Sree Lakshmi <chinnu@jncasr.ac.in>)
pclbanner did not work under RedHat.
(Spotted by: David Kerr Livingstone <davidl@cn.ca>)
Goofs in the HOWTO spotted.
(Spotted by: Zanferrari Domenico <domenico.zanferrari@kone.com>)
Updated the HOWTO format. Now using DocBook to generate output.
RPM packages not generated correctly
If the -Dxxx option is the VERY FIRST on the command line,
then you set up the debug options very early in the parsing
and operation. This can lead to a GREAT deal of rubbish unless
you need it.
Release LPRng 3.6.15 Thu Jun 8 15:24:37 PDT 2000
postinstall.generic.sh was sytactically incorrect.
(Patch by: Justus Addiss <jjaddiss@mmm.com>)
RPM Fixes:
/usr/docs/LPRng now removed
Linux (and possibly other) SETUID BUG compromise detection
added. The setuid(n) call is supposed to be a one-way trip to
uid n, but this can be compromised by users setting
flags. Present in kernels before 2.2.16, and possibly
other capabilities based systems. Added a test to make sure
that this is really a one-way trip.
As far as I can tell, this would only be an issue if the
user had a shell script that was executed by LPRng and the script
could be replaced by something else. This is possible in systems
which are using NFS - I have exercised the compromise and it
exists.
Release LPRng 3.6.14 Sat May 6 08:46:26 PDT 2000
configure now has --with-lockfile=path.
(Courtesy of: Willi Burmeister <wib@cs.uni-kiel.de>)
Complete configure options are now:
--with-cc=COMPILER select compiler to use
--with-ccopts=CFLAGS select compiler command line options
--with-linker=LINKER select linker to use
--with-ldopts=LDFLAGS select linker command line options
--with-cppopts=CPPFLAGS select compiler preprocessor command line options
--disable-setuid disable setuid root client and server executables
--enable-priv_ports require connections to be from privileged ports
--disable-force_localhost force_localhost default to disabled
--disable-require_configfiles client programs require lpd.conf, printcap
--enable-kerberos enable kerberos support
--enable-mit_kerberos4 enable MIT Kerberos 4 support
--disable-kerberos_checks disable kerberos library location and checking for support
--with-lpddir=DIR lpd executable directory (default ${sbindir})
--with-lpd_conf_path=PATH path of lpd.conf (default: ${sysconfdir}/lpd.conf)
--with-lpd_perms_path=PATH path of lpd.perms (default: ${sysconfdir}/lpd.perms)
--with-printcap_path=PATH path of printcap (default ${sysconfdir}/printcap)
--with-lpd_printcap_path=PATH path of lpd_printcap (default ${sysconfdir}/lpd_printcap)
--with-lockfile=PATH lockfile PATH, default /var/run/lpd
--with-ld_libary_path=PATH LD_LIBRARY_PATH value
--with-filter_path=PATH filter PATH value
--with-userid=NAME run LPRng software as this userid, default daemon
--with-groupid=NAME run LPRng software as this groupid, default daemon
--with-chooser_routine=NAME load balance queue chooser routine name in user object file
--with-order_routine=NAME queue order routine name in user object file
--with-user_objs=NAME user specified object file
--with-user_include=NAME include file with function prototypes for user object file
--with-filterdir=DIR filter directory (default ${libexecdir}/filters)
--disable-strip disable stripping binaries by default
--enable-nls use Native Language Support
--with-included-gettext use the GNU gettext library included here
--with-catgets use catgets functions if available
Terminal clearing now done by using 'clear' program.
Configure will look for a clear program and LPQ will fork and
exec it. If no clear, then simply send a '^L' or '\014' (form
feed) to the stdout. This is due to the horrible support in
most OS's for curses, termlib, termcap, term... well, you get
the idea. For a true trip through hell, read the configure
script for 'vim' and see what they do. Not for me, when this
is only a VERY small part of a much larger system.
(Changed after finding curses, ncurses, and sys5 curses on
a system by: Patrick Powell <papowell@lprng.com>)
Makefile.bsd is now a VERY small makefile:
# List the things you want to generate:
all clean install uninstall:
gmake $(MAKEFLAGS) $@
I know that some of the BSD folks will hate me for this, but
I have decided that trying to support both types of Makefiles
and making them work was just too much effort. Also, the BSD
folks now have much better supporort for Gmake in their build
scripts. Also, see below... Enhanced Install and Package Creation
Support.
Enhanced Install and Package Creation Support
(Laid at the feet of: Craig Small <csmall@eye-net.com.au>)
One of the problems that is encountered when trying to build a package
or do an install is to compile stuff in one directory and then install
it in another. The trouble is, you want to install it in a MIRROR
directory.
For example, you have
${SYSTEMSRC}=/private/src, where the source is,
${BUILD}=/var/tmp/BUILD/ where you are going to build all the stuff,
${MIRROR}=/var/tmp/MIRROR where you want to place what you created
The following is generally what is done during distribution creation to
do this:
cd ${BUILD}/.../LPRng;
${SYSTEMSRC}/.../LPRng/configure --prefix=/usr/local --sysconfdir=/etc
make
make install XX=${MIRROR} -> puts thing in
${MIRROR}/usr/local
${MIRROR}/etc
After trying 9 (nine) different variations on a theme, I now have the
following method to do this:
make install INSTALL_PREFIX=${MIRROR} POSTINSTALL=NO
What is this? The install script/steps will install files in
${INSTALL_PREFIX}${prefix}, ${INSTALL_PREFIX}${sbindir}, etc.
etc., where ${prefix}, ${sbindir}, etc, are hardwired by the
configure step to the /usr/local/, etc. Now you might wonder
why this is done. The reason is that GMAKE, bless its little
heart, will use the $PREFIX environment variable value if it
is set. So you cannot do ${PREFIX}/${sysconfdir} in install
scripts, and if you do not set it on the command line, have
it put in the right place.
The POSTINSTALL=NO is used to suppress 'true' postinstallation
stuff that would copy files into 'unexepect' places, such as
'/etc/printcap' or '/etc/lpd.perms' or '/etc/lpd.conf'. Now
if you are building a system distribution for raw install,
then you want this to be done, and you would use:
make install INSTALL_PREFIX=${MIRROR}
If you are building, say a FreeBSD 'package' distribution
or a RedHat RPM then you would use:
make install INSTALL_PREFIX=${MIRROR} POSTINSTALL=NO
Now for all of you who want to make a package and need to find
the files that LPRng will install, I suggest you look at the
following:
INSTALL_PREFIX=/var/tmp/LPRng #note that you do NOT export this
(
cd $INSTALL_PREFIX;
mkdir usr/local/bin usr/local/sbin /usr/local/libexec /etc /usr/local/etc/rc.d
....
)
make; make install INSTALL_PREFIX=${INSTALL_PREFIX}
(cd $INSTALL_PREFIX;
find . -type f | sed -e '/man[0-9]/d' \
-e '/\/info\//'d -e 's/..//' >/tmp/files
find . -type f | sed -n -e '/man[0-9]/s,.*man[0-9]/,,p' \
-e 's/..//' >/tmp/manpages
You can now find the non-doc files, manpages, etc. etc. etc.
and then update the various locations as you need. Clearly this
should be done only as root, on a system where you do not have
other users running, where somebody cannot do 'ln -s /etc/passwd
/tmp/manpages' and so forth.
For a truly abusive use of this method, look at the
DISTRIBUTIONS/FreeBSD* and DISTRIBUTIONS/Solaris* directories.
Yes, I have no shame.
(Put into the distribution after telling people 5 times how
to use this by: Patrick Powell <papowell@lprng.com>)
lpr -U option did not work correctly when UID was root.
(Patch happily submitted after a long search by:
Roberto Togneri <roberto@ee.uwa.edu.au>)
lpd was mangling jobs with more than 26 files - caseless compare
strikes again.
(Found with great consternation by: Peter Scheurer <scheurer@sopra-gmbh.de>)
permissions and filters:
When you use a filter for "perms_path" was not executed when a
connection to the lpd is made. So there are no rules then and the
result of the permission check simply is the default_permission (and
it results in having no rules for the 'R'-check as well)
By convention, a line containing the name of the printer for which
permission is wanted. Now a blank line is written for 'X' rules.
Added capability of filter getting permissions to Setup_printer().
(Found by: Robin Sommer <rsommer@uni-paderborn.de>)
lpd_jobs: race condition eliminated at the cost of a high system
overhead when multiple jobs are spooled to the same queue.
(Inspired by: Shawna Chase" <chase@crd.ge.com>)
client connections on Solaris 2.5 systems fail with EADDRNOTAVAIL,
and need a 'retry'. Alternative is to use non-priveledged port.
(Found by: Peter A. Harris <peter.a.harris@exgate.tek.com>)
innetgr() needs FQDN on some systems, and 'shorthost' on others.
Added check to do both.
(Reminded by: Robin Sommer <rsommer@uni-paderborn.de>)
syslog messages not working. May need to add 'ordering' test to
configure for level comparison.
(Noticed by: Jurgen Northe <juergen.northe@junghans-fwt.de>)
RFC1179 transfer failures to remote spool queue did not do retries
correctly. The 'JFAIL' status was treated as a permanent failure,
not a temporary. The 'Service_printer' code now uses the number
of send attempts to do a retry and backoff on transfer times:
configuration and/or printcap options:
send_try: maximum number of times to send to remote
(0 = infinite) - default 3
connect_grace: minumum time between attempts - default 0
connect_interval: interval between attempts - default 10 sec
max_connect_interval: maximum time to wait - default 60 sec
if( attempt > 0 && max_connect_interval > 0 ){
n = connect_interval * (1 << (attempt-1)) + connect_grace;
if( n > max_connect_interval ) n = max_connect_interval;
sleep(n);
}
(Discovered by: Christof Drescher <drescher@pro-image.de>)
Default filter options were missing '$b'.
(Pointed out by: Jose Carlos Rodrigues Lopes <jrl@europa.fcee.ucp.pt>)
The md5 authentication support did not return back 'error' status for
lpr operations.
(Noticed by: Patrick O'Brien <pdo@cs.umd.edu>)
The 'IS_OS' macros are now set to the OSVERSION; this makes tests like
#if defined(IS_BSDI) && IS_BSDI > 401
possible. Sigh...
The filter_path (PATH environment value for filters) added /usr/contrib/bin
(Suggested by: Jeffrey C Honig <jch@bsdi.com>)
UTILS directory needs to be part of the global 'make' so that
tools are created with the right paths.
(Discovered when fixing a problem found by: Jeffrey C Honig <jch@bsdi.com>)
check_for_nonprintable default is now OFF due to 85 distinct problems reported
by various users.
(Email that broke the camel's back sent by: John Hawley <jhawley@bgea.org>)
lp -s was printing status.
(Discovered and fix by: Mark.Belton@mgc.com.au)
proctitle() code was mangling the envp[] - this only showed up if you
happened to set debug level 6 or higher.
(Discovered by: Vincent Fox <vincent@cad.gatech.edu>)
Microsoft now sends the IP address as part of the control
and data file names. OK. We can handle that.
(Pointed out by: Rainer Schoepf <schoepf@uni-mainz.de>)
When using a routing filter, the DATAFILES environment variable
contains the data files. The routing filter can modify
the datafiles, but cannot remove them or truncat them.
The default for bq_format is now 'f' - i.e. - you can reprocess
outputs of bounce queues. The old default was l (binary),
which was not processable.
The 'lpq -s ID' command was not reporting information correctly.
It always reported the total printable, not the ones selected
by the options.
(Discovered by: Patrick Powell <papowell@lprng.com>)
Retested Kerberos 5 and Kerberos4 stuff with Kerberos 1.1.1,
found problems with compilation, fixed them.
(Helped by: Mike Whitson <mwhitson@MIT.EDU>)
Updated Version and Copyright information.
Added configure --enable-kerberos option for folks who need to build
'non-exportable' binaries.
Added a '$(INSTALL_PREFIX) entry to the install scripts to allow folks
who want to install the binaries in a different subtree to do so.
I might make this 'PREFIX' to fit in better with feedback.
More fixing of Kerberos stuff - fixed up the problems with different
uses of krb5_xfree. Added tests for the krb4des library.
(Helped by: Mike Whitson <mwhitson@MIT.EDU>)
The spool_file_perms option was not being used to set permissions for
files in the spool directory. Noted in the Debian LINUX bugs list.
It was also noted that the user was trying to set some very odd permissions
that would result in a possible security loophole, but Hey! I just
do LPRng... Users (not the LPD server) use 0600 permissions, just
to avoid those nasty security problems.
Nit pick on man pages: SEE ALSO should not reference same man page.
(Submitted by: Debian Linux Bug List)
checkpc now checks for server printcap entries with lp=xxx and rm=yyy
values. This way you at least warn the users when they screw up.
(Good suggestion by: Craig Small <csmall@eye-net.com.au>)
Moved tests for 'setproctitle' in configure around to deal with some
problems of libraries being included when they should not have been.
Fixed up the distclean. Removed junk files. Move the LPRng_DOCS
into the HOWTO, as there were no other files left.
Fixed permissions. Did some fiddling to add easier FreeBSD/NetBSD
etc. support. Side effect was that testing install is easier.
Added a 'INSTALL_PREFIX' to the installation paths that allows
me to make sure that things go to the right places.
Move the various distribution specific information into DISTRIBUTIONS
directory.
Made the LPRng and ifhp configure.in mainly identical. Also use the
same portable.h file.
Fixed (once again) typeos in the man pages, and the installation
of compressed man pages. Sigh...
Added a 'filter_stderr_to_status_file' flag that causes print filter
errors to be written to the status file (:ps=file) rather than to
the status log file. Also added truncation of the status file.
(Inspired by : "William D. Colburn (aka Schlake)" <wcolburn@nmt.edu>)
Discovered, as a result of testing the 'filter_stderr_to_status_file'
flag that backslash '\' escapes were not being handled correctly
on the filter line. Fixed this.
If a filter has <,>,;, or | in it, or starts with (
then it is executed by using:
:if=/.../filter xxx -> /bin/sh -c '/.../filter xxx'
This allows you to do things like '/.../filter 2>>status'
Updated checkpc to check for matching () for filters.
Modified the src/linksupport/connection() code so that the
lpq and other clients do not try binding to port 515. This
can cause problems when used with Samba. The code in
linksupport.c that set SO_REUSEADDR and SO_KEEPALIVE was
also tidied up.
lpc -a now works sort of correctly and the documentation has
been changed to reflect it.
The LPC=xx permissions checking did not require a 'C' operation.
Also, cleaned up some message printing.
Make_passthrough was examined and a couple of changes made to
handling the case when the filter path contained a meta character.
The path now has parenthesis put around it. By default, this
form of invocation does NOT have options passed to it.
Added a '$*' parameter to provide all the default command line
options. This now allows you to do:
:if=(/some/path $* | output filter)
New functionality: remove_z, prefix_z, and append_z
(Inspired by a comment by: Richard Kaszeta <kaszeta@me.umn.edu>)
remove_z=pattern,pattern,...
remove the -Z option specified by the pattern.
Example: -Ztest,this,thing + remove_z=th*,out -> -Ztest
append_z=option,option,...
appends this to the -Z options
Example: -Ztest + append_z=landscape -> -Ztest,landscape
prefix_z=option,option,...
prefixes this to the -Z options
Example: -Ztest + prefix_z=landscape -> -Zlandscape,test
Example of use:
You want to have a set of queues where you can have the
queue set the functionality:
landscape:append_z=landscape:lp=remote@host
portrait:append_z=portrait:lp=remote@host
lpr will add these options before the job
is sent.
OR you have a 'bounce queue' situation where you
want to add -Z options as the job goes through:
portrait:append_z=portrait
:lp=remote@host:server
lpd will put these options into the job file
ON RECEPTION. Also, before sending to a remote
queue as well. Kinda bombproof, but covers most
situations.
If you have force_localhost then you want to connect to
the server with the primary name of the printcap entry.
The clients were using the lp=pr@remote pr value instead.
CONFIGURATION OPTION: ld_library_path and filter_path
you can set these values through configure.
Portability Support: DISTRIBUTION directory and init files
Put the init scripts for various OS's in the main directory.
This helps the poor administrator who is trying to figure
out what init script he needs.
Gathered up all of the various system dependency stuff and put
it in one big directory.
Fixed up the DISTRIBUTION/Solaris.pkg stuff
The 'subserver' queue management now works. The problem was that
the main queue server process had to fork a subserver process
for the subserver queue, and it could not tell that the subserver
queue had been changed. The following solved this:
a) in the lpd_control.c code, if the queue is a subserver
queue,
1. I set a 'changed' flag in the spool control file.
2. I send a SIGUSR1 signal to the process that is the server
for the subserver queue.
3. If that signal is unsuccessful, then I send a SIGUSR1 signal
to the main queue process.
4. If that signal is unsuccessful I restart the server
b) in the lpd_jobs.c code, in the Process_jobs() routine:
1. I check to see if this queue has subservers, and then
check the subserver queues. If the 'changed' flag was set or some
other reason exists to start the subserver, I start a
subserver process.
2. In the main queues 'wait for work' loop, when I get a
'SIGUSR1' I scan the subserver queues and check to see
if their 'changed' flag is set.
If it is set AND there is no subserver process THEN I will
start a server process. Otherwise I wait until the subserver
process exits.
3. In the main queues 'wait for work' loop, when I look for
a free subserver queue to use AND I find one which is
available AND it has a change flag set THEN I start a
subserver process.
As you suspect, this was NOT a simple set of changes.
(Painfully debugged by: Patrick Powell <papowell@lprng.com>)
Kerberos Fix From MIT: added auth=none support, and allow default
principal lookup.
(Patch by: Robert A Basch <rbasch@MIT.EDU>)
FreeBSD port/package support, Solaris pkg support, RPM (RedHat) Support
The configuration, build, and install process has been modified
to better support package generation. (I know, it is a dirty business
and I am trying to make it easier for the vendors.)
I have been driven to this by problems that people have with installing
stuff for the first time, and the rising level of 'Did not RTFM'.
a) postinstall script selection
The last step of the make install process is to find
a 'postinstall' file and execute it. The file is chosen by
looking in the configuration directory for a suitable file.
The file is found by using the 'OSNAME' value found by the
configure script. Linux is a special case - mainly because
I tested several versions and found that they had different
'linux-this' and 'linux-that' suffixes.
I also locate a 'preremove' script and do the same selection.
There is a default 'postinstall' and 'preremove' script as well.
OSNAME=${OSNAME}; case "$${OSNAME}" in *linux* ) OSNAME=linux;; esac; \
echo "OSNAME orig $(OSNAME) '$${OSNAME}'"; \
s=`ls postinstall.$${OSNAME} 2>/dev/null`; \
echo POSTINSTALL "'$$s'"; \
if test -n "$$s" ; then cp $$s postinstall; fi; \
s=`ls preremove.$${OSNAME} 2>/dev/null`; \
echo PREREMOVE "'$$s'"; \
if test -n "$$s" ; then cp $$s preremove; fi;
b) postinstall script execution
If the POSTINSTALL option is not NO, then I execute the postinstall
script as the last step of the 'install' process:
if [ "${POSTINSTALL}" != "NO" ] ; then
MAKEINSTALL=YES INSTALL_PREFIX=$(INSTALL_PREFIX) $(SHELL) postinstall ;
fi;
Note that the 'MAKEINSTALL' environment variable is set to YES.
This can be used to determine that the postinstall script is being
executed by the 'make install' step.
c) "pseudo root" or "PREFIX" support
I have put a "${INSTALL_PREFIX}" variable at all points where
a normal script would have a target. Thus if you do:
mkdir /var/tmp/LPRng-root
make install INSTALL_PREFIX=/var/tmp/LPRng-root
you will find that all of the files are now put in sub
directories of /var/tmp/LPRng-root. You can now do:
(cd /var/tmp/root; find . -type f -ls ) >/tmp/files
(cd /var/tmp/root; find . -type d -ls ) >/tmp/directories
cat /tmp/files | grep 'man[0-9]' >/tmp/manpages
cat /tmp/files | grep '/doc' >/tmp/doc
and so forth. Your Imagination and Creativityy Ma Vary
(YIACMV). It is left as an exercise for the student on how to
use this with their favorite (Ummm... ok - least hated) package
method to generate a %files, pkg/PLIST, packinglist, etc. etc.,
for use in package generation.
d) sample 'init', 'preremove', and 'postinstall' scripts.
I have ruthlessly taken example scripts for FreeBSD, BSDI,
and RedHat Linux and put them in the root directory so that
people can see these scripts.
e) If you want to see how to use these, look in the DISTRIBUTIONS
directory.
Here is the postinstall.freebsd.sh : - comments are marked with *** ....
# FreeBSD Convenience Script for Source Install
# -- START --
# CHANGES,v 1.1 2001/08/21 20:33:14 root Exp
#
# If you are building a PORT, see the
# DISTRIBUTIONS/Freebsd directory for a complete port
# building package.
#
# This is the shell script that does the postinstall
# dynamic fixup
# It needs to be massaged with the information for
# various paths.
# If you are building a package, then you do NOT want
# to have this executed - it will put the sample files
# in place. You need to do this during the postinstall
# step in the package installation.
#
echo RUNNING postinstall.freebsd.sh PACKAGE="$PACKAGE" MAKEINSTALL="$MAKEINSTALL" PREFIX="$PREFIX" cwd `pwd`
**** you can remove this, but it sure helps when you are trying to
**** figure out what is happening.
**** - fix is used to put the /etc/lpd.conf, /etc/lpd.perms, and /etc/printcap
**** or their variants into place. This is truly ugly, as there is
**** no easy way to do this well. You first assume that you will have at
**** build time a file with the name 'lpd.conf' (for example) in the
**** current directory. If you have this, then you copy it brutally to
**** the destination, $TARGET/lpd.conf.sample and, if there is not an existing
**** $TARGET/lpd.conf file.
****
**** Now we get into some ugly stuff.
****
**** When doing a package install, you will want to copy the package version's
**** of this file into the same place. But we do not want to overwrite the
**** existing lpd.conf, as it will break existing printing. Note that this
**** is exactly what happens with RPM - it clobbers the existing config file,
**** and widdles by telling you about it. Right. Who reads all of the rpm output?
****
**** So here is what we do. We will force a package to have only the
**** lpd.conf.sample file, and we will COPY it to the right destination.
****
**** The FreeBSD port/package system functions by having a pkg/PLIST file
**** that contains all of the files we will put in the package. If you have
**** done 'make install INSTALL_PREFIX=/var/tmp/LPRng' you will get all the
**** files installed in the /var/tmp/LPRng, and now can simply use file to
**** list them. For an example, see DISTRIBUTIONS/FreeBSD/Makefile and
**** the 'make plist' target. I call this a 'chroot' image, cause it is
**** (hopefully) the same as though you did a 'chroot' to the $INSTALL_PREFIX
**** directory.
****
**** Unfortunately, this simple picture breaks down when somebody decides
**** to use the 'PREFIX' facility of the package/port installation facilty.
**** So we add yet another wrinkle to this. Use:
**** 'make install INSTALL_PREFIX=/var/tmp/LPRng PACKAGE=YES'
**** when you are generating a 'chroot' image. Then you test for this in the
**** script and put things in a nice place when you are making a package,
**** and then forcefully reinstall them.
fix () {
v=`echo $1 | sed -e 's/[:;].*//'`;
p=`echo $2 | sed -e 's/[:;].*//'`; d=`dirname $p`;
if expr "$p" : "|" >/dev/null; then
echo "$v destination is filter - '$p'"
exit 0;
fi
echo "Checking for $p in $d"
if [ ! -d "$d" ] ; then
echo "Directory $d does not exist!"
mkdir -p $d
fi
if [ -f $v.sample ] ; then
if [ $v.sample != $p.sample ] ; then cp $v.sample $p.sample; fi
elif [ -f $v ] ; then
if [ $v != $p.sample ] ; then cp $v $p.sample; fi
else
echo "Do not have $v.sample or $v"
fi
if [ ! -f $p.sample ] ; then
echo "Do not have $p.sample"
elif [ ! -f $p ] ; then
cp $p.sample $p;
chmod 644 $p;
fi;
}
# we use the /usr/local/etc/rc.d method to start lpd
echo "Installing configuration files, cwd " `pwd`
# we have to take them from one place and put in another
if [ "X$PACKAGE" = "XYES" ] ; then
# we put files into the destination
**** when we make a package, we need to put the files in the
**** ${PREFIX}/.... location to be FreeBSD standards compatible
fix lpd.perms "${INSTALL_PREFIX}${PREFIX}/etc/lpd.perms"
fix lpd.conf "${INSTALL_PREFIX}${PREFIX}/etc/lpd.conf"
fix printcap "${INSTALL_PREFIX}${PREFIX}/etc/printcap"
init=${INSTALL_PREFIX}${PREFIX}/etc/rc.d/lprng.sh
echo "Setting up init script $init using init.freebsd"
if [ ! -d `dirname $init` ] ; then mkdir -p `dirname $init ` ; fi;
cp init.freebsd $init
elif [ "X$MAKEINSTALL" = "XYES" ] ; then
**** OK, now we are doing a make install - this could be a
**** real install by the user, or the deadly 'make install'
**** done by the port package Makefile generation. But
**** we know what to do: install it in BOTH places. This will
**** always end up with a copy in .../lpd.perms, and perhaps
**** an extra copy as well in perhaps /usr/local/etc/lpd.perms
fix lpd.perms "${INSTALL_PREFIX}${PREFIX}/etc/lpd.perms"
fix lpd.conf "${INSTALL_PREFIX}${PREFIX}/etc/lpd.conf"
fix printcap "${INSTALL_PREFIX}${PREFIX}/etc/printcap"
fix lpd.perms "${INSTALL_PREFIX}${LPD_PERMS_PATH}"
fix lpd.conf "${INSTALL_PREFIX}${LPD_CONF_PATH}"
fix printcap "${INSTALL_PREFIX}${PRINTCAP_PATH}"
init=${INSTALL_PREFIX}${PREFIX}/etc/rc.d/lprng.sh
echo "Setting up init script $init using init.freebsd"
if [ ! -d `dirname $init` ] ; then mkdir -p `dirname $init ` ; fi;
cp init.freebsd $init
chmod 744 $init
echo "Stopping LPD"
pid=`cat ${LOCKFILE}* 2>/dev/null`;
if [ -n "$pid" ] ; then kill -INT "$pid" 2>/dev/null; fi
if [ -n "${KILLALL}" ] ; then ${KILLALL} 2>/dev/null; fi
# check the printcap information
echo "Checking Printcap Info and fixing permissions"
${SBINDIR}/checkpc -f
# restart the server
echo "Restarting server"
sh $init start
else
**** OK, this is done when we do a package install. You will
**** be amazed to discover that the ./etc/lpd.perms file is now
**** present here - so you can install this. Gahh... The reason
**** for this seems to lie with the way that the package/port
**** mechanism works. If this is changed, then it is back to the
**** trenches to find out where and if the file location has
**** changed.
# when doing an install from a package we get the file from the package
if [ -f etc/lpd.perms.sample ] ; then
fix etc/lpd.perms "${LPD_PERMS_PATH}"
fix etc/lpd.conf "${LPD_CONF_PATH}"
fix etc/printcap "${PRINTCAP_PATH}"
init=etc/rc.d/lprng.sh
echo "Checking init script $init"
if [ ! -f $init ] ; then
echo "WARNING: $init missing!"
exit 1
fi;
cp $init /usr/local/$init
chmod 744 $init
else
echo "WARNING: configuration files missing from package!"
fi
fi
Here is the postinstall.linux.sh:
# LINUX/RedHat Source Installation Convenience Script
# -- START --
# CHANGES,v 1.1 2001/08/21 20:33:14 root Exp
*** same as above
fix () {
*** same as above
}
echo "Installing configuration files"
init=${INSTALL_PREFIX}/etc/rc.d/init.d/lprng
if [ "X$MAKEINSTALL" = "XYES" ] ; then
if [ ! -d `dirname $init` ] ; then mkdir -p `dirname $init ` ; fi;
cp init.linux $init;
chmod 744 $init
fix lpd.perms "${LPD_PERMS_PATH}"
fix lpd.conf "${LPD_CONF_PATH}"
fix printcap "${PRINTCAP_PATH}"
else
*** this is tricky ....
fix "${LPD_PERMS_PATH}" "${LPD_PERMS_PATH}"
fix "${LPD_CONF_PATH}" "${LPD_CONF_PATH}"
fix "${PRINTCAP_PATH}" "${PRINTCAP_PATH}"
fi
if [ "X$PACKAGE" != "XYES" ] ; then
echo "Configuring startup scripts"
if [ ! -f $init ] ; then
echo "Missing $init";
fi
if [ -f /etc/redhat-release -a -f /sbin/chkconfig ] ; then
echo "RedHat Linux - running chkconfig"
/sbin/chkconfig --del lpr
/sbin/chkconfig --add lprng
echo "Starting Printer"
sh $init start
else
echo "Hand install the configuration files"
fi;
fi;
Cleaned up the 'Make_passthrough' use by having a single
'Filter_file' routine. Problems of unclosed file descriptors
disappeared. Sigh...
Discovered that the 'generate banner' code was not working, and
has probably not worked since 3.5.4. Shows how many people
use this. Fixed.
Discovered that the 'af=|/...' option caused 'orphaned' children
which would hang around until the main lpd server process
exited. Problem unsolvable on the systems where the problem
exits. The :as and :ae provide better functionality for
this case.
If you have an OF filter and one of the other filters dies,
then you invoke the final OF filter, even though the job
will exit with an error. This allows you to do some cleanup
in the OF filter. Implemented by modifying the common/printjob.c
code so that it did a 'goto end_of_job' rather than 'goto error'.
I wonder why I did not see this before.
Fixed a really dumb idiot problem with portability. I simply do
not allow lp=|/filter on systems without the 'socketpair'
function. Sigh... There must be a way around this but I can't
see one.
Added a 'JSUSP' to the error codes. Sigh... Needed this to
indicate that a filter had suspended itself correctly.
Check the size of the status file before writing - this adds one
fstat() call per write, but you don't update the status file
very often.
(Pointed out when his status file filled up the /var spool
directory by: Dmitry Bely <dbely@mail.ru>)
We don't steal, we borrow: the :sh flag in the printcap causes
lpr to act like the -h (no header) flag was present.
(Showing the tattered edges from cutting it out of the
the FreeBSD lpr code, sent by: Garance A Drosihn <gad@eclipse.acs.rpi.edu>)
pclbanner and psbanner now back in /bin/sh. Sigh. Some supported
systems do not have Perl.
(Grudgingly ported to /bin/sh scripts by:
Patrick Powell <papowell@lprng.com>)
The printcap 'x:' is now a real printcap. You use the default
entry values for it. Strange how this one did not get caught
earlier. The 'lpc client x' and 'lpc server x' now looks up the
wildcard as well as the normal information. And finally, checkpc
will squawk if you try to use a wildcard as a queue name,
rather than an alias.
You can now do run time load balancing using user specified program
OR a built in filter.
Printcap/configuration option:
chooser=/path/to/program
STDIN = list of queues to choose from, one per line
STDOUT = single queue to use
(if none, job is skipped)
exit code: == 0 handle job and put it into specified queue
if any
!= 0 treat job as though error code was returned
for processing. Allows job to be held, etc.
chooser_routine
chooser_routine@ - default - do not use chooser routine
chooser_routine - use chooser routine
configure --with-chooser_routine=name --with-user_objs=objectfile.o
defines the CHOOSER_ROUTINE compilation option to name
includes the objectfile.o in the library.
routine usage is described in common/user_objs.c
Now you can have a very optimized routine that will do all sorts
of horrible things. Enjoy.
You can now do queue ordering using a user provided routine
order_routine
order_routine@ - default - do not use order routine
order_routine - use order routine
configure --with-order_routine=name --with-user_objs=objectfile.o
defines the CHOOSER_ROUTINE compilation option to name
includes the objectfile.o in the library.
routine usage is described in common/user_objs.c
Now you can have a very optimized routine that will do all sorts
of horrible things. Enjoy. Note that the overhead for a filter
was horribly high and I could not come up with a clean interface.
Besides, if you are mucking around with this stuff, you better
make sure you know what you are doing. See the user_objs.c
and LPRng/src/common/getqueue/Make_sort_key() for details.
When you did a redirect of a queue, would not move the jobs in
the queue. This is now fixed.
Updated the printcap.5 man page so it is a bit closer to reality.
Finally got slammed with a 'blank page' of output once too
often. The ':sf' (supress form feeds between job files) flag
is now history. If you need a form feed between a job file,
then use 'ff_separator'.
Yet another version of the UTILS/accounting.pl file.
The client -A option (use authentication) now selects the authentication
type from the AUTH environment variable.
Release LPRng 3.6.13 Fri Jan 28 08:03:07 PST 2000
MIT Kerberos support: added code to detect when sending job to server
and the server name is 'localhost'. This requires a special ticket
lookup to get the right ticket, as there is no lpd.localhost ticket,
only lpd.servername.
(Supplied by: Mike Whitson <mwhitson@MIT.EDU>)
src/Makefile.in: ln ${STRIP} -> ln -s
(Noticed by: Mike Whitson <mwhitson@MIT.EDU>)
The filter $- specification did not handle $-/xxx and $-root/xxx
correctly.
(Spotted by: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
When using 'user' or 'custom' authentication, lpr errors were
not printed out. This was due to common/sendjob.c:Send_auth()
not setting non-zero return status when there were error conditions.
(Reported by: Patrick O'Brien" <pdo@cs.umd.edu>)
man/install-sh missing, and ifhp src/install-sh as well.
(Reported by: Bill Kemp <bkemp@srp.gov>
LPRng/Makefile.in referenced the wrong location for lpd.conf and lpd.perms
sample files.
(Spotted by: Marty Leisner <leisner@sdsp.mc.xerox>)
LPD: now do accept in the main lpd process, and this time we brutally
send a message to the remote end if we cannot fork the child
process.
Some linksupport.c routines modified to NOT close sockets on
error condition. This allows us to try to read additional error
information from the remote system.
Tested the kerberos5 authentication with kerberos-1.0.5. Fixed
sserver.c and sclient.c.
LPRng-HOW corrected. Filters only get SIGINT and SIGCONT sent
to them to kill them off.
(Spotted by: Robin Sommer <rsommer@uni-paderborn.de>)
Authentication support code rewritten to support error message and status
returns. Also, added error messages and status reports.
lpd started too many servers. The Get_max_server() code returned
the maximum number of server processes that should be running,
and I would try to start this number. This would lock up the system
until one had exited. Now I start up max_servers - 4 at most
at startup time. This is still high, but seems to work.
lpq.c: missing argument to plp_snprintf()
(Patch by: Craig Small <csmall@eye-net.com.au>)
The environment variables passed to filters were not getting their
escaped characters expanded. Thus, PATH=xx\072xx\072xx was
getting passed instead of PATH=xx:xx:xx
The default lpd.conf has been fixed so that it has escaped values for
: instead of : in the file.
Some filters require a killpg() AND a kill(SIGINT) AND a kill(SIGCONT)
to die. Next it will have to be garlic and a stake... Sigh.
(Noted by: Peter Scheurer <scheurer@sopra-gmbh.de> )
The translate_format and translate_incoming_format options can now have
'*f' entries - the * matches all formats. This would translate all
file formats to f.
The LPRM forward in common/lprm.c did not pass the user's name correctly.
(Found by: John Perkins <john@cs.wisc.edu>)
Reformatted LICENSE so that the words GPL are in the first lines
so that people can tell right away.
Updated dates to match Jan, 2000
LPQ and LPRM commands were not being forwarded correctly.
RADICAL CHANGE IN CODE ORGANIZATION:
In the next major release I will be restricting authentication to
code modules only, and users will have to write (gasp!) C code to do
this. This is due to the problems with adding various types of
encryption, etc., which are not well supported by shell scripts,
etc. (I won't discuss the legal issues, these are ugly.)
The following restructuring of the Authentication API has now been done.
a) Printcap, lpd.conf information
The auth=xxx and auth_forward=yyy set the type of authentication
to be used by the sender. The auth=xxx is used by the clients
to communicate with the server and the auth_forward for server to
server communication.
b) for each authentication type there is an unlimited amount of configuration
stuff available now. The configuration/printcap entries have the
format xxx_key. The xxx_id entry is used by clients to identify the
id of the remote server that they are to use for authentication type
xxx. When the server accepts a connection, it will use the xxx_id
value as its 'key' or whatever for the connection. Similarly, when
doing server to server communication, the xxx_forward_id is the
id of the remote server; the remote server will still use xxx_id.
The reason for this has to do with printcap organization. You want
to have both entries present in a printcap, one for a client to send
to the server, and the other for the server to forward to another
server.
You should note that this will break down a little bit when you
have bounce queues. Since there is only one xxx_forward_id available
for all of the destinations, all of the destinations will need to
use the same xxx_forward_id value. This problem will have to be solved
at the authentication module level, probably by not using the xxx_id
and xxx_forward_id for anything but advisory information.
For backwards compatibility, kerberos can also use kerberos_server_principal
and kerberos_forward_principal instead of kerberos_id and kerberos_forward_id
respectively.
c) for server to server authentication, use the 'auth_forward=type' to
set the authentication type for forwarding.
d) For example, to use kerberos authentication the client printcap
entry would have:
auth=kerberos
kerberos_id=lpr/lpr@server.host OR
kerberos_server_principal=lpr/lpr@server.host
kerberos_service=lpr
kerberos_life=... (this are usually not used)
kerberos_renew=... (this are usually not used)
The server printcap entry would have: (note no 'auth=' stuff used)
forward_auth=kerberos (to use kerberos to forward)
kerberos_id=lpr/lpr@server.host OR
kerberos_server_principal=lpr/lpr@server.host
kerberos_service=lpr
kerberos_life=... (this are usually not used)
kerberos_renew=... (this are usually not used)
kerberos_keytab=/etc/krb5.keytab
kerberos_forward_id=lpr/lpr@anotherserver.host
In addition, you will find that PGP authentication has been more fully
supported.
CLIENTS: use environment variables
PGPPASSFILE = location of a file with the PGP password
PGPPASSFD = fd to read the password from (very very rarely used)
Client Configuration:
auth=pgp
pgp_id = pgp id of the server, used to get server key from key ring
pgp_path = /... - path to PGP executable on user system
Server Configuration
pgp_id = pgp id of the server, used to get server key from key ring
pgp_path = /... - path to PGP executable on server system
pgp_server_passphrasefile = file containing passphrase to be used by server
to unlock key file
Server keyring files are in the server user home directory,
i.e. - if server runs as 'daemon' it is ~daemon/.pgp/pubring.pgp and
~daemon/.pgp/secring.pgp. Don't fight it.
Note that user level authentication using shell scripts is still there,
but I am making it hard to use. Don't use it. Evil. Bad. See the
notes below on how to add C code to do this.
And I have added some interesting code to use md5 authentication and
shared secrets:
CLIENTS: use environment variables
MD5KEYFILE - file containing md5 keys format is: name=key.
keys are currently 16 chars long - the ASCII values are used
to set the 'key' value. Yes, yes, I know there are only approx
76**16 = 5 * 10*29 possible keys using this. Tough. A key for the
user name (login name) and the md5_id need to be present
Example:
User Keyfile
# from the configuration information: md5_id=key
# we use 'key' to look up the host information
# the entry has the format '[user_auth] salt'
# if user_auth is present then it will be used as the
# 'from' or 'client' information. The recipient will use
# this value to look up the corresponding hash key value in
# servers keyfile
#key = user_auth salt
lpr@h4=papowell-h4 xx01223750adfj9098789sdfadf
lpr@h5=papowell-h5 asdfu189asdfasdfasdfasdfasd
Server Keyfile (host h4)
#key = user_auth salt
# user key
papowell-h4=xx01223750adfj9098789sdfadf
# key for forward transfer to host h5
lpr@h5=lpr-h4 adfa9ipioasdfasdfjklsf
# key for forward transfer from host h5
lpr-h5=adfa9ipioasdfasdfjklsf
Server Keyfile (host h5)
#key = user_auth salt
# user key
papowell-h5=asdfu189asdfasdfasdfasdfasd
# key for forward transfer to host h4
lpr@h4=lpr-h5 adfa9ipioasdfasdfjklsf
# key for forward transfer from host h4
lpr-h4=adfa9ipioasdfasdfjklsf
Configuration:
auth=md5
Just to make life interesting, I have also added a demonstration
of how to do md5 signing and authentication.
e) Code reorganization
The LPRng/src/common/sendauth.c and LPRng/src/common/lpd_secure.c
files have the following stuff added at the end.
#define SENDING
#include "user_auth.stub"
struct security SendSecuritySupported[] = {
/* name, config_tag, connect, send, receive */
{ "kerberos4", "kerberos", Send_krb4_auth, 0, 0 },
{ "kerberos*", "kerberos", 0, Krb5_send },
{ "pgp", "pgp", 0, Pgp_send },
{ "user", "user", 0, User_send },
#if defined(USER_SEND)
USER_SEND
#endif
{0}
};
This is an example of how you add user level stuff for encryption
and not go to jail for international arms smuggling. The "user_auth.stub"
file contains the source code for the various modules, or you can put the
source code in another file and link it in. This is recommended when you
want to use a dynmically loadable library and ship the library. (Note:
yes, I looked at loadable modules a la Apache, but LPRng runs on systems
that do not support this, so I gave up. This is the older method from
other real time software that seems to work.)
The data structure has the name of the authentication, used with the
auth=xxx tag. The name field corresponds to the xxx value.
The config_tag is used to do lookups in the various configuration and
printcap files to get values. Why not make them the same? As you see
in the example, we have kerberos4 and Kerberos 5, but we use different
support routine with the same key values. Backwards compatibility is
thus assured. Oh, yes. Note that you can use wildcards for the name value.
The connect, send, and receive fields are the support routines that are
used for handling encryption.
connect: make a connection, fumble around and do authentication,
and then return. Kind of like a 'connect' call, but does handshaking.
Note that the data link and other stuff is handled by LPRng. Very
lightweight and fast.
send: this is an alternative to connect. The routine is handed a file
that it packs up and then sends to the remote end. In response
it gets data back that it will unpack and deliver to the user as
status or error messages.
receive: this routine is called when the LPD server gets an authentication
request.
If the 'connect' routine is used, 'connect' sends a magic
string to the server that will cause it to call this routine. The routine
will do the hand shaking, and then return. The normal LPD service
routine will take over.
If the 'send' routine is used, this routine will get the stuff sent
by the remote end, unpack it, or what ever is appropriate, and then
call the LPD service routine. By convention, it passes the routine
a file to put its error messages, etc., into. When the routine returns,
the file contents are packaged up and sent back to the server.
Note: Kerberos4 : uses connect / receive
Kerberos5 : uses send / receive
PGP : uses send / receive
MD5 'send': uses send / receive
MD5 'con' : uses connect / receive
The source code for PGP authentication is in LPRng/common/linelist.c
(don't ask). You can get an idea of how to add more authentication by
looking in LPRng/common/user_auth.stub for excruciatingly detailed
discussions and examples.
The #define SENDING controls what stuff in the user_auth.stub
gets included. If you look in the sample file, you will find:
#if defined(SENDING)
extern int md5_send();
# define USER_SEND \
{ "md5", "md5", md5_send, 0, md5_receive },
#endif
This little bit of code causes the prototype md5_send() to be put in place,
and then the USER_SEND to be defined. Note that in the original file (send_auth.c)
that this is used in a table to insert the correct authentication stuff.
Enjoy.
Release LPRng 3.6.12 Tue Oct 26 16:59:35 PDT 1999
AIX does not like control files where Nxxx comes before data file lines.
Added a 'nline_after_file' option to cause LPRng to put Nlines after
data file lines.
(Noticed by: Nik Conwell <nik@bu.edu>)
configure - kerberos libraries are now specified at the start
of the library list (LIBS="-lkrb5 $LIBS")
(Suggested by: John Perkins <john@cs.wisc.edu>)
Typo caused LPD not to read the permissions file.
(Noticed by EVERYBODY, but first by: Patrick O'Brien" <pdo@cs.umd.edu>)
Release LPRng 3.6.11 Sun Oct 24 13:37:44 PDT 1999
Permissions checking: SERVICE=* was not getting handled correctly.
(Found by: Dejan Ilic <svedja@lysator.liu.se>)
Jobs with more than 26 files were quietly being mangled.
(Found by: Derek Masseth <dmasseth@u.arizona.edu>)
lp simulation now returns a 'job identifier' consistent with
Solaris 2.5 format.
(Noticed by: Martin Mokrejs <mmokrejs@natur.cuni.cz>)
Added support for case sensitive key lookup in sorted lists.
(General cleanup and tidy: Patrick Powell <papowell@lprng.com>)
Set_linger() (setsockopt socket linger timeout) failure is
now ignored, rather than treated as failure. This now
handles the case where pipes are actually second class citizens
and the operation fails. Note that this probably could
be fixed by testing the file descriptor for type and then
determining the exact socket type, but this is NOT portable.
Set the default paper size for the IFHP-HOWTO to letter.
The psutils package can be used to resize this for a4, which
is slightly larger.
Did horrible things to job reception to handle jobs with
spaces and more bogus entries in the name fields. This
is really strange. Note: still one quirk - if the server name
has a space in it AND the job is originated on the server,
THEN the originating host is set to 'localhost'... which is
correct but may be odd when forwarding to another system.
Compaq AKA DEC True 64 support added - configure.in now does
odd things to detect correct libraries to be used to get
gethostbyaddr() support. Portablility.
configure --disable-strip will disable stripping of binaries.
(Requested by: Marty Leisner <leisner@sdsp.mc.xerox.com>)
Permissions, 'SERVICE=P', and job removal:
if a print job gets through the 'R' (lpr job sumission) checking,
and gets into the queue, there is another check ('P' or print
time checking. This was done to subdue complaints from systems
which could not handle a 'no permssions' error and would sit
there endlessly trying to send the same job to the printer
queue, and other users would not get their jobs through.
When a job is ready to be printed and fails the 'SERVICE=P'
permissions check, it is now removed and not printed,
UNLESS the 'save_on_error' flag is set, in which case it
is marked with a permissions error and left in the queue.
Note 1: the lpd.perms file has been updated to reflect this
behavior.
Note 2: the HOWTO has been updated to reflect this behavior.
Note 3: if you have a DEFAULT REJECT in your lpd.perms, this
means that no jobs will get printed. :0). Enjoy.
Set the 'SO_KEEPALIVE' option on sockets to force keepalives to be
sent so that dead connections would be detected.
Updated some code in the common/lpd_remove.c file to close a small
timing race condition for job removal. Sometimes a job would get
removed and the server process would not be killed. Note that
the kill is done by sending SIGINT to the processes.
Changed a int to double for file length in common/lpd_rcvjob.c.
Modified UTILS/cheap_lpr and UTILS/LPRng.pm to handle more than
one file in print jobs.
Checked out a few problems with PGP and user specified authentication.
(Spotted by: Patrick O'Brien" <pdo@cs.umd.edu>)
LPQ - use the file name information if no 'J' (job) line in control
file, and finally "NULL" if no information. This prevents many scripts
from breaking.
getqueue.c:Get_datafile_info() was not getting the N,U, and format
values correctly under all circumstances, i.e. - duplicates,
out of order N lines, totally bogus or missing N information.
What a mess.
(Spotted and patch by: Edwin Lim <elim@research.att.com>)
(And lots of others, with comments, flames, and snickers as well.)
Fixed a problem when you used a filter to get printcap information,
and you did a recurive get, and you had a tc=xxx entry.
(Spotted and debugged by: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
configure --enable-priv_ports action was reversed...
(Spotted by: Robert Montjoy <Rob_Montjoy@ececs.uc.edu>)
Warning message about '@' in a printcap name was malformed.
(Spotted by: Andreas Kahnt <ak@m-ebert.de>)
Added a 'tc_only' flag to allow printcaps to be explictly
marked for 'tc=name' use only. This allows people using
NIS, NIS++, and other database engines to put printcap
information in database forms.
Now 'checkpc -P printer' will only check specified printer. Handy
for 'checkpc -f -P printer' type of operations when you add a
new printer to a system.
(Suggested by: Wilfried Gaensheimer <wilfried.gaensheimer@hl.siemens.de>)
Release LPRng 3.6.10 Sun Sep 12 19:46:33 PDT 1999
lpc.1 man page moved to lpc.8 man page
(Suggested by: Craig Small <csmall@eye-net.com.au>)
PERMISSIONS CHECKING:
The USER, HOST, IP, SAMEUSER, SAMEHOST, entries will now SUCCEED
when checking permissions for an operation to be applied to a
spool queue; when the individual jobs in the queue are checked
the comparisons will then be done. This has the effect of allowing:
ACCEPT SERVICE=C LPC=hold,release SAMEUSER SAMEHOST
ACCEPT SERVICE=M SAMEUSER SAMEHOST
to be specified and allows a user to hold, release, or delete
their jobs.
(Need pointed out by: Jens Noelle <noelle@amica.rwth-aachen.de>)
Updated the lpd.conf file generation to put in the types of options.
NONE renamed to NONEP due to conflicts with some <sys/types.h>
definitions.
Added a $_ capability to filter options.
(Patch by: Mike Whitson <mwhitson@MIT.EDU>)
Added a configure option to set the :sh default to 1 (on).
Release LPRng 3.6.9 Mon Aug 30 13:30:58 PDT 1999
reverse_priority_order flag - priority z-aZ-A, i.e. - A is lowest
(Requested by: Dennis Bush <Dennis.Bush@dowjones.com>)
LPD now does a chdir("/") so that it is in a well known location.
(Requested by: Craig Small <csmall@eye-net.com.au>)
Time used to sort job is now the arrival time of the last byte
of the job.
Release LPRng 3.6.8 Fri Aug 27 17:06:10 PDT 1999
*** WARNING: configure strikes again
***
*** printcap, lpd.conf, lpd.perms now default to:
*** /usr/local/etc/{ printcap, lpd.conf, lpd.perms}
***
You may want to do:
ln -s /etc/printcap /usr/local/etc/printcap
OR
configure --with-printcap_path=/etc/printcap
Please move your lpd.conf and lpd.perms files to /usr/local/etc/
Why? Because when trying to port this to XxxxBSD, BSDI, Solaris,
SunOS, HPUX, DGUX, etc etc etc I have run into so many inconsistencies
that I have just given up.
You might as well assume that the following is true for a default install.
Updated configuration to be a little more consistent with other packages
default installation directories:
${prefix} is usually /usr/local
${bindir} is usually ${prefix}/bin, (/usr/local/bin)
${sbindir} is usually ${prefix}/sbin (/usr/local/sbin)
${libexecdir} is usually ${prefix}/libexec (/usr/local/libexec)
${sysconfdir} is usually ${prefix}/etc (/usr/local/etc)
${mandir} is usually ${prefix}/man (/usr/local/man)
We install the executables in:
(* indicates default SETUID Root install)
${bindir}/ lpr *, lprm *, lpq *, lpstat *
${sbindir}/lpc *, checkpc, lpd *
${libexecdir}/filters/ lpf, banner, etc
${sysconfdir}/ lpd.conf, lpd.perms, printcap
${mandir}/ man pages
Suppose you wanted to put them in /usr/bin, /usr/sbin, and /etc:
configure --prefix=/usr --sysconfdir=/etc
Note the following explicit overrides:
--disable-setuid disable setuid root client and server executables
--enable-priv_ports require connections to be from privileged ports
--disable-force_localhost force_localhost default to disabled
--with-lpddir=DIR lpd executable directory (default ${sbindir})
--with-filterdir=DIR filter directory (default ${libexecdir}/filters)
--with-lpd_conf_path=PATH path to lpd.conf (default: ${sysconfdir}/lpd.conf)
--with-lpd_perms_path=PATH path to lpd.perms (default: ${sysconfdir}/lpd.perms)
--with-printcap_path=PATH path to printcap (default ${sysconfdir}/printcap)
Fixed up the INSTALL and HOWTO documentation as well.
Note 1: you can make a symbolic link from /usr/local/etc/printcap to
/etc/printcap and this will solve the issue as well.
---
Job time is now recorded down to the millisecond a jobs sorted according to that
time. This will slightly improve the situation due to multiple jobs arriving at
at (approximately) the same time. Jobs are sorted accordingly.
(Suggested by: Abramo Bagnara <abbagnara@racine.ra.it>)
Release LPRng 3.6.7
LPRng now handles files larger than 2 gigabytes on systems where the max
size_t is larger than 2 gigabytes.
configure now checks to see that there is a prototype for lseek().
(Both inspired by somebody trying to print a 2G file:
John Kimberley <jkimberly@harland.net>)
lpq -n linecount
Limits number of status lines to linecount. Can be used when
you want an exact number rather than using -llll.
lpc now puts debug flags in () -
Printer Printing Spooling Jobs Server Subserver Redirect Status/(Debug)
t1@h4 enabled enabled 0 none none (4)
There is a horrible problem with load balance queues, SIGCHLD, and missing
SIGUSR1 signals on Solaris 2.4, 2.5, and 2.5.1. The code in lpd_jobs.c
has been rewritten, silly things have been done and it now looks awful,
but it works, is portable, and ugly. So much for elegance.
Added more %U option to lpc, lprm to allow SAMBA to specify users.
Release LPRng 3.6.6 Sun Aug 22 10:42:20 PDT 1999
LPD did not exit with non-zero success code when there was another
lpd active.
(Patch from: Stephen Fischer <fischer@cse.unsw.edu.au>)
LPD bounce queues changed the 'N' data in the control file. Should not
do this.
(Noticed by: John Rothlisberger <rthlsbrj@pprd.abbott.com>)
New timeout - exit_linger_timeout
When an LPD server process exits, it needs to try to 'flush' data over
the various pipes, sockets, etc, that are part of the IPC. The problem
is that on some OS's, when a process exits the data in a pipe buffer
may be discarded if the process exits due to a signal. Added
'exit_linger_timeout' to force all pipes/sockets to be 'lingered' on
during cleanup. This is a totally bogus method. What is needed is a
setsockopt() function similar to 'fflush' that would not return until
all the data is flushed to the remote end. It turns out that the
SO_LINGER with a 0 value should have done this, but the 0 value causes
a 'default' value to be used. Grr... Needless to say this is a hack
of the worst type, does not work on all systems.
LPR was failing due to connnections closing due to lack of processes.
When a connection is made to the LPD server, it used to do accept()
and would then fork a process. This would lead to some ... interesting...
denial of service attacks, and some very odd problems when you ran out
of processes. The code now does the following:
creates a pipe()
forks a process =
= child will now do an accept
= child will then close the pipe
parent WAITS until the child pipe is closed.
This has the effect of making sure that the child process has
done the accept, and will BLOCK until the accept is done.
This makes sure that there is a process to handle the connection.
Wierd, I tell you. Note that there is a way to do a DOS attack on
some systems that signal a connection is available BEFORE the 3 way
handshake completes, and should cause endless problems. You can
also launch DOS attacks on inetd, ftp, etc. etc. on these systems
as well. See CERT for more nasty details.
LPQ now correctly reports all jobs, even ones from different
machines with the same job numbers. Yeah, it looks confusing
in the output to have two job 12's, but HEY! what do you want
on 80 columns?
LPQ now confuses people trying to figure out why there are
duplicate jobs in the status listing. See above. Isn't this
marvellous?
lpd_jobs: when processing long queues a huge number of tempfiles
would be created. Now these are removed each time the queue is scanned.
Sigh...
lpd_jobs: when you have a connection opened using lp=host%port,
then lpd now do a shutdown(port,1) on the socket. Now we get
into the really odd stuff. We first set the linger value to
'read_write_timeout' if nonzero otherwise the 'exit_linger_timeout'.
IF the 'wait_for_eof' flag (default TRUE) is set, we try
READING from the socket until we get an eof. We then close
(with the linger) the socket.
Here are the problems that this tries to solve.
When you send a job to a printer over a socket connection,
you stuff the files into a socket and then expect the OS to
deliver the data. WRONG! The OS puts this in some buffers.
It returns from the WRITE call with success. You now do a
close(). At this point there are some interesting possibilities:
a) your data is delivered, even after waiting 6 weeks for the
other end to respond (BAD choice); b) the system attempts to
deliver your data for, say, 120 seconds (default 'linger'
time on some BSD systems); c) you can specify how long you
want to have the system try to deliver the data. While this
is going on of course, you cannot open a connection to the
device, as it is still busy with the previous connection.
You really want to treat the 'close' like a 'write' and wait
for a reasonable (read_write_timeout) time for this to happen.
When you do a write 'shutdown', the TCP/IP connection sending
(write) capability is terminated, and the TCP/IP stack does a
handshake with the other end telling it that no more data will
be sent. The receiver will get an EOF when it tries to read
more data, and will, in turn, close the connection. Note that
this must be a 'shutdown' and not a 'close'. All close does
is closes the process's copy of the file descriptor information.
Shutdown is brutal and will terminate with predjudice the tcp/ip
level communication (thank the Diety). How do you know that
the receiving end has closed the connectio? You do a read from
the socket until you get an EOF. Of course, you should be
reading from the &*()*& socket at all times, as the printer
will be sending status, error messages, etc. etc. back to you.
But your filter should be doing this, right? Oh... you do
not have a filter... well, you MUST have a filter that does
the reading - this is what the IFHP filter was designed to do,
and in fact goes overboard to solve this problem. Even when
you say 'status@' it STILL tries to read from the file descriptor
because there might just be stuff coming back. Sigh...
Release LPRng 3.6.5 Sun Aug 1 16:46:31 PDT 1999
The date format in the status messages has been changed so that
you can have a short or long format displayed. By default, the short
format is displayed (short_status_date option is true). Note that this
sillyness is partly forced on us by Y2K issues.
New flag option: short_status_date - when set, status time/date displays
only time.
(Sigh... by: Patrick Powell <papowell@lprng.com>)
Remote logging information now contains full date and time and process id.
(Sigh... by: Patrick Powell <papowell@lprng.com>)
Update LPRng HOWTO to specify that filter STDERR output is now merged with
the status messages. This allows errors reported by the filter to appear
on the lpq status.
You can specify filter arguments as the form xxx 'yy yy' "zz zz" and they
will get passed as a block.
(Suggested by: Martin Forssen <maf@crt.se>)
The lpstat -a code has been fixed so that it correctly searches for
printer names.
(Reported by: Martin Forssen <maf@crt.se>)
Removed duplicate status information lines in status file.
(Discovered by: Patrick Powell <papowell@lprng.com>)
Added 'send_failure_action' information to status output to allow users
of this very odd feature to figure out what is happening.
Fixed up LPRng to handle a stupid RFC1179 idiocy. If you have a control
file, then the order of N and data file lines is not defined. So
you have to handle them in any order. Also, you can have the same
data file line with DIFFERENT formats - sigh... this means that you
can print it several times with different formats.
The 'generate_banner' option, which was present in 3.5.1, has been restored.
This is only operational when you have a 'normal' forwarding queue.
It uses the 'ab' (always banner), bp (banner printer), bs (banner
printer program for banner at start), and be (banner program for banner
at end), hl (header or banner last) and the user banner information.
The "cm" (comment) option has escapes processed. Now you can put ":"
in the comment line by using "\072"
(Wanted by: Johan Claesson <Johan.Claesson@uab.ericsson.se>)
Release LPRng 3.6.4 Sat Jul 24 14:29:09 PDT 1999
Cut and Paste-o observed in the configure.in file - LPD_CONF_PATH
should be LPD_PERMS_PATH.
(Reported and patched by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu)
Added: AC_PROG_AWK, AC_SUBST(AWK), to configure.in to find the version
of awk to use.
(A good suggestion by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu)
SAMBA Assistance.
The -U option has been extended to the LPRM program as well as the LPR
program. This allows facilities such as SAMBA to submit jobs on behalf
of users. In order to allow SAMBA and these facilities not run as root,
the allow_user_specification=name,name,... configuration option will allow
either root or the named users to forgre... I mean impersonate any user.
The SAMBA printing configuration file will now look like:
[global]
printing = lprng
print command = /usr/local/bin/lpr -P%p -r %s
# alternative to allow userid to be specified as well
# You will have to add the samba UID to the 'allow_user_setting'
# option in the /etc/lpd.conf file.
# print command = /usr/local/bin/lpr -U%U -P%p -r %s
lpq command = /usr/local/bin/lpq -P%p
# alternative
# print command = /usr/local/bin/lpr -U%U -P%p -r %s
lprm command = /usr/local/bin/lprm -P%p -U%u %j
printcap name = /etc/printcap
load printers = no
[printers]
comment = All Printers
path = /tmp
browseable = no
printable = yes
guest ok = no
writable = no
create mode = 0700
man pages and HOWTO have been update to reflect these changes.
commmon/linelist.c: Escape() had a malloc() size error.
man/lpd.8 man page editted and fixed up for consistency.
(Found by: Patrick Powell <papowell@lprng.com>)
FreeBSD Support: FreeBSD.ports.sysutils has the files for a Ports Install
RedHat RPM: pkg has the files needed to build a RedHat RPM distribution.
Release LPRng 3.6.3 Fri Jul 16 16:01:27 PDT 1999
CONFIGURE CHANGES
Please note that the configure and 'make install' have been modified in
order to deal with different installation locations and configuration setups.
Here are the options to configure that you should be aware of:
--with-cppopts=CPPFLAGS select compiler preprocessor command line options
**** note: these flags will also be passed to CC, so set your options using
**** this configuration option.
--disable-setuid disable setuid default
**** note: use this if you want to install without setuid
--disable-priv_ports set default lpd.perms to reject connections from non-privileged ports
**** note: if you disable priv-ports, you MUST install setuid.
**** Thus, you can have --disable-setuid, --disable-priv_ports, but not both
--disable-force_localhost disable force_localhost default
--with-lpddir=DIR where to install the lpd binary.
*** where you want LPD to be installed.
--with-admindir=DIR where to install the administrative commands, like
checkpc, lpc, etc.
*** where you want the other stuff installed
--with-filterdir=DIR where to install filter (default ${libdir}/filters)
checkpc, lpc, etc.
*** where you want the filters installed
--with-lpd_conf_path=PATH where to install lpd.conf (default /etc/lpd.conf,/usr/etc/lpd.conf)
--with-lpd_perms_path=PATH where to install lpd.conf (default /etc/lpd.perms,/usr/etc/lpd.perms)
--with-printcap_path=PATH where to install printcap (default /etc/printcap,/usr/etc/printcap)
--enable-nls use Native Language Support
--with-included-gettext use the GNU gettext library included here
--with-catgets use catgets functions if available
MAKE INSTALL changes
These tie into the changes with configure. You should be aware of them.
You have been warned.
Note 1: FreeBSD
To put LPD in /usr/libexec/lpd, admin in /usr/sbin, and other stuff in /usr/bin
configure -with-lpd_conf=/usr/libexec/lpd -with-admindir=/usr/sbin --prefix=bin
Note 2: RedHat Linux
To put LPD in /usr/sbin/lpd, admin in /usr/sbin, and other stuff in /usr/bin
configure -with-lpd_conf=/usr/libexec/lpd -with-admindir=/usr/sbin --prefix=bin
Minor fix to configure, src/Makefile to link only lpq with terminal library
(Supplied by: Roderich Schupp <rsch@ExperTeam.de>)
Set spool_dir_perms to 0600 instead of 042600.
(Supplied by: Roderich Schupp <rsch@ExperTeam.de>)
Typos and More Typos in HOWTO
(Spotted by the Eagle Eye of: Wolfgang Schludi <schludi@syscomp.de>)
Printcap 'oh=' was using wrong entry.
(Reported by: Wolfgang Schludi <schludi@syscomp.de>)
lpd -D= did not tell you what you did wrong.
(Reported by: Niklas Edmundsson <nikke@ing.umu.se>)
Kerberos authentication forwarding was incorrect.
(Fixed by: Mike Whitson <mwhitson@MIT.EDU>)
Printcap includes were not being processed correctly.
(Reported by: Don Badrak <dbadrak@census.gov>)
The spool queue control, status, and unspooler files (control.%P,
status.%P, and unspooler.%P) are now specified by the
queue_status_file and queue_control_file options. This allows
you to relocate the files to another spool queue, or even use
the file.%D option to have a date appended to the file name.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
When the lpd logger facility makes a connection to the receiver of the
log information, it sends a dump of the system status. The dump
consists of a set of lines, one line per print spool entry.
The end of this dump information is indicated by a single END
line, i.e: END\n. This enables a database management system to
know that all of the queue information has arrived and can then
undertake to do any consistency checks.
(Need determined by: Patrick Powell <papowell@lprng.com>)
When a 'lpc reread' is done, the logger process is killed and restarted.
This forces the logger process to use the new printcap or configuration
information.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
When an unspooler process is active, a SIGUSR1 signal is sent to it
to force it to rescan the spool queue. The SIGUSR1 signal
handler sets the Susr1 flag, and this flag is checked. There
is a small window between the time that the flag is checked,
the process decides that no new jobs have been put in the queue,
and the process exits. This window has now been narrowed down even
more by performing a final check just before the process exits.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
On a heavily loaded system where a large number of files are being
created and/or destroyed, the spool queue scanning code would
miss some jobs at the start or end of the queue. This was due
to the fact that the scandir() routine does not lock the spool
directory, and it can change as the directory is being read.
In order to reduce this window to the smallest possible size,
the directory is now scanned for files and then the files are
processed.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
Updated HOWTO to reflect these changes. Updated MAN pages.
Release LPRng 3.6.2 Sat Jun 12 16:44:15 PDT 1999
LPRng-HOWTO corrections.
(Corrections by: Vladimir V Egorin <vladimir@math.uic.edu>)
Used the wrong process exit status variable in common/lpd_jobs.c
(Noted by: Olav Kolbu <olav.kolbu@usit.uio.no>)
Added STATE and LPC command execution tracing to the
logger messages. This allows a remote system which is
monitoring LPRng operation via the logger interface to
monitor when a job is submitted and printed.
Updated format of message sent by logger.
UPDATE message now has a
hf_image= and (optional) lpc= encoded portion
QUEUE message now has a
queue= and (optional) lpc= encoded portion
The lpc identifies that the udpate was done by LPC operation
rather than by LPD as part of normal operation.
File locking had problems under SunOS 4.1.4.
You can now have single letter printer names.
(Sigh... noted by: Patrick Powell <papowell@lprng.com>)
Accounting information now has options (correctly) quoted:
start '-H...' '-c' '-JThis is a job'
This is consistent with ifhp 3.3.2.
Release LPRng 3.6.1 Mon Mar 22 09:42:07 PST 1999
This release is a major rewrite of the LPRng software and uses
dynamic memory allocation and as few static and global variables as possible.
This is intended to simplify the porting of the LPRng software
to a multi-threaded environment. In addition, substantial
cleanup of much of the code was done.
Due to time constraints, some functionality that is present in other
test versions was not put into this release. This includes
setting user information by originating IP address.
The 4.x.x release will have support for the new IPP print protocol,
SNMP MIB, and a HTTP server interface.
As far as possible, existing functionality has been preserved,
with the following notable exceptions. These are divergent enough
to cause a new major release number to be used, i.e. - 3.6.x
License
Due to various technical legal reasons, the License for this
release of LPRng has been changed from the GNU Copyleft to the slightly
different but similar in intent Artistic License.
Load Balance Queues and Class types
Assume: a load balance queue with several printers, say
master -> S1, S2;
You can now set the class types accepted by S1 and S2, and
the Master Queue will check the job types against the class
types before sending the job to the appropriate queue.
What is this all about? If S1 has blue paper you can set the
currently printing class to blue (lpc class blue).
Now do lpr -Pmaster -Cblue and your job will be routed to printers
which currently are printing class 'blue'. Clearly this can be
extended to other things besides paper.
Note that when you use this option you should set the master
queues ignore_requested_user_priority flag so that the first
letter of the class type is not used as the priority.
*********************************
******* force_localhost ********* distribution default is ON
*********************************
The Most Frequently Reported Problem with 3.4.X and 3.5.X was the following:
lpr is not sending jobs to my lpd server. Why?
The reason is that other BSD based spoolers ASSUME that the
lpd server will be running on localhost, and the clients
(lpr, lpq, etc) will connect to the server. So the printcap
files are written as:
lp:sd=/usr/spool/whatever
:rm=remoteserver:rp=remoteprinter
Of course, lpr reads this as meaning 'connect to the remoteserver',
and never sends the job to the server running on the localhost.
The 'force_localhost' option will FORCE lpr, lpc, etc to connect to
the localhost UNLESS lpr -Ppr@remoteserver is used, i.e.- a command
line override. In LPRng 3.5.X, the default value of 'force_localhost'
was OFF. In LPRng 3.6.X, the default value is ON.
Bounce Queues, lpd_bounce, and LPR Side Filtering
The lpd_bounce option REPLACES bq=xxx
Example: ->
pr:lp=pr@xxx pr:lpd_bounce
:bq=far@server :lp=far@server
This makes bounce queues consistent with remote print queues.
The entire print job job is passed through the various filters,
and the entire output is now sent as a single file to the next
queue. The format of this file is set by the bq_output=X option.
This now allows the full use of leaders, trailers,
banner page generation, etc., to be used.
Printcap tc=xxx:tc=yyy handling
printcap includes (tc) are done BEFORE setting the values
in the printcap entry, and in order. Thus:
lp:s=X:tc=.t1,.t2:tc=.t3
.t1:s=Y
.t2:z=W
.t3:z=P
would result (for lp) in:
lp:
:s=Y # from .t1
:z=W # from .t2
:z=P # from .t3
:s=X
and a final result of
lp:s=X:z=P
(Requested by and faultless arguments by: the lprng mailing list...)
Permissions List File:
You can now say XXX=<filename and the whitespace separated
contents of the file are used as the options value.
Example:
ACCEPT REMOTEHOST=</usr/local/etc/lpd_hosts
and have /usr/local/etc/lpd_hosts contain:
*.site.com
10.0.0.1/24 pc.*.mystuff.org
LPC Permissions Checking
You can now use:
ACCEPT LPC=hold,remove,topq
If you are doing an LPC operation, then this matches the operation.
This replaces the lpc_user=.... printcap abomination.
For example, to allow user X on the server to do hold operations,
use:
ACCEPT LPC=hold USER=x SERVER
The 'ms', 'sy' and 'ty' serial port configuration options are now
the single option 'stty' which makes more sense and is compatible
with other LPRng software.
The 'rt' and 'send_try' options were accidentally aliased - removed
the 'rt'.
There is now finer control for remote LPQ queries.
force_lpq_status=KEY=hostlist;KEY=hostlist
Specifies a set of hosts and the format for lpq status queries,
overridding the requested format.
KEY = l (long) or s (short)
hostlist = list of IPaddress/Mask or GLOB patterns for hostnames
Example: force_lpq_status=s=*pc.site.com,10.0.25.0/24;l=sunsystem.site.com
reverse_lpq_format=hostlist
Reverse l and s query formats when a request arrives from these
hosts.
return_short_status=hostlist
Return short_status_length status lines when a request arrives from
these hosts
short_status_length=N
Number of status lines to return when return_short_status matched
LPC added commands
active - checks for an active server
local (all | printer) - show printcap and configuration information
for a local printer. Debugging aid.
LPQ added option
-L - equivalent to -llllll....
CHECKPC
checkpc -V now prints out all sorts of additional information for
debugging and problem solving.
checkpc now checks both for server AND client mode. No fixing done
for client information, just displays it.
checkpc now checks for missing tc=xxx entries.
LPD_CONF_PATH and PRINTCAP_PATH compilation option
make LPD_CONF_PATH=/usr/local/etc/lpd.conf
make PRINTCAP_PATH=/usr/local/etc/printcap
- changes the /etc/lpd.conf and /etc/printcap file
default locations
AUTHENTICATION
The entire authentication interface has been redone, and PGP,
Kerberos 5, and MIT Kerberos 4 Print System compatibility has
been added. The permissions checking method has been changed as
follows, with respect to the following keys:
AUTH match or TRUE if authenticated transfer done
AUTHTYPE matches the authentication type
AUTHUSER client or user's authentication id
AUTHFROM originating server's authentication id when forwarding job
AUTHSAMEUSER match if the client id in the request and the
(saved) client ID used to spool a job are identical.
AUTHJOB match or TRUE if a job was submitted with authentication
Options have been redone to put a bit of consistency into things
auth=xxx authentication type for client to server
auth_client_filter=/path client to server authentication filter
auth_forward=xxx authentication type for forwarding
auth_forward_id=xxx authentication id for remote end when forwarding
auth_forward_filter=/path server to server authentication remote server id
auth_recieve_filter=/path server filter to recieve authentication
auth_server_id=xxx client to server - id of server
receiving server - id for reception
server to server - id for origination
pgp_path=/path path to pgp program for auth=pgp
pgp_passphrase=clientkey file in $(PGPPATH) or $(HOME)/.pgp
holding client passphrase
pgp_server_key=~daemon/.pgp/serverkey file holding LPD server passphrase
SOLARIS Package Support
Start of generating binary distributions.
(Contributed by: Martin Forssen <maf@crt.se>)
LPD lock file: now defaults to /var/run/lpd
(Pointed out by: Martin Forssen <maf@crt.se>)
%D expansion, create_files flag
If you have %D in a printcap value, it gets expanded to the
current date in YYYY-MM-DD format. If you have the create_files flag
set, then the files that normally get trimmed (max size specified)
are created. This allow you to do:
lf=log-%D
Your log files now will have the pathname sd.../log-YYYY-MM-DD
and you can now get rolling log files on a daily basis.
The files that have this done are the log file, status file,
and accounting file.
PCLBANNER and PSBANNER - new banner printing programs using PERL produces
pcl or PostScript banner page.
lp:bp=/usr/local/.../pclbanner
:of=....
:if=....
OR
lp:bp=/usr/local/.../psbanner
:of=....
:if=....
Bug fixes:
Gadzillions. Many. Some were not bugs but simply inconsistencies with
documentation. Sometimes documentation changed, sometimes the code.
Default Server Print Queue:
The default_printer_when_unknown configuration option
allows you to specify a print queue that the server will use when
it cannot find one in the printcap. This print queue should have
the format:
/etc/lpd.conf:
default_printer_when_unknown=fallback
/etc/printcap:
fallback:server
:sd=/usr/spool/lpd/%P
:router=/..../router_for_misdirected_jobs
The router should output the correct destination (see router documentation
in LPRng-HOWTO), and exit with 0, or exit with JREMOVE to cause the job
to be dropped in the bit bucket.
Release LPRng 3.5.4 Mon Nov 9 10:07:42 PST 1998
Bug fixes:
Bad link to site in LPRng.smgl documentation.
(Reported by: Anthony Thyssen <anthony@cit.gu.edu.au>)
LPQ status was missing a space separator when reporting
subserver name list.
(Spotted by the Eagle Eyes of: John Callaghan <callagh4@pilot.msu.edu>)
The xt flag has been expurgated, totally. As was documented.
(Spotted by: James P. Dugal <jpd@usl.edu>)
LPR_bsd option added so that -m does BSD mail option.
(Requested by various folks)
Testers and bug fixers:
(Compilation: Bernie Kirby <bernie@ecr.mu.oz.au>)
Release LPRng 3.5.3 Mon Nov 9 10:07:42 PST 1998
Documentation Error:
LPRng-HOWTO, Section 8, indicated that the lpd.conf file
could be obtained using a filter. This is not correct.
(Noticed by: David Stenglein <david.stenglein@citicorp.com>)
Major Modification:
removed the 'xu' (per spool queue permission file) after trying
to make the semantics work. Now we have a single permission file
for all printers
Major Modification - Load Balance Queues:
Some users reported very slow operation of the load balance
queues. This was verified, and extensive modifications were
made to the functionality.
CHANGE:
The subserver queues are only scanned at startup
and when there is an explicit indication that a new
job has been put into or removed from the queue
(SIGUSR2 received)
Major Modification - LPD Does Not Ignore LPR, LPC Requests
Some users with either large numbers of spool queues or
spool queues with large numbers of jobs noticed VERY slow
LPD response.
This has been improved considerably.
CHANGE:
LPD server would run through the Spool queues, looking for
trash to be removed or jobs to be started. This polling is
necessary due to the possibility of a race condition between
the time that a job is put into the queue and the time that
the unspooler checks the queue for entries.
The operation has been modified so that only a SINGLE PROCESS
runs down through the spool queues. When it finds work to do,
it informs the LPD server, which now will start ANOTHER process
to check other queues for work. Note that while these processes
are working their little hearts out, chewing up swap space
and reading directory entries like mad, the LPD server can
accept requests for LPQ, etc.
Major Modification - LPR speedup:
The LPD server now accepts jobs for spooling WITHOUT extensively
checking the spool queue. This eliminates problems with printing
to queues with a large number of entries.
Speed Improvement:
A bit of time analysis showed that LPRng was spending a large
amount of time during queue scanning in the fcmp() routine.
This has been rewritten and is now a strcmp().
During queue scan, Get_controlfile() generates a 'cmp_str' value
that represents the information needed to do sorting. This is
is then used during queue sorting as the comparison value.
The 'struct cmp_struct' in the include/sortorder.h is used to
make sure that sufficiently long string buffers are allocated.
The make_cmp_str() in common/sortorder.c can be replaced with
a users version if they desire.
Bug Fix:
safestrncpy, mystrncpy, safestrncat, mystrncat now used for string
copies where there is doubt on the buffer/string length. Note that
these versions will always make sure the buffer is terminated with
a 0 value.
lpr -U xx is supposed only to work for ROOT. Check for root perms
was not done correctly.
(Patch by: Paul Szabo <psz@maths.usyd.edu.au>)
permissions checking: the C=value1,value2 permissions checking
option wants a C (control file) line starting with character C
and glob matching the indicated value1, value2, etc. For example,
N=patrick*,powell* should match against line Npatrickwashere or
Npowellwasthere. The check was done incorrectly.
(Patch by: Paul Szabo <psz@maths.usyd.edu.au>)
LPD/lpd_rcvjob.c - removed limits on lengths of class and host names
When using bounce queues and the generate_banner to cause a banner to
be added to a job, the 'ab' (always banner) and the lpr -h (no header)
flags now are used in the decision for banner generation.
(Noticed by: Charles Karney <karney@pppl.gov>)
Filters were not being passed -Knnn option.
(Noticed by: Charles Karney <karney@pppl.gov>)
Permissions: SERVER keyword was not used for X permissions.
(Fix by: Patrick Powell <papowell@lprng.com>)
File Permissions: spool_file_perms was being ignored due to the
umask() not being (un)set before creating a file.
(Discovered by: Albert Fluegel <albert.fluegel@hl.siemens.de)
ConnectTimeout now times out on connect() calls.
(Reminded by: Heinz-Ado Arnolds <arnolds@ifns.de>)
Accounting filter: when the filter returns 'JHOLD' the job
will be held (as documented).
(Patch by: Rainer Schoepf <schoepf@uni-mainz.de>)
LPRM incorrectly gives the "clean" usage instead of "lprm" usage.
(Fix by: Edan Idzerda <edan@mtu.edu>)
The 'xt' and 'check_for_nonprintable' flags were in conflict. Removed
the 'xt' flag.
(Reported by: "Dugal James P." <jpd@usl.edu>)
The LPD/lpd_remove.c code did not remove jobs correctly when a
:destination=... entry was present
(Patch by: john@cs.wisc.edu)
Log files not being truncated. Well, they are now.
(Fix by: Patrick Powell <papowell@lprng.com>)
LPR not printing multiple copies (-K option)
(Patch by: Keith Richardson <keithr@ms.com>)
LPD did not check spool queue just before exiting from printing loop.
This opened a BIG race window on systems with lots of jobs in the
spool queue.
(Fix by: Patrick Powell <papowell@lprng.com>)
Expand_command did not check for Do_dollar() returning 0, indicating
a string overflow condition, which it then dereferenced and core dumped.
(Reported by: (Walter Misar) <misar@rbg.informatik.tu-darmstadt.de>)
Control file filters were not being invoked correctly.
(Reported by: Tony Graham <Tony.Graham@uni-c.dk>)
Memory trashing being done by different behaviour of strncat() on some
systems. Replaced by mystrncat() and took the performance hit in return
for reproducible behaviour and non-trashing copies. Sigh.
(Fix by: Patrick Powell <papowell@lprng.com>)
strncpy() and strcpy() does not handle overlapping strings correctly, or
at least that is what the man page says. Replaced several of these
calls by memcopy() and friends.
(Fix by: Patrick Powell <papowell@lprng.com>)
Release LPRng 3.5.2 Fri May 1 14:39:55 PDT 1998
Bug Fix:
lpr -k did not pass the correct length (0) to the
remote system.
(Reported and patch by: Wolfgang Scherer <ws@ecosys.de>)
common/pr_support/ checks Do_lock() for <= instead of < for
failure condition.
(Reported by: Wolfgang Scherer <ws@ecosys.de>)
common/proctitle.c had a strdup() call - not supported
under ULTRIX.
(Reported by: "Todd C. Miller" <Todd.Miller@cs.colorado.edu>)
force_localhost was being tested BEFORE it was set in the printcap
entry. Now is checked AFTER the printcap entry is processed.
(Reported by: Petri Kaukasoina <kaukasoi@elektroni.ee.tut.fi>)
LPD returns 'o connect permissions' instead of 'no connect ...'
(Noted by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
LPD records filter name in error message correctly.
LPQ now reports full class name in status message if
'class_in_status' flag set in printcap.
(Requested by: Philip J. Nesser II <pjnesser@nesser.com>)
common/sendlpc.c - missing Lp_device = 0
(Reported by: "Dugal James P." <jpd@usl.edu>)
LPD reported the wrong host name in 'no permission' messages.
(Noticed by: Patrick Powell)
Release LPRng 3.5.1 Fri May 1 14:39:55 PDT 1998
Baseline Stable Release
Release LPRng 3.4.12 Fri May 1 14:39:55 PDT 1998
Legacy support modification:
control file now has printer information in:
controlfile
Ninfo
Uinfo
order. Some legacy printer spoolers require this order.
(Reported by: Don Badrak <dbadrak@geo.census.gov>)
Minor cleanups of:
Get_printer() calls - some silly comments and orders
common/fileopen.c/Init_tempfile() - clarified the
use of the various directories and defaults.
Force_localhost: now done in Get_printer(), where it should
have been done in the first place; LPQ and LPRM
now send requests to localhost unless explicitly overriden
Force_fqdn will now brutally assume that the domain of the
sender is the one reported by the FQDN of the originator
of the connection.
Release LPRng 3.4.11 Thu Apr 30 11:46:25 PDT 1998
Functionality Change:
JABORT and stop_on_abort default value changed
JNOPRINT filter exit status stops printing
JFAILNORETRY filter exit status stops retries
In previous versions, when a filter exited with unknown or
JABORT status, the default action was halt processing of
PENDING jobs. When a new job was sent to the queue,
or a lpc start was performed, processing was restarted started.
Under heavy load conditions, the effect of the JABORT was
nullified by the arrival of new jobs.
The LPRng behaviour has now been modified to handle JABORT
conditions in a predictable manner, using the 'stop_on_abort'
flag.
1. The default for 'stop_on_abort' is now FALSE.
This means by default that the JABORT status will simply be
treated as a 'do not retry this job' error status.
If the 'save_on_error' flag is FALSE (default), the job
will be removed from the queue.
2. If 'stop_on_abort' is set to TRUE, then when a filter
exits with a JABORT on unknown status, further processing
will stop, and NO pending jobs will be printed. If the
'save_on_error' flag is FALSE, the job will be removed from
the queue.
3. If 'stop_on_abort' is set to TRUE, the abort condition is
sticky, i.e. - it will persist until
action is taken to clear it. Any of the LPC commands which
cause printing to be restarted will clear it:
LPC start, up, kill, topq, release, or redo
4. LPQ and LPC will report if there is an aborted job condition.
Note that for most users, the default action is now the desired
action, i.e. - to continue processing jobs.
However, certain administrators will most likely need to assume
that when a filter exits with JABORT that further printing on this
queue will fail. The sites should set 'stop_on_abort' to TRUE.
JNOPRINT:
If a filter exits with JNOPRINT, then printing will be stopped;
this will have the same effect as an LPC stop command. The job
will NOT be treated as an error job and will remain pending in the
print queue.
This allows filters to detect conditions that would normally cause
printing to fail before a job is started, and halt printing under
these conditions.
JFAILNORETRY:
Under various arcane conditions, it is possible for a filter to
determine that a job has failed, and should not be retried. Most
filters would return a 'JREMOVE' error code, but for various arcane
reasons (lots of Arcania here, folks), the 'save_on_error' flag
might be set, and the adminstrator would like to have the job
marked as erroneous, but NOT removed.
If the filter exits with JFAILNORETRY, then the job is treated
as though it had an error, but no retries are performed.
Extended Functionality: 'mail_from' option
Allows specification of the 'From:' user. If not specified
default is to use the printer name.
(Patch By: Rainer Schoepf <schoepf@uni-mainz.de>)
Portability Extension:
LPD_CONF_PATH compilation option
The location of the LPRng configuration file is specified
by the config_path value in the src/common/vars.c file.
The compilation option -DLPD_CONF_PATH=path can be
used to override the default locations.
Example: make LPD_CONF_PATH=/usr/local/etc/lpd.conf all
Nit Fix: spelling errors corrected.
(Reported by: Don Badrak <dbadrak@geo.census.gov>)
Incredible 9 Gigabyte Partition Fix:
(Reported by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
Apparently the common/freespace/plp_fs_free_bytes cannot handle
a >4 gigabyte partition. The fix was to cast values to a
double - this should be sufficient until we get 10**38 byte file
systems. :-)
Bug Fixes:
LPD usage() had (erroneous) -i option.
(Reported by: wcolburn@nmt.edu (William Colburn (aka Schlake)))
get_max_servers did not get max servers.
(Patch by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
Release LPRng 3.4.10 Thu Apr 23 18:01:37 PDT 1998
Added Functionality:
sync_lpr flag- this suppresses the closing of the lpr to lpd
network connection until the LPR job is completely processed
by the LPD server. This can, under various arcane and odd
situations, result in the lpr processes 'hanging' until the
LPD server queries DNS servers, looks up permissions, etc etc.
However, if users are trying to figure out why LPR has returned
and their job is not in the queue, or you have some desire to
write shell scripts that create jobs and then remove them
in order to see 'just how fast LPRng is', this flag will SLOW DOWN
the operation by making it synchronous. Any little thing
to make folks happy... :-)
Modified Functionality:
The 'force_localhost' flag has now been modified to (literally)
force a connection to one of the 'localhost' addresses returned
by a DNS lookup. This should have no effect on 'normal' users,
but might have the result that the status returned by LPQ
will now differ a little. For example, if you have a printcap
pr:lp=pr@host2:force_localhost
you will discover that lpq -Ppr will now print:
Printer: pr@localhost
... status for localhost queue
Printer: pr@host2
... status for host2 queue
This is correct and accurate reporting, compared to the previous
lpq format.
(Brought to my attention by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
Bug Fixes:
Job_printable_status() did not report active jobs, so lpq and lpc job count
was off by one.
(Reported by: Al Marquardt <almar@uiuc.edu>)
Release LPRng 3.4.9 Mon Apr 20 12:42:55 PDT 1998
Enhanced Functionality:
For those folks who want to 'masquerade' their servers,
the 'report_server_as=hostname' will now report your printer@server
as 'pr@hostname'.
(Requested by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
EXTA/EXTB:
ifdef'd for folks with REALLY vintage systems...
(Requested by: David Coelho <drc@ppt.com>)
Added debugging code to determine when servers started.
LPD now clears job 'move' indications so that a job can
be saved (save_when_done) and then reprinted with
out being moved to the destination again.
lp -s (Silent) now does not print job id information.
(Noticed by: David Coelho <drc@ppt.com>)
Jobs which do not have print permissions now get removed.
(Reported by: Al Marquardt <almar@uiuc.edu>)
lpq -tN -c now will not core dump.
Release LPRng 3.4.8 Sat Apr 18 15:23:22 PDT 1998
Portability Fix: AIX 4.1.5 has definition conflicts when
doing #include a.out.h.
(Reported and Fix by: Niklas Edmundsson <nikke@ing.umu.se>)
Also, Solaris4.1.4 has conflicts with tgetent() definition.
(Reported by: wcolburn@nmt.edu (William Colburn (aka Schlake)))
Y2K checked - ISO conformant date format is used in log and other
messages.
:force_fqdn_hostname flag causes FQDN host name rather than
short hostname to be put into control file.
Bug Fixes:
Accounting at end was failing do to closing output device
too early in the algorithm. Device now closed AFTER last
accounting script is called.
(Reported by: Niklas Edmundsson <nikke@ing.umu.se>)
Time_t strikes again. I just discovered that there were some
places where I was using long instead of time_t for time values.
This has been fixed. However, there is also now the problem
of snprintf( "%d", time((void*)0)) being used for output and
t = atoi("xxx") for input of time values. Sigh... will fix
this later.
"lpc lprm pr all" operation now works correctly
(Reported by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
Release LPRng 3.4.7 Wed Apr 15 08:40:25 PDT 1998
Bug Fix:
Stupid system implementor used snprintf() instead of
plp_snprintf, causing headaches for unsuspecting
folks on systems that did not have snprintf().
Better fix is to insist that systems have snprintf() :-)
(Reported by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
Enhancements:
The code for doing 'polling' of spool queues had a very high
overhead in terms of process creation. This code has been
modified to have a single process run down the queues and
check for work. There is a bit of overhead, but much less than
the overhead in creating a large number of processes.
Bug Fix:
when generating banners using :generate_banner, it did not
work. System developer forgot to include banner... :-)
(Reported by: Cecil R. Whitaker <cwhitak@nswc.navy.mil>)
Jobs that did not get permission to print and were flagged
with JREMOVE did not get removed.
(Reported by: Al Marquardt <almar@uiuc.edu>)
When putting in a new 'From this host' line in a control file,
did not remove the old one. Also 'Q' entry as well.
(Reported by: Al Marquardt <almar@uiuc.edu>)
Multi-homed hosts that do not recognize interfaces need
special coddling when trying to connect to them. Link_support.c
gets yet another special case for connections.
(Patches by: Giray Pultar <pultar@pprd.abbott.com>)
listen(backlog=64) - used to be 10, which caused connections
to be dropped under heavy loads.
checkpc was adding a / to end of file names.
(Noticed and fixed by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
Release LPRng 3.4.6 Tue Mar 31 18:10:59 PST 1998
Bug Fix or Nit Pick:
When sending a job AND the :qq or :use_queuename flag
is set AND the job arrives without a Q entry THEN
the name of the queue it was spooled to is used.
(Noticed by:Cortney Sampson <sampson@physics.utoronto.ca>)
Missing initialization in src/common/permissions.c
Discoverer got the 'Gold Star with Flashy Sequins' bug hunting
award.
(Found by and Award to: Duncan McEwan <duncan@MCS.VUW.AC.NZ>)
Lpr -Z options now accumulate, rather than overwrite, if the
Allow_duplicate_options flag is not set. This makes life
easier for the user when specifying multiple -Z options.
Allowed a LPR to LPD job transfer ending in a 'blank line' to be accepted.
This is generated by some oddball LPR programs.
(Reported by: Patrick Hildenbrand <patrick@emea.ers.ibm.com>)
Release LPRng 3.4.5 Sun Mar 29 18:37:09 PST 1998
LPF:
Cleaned up some minor nits with options.
(Noticed by: Patrick Powell <papowell@lprng.com>)
LPRng-HOWTO:
A huge number of corrections from:
(Tim Mooney mooney@dogbert.cc.ndsu.NoDak.edu)
Enhancements: max_log_file_size, min_log_file_size
Sometimes it is desireable to run a log file in order to try
to find problems. But if you do not truncate the log file, it
can grow to enormous lengths. The max_log_file_size#nnn
(size in Kbytes, default = 0 or unlimited size)
printcap/configuration variable will
cause the LPD server to check for the size of the log file
on opening it and if larger than max_log_file_size K bytes
truncate it to min_log_file_size
(default 0 specifies max_log_file_size/4) Kbytes. It preserves
the last part of the file.
Note that when the truncation operation occurs and there is
heavy logging activity from multiple processes that the log
file may get jumbled. Recommended value of max_log_file_size
should be pretty large in order to make the truncation activity
minimal - 10240 (10 Megabytes) is what I have been using with
pretty reasonable success.
Enhancements:
The time of a job error is now logged in the hold file.
This allows the time of the error to be determined.
Bug Fixes:
Modified reporting of subserver processes that have been
killed off or have core dumped. This solved a problem with
a system that would generate a SIGTERM signal.
UTILS/accounting.pl fixed up. Also, psfilter and hpif now
working correctly with the filter.
(Patches, suggestions, and advice by:
Gordon Haverland <haverlan@agric.gov.ab.ca>)
The LPD/lpd_jobs code for retrying has been redone to make it
more robust when printing fails. The LPRng system will now
agressively retry sending jobs. Needless to say, there are
magic debugging flags to turn this off for testing purposes.
(Noticed by: Jesse Off <joff@cnde.iastate.edu>)
The bogus 'server starting' and 'server done' messages have
been removed from the status file.
Now send a trace/logging message before the job is finally put
in the spool queue. Removes disturbing occurrence of 'success'
messages being sent for a job that has not yet arrived according
to log messages.
More informative error messages and logging messages added at
appropriate points.
Release LPRng 3.4.4
Bug Fixes:
termclear.c - tgetent() misdefined.
Also, configure now checks for Solaris systems and tries to
handle their brain damaged colliding definitions in term.h, curses.h,
terminfo.h and termcap.h files.
ignore_name_format_errors is now documented. Actually, it is really
fix_bad_jobs.
(Pointed out by: Bruce S. Marshall bmarsh@wwnet.com)
Fixed a minor but annoying problem with hold files and very fast
system. Better solution would be to have an indexed database,
but it is almost more trouble than it is worth to implement.
Fixed a problem with 'Destination' being a pointer to dynamically
allocated memory, which would get deallocated by Set_job_status()
calling Get_job_status().
Fixed a problem with control file names not being formatted correctly.
(Reported by: John Perkins <john@cs.wisc.edu>)
Fixed up LPRng-HOWTO, created new version.
snprintf() used instead of plp_snprintf()
(Reported by: lots and lots of folks, including
"Reinhard Zierke" <zierke@informatik.uni-hamburg.de>)
Release LPRng 3.4.3
Bug Fixes:
Serial Port Configuration. Do_stty not called to set up serial
ports. Reported by LOTs and LOTs of folks.
Fixed the GetMaxServers() code to really find the maximum number
of processes.
(Fixes by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
Memory Leaks From Hell
Found them. Found the problem. Decided that fixing the problem
was not worth it. Found an alternative method to the current one
for starting processes that AVOIDS the memory leaks.
In the new version of code, the LPD main() process will start
subprocesses only when it needs to. Periodically, it will run
down the list of print spools, starting (forking) a process.
In the previous version, it would call the Setup_printer() code
which would then in turn all the routines which would allocate
(malloc) memory that would never get deleted. If there were jobs
to be printed, the main() process would then fork and create a
server process.
In the current version, the main() process will create a pipe(),
and then fork the child process, which will call the *&I*(&()
Setup_printer() code, and then checks for work. If there is NO
work, it exits (exit code 0), and as a side effect, the pipe is closed.
The parent process will read 0 bytes, and say, 'Ah, No work'. As
a side effect, it also gets the status. If there is work, the
daughter will write a string to the pipe and THEN close the pipe.
The parent will read the data, and say 'Ah, work to be done'.
There are several elegant little side effects of this method. Firstly,
the main() process will block until the child decides if there is work
to be done. In effect, this will allows the child to proceed ASAP
to the decision point. Secondly, the parent process has a VERY small
amount of memory allocated, and does not grow at all large. This
helps, as the children, when created, have very small memory needs
and process creation is sped up tremendously.
I am surprised to find just how much better this is... I probably
should have done this before, but I was trying to avoid process creation
problems, and ended up with large memory footprints.
(Proddings, pokings, help, suggestions, and lots of tracking down by:
Al Marquardt <almar@uiuc.edu> - who found the cause of the memory
leak
Branson Matheson <Branson.Matheson@FergInc.com> - who came up with
another memory leak
If you ever want to debug memory leaks, please look at the
malloc debugging package by Gary Watson.
http://www.letters.com/dmalloc/
)
lpc move
In the previous versions, lpc move only worked if the spool
queue was active. This meant that you could not stop a spool queue and then
move the jobs to a different queue. Now you can. However, if you
redirect a queue, then it must be active for jobs to be redirected.
C'est la Vie.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
Some logging numbers were not being reported correctly. They now should be.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
The QQ option was not working correctly due to a coding typo.
(Reported by: Gary Cender <gcender@eng.dowjones.com>, and others)
LPR was doing translate_format, which was wrong.
(Reported by: Chad Mynhier <mynhier@cs.utk.edu>)
LPR does not use '-' as a flag to read from STDIN. Documentation changed
to reflect this; easier than fixing LPRng... :-)
(Reported by: "James P. Dugal" <jpd@usl.edu>)
LPR now allows LOOOONG options to -Z.
(Requested by: George Lindholm <lindholm@cheshire.ucs.ubc.ca>)
Race condition with job completion and testing for completion once
again explored. Now err on the side of 'slow but correct' rather than
'fast but sloppy'. Only happens on FAST servers, and the alternative
to run LPRng on slow servers was not taken well :-).
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
OS/2 sends very odd control file format - now should parse this format correctly.
(Reported by: "Patrick Hildenbrand"<patrick@emea.ers.ibm.com>)
Release LPRng 3.4.2
Bug Fixes:
Connect_timeout was not used uniformly or documented accurately.
(Fixes by: Heinz-Ado Arnolds <arnolds@ifns.de>)
configure was too agressive in checking for -lresolv. Now includes
-lresolv only if gethostbyname2 is not found.
(Problem reported by: Uri Blumenthal <uri@ibm.net>)
It was observed that under heavy load conditions that some files
were getting printed twice. This was due to a race condition.
The race condition has been eliminated by introducing another
field into the job control information specifying the subserver
process id.
Release LPRng 3.4.1
New Baseline Release - Stable version
Enhancements:
The configure script now supports setting the installation directories
configure --with-lpddir=DIR --with-admindir=DIR
- sets the install directory for lpd and lpc/checkpc respectively.
(Patches by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
Added a 'retry_etimedout' flag as well to handle connections to devices
that have a very long connection time due to slow network connections
over dialup devices.
The lpq status now will show 'stalled' when 'stalled_time' is non-zero
and the job is active for more than stalled_time seconds.
(Suggested by: lots of folks)
The check_idle=program facility can now be used to check that a printer
is idle before processing jobs. This is useful when you have multiple
server queues. For example:
lp:sv=lp1,lp2:...
lp1:check_idle=/prog:...
lp2:check_idle=/prog:...
When the lp server starts up, it will check the lp1 and lp2 queues,
and will only send jobs to the one whose check_idle program reports
an idle condition.
Bug Fixes:
Updated LPRng-HOWTO.
Fixed missing permission check checkpc.
Also (correctly) implemented ${option} expansion in filter commands.
This now gets expanded to the printcap option value, as documented.
(Made by: Patrick Powell <papowell@lprng.com>
Release LPRng 3-3-7
Ports:
Solaris 2.6. Also update README.install for new startup/shutdown script
New functionality:
reverse_lpq_format : reverse returned lpq status format when from
specified host.
There is a defect in some System V support for RFC1179 printers.
The lpq facility will send a 'SHORT' status request when a 'LONG'
is desired, and vice versa. This results in the wrong status format
being returned.
The reverse_lpq_format=(globhost|ip/mask)+ option allows you to specify
that when a request is received from a host whose name or address matches
an entry in the list, then SHORT/LONG format requests will be reversed.
When the LPD is acting as an intermediate host, the reversed request
will be sent to the next destination on the list. For example:
reverse_lpq_format=*.eng.com,130.29.0.0/16
will select hosts whose FQDN ends in eng.com or in subnet 130.29
to have reversed lpq formats.
return_short_status : return limited length status information
short_status_length : number of lines to return
Some users have expressed a desire to have the LPD server return
short (i.e. - limited length) status to the requestor.
The return_short_status=(globhost|ip/mask)+ option allows you to specify
that when a request is received from a host whose name or address matches
an entry in the list, then only short_status_length (default 3)
Status: and Printer_status: lines returned.
lpc redo command:
this forces a job to be totally reprinted, if it has been held
in the spool queue. This command has been added in order to allow
the reprinting of jobs that have been printed and held in the spool
queue, i.e. - the save_when_done printcap flag is set.
routing filter 'priority N' output:
the routing filter can set the destination, copies, and now the
priority of jobs. If the routing filter output is:
dest t1
CB
priority B
copies 2
end
then two copies of the job will be routed to the destination
with priority B, and the C line in the control file will be
set to CB.
safe_chars=nnn configuration file option.
By default, LPRng detects and optionally eliminates suspicious characters
from the control file; the fix_bad_job option will enable removal.
The safe_chars=nnn specifies that in addition to the normal safe
characters, the indicated ones can be used as well. For example,
save_chars=#" will allow # and " to be used in the control file.
Release LPRng 3-3-6
New functionality:
Timeouts: send_job_rw_timeout, send_query_rw_timeout replace send_timeout
The printcap send_job_rw_timeout and send_query_rw_status options
now set timeouts on read/write operations when printing or sending
jobs to a remote host or doing a status or query operation respectively.
If the value is zero, there is no timeout on the operation.
These timeout values and the associated read/write operations
solve a problem when LPQ or LPR tries to attach to a printer or system
which accepts a connection but then does not reply to the request
in a reasonable amount of time. Note that the send_job_rw_timeout
should be quite large (6000 or 100 minutes) in order to accommodate
transient problems like paper outages on a printer.
(Suggested by: Brad Rogers <brad@ast.lmco.com> and
Alek Komarnitsky <alek@ast.lmco.com>)
lpc active, lpd, and reread commands
The lpc active command will try to open a connection to the remote
server. This allows non-LPRng remote servers to be polled to see
if they are active.
All of the active, lpd, and rereads now take a printer[@host] argument,
allowing the specified server for the printer to be queried.
(Deficiency noted by: James P. Dugal <jpd@usl.edu>)
stop_on_abort printcap flag (default TRUE)
If a filter aborts and this flag is TRUE then all further processing
of the queue stops until restarted by some other action and the job
will not be removed from the queue.
max_connect_interval (default 60)
maximum interval between attempts to send a job to a remote site.
user_lpc configuration option, SERVICE=U, and lpc command
There was a request to allow a selected set of lpc commands
to be performed by users on their individual jobs in a queue.
This has been accommodated using the following method.
1. A new user_lpc=cmd,cmd,... printcap operation enables the
SERVICE=U permissions facility. The cmd can be:
hold, release, move, topq, kill, and abort.
2. When the lpc command is checked for permissions by the LPD
server, and the cmd is one of the specified in the user_lpc
printcap, rejection is delayed until the point where individual
jobs are checked for action. At this point a check for
SERVICE=U is performed on the permission database. If,
at this point the action is rejected OR the default action is
to reject, the action will not be performed.
3. While users can perform a kill or abort operation, they can
only do this while their job is active or at the top of the queue.
Release LPRng 3-3-5
HOWTO and README:
The HOWTO/LPRng-HOWTO has been extensively editted and extended.
This will replace the README.* files in the distribution.
Enhancements:
configuration/printcap flag: force_localhost
force_localhost forces client programs (lpq, lpr, lpc, lprm, etc)
to connect to the server on the local host, as is done on the
BSD LPR system.
This option has an effect ONLY if you use the destination
in the printcap information for the printer.
If you explicitly specify a printer@host as the destination
(-Pprinter@host) then the force_localhost flag is ignored.
The default is force_localhost = TRUE.
Question: why this flag?
Answer: the Most Frequently Asked Question in the LPRng mailing
list is from users asking why lpq/lpr/lprm does not send the
job to the local server, and why they are sending them directly
to the remote printer instead of spooling them. After having
referenced folks to the documentation multiple times, I have
thrown in the towel on this one and have put in this flag.
Question: what does this change?
Answer: If you are running a server on your system, jobs will be sent
to the server and then spooled. You may need more spool queue space.
If you want to use the "lpr_bounce" option, you will need to turn
try_localhost and force_localhost OFF (:try_localhost@:force_localhost@:)
to get the old behaviour and not have the job run through the filters
by both LPR and LPD.
Question: Wouldn't it be easier to ask people to read the documentation?
Answer: No.
I gave up asking. The LPRng behaviour was too different from the BSD LPD
behaviour and folks who wanted a "rip out and replace" solution were
too frustrated by the different behaviour.
User Requested Status Information:
lpr -mhost%port now causes LPD to open a UDP (by default)
connection to port on host and send status updates for the job
being processed. The form host%port,TCP will open a TCP port
rather than a TCP port. Users can now use the monitor program
(or a variant) to have job status reporting done. This has the
side effect that mail addresses of the form host%port will
not get mail sent to them.
Routing Filters:
During job reception, the :routing_filter: option specifies that the
received job information is to be processed by a routing filter, which
supplies additional destination information or modifications.
STDIN of the filter is attached to the control file (read/write)
and STDOUT of the filter should be the additional control/routing
information. Note that routing filters that need to modify the
control file can now do so by using FD 0 and making the modifications
directly to the file. After processing by the routing filter, the
control file will be re-read by the lpd server, and checked for correctness.
See the HOWTO (/HOWTO/LPRng-HOWTO.html) for more information.
Exit codes for routing filter:
JSUCC (0) - processing continues;
JHOLD - job will be held
anything else - job will be removed (not accepted for printing)
socket_linger#secs
This option/flag has been added to solve a nasty problem
involving closing network connections and process exit.
When a process exits, the system will attempt to finish IO
operations, flushing pending data to the destination. However,
It has been observed that when the LPD process which is doing
the actual printing exits, it will sometimes terminate and the
last output is lost.
Experiments have shown that when the SO_LINGER flag is set on these
connections, the LPD process will not terminate until the last data
has been transferred, which is the desired behavior.
The 'socket_linger#nn' flag can be used to force setting the SO_LINGER
timeout value. By default, this is now set to 10 seconds, which
appears to be compatible with most TCP/IP connections. Note that the
documentation is very blank on what happens when the connection is still
"active" but no data is being transferred.
If you are having problems with network connections and lost data
at the end of jobs, try using:
:socket_linger#120
in the printcap for the printer.
LPRng executables default to SUID root at installation:
By default, LPRng executables are now installed SUID root.
This will reduce the number of problems encountered by folks who
do not read the README.install instrucutions.
(Noted by: Patrick Powell <papowell@lprng.com>)
:remote_support=RMQVC (default)
R = lpr, M = lprm, Q = lpq, V = verbose lpq, C = lpc : allowed operation
This option specifies the allowed operations to a remote printer.
This solves the problem of printer servers 'hanging on lpq', due
to their inability to handle multiple requests. Note that the hang
appears to be permanent - i.e. - the printer locks up. Thus, you
should never do a lprm, lpq, or lpc operation to the printer. The
:remote_support=R: setting will do this.
:rg=group[,group] - allow clients to use printer only if user
is a member of one of the specified groups.
(Requested by: Oved Ben-Aroya <oved@ns.technion.ac.il>)
Bug Fixes:
After a LOOOONG study, the problem with non-LPRng servers terminating
with 'out of space' error status has been resolved, and hopefully fixed.
(Noted by: Patrick Powell <papowell@lprng.com>)
Order of variables in sorted list was incorrect.
(Noted by: Patrick Powell <papowell@lprng.com>)
README.pgp_authentication referenced 'client_auth*' names; should be
'user_auth*' names.
(Noted by: Patrick Powell <papowell@lprng.com>)
The print job transfer (LPD/lpd_rcvjob.c) code has been reviewed, and
the underlying method has been modified to accomodate reception of
multiple jobs in a more consistent manner.
1. On start of job transmission, a 'lock file' is created.
2. Data and control files are placed in 'temporary files' during transfer.
3. At the end of job transfer, rename() is used to change temporary
files to permanent ones.
4. The routing filter (if any) is invoked. Note that the data files
are available for reference during this stage.
5. The control file is renamed to the final version.
(Noted by: Patrick Powell <papowell@lprng.com>)
The plp_waitpid() code has been extensively modified, together with the
fdfork() code, the killchildren() support, and the Print_abort()
code. Hopefully, this will now solve the problems of processes
not being terminated and/or zombies accumulating. This has the
(desirable!) side effect that child exits will not cause system calls
to terminate with EINTR status.
(Noted by: Patrick Powell <papowell@lprng.com>)
By default, LPRng executables are now installed SUID root.
This will reduce the number of problems encountered by folks who
do not read the README.install instrucutions.
(Noted by: Patrick Powell <papowell@lprng.com>)
Race condition with Set_control_info fixed. Now file locking works
correctly.
(Noted by: Patrick Powell <papowell@lprng.com>)
For HP configurations and no GCC, added a -Aa flag to CFLAGS
(Suggested by: Brad Rogers <brad@ast.lmco.com>)
The logger support was flawed somewhat. Previously, each process
would open a socket (connection) to the logger - this would soon
use up a lot of connections. Now the LPD server opens a connection
at initialization, which is then inherited by the various processes.
(Found by: Desmond Macauley <desmondm@eng.dowjones.com>)
By default, LPRng executables are now installed SUID root.
This will reduce the number of problems encountered by folks who
do not read the README.install instrucutions.
(Noted by: Patrick Powell <papowell@lprng.com>)
The SERVER permissions checking did not handle localhost correctly.
(Noted by: Patrick Powell <papowell@lprng.com>)
Passed the PRINTCAP_ENTRY to routing filters and control file filters.
(Patch by: George Lindholm <lindholm@ucs.ubc.ca>)
Only LPD now does killpg() otherwise this effects output from the
lpq, lpc, etc., programs.
(Noted by: Patrick Powell <papowell@lprng.com>)
Jobs were being thrown away with Send_try#0
(Patch by: George Lindholm <lindholm@ucs.ubc.ca>)
Release LPRng 3-3-4
Enhancements:
When using routing_filters to cause jobs to be sent to multiple
destinations, you might want LPQ to report the status of the
destinations as well. The 'destinations=pr1,pr2,pr3' will now
case LPQ to report the status of destination queues.
(Work, patches, and slugging by: George Lindholm <lindholm@ucs.ubc.ca>)
LPR and LPRM duplicate arguments:
Some users would like LPR's and LPRM's arguments to be 'cumlative', i.e. -
lpr -a x -a y would be identical to lpr -a
The allow_duplicate_args configuration flag will now enable this behaviour.
Also, by default the class name and the job priority are identical. The
break_classname_priority_link flag breaks this link, and the class can be
specified separately from the priority. Also, the maximum classname
size specified by RFC1179 is 32 characters; the 'classname_length#nnn'
(default 31) allows a longer classname to be used.
(Patches supplied by: George Lindholm <lindholm@ucs.ubc.ca>)
Bug Fixes:
checkpc -p and -c options were not functioning as documented.
(Noted by: Christophe Kalt <kalt@research.bell-labs.com>)
README.bouncequeues indicated that exit status returned by
the control_filter program was used to control job processing.
README and common/fixcontrol.c updated to agree. When control_
filter exits with: JSUCC (0) - normal processing, JHOLD (37)
job is held, JREMOVE, job removed, etc.
(Noted by: George Lindholm <lindholm@ucs.ubc.ca>)
Generate_banner did not put banner in correct position.
(Reported by: Jost Krieger <Jost.Krieger@ruhr-uni-bochum.de>)
LPD/lpd_rcvjob.c - control file is now written to a temp file and then
renamed as the control file. This elminates problems with locks.
(Suggested by: George Lindholm <lindholm@ucs.ubc.ca>)
Release LPRng 3-3-3
Updated the sample lpd.perm, README's to use the 'REMOTEUSER'
rather than USER in the permissions value.
(Spotted by: Chen Shiyuan <csy@hjc.edu.sg>)
Cleaned up filter and server killing code - added more robust
exit and abort facilities. This was done in several places
in order to try to make sure that processes created for filters would
be killed off when the server process exited.
Cleaned up logging and some minor error messages.
Removed 'intl/po2tbl.sed' and 'po/POTFILES' from distribution.
(Noted by: George Lindholm <lindholm@ucs.ubc.ca>)
Release LPRng 3-3-2
Thu Oct 9 20:03:30 PDT 1997
lpr, lpq,... usage message formats fixed.
(Patches by: Jan Barte <yann@plato.uni-paderborn.de>)
Autohold support was accidentally removed from LPD/lpd_rcvjob.c
Release LPRng 3-3-1
New Baseline Tue Oct 7 18:29:55 PDT 1997
Comments:
README.account updated to show how to use psfilter and CTI-hpif
filters and accounting scripts.
Bug Fixes:
Permissions checking patch did not work correctly. Patcher patched
patch to make patchwork code work correctly.
(Originator of patch: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
Release LPRng 3-2-12
Bug Fixes:
The sample lpd.conf file had ff=\\f which confused folks. Now it
has correct syntax.
The end of job and Print_abort code has been clean up and modified
so that exit is now fast and brutal. When you do LPRM you now GET
LPRM action fast and quick, and no processes hanging around.
The code for reporting fatal 'filter errors' has been modified to put
the termination conditions into the LPQ status report. This will
simplify the job of finding out why your job died much easier.
Jobs that now exceed their maximum number of print attempts are deleted
by default instead of being retried indefinately. This can be be
suppressed by setting retry to 0, as documented.
The above bugs/changes were the result of a long standing report of
the LPD server being slow to respond when printing bad jobs.
(Added by: Patrick Powell <papowell@lprng.com>)
Release LPRng 3-2-11
Enhancements:
printcap/configuration 'network_connect_grace#nnn' variable
is similar to the 'connect_grace' variable, but pauses for
the specified time between connections to LPD or other servers.
Useful when using LPD prototcol to network based printers that
need some recovery time between jobs.
(Suggested by: Christian Illinger <illinger@lepsi.in2p3.fr>)
Bug Fixes:
all:all=p1,p2,p3 did not check correctly for separators.
(Reported by: Bertrand Decouty <Bertrand.Decouty@irisa.fr>)
configure.in - checks for random() defined in stdlib.h
(Suggested by: Bernhard Rosenkraenzer <root@BOL-SubNet.ml.org>)
Logging: the JOBNUMBER is now reported correctly.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
LPC move: the job is deleted from the queue after being moved,
even if save_when_done is set.
(Requested by: Gary Cender <gcender@eng.dowjones.com>)
Release LPRng 3-2-10
Bug Fixes:
In cleaning up the routing support in LPD/lpd_jobs.c and
LPD/lpd_rcv.c, I cleaned it up so much that only the first
routed job was printed.
(Reported by: Gary Cender <gcender@eng.dowjones.com>)
Release LPRng 3-2-9
Bug Fixes:
Typo in src/common/linksupport.c caused very wierd error messages to be
printed.
(Reported by: lots and lots of people)
Release LPRng 3-2-8
Bug Fixes:
snprintf used instead of plp_snprintf()
(Reported by: Dirk Wrocklage <dirkw@uni-paderborn.de>
and Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
Max_servers code did not function correctly - there was a logic error
in the design. As a result, it would lock up and refuse incoming
jobs.
(Reported by: Jim Stosick <Jim.Stosick@Forsythe.Stanford.EDU>)
Poll_time: Under certain very odd conditions, a spool queue could
have a job in it and the LPD server would not fork a process to
serve the queue. The poll_time (default 6000 seconds) is a timer
that will scan the print queues for a pending job and no server.
The previous version had a race condition in it that would
periodically spawn too many servers. The new code not only fixes
this problem, but also enforces a true idle condition on the
lpd server. If there is no activity and no jobs, then the server
will not periodically wake up and check the spool queues.
Force_poll: Some users have software that places jobs in the
spool queues, and want LPRng to periodically poll the queues
for these jobs. The 'force_poll' flag has been added to provide
this functionality.
Release LPRng 3-2-7
Major Revisions:
Hold file names and creation:
When the server creates a job in a job queue, it also creates
a hold file along with the data and control file in the spool
queue directory. During job processing the hold file is updated
by various processes. As a result, this file must be locked
and carefully updated. The implemented method of locking and
holding locks for jobs was flawed, resulting in race conditions,
etc.
The routines responsible for reading and writing hold files are
Lock_job_control, Get_job_control and Set_job_control. These have
been modified as follows.
0. A Lock_job_control() routine now generates and locks a control
file.
1. The Get_job_control() routine may now open the job file in a LOCKED
or UNLOCKED mode. It will open the file UNLOCKED if not passed
a file descriptor (FD) created by Lock_job_control(),
reads the file and then closes the file if not locked.
2. The Set_job_control() file now updates the hold file as follows.
a) It creates a temporary file (open, locked).
This file has the name _fAnnn, while the lock file is
cfAnnn.
b) It writes the job file to the temporary file.
c) It RENAMES the temporary file to the hold file.
d) If it has been passed a FD created by Lock_job_control()
it will close the passed FD and return the locked FD;
the effect is to maintain the lock on the control file.
e) if not passed an FD, it simply closes the FD, effectively
releasing the lock.
This functionality guarantees the following:
1. While there might be a race condition in time over a particular
control file, the Get_job_control() routine will always open
either a 0 length hold file (i.e. - file is in an initial state)
or a VALID COMPLETE non-zero length hold file.
2. Get_job_control() (no lock) will always read correct status information
or NO status information.
3. If a Write operation is needed, Set_job_control() does this correctly
and indivisibly.
4. If a Read/Modify/Write is needed, Get_job_control() is requested to
read and lock the file, and then Set_job_control is used to modify
the information.
Hold File Name Format:
In order to guarantee that jobs placed into the hold file have unique
job numbers, i.e. - so you can reference them by job number, the hold
file name format is now hfAnnn. Note that this means the host name is
now not used. The Find_unique_job_number() routine will attempt to find
and create a hold file with a unique job number in the queue.
Jobs Placed In Queues Always Get Unique Job Numbers:
In the previous version of LPRng, when a job was placed in a queue
with an existing job with the same control file name, the job overwrote
the existing job. This had some interesting side effects, mostly concerned
with duplicate jobs. If you have the 'Save Job After Printing' flag
set, you may run out of job numbers.
Full_time printcap/lpd.conf flag
Specifies that you want to have a full year-mo-dy-hr:... time
format in log and status message.
Binding to random ports
The RFC1179 specifies connections must originate from port 721-731;
most BSD implementations relax this to 512-1023. There is a problem
when trying to reuse a port and connecting to the same system;
TCP/IP requires about a 10 minute timeout on a IP:port/IP:port pair.
The code that tried to do connections originally tried the ports in
sequential order, leading to long delays. Now it will try them in
RANDOM order, and will try at most 'connect_try' ports at a time
before admitting failure.
Bug Fixes:
Minor nit with lpc commands fussing about RemotePrinter values.
(Reported and patch by: Martin Pahl <pahl@tnt.uni-hannover.de>)
File descriptors are lost if the remote system that we are trying to send
a job to doesn't like the printer name we are trying to use.
(Reported by: George Lindholm <lindholm@ucs.ubc.ca>)
Permissions checking for PRINTER=host,@netgroup was done incorrectly.
checking now done by match_pr().
(Reported by: Sergio Tessaris <tessaris@ictp.trieste.it>
and Warren Marts <warren@nmt.edu>)
Problems with Get_perms() when rereading the permissions database.
The actual problem was trying to be too tricky and preallocate data
structures. When this was done incorrectly, you had some very odd
results when rereading the same database.
LPR: when printing multiple files, data files were duplicated.
i.e. - dfA..., dfB..., ..., dfZ..., dfA...
Fixed LPR/lpr_cpyjobs.c so that now we have dfA... dfZ, dfa..., dfz
(Reported by: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
User detected a bug where the "-r" option to LPR (LPRng 3.2.6)
actually removes files even if the job was not spooled successfully.
my patch to fix this problem. Updated LPR man page to reflect the dreaded
-r (remove after printing) option.
(Reported and Fixed by: Garrett D'Amore" <garrett@qualcomm.com>)
Permissions checks for group did not check the group id, just the
user name.
(Reported and Fixed by: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
Race conditions src/LPD/lpd_jobs.c between printer server
and worker process caused a null pointer reference.
(Reported and Fixed by: George Lindholm <lindholm@ucs.ubc.ca>)
Checkpc did not use correct lockfile format.
(Reported by: Jan Barte <yann@plato.uni-paderborn.de>)
When routing a file, the route Xnnnn information was not used.
Updated Fix_control to use this information as per documentation.
(Reported by: Patrick Powell <papowell@lprng.com>)
Control file not reparsed after 'control_filter' processing.
It is now reparsed, and only the new contents are sent
to the destination. This includes the data files. The
control file filter MUST remove excess data files.
End of job accounting to a remote server was erroneously expecting
an 'ACCEPT' reply. Fixed.
(Reported by: Markus Fleck <fleck@informatik.uni-bonn.de>)
Release LPRng 3-2-6
README.accounting, lpd.8, printcap.5 man pages - accounting file is
documented as not being created.
(Reported by: Christophe Kalt <kalt@research.bell-labs.com>)
LPRM/LPD did not forward remove commands correctly.
(Reported by: Paul Zablosky <zablosky@ucs.ubc.ca>)
Permissions: PRINTER attribute can now be a netgroup. This allows
things like:
ACCEPT SERVICE=R,P PRINTER=@PRIP_printers REMOTEGROUP=@PRIP_users
REJECT SERVICE=X,R,P PRINTER=@PRIP_printers
makes management of printers... easier... I suppose.
Updated lpd.perms.5 as well.
(Suggested by: John R Lane <lanejohn@cps.msu.edu>)
Removed mention of "co" flag (obsolete) from lpd.conf man page.
(Reported by Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
HP/UX version 10.x needs to use termiox IOCTL call to set
hardware handshaking on.
(Reported and patches supplied by:
Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
lpc printcap command now only needs STATUS (S) privileges.
New DEFAULTQ protocol message added. This allows lpc to request
the default queue used by LPD.
fix_bad_job flag now ignores duplicate control lines, and replaces
bad characters with blanks in control file.
Release LPRng 3-2-5
configure: now checks to see if inet_ntop() is in resolver
library (-lresolv), and includes it when doing checks for
other functions.
termclear now uses IS_LINUX instead of __linux__
(Reported and fixed by: Horst <horst.fickenscher@it.erlm.siemens.de>)
memory leak fix of 3-2-4 interacted with other code in unexpected
manner - revised memory fix.
(Reported and fixed by: Patrick Powell <papowell@lprng.com>)
LPD/lpd_status.c - status display line length now controlled by
max_status_line configuration/printcap variable, which allows
the maximum line length to be exceeded if desired. Default is
still 79.
src/Makefile.in COMPILATION FLAG: STRICT_RFC1179
default originate_port value is now 512 - 1022,
rather than RFC1179's 721 - 731. compiling with -DSTRICT_RFC1179
sets the default to 721 - 731.
Release LPRng 3-2-4
LPD - pursued and found an extremely minor memory leak that
was exercised only under a very unusual set of conditions.
(Reported and fixed by: Patrick Powell <papowell@lprng.com>)
Batch of patches and errors: Tom Bertelson <tbert@pamd.cig.mot.com>
include/portable.h - minor changes in SUNOS prototypes
CHECKPC/checkpc_port.c - better check to see if setproctitle worked
PAIR() macro has added guards for _PROTO_ problems
rw_pipe() has a minor portability problem clean up.
LPQ, LPR, LPRM option checks were done incorrectly.
(Reported by: Scott Nelson <nelson@canopus.llnl.gov>)
umask(0177) should really be umask(0077) to allow correct directory
permissions checking.
(Reported and fixed by: Guy Geens <Guy.Geens@elis.rug.ac.be>)
lpd - the lpc reread function sends a signal to the LPD server,
which then calls 'Read_pc' from a signal handler. This can cause
problems. In addition, there was a memory leak in the Read_pc()
routine.
(Reported by: Rainer Schoepf <schoepf@uni-mainz.de>)
Release LPRng 3-2-3
BUG FIXES:
src/Makefile(Makefile.in), man/Makefile.in did not do 'make install
prefix=/xxxx' operations correctly.
(Reported by: Chris O'Regan <chris@ECE.concordia.CA>)
Get_remote_hostbyaddr() used host_ent when it was undefine/null.
(Reported by: Carson Gaspar <carson@lehman.com>)
Patch for HAVE_SIGLONGJMP did not include common/timeout.c and
include/portable.h.
(Reported and fixed by: Guy Geens <Guy.Geens@elis.rug.ac.be>)
Release LPRng 3-2-2
BUG FIXES:
Not freeing memory allocated by Expand_value().
(Reported by: "Todd C. Miller" <Todd.Miller@cs.colorado.edu>)
Added logging for non-job related operations.
Added finer time resolution on job changes
(Requested by: Chao-Wen Young <kiki@eng.dowjones.com>)
Added LPDEST environment variable for printer as well as PRINTER
and NGPRINTER
(Suggested by: Garrett D'Amore <garrett@qualcomm.com>)
Moved Print_flush() to Print_abort().
(Motivated by: Gerhard Schneider <gs@ilfb.tuwien.ac.at>)
MONITOR/monitor.c had duplicate include references. This caused some
portability problems with systems that did not have 'guards' in their
include files for multiple inclusion.
(Reported by: John Perkins <john@cs.wisc.edu>)
lpstat format fixes.
(Reported and Fixes: Carson Gaspar <carson@lehman.com>)
common/getqueue() rejects control files with duplicate remove lines -
this is not a big problem, so added code to ignore them.
(Reported and Fixes: Frank Terhaar-Yonkers <fty@cisco.com>)
Release LPRng 3-2-1
Baseline Release
Release LPRng 3-1-13
Changed sleep() calls to plp_sleep(), which uses select mechanism,
to avoid interactions with SIGALRM signal handler in Linux.
In the waitchild() code, the signal(SIGCHLD,SIG_IGN) caused
some systems to automatically perform a 'wait()' on child
processes. The SIG_DFL only ignored the signal, and the
waitpid() would then succeed. Note that this action is implied
by the POSIX standard wording for _exit().
The code for job queue scanning will not report 0 length
control files as errors until they are older than an hour.
The LPD/lpq_status() now ignores jobs being transferred,
and does not report their status.
LPD/lpd_rcvjob() now allows multiple jobs to be transferred on a single
connection. This is a violation of RFC1179 but it is now done.
Expanded \xx entries in Banner line, so that very strange
filters that insisted on these characters would get them.
If a banner line had these characters, a \n is not appended.
Bounce queue destinations no longer have to be printer@host,
they can just be printer. The default destination is the
server host.
CHECKPC/checkpc.c - To_root() interferred with Test_code();
reordered code.
(Reported by: Todd Rannow <rannow@msc.edu>)
common/check_remotehost() - added checks for Is_server, moved some
tests into LPD/lpd_status.c, LPD/lpd_remove.c
(Reported by: Damon W Atkins <zdxa21@gascor.vic.gov.au>)
Solaris 2.4 LPD server insists on sending REQ_START messages -
and gets peeved when it gets an error. Now messages are NOOPs.
(Reported and fix suggested by: Jussi Eloranta <eloranta@voimax.voima.jkl.fi>)
Read_fd_len_timeout() closed fd on timeout - this was not correct behaviour.
(Reported by: Todd Rannow <rannow@msc.edu>)
Clients (LPR, LPQ, LPC) were not expanding printcap %P, %H, etc., entries.
(Reported by: Damon W Atkins <zdxa21@gascor.vic.gov.au>)
Release LPRng 3-1-12
Check_remote modifications exposed logic error in various places-
need checks for both RemotePrinter and RemoteHost, not just
RemoteHost.
Release LPRng 3-1-11
Missing check for Is_server in Check_remote() caused clients to
not connect to LPD server.
Release LPRng 3-1-10
LPR/lpr_cpyfiles() did not handle multiple copies of stdin
correctly.
(Reported and fixed by: Jens Thiel <thielj@uran.informatik.uni-bonn.)
LPR and clients updated hold files. Added checks for Is_server in the
appropriate places.
(Reported by: Lee Muh Hwa <cceleemh@dolphin.cc.nus.sg>)
Problem with bad printer name detection.
(Reported and fixed by: Martin Pahl <pahl@tnt.uni-hannover.de>)
setstatus() was not sending STATUS information to the logger.
(Reported by: Chao-Wen Young <kiki@eng.dowjones.com>)
Bad non-existent printer, printcap file misconfiguration code.
(Reported and fixed by: Dirk Nitschke <ms3a512@math.uni-hamburg.de>)
Documentation and man page editting - minor corrections, missing entries.
(Comments and patches by: Florian La Roche <florian@knorke.saar.de>)
Release LPRng 3-1-9
lpq -v format modified so Destination was printed correctly.
Remove_job() did not remove all the data files or hold files.
dofork() did not zero Tempfile->pathlen.
LPR/lpr_cpyfiles() did not preallocate the job file array,
leading to problems when realloc() was called.
printcap(5) and lpd.conf(5) man page cleanup.
(Done by: Florian La Roche <florian@knorke.saar.de>)
Release LPRng 3-1-8
Print_job() did not use correct queue name.
Man Pages did not get right version number.
force_queuename not in printcap(5) man page.
(Reported by: Guy Geens <guy.geens@elis.rug.ac.be>)
In LPC, Queue_name is not NULL when getprinter() is called.
(Reported by: Jussi Eloranta <eloranta@voimax.voima.jkl.fi>)
The filter environment variable PRINTCAP_ENTRY now holds the
printcap entry for the printer. In conflict with some filters
using PRINTCAP to hold the pathname of the /etc/printcap file.
(Reported by: Guy Geens <guy.geens@elis.rug.ac.be>)
waitchild() had an alternate wait3 implementation that turns
out to be broken on some systems. Force use of the waitpid()
version.
Release LPRng 3-1-7
New Functionality: poll_time configuration variable
There is a small, but almost impossible to eliminate, race condition
when a job is put into a busy queue. If the server process checks to
see if there is work to be done, and the job is put into the queue
after that point, then there is a possiblity that the server may
exit with a job in the queue. This can be solved by using semaphores,
locks, etc., but is almost impossible to do in a portable and efficient
manner. The 'poll_time#nnn' configuration entry has been added to
allow the administrator to specify an interval at which the queues
can be periodically checked for unprinted jobs.
The default poll_time value is 6000, i.e. - 10 minutes.
Bug Fixes:
printcap.5 documents :mi: (spool directory space needed) as number
but it is a string. Fixed documentation.
(Reported by: Jeff Bacon <bacon@twinight.org>)
Install.txt, Install.ps - lp=host%port misdocumented.
(Reported by: Jeff Bacon <bacon@twinight.org>)
printjob.c - check to see if there is a filter; if not, shove
file directly out.
(Reported by: Guy Geens <guy@abacus.elis.rug.ac.be>)
src/Makefile - SUID_ROOT_PERMS= 04755 -oroot should be -o root
(Reported by: Dave Goldhammer <Dave.Goldhammer@Colorado.EDU>)
POSIX uses LOGNAME environment variable - check this first, then
USER for user information.
(Suggested by: Todd C. Miller <Todd.Miller@cs.colorado.edu>)
lpc now allows printer@host specification.
(Reported by: Doug White <dwhite@gdi.uoregon.edu>)
printer queue loop detection algorithm modified
The code to detect print queue loops was too agressive, and gave
false warnings about print queue loops. Now only checks for explicit
loops.
(Reported by: Yuji Shinozaki <yuji@cs.duke.edu>)
Start_all() code did not check for a limit on the number of processes
that would be started by the server.
Release LPRng 3-1-6
Bug Fixes:
The :direct_read: flag now works for bounce queues. Tested with aps
filter. The aps filter distribution of globals/GLOBALS.sh has been
modified to have defaults for various options that allows even a
(possibly) misconfigured filter to produce some sort of output
instead of dying with a strange error message.
setstatus() was not putting \n on end of lines, but only when used
on Solaris 4.1.4 with Sun's ACC compiler. Compiler bug. Rather
than fix the compiler, we (hopefully) modify the code.
(Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
LPSTAT simulation:
Progress reporting too coarse.
lpstat -s too verbose.
lp now reports 'request id is ....'
(Reported by: David Livingstone <davidl@scdes.cn.ca>)
Release LPRng 3-1-5
New Functionality: PCNFSD compatibility
PCNFSD - Public Domain version, from Geoff Arnold (Geoff.Arnold@Sun.COM,
geoff@East.Sun.COM). Assumes that LPC will return list of
printers, indented one space. (Fixed).
Added README.pcnfsd as a guideline for users.
LPRM now says 'dequeueing' (yech!) instead of 'removing' to make it
consistent with lprm and PCNFSD implementations.
PCNFSD distribution put into LPRng collection.
Bug Fixes:
cleanup() was causing early exits due to use of killpg();
commands such as lpq |more would not work correctly.
Fix was to suppress top level process from killing itself.
autoconf bizzarness - src/Makefile.in now has ${prefix} entries
to match the INSTALL documentation. You can now do
make prefix=xxx and software will be installed in xxx/bin
Default directories made to conform with existing LPRng ones,
not Linux/GNU ones.
LPD/lpd_jobs: when a job is aborted, the return status is
clobbered. Now it is not clobbered.
Release LPRng 3-1-4
New Functionality - :oh: entry does globmatch on FQDN host name.
The :oh=*val*: entry can now be used to do matching on the
FQDN host name. This allows such things as defining classes
of printers, i.e.:
lp:oh=*lab1*:lp=pr1@server
lp:oh=*lab2*:lp=pr2@server
(Inspired by: Nathan Neulinger <nneul@umr.edu>)
Bug Fixes:
Debugging stuff added to Is_printable(); LPR/lpr.c and company had
the control file generation fixed up so that lpr -K worked correctly
when taking input from stdin; also when using it with lpr_bounce.
(Reported by: Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>)
autoconf Version 2-12 has a bug and was not generating configuration
files correctly; fixed this and now the --exec_prefix option
appears to work correctly. To regenerate configure from configure.in,
the following acgeneral.m4 file lines must be changed:
.... original .....
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
.... correct ......
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
Permissions checking in Is_printable() was erroneous.
(Reported by: Dirk Nitschke <ms3a512@math.uni-hamburg.de>)
Find_non_colliding_job_number() did not check to see if job priority
was available, and was generating bogus hold file names. This only
occurs when data files are sent first.
Release LPRng 3-1-3
New Functionality - Kerberos authentication uses encryption
Send encrypted and authenticated information by default.
(Greateful thanks to: Ken Hornstein <kenh@cmf.nrl.navy.mil>)
Bug Fixes:
Fix_str(): missing null pointer check
(Reported by: Christian Kuehnke" <Christian.Kuehnke@arbi.Informatik.Uni-Oldenburg.DE>)
Release LPRng 3-1-2
New Functionality - glob matches for printer names:
At USENIX97, somebody mentioned that they wanted to have a 'wildcard'
entry that would allow them to 'trap' all sorts of printers, and then
do formatting based on the printer name. I puzzled over this, until
I realized that the combination of the :qq: (put queue name in job)
and a wildcard match would do exactly what this person wanted.
The more I thought about it, more functionality seemed to be
provided by this - you could match various arcane printer names
against patterns, etc.
Now when a job arrives and the LPD server is searching for the queue
name, the search is done using a glob match. Note that you
cannot have a primary printer name with a GLOB character, but it
is allowed to have an alias with one. For example:
pr1|pr*|all printers which start with pr
:lp=pr1@host
:qq
pr2|*|wildcard match
:lp=pr2@host
:qq
New Functionality - munging control files:
There is now a 'control_filter' option that will cause the control
file to be passed through a filter. This takes place only when a job
is transferred to a remote printer. It was intended to be used by
bounce queues whose destination required extremely whacko formats
for their control files. See README.bouncequeues for details.
New Functionality - generating banner pages for remote printers:
The :generate_banner: printcap option will now generate a banner
page for remote print jobs and/or when using LPR and :lpr_bounce:
is set. The banner is generated by the banner printer specified
by :bp: or the default banner printer. If the :hl: (header or
banner last) flag is set, it will be the last part of the job printed.
New Functionality - spreading job numbers to avoid collisions:
Some users have been encountering job number collisions when using the
routing facility and making multiple copies. The "spread_jobs" printcap
and configuration variable now allows you to spread out job numbers
by the indicated factor. The job number is based on the process id;
jobnumber = processid * spread_jobs;
Under heavy use, this value should be set to the expected maximum
number of jobs copies that will be made.
Fixes and Extensions:
fixcontrol.c - badly formatted DEBUG message.
(Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
configure - cray-unicos is now just unicos in the system targets.
In addition, HAVE_SYS_SIGLIST botches have been fixed.
fix_create_dir() segment faulted
(Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
LINUX has undocumented (and in my opinion broken) gethostbyname()
and gethostbyaddr() interactions. The code that does lookup
now performs extremely picky checks, copies, etc., to avoid
problems with this.
(Reported by: just about every LINUX user...)
Makefile: install was missing a value.
(Reported by: Doug White <dwhite@gdi.uoregon.edu>)
:bk: (Backwards compatible) now forces short job names and
short job numbers as well.
LPC - lpq command now takes the last printer specified as its default.
(Suggested by: Jeff Bacon <bacon@twinight.org>)
IRIX and UNICOS compilation mods.
(Suggested by: Paul Burry <rpburry@magi.com>)
Aborted LPR caused 0 length files to be left in spool directory
Multiple copies and routing interact
(Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>)
config.sub now recognizes i686 as a proper machine type.
(Reported by: Michel Robitaille <robitail@IRO.UMontreal.CA>)
Release LPRng 3-1-1
New Functionality:
Support for client to server and server to server authentication.
See README.authentication and lpd(8) man page, as well as
README.pgp_authentication. Currently, pgp is supported for
client to server and server to server authentication; Kerberos
is supported for client to server authentication.
Printcap entries can contain the following:
%a - architecture
%H - fully qualified domain name of host
%h - shost host name
%P - printer (when in printcap entry)
%R - remote printer (when in printcap entry)
%M - remote host (when in printcap entry)
This is the same as for the configuration information. Note
that these keys are marked by %; keys marked with $ such as $P
are expanded only when used by filters. Currently only the
:sd: (spool directory), :server_user:, and :remote_user: (for
authentication) are expanded.
Support for lp(1) simulation (Solaris SystemV R4) print facilities
now built in. This is done by checking the name that the program
is invoked with:
lpr invoked as lp - simulates lp operation
lpq invoked as lpstat - simulates lpstat operation
lprm invoked as cancel - simulates cancel operation
Note that this is not full functionality, but it will provide
a usable interface for programs that need lp, lpstat, and clean.
man pages updated and rewritten to reflect latest changes.
IPV6 awareness is being planned for. The permissions checking is
now done assuming that information returned by gethostbyname()
and/or gethostbyaddr() may be for IPV6. Host names checking
is done not only on the cannonical (main) host name, but also
for aliases; the IFIP permissions check has been added to allow
access to the IP address reported by the accept() system call
that reported a connection. See README.lpd.perms for details.
A new printcap flag, :direct_write: now passes a file descriptor
to print filters. This is backwards compatible with the old BSD
filters, but you lose the ability to monitor the printing
process. In addition, you are stuck with 'send_timeout'
seconds for printing a job, which may not be suitable if a job
hangs up on a printer.
Makefiles compatible with the BSD make are now provided; these
are generated from the basic Makefiles using a simple conversion
script. Of course, the Makefiles were redone in order to make this
feasible...
LPR now can do filtering if the :lpr_bounce: flag is set.
LPR Protocol Extensions:
REQ_SECURE: an authenticated transfer of job and control information.
See the details in the README.authenticate and lpd.8 man page.
REQ_VERBOSE: provides a hideously detailed set of information about
the print queues and their status. This is of interest to persons
who are trying to provide tracking for jobs and other information
and need more than the status provided by the high level LPQ
dumps. The LPQ -v format now will generate this.
LPQ and Status Generation
LPQ now prints each queue status once. In addition, when getting
status, LPD makes a valiant effort to avoid forking and creating
processes. This makes things much more easy on the system load.
Source Code Reorganization:
A major source code reorganization was done in order to support
configuration management tools in a more effective way.
System configuration and printcap initialization is now done by
the values in the lpd.conf file, which can contain printcap
flags as well as configuration information. This allows
defaults to be set in a much simpler manner.
Beta Testers:
Pseudo Anonymous, <pseudo@erehwon.org>
Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>
Dirk Nitschke <nitschke@math.uni-hamburg.de>
Paul Burry <rpburry@magi.com>
Thierry.Besancon@lps.ens.fr (Thierry BESANCON)
Fixes and Extensions:
configure and Makefile support for CRAY (by Paul Burry <rpburry@magi.com>)
using the lpc class facilities now prevents held class jobs from being
printed.
(Reported by: Chao-Wen Young <kiki@eng.dowjones.com>)
gethostbyname() has a possible problem. Added checks for
parameters.
(Reported by: Jens Thiel <thielj@uran.informatik.uni-bonn.de>)
printcap '@' operator did not set clear entries.
(Reported by: Park Jae-hyon <jhpark@entropy.kaist.ac.kr>)
filter error code 'JFAIL' now causes job removal.
(Reported by: Norman R. McBride <N.R.McBride@city.ac.uk)
SAMEUSER permission check was not working correctly.
(Reported by: Carsten Benecke <benecke@informatik.uni-hamburg.de>)
LPD now checks for the number of servers it has active; Max_servers_active
configuration variable sets this. In addition, uses the getrlimit()
to determine real value if available. This should throttle back
problems when a lot of LPR connections are being made and the server
proceeds to die or lose jobs.
getconnection() now tries to open a connection with different
originating ports. This solves a problem with some systems that
did not like LPRng originating connections from the same reserved
ports. Users encountering this difficulty might have to use
a wider port range; this can be done now by modifying the printcap
entry for the printer.
checkpc now has Is_server set to 1, so it should do the full
server compatibility checks.
Queuename not being set correctly.
(Reported by: Thierry.Besancon <Thierry.Besancon@lps.ens.fr>)
LPC now calls 'lpq' via a bombproofed system() call
(Suggested by Paul Burry <rpburry@magi.com>).
LPR now generates correct job names for more than 26 files.
(Reported by: Guy Geens <ggeens@elis.rug.ac.be>)
Release LPRng 2-4-3
New Functionality:
Printcap Files
The printcap reading and configuration file reading code
now supports the following:
1. you can have multiple :tc=name: references.
2. printcap entries whose main name starts with a punctuation character
is not used as a printer. However, it can be referenced by
:tc=: entries. For example, the following shows how to
use this facility.
@filter:if=/bin/whatever:of=/bin/whatever
@banner:sh:sb
@spool:sd=/var/spool/%P
p1:tc=@filter:tc=@banner:@spool
In addition, the following printcap entries have %P (printer),
%h (short host name), and %H (Fully qualfied domain name of
host) replaced by the current values before jobs are processed;
other values are ignored and replaced by which space. A %% is
replaced by a single '%'. The variables which are expanded are
controlled by the flags value of the src/printcap.c/Pc_var_list[]
array; currently the following are expanded:
:sd=: (spool directory)
Device Locking:
This code was originally put in place for systems where you might
have multiple people trying to use a printing device. The 'lk'
flag now controls if you want to lock the IO device. Default
is no locking.
Portability Fixes:
Quicksort is not a stable sorting algorithm - if two entries are
identical, then their position can be reversed. The order of entries
is important and needs to be preserved when reading information,
so mergesort() is now used.
The organization of the include files was causing problems with
testing packages. There is now one include file for each major
functional component. Global variables are now in a single file,
and are the same for all packages. The difference in size of
the executables was minor.
Bug Fixes:
Printcap reading code: now handles forward references correctly.
(Reported by:
Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
Ruthless purging of metacharacters passed to filters. This includes
quotes, backslashes, and all other even vaugely funny characters.
(Reported by:Bertrand Decouty-INRIA Rennes-France
<Bertrand.Decouty@irisa.fr>)
Release LPRng 2-4-2
Missing REMOTEGROUP check in permissions.c
(Reported: Michel Robitaille <robitail@IRO.UMontreal.CA>)
configure.in: Added more robust check for undefined functions
on various systems, added checks in source code for various
variants: termclear.c, gethostinfo.c
(Reported by: Doug White <dwhite@gdi.uoregon.edu>,
Sven Rudolph <sr1@inf.tu-dresden.de>)
LPQ: status line now too long, truncated it to 79 chars.
LPD: time of day format changed to YY/MM/DD/HH:MM:SS
LPC: autohold and noautohold command changed to 'holdall'
and 'noholdall'; LPQ: autohold and holdall status reporting
added.
lockfile.c: Added #if !defined(LOCKDEV) code to not do locking
on serial devices.
(Reported by: bennett@nomolog.nagoya-u.ac.jp (Bennett))
Printcap printer names: primary printer names starting with
punctuation are now treated as simply entries and not valid names.
This means that they can be referenced as tc=@name, i.e.
@name:if=/whatever
prname:tc=@name
Multiple Server Queues: ss/sv code reworked again - got rid of several
race conditions, lost files.
Routing filters: added code to handle dropped jobs better.
Release LPRng 2-4-1
minor problems with Makefiles, portability fixes.
(Reported by: Michel Robitaille <robitail@IRO.UMontreal.CA>)
malloclist.c error message format wrong.
(Reported by: Jens Thiel <thielj@uran.informatik.uni-bonn.de>)
Release LPRng 2-3-14
New Functionality:
Jobs are now sorted by priority.
(Reported by: syl@ecmwf.int (Lennart Sorth))
LPC CLASS option added. Classes of jobs can now be held and/or
released. lpc class printer A,B,C would release jobs with
classes A,B,C; lpc class printer J=*form1* would release jobs
whose job name contained the form1 string.
(Requested by: garyc@eng.dowjones.com (Gary Cender))
Printcap and Configuration :send_failure_action:
when a job fails to be printed or transferred, it is automatically
retried :rt: (:send_try: or configuration send_try) times. A 0
:rt: means infinite retries. It may be desirable under various
circumstances to have a method of dynmaically deciding if an error
threshold is exceeded or some other action is needed. The
:send_failure_action: printcap and/or configuration variable specifies
the default action when :rt: is exceeded. It can have the following
form:
1. The string "success", "abort", "retry", "ignore", "hold"
which will cause the job/spooler to treat as successful,
abort, retry, ignore, or hold the job respectively.
2. A filter of the form: |/filtername. The filter is executed
with the default set of filter options, and the number of attempts
is printed to its standard input. It can print error messages
to standard error, which are placed in the spool error log.
The exit codes JSUCC (0), JFAIL (1 or 32), JABORT (2 or 33),
and JREMOVE (3 or 34), JIGNORE (5 or 36), etc. will force
removal as if successful, retry, etc. as for the text form.
README.nis: new script for creating NIS (YP) databases.
(Contributed by: Sven Rudolph <sr1@inf.tu-dresden.de>)
LPF: modified the -T option, added -D (debug level option)
(Contributed by: Sven Rudolph <sr1@inf.tu-dresden.de>)
LPD cannot be started from inetd. This functionality
puts a very heavy load on the system and trying to make
it function correctly was very difficult.
Makefile: PREFIX variable defined, to allow overriding default
prefix value.
(Suggested by: Sven Rudolph <sr1@inf.tu-dresden.de>)
Major Fixes:
File Locking:
The code for dealing with file locking and job name collision was not
sufficient to handle the case where multiple jobs were being submitted
simultaneously. The new code uses the hold file for locking jobs,
in addition to locking the control file. When a job is submitted via
LPR or forwarding, the hold file is created, written with the
receiving process PID, and is then released. When other processes
try to submit a job, they will lock the hold file, check for the running
process, and then try anther job if the process is still delivering
the job files. When all of the job files are delivered, the process
will then write the hold file with -1, i.e. - a signal that all files
have been delivered. If a job is submitted by other means, i.e.-
copied directly to the spool directory, there is no guarantee that
collisions can be avoided. Note that sometimes hold files will
be left in the spool queue, but these can be clean up periodically
by using checkpc for example.
Bug Fixes and/or Deficiencies:
Added Hold_all variable that is controlled by LPC command -
:ah: printcap entry cannot be overridden now.
(Reported by: garyc@eng.dowjones.com (Gary Cender))
LPD/lpd_control.c: STOP was killing off server; now it prevents
next job from being started.
common/printjob.c/Fix_string() - missing check for 0 length string.
(Zygo Blaxell <zblaxell@myrus.com>)
Printing filter exit codes 1->5 are translated to JFAIL->JABORT
This makes vintage filters compatible with LPRng.
Find_key() can return a 0 value under extreme circumstances - 0 check
added. (Reported by: Ron Roskens <roskens@cs.umn.edu>)
lpr -l or lpr -b did not get IF filter invoked with -c option.
(Reported by:Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
trailers are not sent to printers; caused by premature close of output.
(Reported and Fix by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
permissions checking once again has a problem - if no match is found
incorrect use of defaults.
(Reported by: QingLong <qinglong@Bolizm.ihep.su>)
LPQ: queue status not reported correctly. Caused by a memory leak,
and also incorrect buffer length specified to allocation routine.
(Reported by: Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
Release LPRng 2-3-13
Linux has inconsistent ncurses (curses.h) and termlib (termlib.h)
definitions for tgetent(). Use only one.
(Reported by Elliot Lee <sopwith@cuc.edu>)
The 'printed 10% of 1000 bytes" message gets scambled when
processed by other systems where the % is interpreted as a
format character by printf. Changed to 'percent' instead.
(From: Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
Release LPRng 2-3-12
waitchild.c does not enable the SIGCHLD signal. This was causing
problems when a child would die during a read/write operation and
interrupt the read/write operation.
checkpc - now checks to see if the LPD lockfile directory exists,
and creates it if necessary.
getopt.c - strdup() changed.
(Reported by Brad Greer <brad@cac.washington.edu>)
src/Makefile.in - LOCK_DEV_CFLAGS -> LOCK_DEVS_CFLAGS
(Reported by Klaus Guntermann
<guntermann@iti.informatik.th-darmstadt.de>)
LPD, lpr -p and :pr: filtering. Documentation claims that LPD will
filter 'p' format jobs through :pr: filter and :if: filter. It was
not doing it, and now does. However, when using a bounce queue,
it will not filter :pr: formats unless a :pf: filter is present.
(Reported by Scott Sutherland <scott@math.sunysb.edu>)
:translate_format: printcap variable, and functionality added for
bounce queues. A bounce queue can now also modify the job file format
using the :translate_format: printcap entry. For example,
:translate_format=mfpl: would change m to f and p to l format
job files.
Release LPRng 2-3-11
MAJOR ADDITIONAL FUNCTIONALITY:
Logger: filter error output is now written to the logger as well as
status information.
lpr -p and LPD: the pr filter support was not updated. It now invokes the
traditional 'pr' program correctly.
(Reported by: K.D. Meyer" <meyer@uni-trier.de)
LPD/lpd_control.c - reporting duplicate status line information.
(Carl Hilton <chilton@dns2.sac.usace.army.mil>)
LPR: exits with a nonzero error when 0 length job or invalid queue.
(Paul Haldane)
lpbanner.1 and lpraccnt.1 man pages created.
(Carl Hilton <chilton@dns2.sac.usace.army.mil>)
lpq -Pall - sendstatus() returned wrong status.
Release LPRng 2-3-10
MAJOR ADDITIONAL FUNCTIONALITY:
routing to multiple destinations, multiple copies, via a bounce queue
A bounce queue can now route jobs to multiple destinations
and/or make multiple copies of a job. This action is controlled
by the printcap/configuration variable router=filter.
See README.routing and the LPD.8 manual page for details.
Identifiers:
The 'A' control file line is now used to store a 'unique' job
identifier. This follows a job through the system, and is
used to identify a job. It can also be used in LPRM and
LPC messages.
The :use_identifier: printcap and configuration variable controls
the addition of this information to the control file.
Job ID Wildcards:
LPRM, LPC now take wildcard entries as well use job numbers and
user IDs for jobs. (Updated LPRM, LPC man pages).
Logger:
Added code to record the actions of jobs passing through the
system. SetStatus messages now sent to a logger process as
well as recorded in a status file. Added:
printcap/configuration:
logger_destination = host[%port][,(TCP|UDP)]
host%port is destination host%port combination.
configuration:
default_logger_port = 560 - default port for logging
default_logger_protocol = UPD - default protocol for logging
lpd_rcvjob.c - error message has a missing '%s' entry.
(Brad Greer <brad@cac.washington.edu>)
Link_read() in link_support.c - minor error - zero length read
reported as error, not EOF condition.
lpd: multiple copies (lpr -K option) were causing malformed job control
files to be generated by LPD when it checked them. Off by one problem
with pointers fixed.
(Reported by: Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>,
details of problem by Dirk Wrocklage <dirkw@uni-paderborn.de>)
cleanup() - exited with erroneous error code when NOT sent a signal.
(Reported by Ed Santiago <esm@lanl.gov>
and Sven Rudolph <sr1@os.inf.tu-dresden.de>)
HOST and REMOTEHOST permissions now can be netgroups, i.e. -
HOST=@netgroup or REMOTEHOST=@netgroup will check to see
if a host in in the netgroup.
permissions.c - Mods by Geoff Ballinger <geoff@chemeng.ed.ac.uk>
These modifications fixed a problem with checking for user
permissions, and now the permissions 'user' or 'remoteuser'
is checked according to documentation.
REMOTEUSER, REMOTEGROUP added to permissions checking. Permissions
checking now done in much more rigorous way.
LPD/lpd_rcvjob.c - fixed up hold file removal on bad job submission.
Setup_waitchild() - moved to Initialize(), done for all programs
Release LPRng 2-3-9
killchild.c - minor bug on cleanup. If cleanup called with 0
argument, never killed off children. Under very rare circumstances,
this resulted in a OF filter process hanging up, and never exiting.
LPR: the -s option is now silently ignored.
(Jon E. Ferguson" <jon@media.mit.edu>)
ULTRIX has a sys/syslog.h and a syslog.h file, need to use sys/syslog.h
(Per Foreby <perf@efd.lth.se>)
Accounting Filters: the :as: (accounting start) filter returning JREMOVE
did not cause the job to be removed. Fixed.
(Reported by Panos Dimakopoulos <dimakop@cti.gr>)
Release LPRng 2-3-8
lpr_makejob.c - not handling -w and -0 (font options) correctly.
(Reported by Jens Thiel <thielj@athene.informatik.uni-bonn.de>)
Comments in sendjob.c updated to reflect reality.
(George Lindholm <lindholm@ucs.ubc.ca>)
Release LPRng 2-3-7
lpd.conf default file - updated example configuration values
Documentation miswordings, downright errors, and missing information
corrections and comments added.
(Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
struct fd_set declarations changed to fd_set to make it compatible
with POSIX.
(Reported by Alan Shutko <ats@shep1.wustl.edu>)
use_shorthost flag not working - fixed.
(Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
setup_filter.c - %h in an option string is now expanded to the short
form of the host name.
ROOT perms for filters - added the ROOT_PERMS_TO_FILTER_SECURITY_LOOPHOLE
definition to the src/Makefile, modified common/setup_filter.c.
Added comments to man/lpd.8. Comments by Patrick Powell, mods by
(Jens Thiel <thielj@uran.informatik.uni-bonn.de>)
Release LPRng 2-3-6
LPR/lpd_rcvjob.c - snprint() replaced by plp_snprintf()
src/common/defaults.c - erroneous LD_LIBRARY_PATH= and PATH= values in
configuration variables.
(Reported by Jens Thiel <thielj@athene.informatik.uni-bonn.de>)
LPRng 2-3-5
printcap.c - when lpd-perms array gets longer than 40kB or so,
lpd crashes with an segmentation fault when it's getting started.
fixed by: Dirk Wrocklage <dirkw@uni-paderborn.de>
permissions.c, globmatch.c - updated error reporting, and added
check for user's default group when checking GROUP permissions.
(Stefan Monnier" <stefan.monnier@lia.di.epfl.ch> and
Ron Roskens <roskens@cs.umn.edu>) Also, changed strcmp to strcasecmp
to make comparisons case insensitive.
LPD/lpd_control.c - modified error message to better indicate failure.
long job numbers - lpd_rcvjobs.c, cleantext.c, lpr_makejob.c, printcap.c
added the capability to have long (6 digit) job numbers. This is done
by reformatting the job control file and the job file names.
printcap :longnumber: and configuration longnumber=yes enables this.
Note that :bk: (Backwards compatibility) overrides long numbers.
If a queue is marked :bk: then it will attempt to shorten long numbers
to produce a short number file. This can be used with a bounce queue
to produce files compatible with the older vintage systems.
As a side effect, tightened up format checking of unlink entries,
and other issues reported by the following folks.
(Lennart.Sorth@ecmwf.int, Desmond Macauley <desmondm@eng.dowjones.com>)
lprm - fixed the removal algorithm so that multiple tags select multiple
jobs. i.e. - lprm 1 2 3 removes jobs with numbers 1, 2, and 3.
If you do lprm user, all jobs with the tag 'user' are deleted.
This allows much easier job purging, which is usually why you
are using lprm...
use_info_cache flag - printcap.c(Free_pc()) routine brutally wipes
out all data now. This will either force the reread or crash the
process.
(reported by Dirk Wrocklage <dirkw@uni-paderborn.de>)
configuration variables: added default_format, default_priority
to configuration as well as printcap variables. lpd.conf.5 and
printcap.5 man pages have been updated. Apparently they were never
documented in man pages.
(reported by Stefan Monnier <stefan.monnier@lia.di.epfl.ch>)
common/sendjob.c: error reporting for DATAFILE was incorrect.
(reported Brad Greer <brad@cac.washington.edu>)
:send_data_first: printcap and configuration variable added.
causes data files to be sent to the destination first, before
control files. (Supports horrible spoolers that violates RFC1179)
(suggested Brad Greer <brad@cac.washington.edu>)
:connect_grace#nn: printcap and configuration variable added.
Klaus Steingerger reports that some printers require a grace
period between connection attempts. This variable provides
a suitable delay. Also, the Clear_timeout() routine now
restores the ORIGINAL signal handler. This means you can
only have one timeout pending at a time - which makes sense
in this implementation.
(reported and mods by Klaus Steinberger
<Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
globmatch.c - a bug with checking for upper and lower case chars.
(reported by Per Foreby <perf@efd.lth.se>)
Release LPRng 2-3-4
typos in the documentation - fixed
Release LPRng 2-3-3
getcfng.c - "use_info_cache" entry out of order.
(Alan F Lundin <aflundi@sandia.gov>)
Release LPRng 2-3-3
LPR and :qq: printcap entry, use_queuename configuration information
Added 'use_queuename = no' to the common/default.c file - the
use_queuename will force control files to have the 'Qqueuename' entry
placed into them. The :bk: (backwards compatible) entry can be used
to override this when sending to non-LPRng systems. When receiving
a job and use_queuename is TRUE, then LPD will add the name of the
spool queue to the control file.
Release LPRng 2-3-2
common/defaults.c - removed :xt: from the printcap defaults.
common/getcnfinfo.c - added "true", "all", "false" keywords for flags.
common/termclear.c - for LINUX, added include <termios.h>
(Avery Earle <ae@play.psych.mun.ca>)
Release LPRng 2-3-1
printcap.5 :xt: entry updated
bk, qq, and bounce queue filter interaction: printjob.c modified to
add Queuename information for filters if :qq: option or Q entry
in job file.
Release LPRng 2-3-0
Minor rewording on printcap.5 man page.
common/termclear.c - defined(solaris) changed to defined(SOLARIS)
(Andrew Richards <physajr@phys.canterbury.ac.nz>)
common/printcap.c, CHECKPC/checkpc.c - subtle bug when reading
printcap information from a filter AND the 'oh=host' specified
AND the host is not the current host. Fixed. In addition,
checkpc will not create queue entries for queues not used/defined
on the current host.
(Dirk Wrocklage <dirkw@uni-paderborn.de>)
Release LPRng 2-2-9
printcap.c - malformatted printcap entries ending with a \
at the end of the file are now accepted.
Release LPRng 2-2-8
LPR now uses a reasonable size buffer when copying files.
Release LPRng 2-2-7
lpq: back to the previous format!
lpq -s - does the very short format
lpq - prints short form of detailed information
lpq -llll... - each l doubles status information
lpq.1 - man page updated.
printcap, lpd.conf: send_failure_action - added a 'hold'
keyword that will hold the job on error rather than deleting it.
updated printcap.5, lpd.conf.5 man pages
lpd_jobs.c - added checks for filter non-zero status exit.
configure.in - printf("%s",sys_siglist[0]) added
(<harlan.stenn@pfcs.com>)
Release LPRng 2-2-7
lpq: by default, a very very short format- pr@host:(status stuff) NN jobs
lpq -l - short, verbose format
lpq -l -l or lpq -ll - longer format
lprm: was not removing all jobs when 'lprm all' specified.
lpr.1 man page: priority of jobs is A (highest) to Z (lowest)
Release LPRng 2-2-6
lpr: -K option did not have ':' in getopt options string.
(Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
lpr: -# has been readded, in spite of my better judgement, to be
compatible with antique LPR systems.
lpd: 'sending job to...' message error
(Dwaine C. Gonyier <virtual@panthra.catt.ncsu.edu>)
printcap.c, getcnfginfo.c - ordering of parameters not alphabetical.
(Ron Roskens <roskens@cs.umn.edu>)
lpr, configuration - check_for_nonprintable code got mushed, fixed
now; the :xt: (check text) printcap flag added as well. man page fixed.
(Ole Benner <olb@kom.auc.dk>)
configure.in- library check fixed, added additional library check
(Harlan.Stenn@pfcs.com)
lpc - the 'lpc lpd xx' operation set the current printer to xx. Fixed.
(Jos Backus <jos@oce.nl>)
Release LPRng 2-2-5
** changed the bqfilter flag to bq=destination_queue
This now forces all input to be passed through the filter.
Changes in the bq filter information as well.
Bounce_filter: removes temporary bounce queue file on exit unless
debugging is high level. bounce queue file name is bfAnnnHost,
i.e.- has same format as a job file. This makes job related
processing easier to debug.
lpc - Updated queue status display
lpc status now shows autohold status
lpc noautohold now restarts printer on 'NOAUTOHOLD' command
lprm with no options removes first removable job in queue
This is compatible with BSD lprm functionality
configure - GCC version checks moved to start of configuration
added checks for sys/utsname.h, utsname.h
common/gethostinfo.c - uses sys/utsname.h
configure.in has check added for utsname.h
lpd - printjob now checks for exit status of filters - should
terminate now if filter has bad exit status.
(Note: this may not be bombproof in all situations.)
printcap and configuration - connect_retry was defined as connect_try
documentation fixed as well.
CHECKPC- checkpc -r -A nD now removes all job related files older than
n Days. This can be put into crontab and run periodically.
printcap :ah: (autohold) now operational. Note that LPC will
override printcap default. lpc status now indicates if autohold
is on.
Release LPRng 2-2-4
:bk: (backwards compatible) flag now causes removal of non-BSD compatible
control file entries as well as modifying the order.
:qq: (Queuename in control file) flag is now overridden by :bk: flag.
This will now generate Berkeley compatible job files.
lpr - improved 'connnection failed' message format.
accounting_server and accounting_check added for accounting.
printcap.5, README.accounting, and other documentation updated.
Release LPRng 2-2-3
Once more the portability/bugfix Gods need yet another sacrifice.
BSDI V2.1 setreuid() returns erroneous error codes - setuid.c
fixed yet again... I suspect other BSD derivatives to have same
problem. Sigh...
cleanup() now unblocks signals before exiting.
Print_open() - better status messages on open failure.
Release LPRng 2-2-2
TESTSUPPORT: removed lpf generation
Perms_check(): missing ntohl(HostIP), needed for host order of addresses.
Lock_fd(): - saves errno error codes and returns them correctly
Prefix_line in malloclist(): - copy now done in correct order
fixes print queue bug.
Accounting Filters:
1. the filter command is not passed as an argument to the accounting
filter. This solves some problems with shell script filters,
as the last filter command would have the form:
filter -H... -a|filter |filter
2. Accounting information now logged at start and end of job.
GROUP Permissions: permissions.c now checks to see if a specified
group exists first, using getgrnam(), then tries wildcard
search next.
Permissions: IP=host/netmask format updated- allow /n to be n bit mask
i.e. - 130.191.163.12/16 -> 130.191.163.12/255.255.0.0
Release LPRng 2-2-1
LPF filter: added source code to the LPRng main distribution.
This provides a passthrough filter for most applications.
README.printcap: updated to reflect use of lpf filter and
banner printing
LPRM/LPD: lpd restarts printing if the active job is removed.
LPQ: more robust handling of bad printcap entries
LPD: attempt to solve problems of filters which print to
serial devices hanging because the device has pending
output, has been sent a ^Q to stop output, and has not
received a ^S to restart. Uses tcflush() to flush serial devices.
LPR: added a 'use_shorthost' configuration and printcap variable
to force the use of short host names for print job control and data
files. The code was present in LPR, but not enabled.
Update lpd.conf.5 and printcap.5 man pages.
Debugging Flags: added keyword and flag capability. For example:
-Dthis,that@ can be used to set the 'this' flag and clear the
that flag. see common/parsedebug.c for details.
NGPRINTER environment variable added. Used to override PRINTER environment
variable. Allows one format for PLP/LPR/Solaris, one for LPRng.
(marty leisner@sdsp.mc.xerox.com)
LPC: command of form 'status printer@host' was not formatted correctly.
(Jarrod Douglas <jarrod@cs.curtin.edu.au>)
man/printcat.5 - added a functional listing as well as alphabetical.
(Sherwood Botsford <sherwood@space.ualberta.ca>)
LPD, LPQ: added termination error messages to status output.
Details for job failure now available.
printcap :qq: and lpr -Q option now fully operational.
lpr -Q or :qq: printcap field sets Qqueuename in job file;
lpd bounce queue will add Qqueuename line to the control file.
Release LPRng 2-2-0
Updated README files.
README.1st - overview
README.install - much more complete
README.lpd.conf - explains lpd.conf
README.lpd.perms - lpd permissions structure listed
man/lpr.1 - missing -k information added.
man/lprm.1 - fixed typos
man/lpd.perms.5 - lpd.conf documented
DOC/Tutorial - added additional information
DOC/Install - extended to include more testing and installation
details.
strdup() changed to plp_strdup() to avoid problems with C library.
configure.in - check for sys_siglist[] improved.
src/commmon/decodestatus.c - fixed problem with Solaris 2.5
and sys_siglist[]
Makefile - added default target to install default lpd.conf and
lpd.perms files; prototype files added as well.
man/lpd.conf.5 man page added
src/common/permission.c: added a SERVER key, to allow restriction
to users on the server.
checkpc - truncation now done on log, accounting, and status files.
LP_SIMULATION - SVR4 simulation with lp.sh and lpstat.pl scripts
Release LPRng 2-1-3
waitchild.c - race condition with malloc() in the SIGCHLD handler
would result in rare, very very rare problems. Data structures
are now pre-allocated.
LPD/lpd_jobs.c - WIFSTOPPED and WIFSIGNAL checks done improperly.
Shows up in OSF1 based systems. The test is now done correctly.
AIX portability - added sys/select.h to include list
LPQ status display modified to be consistent-
Filter status: -> Filter_status:
Now all the comment and information lines have a : at the end
of the first field. This makes parsing by perl/awk, etc. simple
Note that the Rank Owner ... line still does not have a colon
joost@cadlab.de - minor fixes for Apollo DN4500 and portability
TESTSUPPORT/Makefile.in, as well as minor fixes in portable.h
Release LPRng 2-1-2
STATVFS typeo corrected in in configure.in, portable.h, freespace.c
(curt@ltpmail.gsfc.nasa.gov (Curt Tilmes))
Missing VARARGS declaration for setstatus() in lp.h
(Marc Baudoin <Marc.Baudoin@hsc.fr.net>)
Makefile.in (in general) - fixed realclean mostlyclean targets
(Paul Eggert <eggert@twinsun.com>)
setproctitle() - check made in configure, and if not present
the proctitle.c code is used. (Marc Baudoin <Marc.Baudoin@hsc.fr.net>)
Makefiles - realclean and distclean targets did not remove Makefile
(Paul Eggert <eggert@twinsun.com>)
Missing read permissions on various files
(Paul Eggert <eggert@twinsun.com>)
configure.in (CFLAGS): Use a more accurate test to decide
whether we are using GCC version 2.4.5 or earlier. The old
test didn't handle GCC snapshots correctly.
(Paul Eggert <eggert@twinsun.com>)
Release LPRng 2-1-1
CHECKPC- added test for the printcap 'ps' - printer status file
- fixed up test for printer device, now ignores remote and filters
- added 'checkpc -s' option to not create/check printer status file
common/sendjob.c - Bounce Queue Filters are only invoked by the server;
added a check for Interactive and printcap :bqfilter: flag BOTH
set before invoking filter. This prevents clients from invoking
filters.
Release LPRng 2-1-0
Added 'rs' (time between spool queue rescans) printcap entry
Added 'oh' (option for host) printcap entry
Added check for NULL printcap pointers. Printcap files entirely
consisting of comments and empty lines are now handled
correctly.
Added ntohl() and htonl() calls to fix IP addresses for permissions
checking. This showed up on X86 systems.
Release LPRng 2-0-9
Patch to make sigsetjmp() work correctly on Solaris. Sigh...
Release LPRng 2-0-8
Solaris 2.5 requires sigsetjmp() and siglongjmp() for alarms and
timeouts to work reliably. Note that GCC now does not put out
warnings about 'variables may not be restored after longjmp'
C'est la vie, c`est le guerre...
Documented getting permission database with a filters, allowing
dynamic checking of a database.
Release LPRng 2-0-7
Fixed up the setuid() code yet again - portablility issues on
BSDI and FreeBSD - need to do a setuid() operation first.
Release LPRng 2-0-6
Removed default non-blocking open() operations;
added printcap 'nb' (Nonblocking_open) variable to allow
nonblocking open for specific devices
Updated man pages and DOC files to reflect new open() capabilities
Release LPRng 2-0-5
getuserinfo() was not using the original RUID value.
Fixed device locking again, this time to do a fallback to
fcntl() based locking if TIOCEXCL is not functioning
Removed MFLAGS from Makefiles, also put in cleaner test for GNU Make
The sleep() implementation on linux is defective; replaced
by a plp_sleep() using select().
Release LPRng 2-0-4
src/cleantext.c - Check_format() was too strict in checking
hostnames - now allow '-' as well as . and _ in name.
configure.in - SGI IRIX configuration needs SVR4 definition forced.
added more specifics for solaris
Release LPRng 2-0-3
- mostly portability fixes
man/Makefile.in - removed $(FILES) targets
did updates in a 'sane' manner
Fixed missing declarations of functions for fussy compilers.
Fixed CHECKPC/checkpc_port.c - SunOS4.1.4 has two versions of
stty - /bin/stty and /usr/5bin/stty
forced use of /bin/stty
configure.in - added gcc version check, fixed up CFLAGS
HPUX portability kludges -
1. O_NDELAY and O_NONBLOCK interact - removed one of them
2. Need to use fcntl() after open to fix the non-blocking
read operation.
device locking now works on Solaris 5.4
checkpc- added a couple of sanity check functions for internal
tables - Check_pc_list() and Check_config_list()
discovered a couple of entries in wrong order (bp was one)
that prevented use of banner printing.
Release LPRng 2-0-2
Modified configure to use config.guess; fixed config.guess as well.
- config.guess did not recognized BSDI systems, and exited
with an error.
Fixed configure.in to force library order if necessary.
Ripped out several SVR4 dependencies; src/killchild.c
Filters + Bounce Queues - added filtering capability
printcap variables - bqfilter (flag)
If a bounce queue (one that sends files to a remote printer/host)
has filters speicified, and the :pqfilter: printcap flag is set,
the data files will be passed through a filter, if there is a
filter for that format. Updated printcap.5, lpd.8 documentation,
as well as DOC/Intro.
Release LPRng 2-0-1
configure.in -
WARNING ** gcc version 2.4.5 and below
The -O option produces erroneous code several places.
configure.in has been modified to remove the -O option.
configure.in - added explicit check for elf.h - now defines
SVR4 if the file is present (see autoconf documentation
for test). Compatibilty check. Updated CFLAGS with define
for HPUX and uses the @CFLAGS@ edit in Makefiles. This
solves a problem when configure sets CFLAGS and the
default GNU Make .o.c rule set needs to be used.
LPRM: If a user has LPC CONTROL permissions, he can now remove
jobs from a queue.
Makefile.in, Makefile - Added various GNU compatible targets
such as clean, dist, reallyclean, etc.
Fixed the man/Makefile to better update the man pages when
installing them.
checkpc -T line : fixed up the STTY reporting to be more robust
should work with SVR4 better.
LPR: added locale initialization; printable checks now use
8 bit characters if the locale has been enabled.
O_NONBLOCK|O_NBLOCK - these both must be set on a SVR4 system to
do a non-blocking open. This might be considered a documentation
feature in some circles.
FreeBSD defines: various files have had #ifdefs for FreeBSD added.
Accounting: modified the default accounting string to add the
control file name; allowed the accounting filter to exit
with error status and write an error message.
Release LPRng 2-0-0
Baseline Release Version
Release LPRng 1-2-6
PERMISSIONS: permissions checking was defective- correct values now
used.
LPC: usage message updated
Error reporting: connection permission errors reported to connecting
system now.
LPR: now reports server error msgs to user on STDERR.
Release LPRng 1-2-5
PERMISSIONS: lpc operations split, 'C' are control, 'S' are status
this allows 'lpc status' command to be used by non-privileged users
Updated documentation to reflect this change as well.
Updated lpq, lpc, lprm -V option to be less verbose
by default; -V -V will show copyright information.
("Marty Leisner" <leisner@sdsp.mc.xerox.com>)
Control file format: allowed first 'N' line to appear before
data file information, and stuck in middle of control file.
This makes it compatible with other LPR implementations. Sigh.
If a filter is not available, this is logged in status and the
job is discarded. This prevents a job with bad format information
locking up the printer queue.
Filter program lookup in printcap entry has been fixed to be a little
more effective.
Fixed checkpc and setproctitle() to work with FreeBSD
(Richard Letts R.J.Letts@salford.ac.uk University of Salford)
Release LPRng 1-2-4
Harlan Stenn <Harlan.Stenn@pfcs.com>
termclear.c - there is an interesting problem with termcap.h, curses.h,
terminfo.h. On some systems you do not want to include curses.h,
but not terminfo.h and termcap.h. I recommend putting guards in the
terminfo.h include file so you can include it multiple times without
redefinition problems.
curt@ltpmail.gsfc.nasa.gov (Curt Tilmes)
- removed O_NDELAY from various open statements
Makefile.in - removed ${SRC}/src, etc. to allow compilation
in separate directories.
Release LPRng 1-2-3
Fixed lprm -a flag; documentation error as well
common/jobcontrol.c - erroneous error field update
miscellaneous errors reported by users.
SVR4 - added sys/systeminfo.h, sysinfo() call replace gethostinfo()
printcap - added 'qq' (save queue name in job file)
Release LPRng 1-2-2
This sounds ridiculous, but there is yet ANOTHER problem with
implementing portable file locking. It turns out that some systems
allow file locking only if the files are opened R/W, no APPEND.
This is only a problem in pr_support.c; the permutations and
combinations of files, devices, etc., are too much to deal with
algorithmically. An new printcap flag 'lk' (lock LP device) is
introduced to handle this. By default, no file or device locking
is done.
Release LPRng 1-2-1
Martin Forssen: maf@dtek.chalmers.se or maf@math.chalmers.se
- fixed an erroneous test in checkremote.c - missing data
initialization in LPD/lpd_jobs.c, LPD/lpd_status.c
- common/getqueue.c off by one error - LPD/lpd_remove.c - cfpp
uninitialized in Get_queue_remove()
hagberg@mail.med.cornell.edu (Eric Hagberg) A/UX portability
fixes in portable.h Fixed lpr, lprm MAN pages; fixed usage
messages. Added CONTROL permission checking for LPRM operation;
i.e. - if you have CONTROL permission you also can remove files.
Release LPRng 1-2-0
Documentation - DOC/Intro and DOC/Install
Filters: CTI-ifhp-1.1.1 lp-pipe-1.0.0 lp-support-1.0.0 psfilter-1.0.2
Fixed a minor bug in LPD/lpd.c - geteuid() missing
Release LPRng 1-1-2
Documentation (Introduction, and Installation) added
psfilter-1.0.1 added to FILTERS
Added test for signal.h to configure.in.
reported by Martin Forssen <maf@math.chalmers.se>
fixed missing bounds check in common/printcap.c, put install-sh in
directories needed (autoconf does not fix up $(INSTALL) correctly)
lookup loop for remote hosts in common/checkremote.c
Link_listened(void) missing in include/lp.h
Release LPRng 1-1-1
Added lp,lpsched, lp-pipes support
Fixed a bug in the job renumbering code in lpd_rcvjob.c; always started
with 0, instead of next job in sequence.
Fixed a bug in lpd_rcvjob.c, additional 0 ACKS being sent.
Fixed a bug with the filter options; added $0, $-, $'
Fixed the default filter parameter list - accounting file at end
Release LPRng 1-1-0
Cleaned up all sorts of minor problems with duplicate variables
being declared in two places.
Hopefully cleaned up the problems with Errormsg() not getting
sys_nerr; sigh.
Fixed accounting. Again. Sigh.
Added (fixed) support for host%port
Added install/test documentation.
Added even more portability tests to checkpc. - device locking,
stty, file locking.
Release LPRng 1Alpha9
Accounting has been added.
Fixed up a very very very rare problem with file locking by
redoing some tests.
Added the checkpc -T serial_line option
This performs a whole series of portability tests, all of which
need to pass.
Include file problems strick again: fixed up the right set.
Release LPRng 1Alpha8
Sun Aug 6 11:07:51 PDT 1995 Patrick Powell
Renamed files with pathnames greater than 14 chars to shorter ones;
Antique file systems strike again.
Added 'form' and 'hold queue' capability; modified the control and
job files; Renamed the release name to be consistent with GNU standards.
Fixed problem with compatibility between SUN and other systems.
Added LPR -Q flag, LPR -k flag to make it work.
Sun Jul 30 09:09:49 PDT 1995 Patrick Powell
Discovered some problems with the job printing code in LPD/lpd_jobs.c,
re-editted it and put in some stronger checks.
Modified the spool control file format slightly.
This did not work as well as I thought it would in the overall design;
now the spool control file can have any number of different types
of entries for future expansion, i.e.
printing_disabled 1
redirect printer@host
Several rather silly coding errors in various places that turned up
when a code checkout program was run: if/then not being executed,
etc. etc.
Fixed up the configure.in file to use the old dnl, socket, etc. libraries.
man/Makefile and src/Makefile modified to use INCLUDE=.. so that configure
can be run from another directory. This is very very strange autoconf
dependency, but who cares, as long as it works.
Fixed up a whole minor mess of writes and timeout interactions. Who would
have guessed at this interaction? Created a couple of utility functions
(Write_fd_str(), Write_fd_len()), and timeout (Set_timeout(), Clear_timeout())
routines. These assume that writes will be done with timeouts; all places
where writes are done have been surrounded by Set_timeout, Clear_timeout.
Release LPRng 1Alpha7
Mon Jul 24 09:29:15 PDT 1995 Patrick Powell
Changed the Makefile 'TARGET' name to avoid conflicts with other
Makefiles... sigh...
In link_support.c/Link_send(), the original code was using
several writes to send a line; this has been modified to use
a single write where possible. Apparently some implementations
of LPD code expect the command lines to be sent as a single
TCP write operation, and do not look for the \n terminator.
Removed the 'lorder/tsort' from Makefile, and hardcoded the
library file order. This provides a simple form of portability,
but will require updates to the Makefile if a new library file
is added.
Added better tests for sys_errlist and sys_siglist definitions.
Moved all of the configuration information to the root level;
this fixes a bug with the autoconf code that cannot handle
more than one level of directory structure. You can now
compile the LPRng software in another directory by using:
cd LPRng.<version>; SRC=`pwd`; \
cp configure $DEST; cd $DEST; configure --srcdir=$SRC; \
make all
Modified the top level Makefile to use the GNU Make -C directory
capability.
Fixed Send_job() to make it more robust in the face of protocol
errors. The numbers of times a job is retried is set by the
Connection_retry value.
Modified the LPC status reporting to make it clearer.
Removed a redundant error message.
Release LPRng 1Alpha6
Thu Jul 20 19:23:03 PDT 1995 Patrick Powell
Reorganized the auto configuration code so that it is at the top
level of the distribution. Added top level MAKEFILE with directory
recursion.
Separated out default printcap and configuration initialization,
put them in src/default.c
Fixed up some minor 'lint' level errors.
Update man pages. Fix up installation so that VERSION information
is put in the MAN page source.
Editted MAN pages heavily in light of comments from people.
Clean up some code in printcap.h, printcap.c, lp_config.h, getconfig.c
Fixed a missing check for null string with STRCMP in src/getqueue.c.
Considered using safestrcmp() for this reason; checked most places;
safe or appear to be safe.
Modified the format for LPQ status information, added more detail
about the printer status.
Added -Pprinter option to LPD to simply start and run a spool queue
server. This allows debugging of filters much easier.
Added bk-of-filter-options and bk-filter-options to provide compatibility
with old style filters.
Fixed up a lot of minor portability issues with Solaris2.4, using the
SUN Soft C compiler. Fixed fumble in gethostinfo.c - will die if
it cannot find the local host name; this is very bad and should be
immediately fatal instead of dying later.
Fixup the the TESTSUPPORT/Makefile to be a little more intelligent.
Also, put in guards to make sure that you have GNU Make. This appears
to be essential for sanity reasons alone.
Release LPRng 1Alpha5
Mon Jul 17 10:57:49 PDT 1995 Patrick Powell
********* BSDI *************
Literally hundreds of questionable items were reviewed, fixed
or modified. The 'snprintf' function was renamed to 'plp_snprintf'
in order to avoid conflict with the BSDI/GCC snprintf functions.
Fixed up some questionable uses of snprintf, changed to sprintf.
Discovered an incredibly vulgar behaviour in strncat(), and
fixed up its uses. Strncpy will clobber all information in string;
double checked its uses where possible.
Fri Jul 14 08:22:03 PDT 1995 Patrick Powell
Fixed up configuration file reading. Was always using default
values.
Fri Jul 14 08:23:06 PDT 1995 Patrick Powell
LPD status reporting did not read the printcap 'st' status file.
Now reads the file and reports information using short form or
long form as needed.
|