File: CHANGES

package info (click to toggle)
lprng 3.8.B-5
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 4,712 kB
  • sloc: ansic: 35,069; sh: 3,040; perl: 1,896; makefile: 381
file content (6980 lines) | stat: -rw-r--r-- 327,658 bytes parent folder | download | duplicates (6)
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.