Napisz /usr/local/atalk/bin/getzones
, aby sprawdziæ czy
wszystkie strefy AppleTalk są widziane przez Linux-a. Powinieneś
widzieæ przynajmniej jedną nazwê, która jest twoją strefą lokalną,
w innym przypadku bardzo prawdopodobne jest, że twój serwis
AppleTalk nie działa poprawnie. Ja dostajê coś takiego (tylko kilka
pierwszych linii):
Pingo$ /usr/local/atalk/bin/getzones | more VLSB LSB-Integrative Biology LSB-Biology Library LSB-Herbaria LSB-UCMP LSB-MVZ Vanishing Packets MIP Barker Hall
Przy pomocy opcji dowiesz siê która jest twoją strefą:
Pingo$ /usr/local/atalk/bin/getzones -m VLSB Pingo$
Tak wiêc moją strefą lokalną jest VLSB, kompletną listê wszystkich
lokalnych stref można uzyskaæ przy pomocy opcji -l
(w razie
gdy twoja drukarka nie jest w twojej strefie musisz znaæ dokładną
nazwê strefy).
Jeśli chcesz tylko, aby lokalna drukarka UNIX-owa była dostêpna dla klientów AppleShare, to przeskocz tê sekcjê i idź do sekcji nr 3.
Najpierw musimy siê dowiedzieæ jak są zdefiniowane nazwy Internetowe w
AppleTalk. Jest to bardzo podobne do tego co znasz ze swojego
Linux-a. Nazwy wystêpują w formie: objekt:typ@strefa
. Jeśli
nie zależy ci na nazwie strefy lokalnej to użyj @*
.
Tak wiêc, aby znaleźæ wszystkie objekty w twojej strefie, napisz
/usr/local/atalk/bin/nbplkup
, co wypluje wielką listê, z
elementami jak ten:
Pingo$ /usr/local/atalk/bin/nbplkup |more Sun ValleyUs Macintosh:Macintosh IIsi 12398.245:253 Sun ValleyUs Macintosh:Workstation 12398.245:4 IB Instructional Support: Power Macintosh 12398.196:253 IB Instructional Support:Workstation 12398.196:4 centris 660AV: Macintosh 12398.51:253 centris 660AV:Workstation 12398.51:4 Chapin Lab vx - JoeC:Macintosh IIvx 12398.101:253 Chapin Lab vx - JoeC:Workstation 12398.101:4 Pingo Mac Printer:LaserWriter 12398.164:129 Pingo Default Printer:LaserWriter 12398.164:128 Pingo:AFPServer 12398.164:130 Pingo:netatalk 12398.164:4 Pingo:Workstation 12398.164:4 Lucicutia:AFPServer 12398.123:248 Theobald Chapin, III:LaserWriter 12398.73:191
Jeśli chcesz znaæ tylko objekty konkretnego typu jak LaserWriter,
musisz użyæ /usr/local/atalk/bin/nbplkup
:LaserWriter
. Upewnij siê, że wstawiłeś dwukropek, który
oznacza, że chcesz znaæ tylko objekty typu LaserWriter. Słowo nie
może zawieraæ dużych liter, ale nie możesz ominąæ spacji. Tak wiêc,
żeby zobaczyæ Macintosh IIvx musisz wstawiæ nazwê typu w
cudzysłowia:
Pingo$ /usr/local/atalk/bin/nbplkup :"Macintosh IIvx" Chapin Lab vx - JoeC:Macintosh IIvx 12398.101:253 Pingo$
Dobra. Krótko: Chcê móc drukowaæ z mojego Linux-a na LaserWriter o nazwie Theobald Chapin, III. Zanim spróbujesz ustawiæ printcap dla kolejki tej drukarki, upewnij siê czy masz dostêp do tej drukarki.
Napisz /usr/local/atalk/bin/papstatus -p "Theobald Chapin,
III"
(zauważ, że cudzysłowia służą tylko temu, aby
poinformowaæ twoją powłokê, iż Theobald Chaplin, III to jeden
argument a nie trzy) i powinieneś otrzymaæ coś takiego:
status: idle
Jeśli nie, to sprawdź czy AppleTalk rzeczywiście działa (może demon
nie jest uruchomiony ? Sprawdź tak: ps -xa | grep atalkd
i
ps -xa | grep afpd
).
Ponieważ LaserWriter spodziewa siê PostScriptu, powinieneś mieæ pod rêką krótki plik testowy w PostScripcie. Nazwa mojego pliku to: test.eps i mogê go wysłaæ bezpośrednio do Theobald Chaplin, III uruchamiając klienta drukowania AppleShare:
/usr/local/atalk/bin/pap -p "Theobald Chapin, III":LaserWriter@VLSB test.eps
Zauważ, że dołaczyłem nazwê strefy tylko po to, żeby siê upewniæ, że wszystko działa dobrze. Jeśli twoje zadanie drukowania siê pojawi (co sekundê - czy jakoś tak - otrzymasz komunikat jeśli ktoś inny używa drukarki w tym samym momencie. Obserwuj odpowiedź twojej drukarki i co robi kiedy zacznie drukowaæ twój plik).
Jeśli bêdziesz miał jakieś kłopoty, użyj aecho, aby sprawdziæ objekty AppleTalk w ten sam sposób jakbyś używał ping-a przez TCP/IP (Ctrl-C zatrzymuje aecho):
/usr/local/atalk/bin/aecho "Theobald Chapin, III":LaserWriter@VLSB 14 bytes from 12398.73: aep_seq=0. time=15. ms 14 bytes from 12398.73: aep_seq=1. time=14. ms 14 bytes from 12398.73: aep_seq=2. time=14. ms 14 bytes from 12398.73: aep_seq=3. time=14. ms ----12398.73 AEP Statistics---- 5 packets sent, 4 packets received, 20% packet loss round-trip (ms) min/avg/max = 14/14/15 Pingo$
Powinieneś straciæ tylko ostatni pakiet przy przerwaniu Ctrl-C, w innym wypadku coś jest nie talk z twoim połączeniem.
Bêdą dwa kroki. Najpierw upewnisz siê, że możesz drukowaæ na Linux-ie potem upewnisz siê, że ta drukarka jest dostêpna dla klientów AppleShare.
Mówiąc jaśniej: najpierw ustawisz swoją drukarkê, żeby była
dostêpna dla UNIX-a (lpd
- demona drukowania) (sekcja 3.1 do
3.2), a potem udostêpnisz ją innym użytkownikom w strefie AppleTalk
(sekcja 3.3) co jest oczywiście opcjonalne.
Wielu ludzi nie lubi ustawiania z dwóch powodów:
(1) Jeśli
drukarka AppleTalk jest już dostepna w strefie AppleTalk, to
użytkownicy Mac-ów mogą siê do niej bezpośrednio dołączyæ. Wiêc nie
ma potrzeby istnienia kolejki na Linux-ie. Jednak ja jestem
użytkownikiem Linux-a i chcê mieæ dostêp do tej drukarki i dlatego
mój poniższy opis robi dokładnie to: pozwala użytkownikowi Linux-a na
drukowanie na drukarce AplleTalk.
(2) Jeśli twoja drukarka
jest drukarką lokalną podłączoną do równoległego portu Linux-a
(np. /dev/lp1
), to jest kilka zmian w pliku
/etc/printcap
. Ja pokażê przykład ustawienia z drukarką
lokalną, którego nie testowałem, ale dostałem od innego
użytkownika. Przeczytaj
sekcjê 3.4 na ten
temat i sprawdź szczegółowe informacje na temat
używania Ghostscript-u razem z Netatalk napisane przez
Mike'a Pearsona i Billa McGonigle'a.
Jeśli twoja drukarka może już drukowaæ przy pomocy polecenia
Pingo$ lpr -P lp test.eps
to możesz przeskoczyæ ten pierwszy krok.
W innym przypadku stañ siê "root-em" i idź do katalogu /etc, żeby wyedytowaæ plik printcap. Szczegóły znajdziesz na stronie podrêcznika systemowego "man". Ja opiszê tylko jak ustawiæ LaseWriter, tak żeby działał z poleceniem lpr z Linux-a.
Dodaj pozycjê dla swojej drukarki do pliku printcap. Ja mam zdefiniowaną tylko LaserWriter i mój plik wygląda tak:
lp|Pingo LaserWriter|Theobald Chapin, III:\ :sd=/usr/spool/theobald:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/usr/adm/lpd-errs:\ :if=/usr/local/bin/myif:\ :of=/usr/local/atalk/etc/ofpap:
Pierwsza linia definiuje trzy logiczne nazwy, które nie muszą mieæ żadnego podobieñstwa do nazw, jakie chcesz nadaæ tej drukarce w kliencie AppleShare. Dlatego nazwałem ją lp, ponieważ jest to nazwa stosowana w wiêkszości UNIX-ów. Inne nazwy stosujê tylko po to, żeby wiedzieæ co to właściwie za drukarka.
Potem musisz mieæ katalog zadañ, gdzie demon bêdzie składował
zadania. Ja nazwałem swój katalog zadañ
/usr/spool/theobald
w tej samej hierarchii co katalog
poczty.
Pingo$ ls -l drwxrwxr-x 2 root mail 1024 Feb 8 08:46 mail drwxr-xr-x 2 root mail 2048 Feb 8 17:23 mqueue drwxrwxr-x 5 news news 1024 Sep 1 1994 news drwxrwxr-x 2 root lp 1024 Feb 9 13:15 theobald
Stwórz go używając mkdir a potem ustaw właściciela (root), grupê (lp)
Pingo$ chown root.lp theobald
i prawa dostêpu
Pingo$ chmod 775 theobald
Potem stworzyłem dwa pliki: lock i status w tym katalogu:
Pingo$ cd theobald Pingo$ touch lock; chown root.root lock; chmod 004 lock Pingo$ touch status; chown root.root status; chmod 664 status
teraz możesz zdefiniowaæ ten katalog jako katalog zadañ jak ja to zrobiłem w linii 2.
Jeśli twoja drukarka jest lokalną drukarką dołączoną do urządzenia
takiego jak/dev/lp1
, to to jest urządzenie, którego
potrzebujesz. Użyjesz mknod, aby utworzyæ to urządzenie jeśli go
jeszcze nie ma. Dla drukarki w AppleTalk nie chcesz właściwie
drukowaæ do żadnego urządzenia, ale wysłaæ zadanie do tej drukarki
używając programu pap z katalogu
/usr/local/atalk/bin
. Zrobi siê to przy pomocy filtra psf,
który uruchomi program pap, aby mieæ dostêp do drukarki. Dlatego,
po tym jak zadanie zostało wysłane do LaserWriter, jest ono ciągle
w Linux-ie, ponieważ demon drukowania lpd ma na samym koñcu wysłaæ
to zadania na urządzenie. Dlatego zdefiniujemy urządzenie
/dev/null
jako urządzenie drukarki, które wyśle twoje
zadanie w próżniê (bo chcesz mieæ tylko to co siê pojawiło na
drukarce AppleTalk, prawda?). Dlatego w trzeciej linii wpiszemy
:lp=/dev/null:\
. Przeczytaj stronê podrêcznika systemowego
na temat psf, jeśli masz wiêcej niż jedną drukarkê AppleTalk i
jeśli masz problemy z używaniem urządzenia /dev/null
jako
urządzenia drukarki.
Użyj pól pl i pw dla określenia długości strony (linie) i szerokości (znaki). Polem mx możesz zdefiniowaæ maksymalny rozmiar pliku drukowanego. Jeśli plik jest wiêkszy, demon drukarki obetnie go, albo odmówi drukowania. Jeśli ustawisz tê wartośæ na 0 (mx#0), oznacza to, iż można drukowaæ pliki o nieograniczonych rozmiarach. Uważaj, bo przypadkowo papier może siê skoñczyæ jeśli nikt siê nie bêdzie o to troszczyæ. A twoja głodna drukarka bêdzie wołaæ o papier ! Tak wiêc radzê nie ustawiaæ pola mx na 0 jeśli skoñczyłeś już testowaæ i wszystko jest w porządku.
Polem sh możemy zabroniæ drukowania strony początkowej (z identyfikatorem właściciela itp.)
Polem sf możemy zabroniæ drukowania feed forms.
Ja zdefiniowałem do tego celu plik
/usr/adm/lpd-errs
. Bêdziesz musiał stworzyæ ten plik samemu
(np. poleceniem touch /usr/adm/lpd-errs
)
To jest ważne ! Jak już to opisałem, twoje zadanie zostanie
wysłane do drukarki AppleTalk tylko jeśli zainstalujesz odpowiedni
filtr, który uruchomi program, pap
. Pakiet netatalk używa
konceptu hackerskiego, używając filtru psf
, ale z różnymi
dołączeniami do niego. psf
analizuje nazwê tego dołączenia,
aby dowiedzieæ siê, czy ma uruchomiæ pap jeśli podłañcuch jest w
nazwie dołączenia, i odwróciæ kolejnośæ drukowania jeśli w nazwie
jest rev. Spójrz na to wydając polecenie:
Pingo$ ls -l /usr/local/atalk/etc lrwxrwxrwx 1 root root 3 Feb 8 14:44 ifpap -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 ifpaprev -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 ofpap -> psf -rwxr-xr-x 1 root root 49299 Feb 8 14:44 papd -rw-r--r-- 1 root root 35 Feb 9 13:48 papd.conf -rwxr-xr-x 1 root root 11395 Feb 8 14:44 psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 tfpap -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 tfpaprev -> psf Pingo$
Tak wiêc filtr o nazwie ifpap
uruchomi pap, ifpaprev
odwróci kolejnośæ stron i uruchomi pap
. Zamienia on zwykły
tekst na PostScript, tak żebyś nie skoñczył na komunikacie z
błêdem.
Jedyny filtr jaki musisz zainstalowaæ to of:
:of=/usr/local/atalk/etc/ofpap:
gdzie /usr/local/bin/myif
jest prostym skryptem powłoki,
który pozwala mi na przerywanie linii w tekście, które zostały
zapisane programem, który automatycznie łamie linie
(bp. textedit). Niestety filtr psf
nie robi nic takiego i
ignoruje ustawienia szerokości papieru. Ja napisałem swój własny
filtr
linebreak.c, który robi to dla mnie i umieśæ nastêpujące
linie w "myif":
#!/bin/sh /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $*
Jeśli w ten sposób ustawisz filtr tekstowy, to linbreak bêdzie
uważał tylko na szerokośæ strony (ustawioną pw
), podczas gdy
ifpap
(psf
) sprawdza tylko długośæ. Wygląda na to, że
psf
zakłada, że pierwsza linia to 0, tak wiêc ustaw
pl#63
jeśli chcesz mieæ 64 linii na stronie.
Jeśli nie chcesz łamania linii, to po prostu umieśæ liniê:
:if=/usr/local/atalk/etc/ifpap:\
Teraz zapisz swój nowy printcap. Jeśli spróbujesz teraz coś wydrukowaæ, dowiesz siê, że jeszcze nie działa, wiêc czytaj nastêpny paragraf.
Jak wspomniałem wcześniej, UNIX-owa nazwa drukarki w printcapie nie
ma odpowiednika dla nazwy drukarki w AppleTalk. Musisz stworzyæ
plik .paprc
w swoim katalogu zadañ, który bêdzie zawierał
adres drukarki w AppleTalk. Jest to tylko jedna linia. Zauważ, że
nie musiałem umieszczaæ nazwy drukarki w cudzysłowia w tym pliku,
ale inni piszą mi, że u nich to działało tylko z cydzysłowami. To
spróbuj najpierw bez cydzysłowów:
Pingo$ cat /usr/spool/theobald/.paprc Theobald Chapin, III:LaserWriter@VLSB
To teraz możesz zaczynaæ.
Jeśli dostaniesz komunikat o błêdzie jak
np. "Turing:LaserWriter@Tech Support": NBP
wtedy spróbuj z
cudzysłowami. Może byæ też tak, że musisz wstawiæ tylko nazwe przed
dwukropkiem w cudzysłowa, tak: "Theobald Chapin,
III":LaserWriter@VLSB
. Jeśli masz jeszcze jakieś problemy, to myśl
i kombinuj ;) NIe znam żadnego uniwersalnego sposobu na rozwiązanie
tego problemu.
Wiêcej na temat hackowania i różnych obejśæ z filtrami znajdziesz w sekcji Znane problemy.
Najpierw sprawdź czy demon drukarki jest rzeczywiście uruchomiony:
Pingo$ ps -xa | grep lpd 45 ? SW 0:00 (lpd) 346 pp0 D 0:00 grep lpd Pingo$
Spróbuj wydrukowaæ plik w PostScripcie i plik tekstowy, żeby siê
przekonaæ, że wszystko działa. Przypuszczalnie musisz zrestartowaæ
demona poleceniem lpc
. Uruchom lpc i napisz restart lp
,
down lp
i up lp
. Potem sprawdź status:
lpc> status lp: queuing is enabled printing is enabled no entries no daemon present lpc> lpc> quit
Teraz wydrukuj swój plik poleceniem
Pingo$ lpr -P lp filename
Jeśli wszystko jest w porządku, to plik status w katalogu zadañ powienien teraz zawieraæ najświeższe informacje na temat twojej drukarki:
Pingo$ cat /usr/spool/theobald/status job: Paul; status: busy; source: LocalTalk Pingo$
Jeśli teraz pójdziesz do Mac-a i spróbujesz wybrac swoją nową
drukarkê dowiesz siê, że pokaże siê ona z nazwą twojego serwera
Linux-owego. To może nie byæ zbyt zadowalające, dlatego musisz
stworzyæ, albo wyedytowaæ plik papd.conf w katalogu etc AppleTalk,
/usr/local/atalk/etc/papd.conf
(przeczytaj "man papd"
jeśli chcesz znaæ wiêcej szczegółów). Minimum tego co musisz zrobiæ
to umieszczenie w tym pliku nazwy jaką chcesz nadaæ drukarce, a na
koñcu dopisz :\
tak jak w printcap-ie. W drugiej linii
podajesz nazwê jaką ta drukarka ma w Linux-ie opcją pr. Mój plik
wygląda tak:
Pingo$ cat /usr/local/atalk/etc/papd.conf Pingo Mac LaserWriter:\ :pr=lp: Pingo$
Oznacza to, że (domyślna) zmienna lp zawiera nazwê: Pingo Mac LaserWriter dla klienta AppleShare. Dowiesz siê również, że teraz użytkownik na Mac-u może drukowaæ bezpośrednio na drukarce Theobald Chaplin III jak i poprzez Linux-a, gdzie nazwa drukarki to Pingo Mac LaserWriter. Dla mnie jest ważne, aby móc drukowaæ bezpośrenio na tej drukarce, a podczas pracy na Mac-u drukowanie poprzez Linux-a wydaje siê o wiele szybsze, ponieważ Linux zkolejkuje zadanie i zniknie ono natychmiast z mojego desktopu.
Jeśli chcesz zarejestrowaæ swoją drukarkê w jakiejś strefie
AppleTalk (nie w domyślnej strefie), po prostu podajesz tê strefê
wraz z rozszerzeniem @nazwa_strefy
w pliku papd.conf
:
MotorsLab@EEAP:\ :pr=ee3rd:
Ta sekcja nie jest jeszcze całkiem gotowa !!!
/etc/princap: lp:lp=/dev/lp1:sd=/usr/spool/lp1:sh /usr/local/atalk/etc/papd.conf: HP LJIIIp:\ :pr=lp:\ :pd=/usr/local/atalk/etc/HP_LaserJet_IIIP.ppd:
Sprawdź szczegóły na stronie Używanie ghostscript-a wraz z Netatalk.
Jeśli masz jakieś problemy podczas drukowania, nawet jeśli działało
kiedy wszystko ustawiałeś tak jak opisałem, to spójrz do
/usr/adm/mesaages
(albo do /usr/log/messages
albo
/var/log/messages
- przyp. tłum.) oraz do
/usr/adm/syslog
(patrz poprzednia uwaga). Jeśli tylko
spróbujesz coś wydrukowaæ używając filtru psf
, to znajdziesz
podobne linie w wymienionych wyżej plikach:
Feb 12 17:47:52 Pingo ofpap[1443]: starting for ? Feb 12 17:47:52 Pingo ofpap[1443]: sending to pap[1444] Feb 12 17:47:52 Pingo ofpap[1443]: straight text Feb 12 17:47:59 Pingo ofpap[1443]: 1444 done Feb 12 17:47:59 Pingo ofpap[1443]: pausing Feb 12 17:48:01 Pingo ifpap[1447]: starting for ? Feb 12 17:48:01 Pingo ifpap[1447]: sending to pap[1448] Feb 12 17:48:01 Pingo ifpap[1447]: straight text Feb 12 17:48:09 Pingo ifpap[1447]: 1448 done Feb 12 17:48:09 Pingo ofpap[1443]: restarting Feb 12 17:48:09 Pingo ifpap[1447]: done Feb 12 17:48:09 Pingo ofpap[1443]: done Feb 12 18:00:46 Pingo ofpap[1481]: starting for ? Feb 12 18:00:46 Pingo ofpap[1481]: sending to pap[1482] Feb 12 18:00:46 Pingo ofpap[1481]: straight text Feb 12 18:00:51 Pingo ofpap[1481]: 1482 done Feb 12 18:00:51 Pingo ofpap[1481]: pausing Feb 12 18:00:52 Pingo ifpap[1485]: starting for ? Feb 12 18:00:52 Pingo ifpap[1485]: sending to pap[1486] Feb 12 18:00:52 Pingo ifpap[1485]: straight text Feb 12 18:00:57 Pingo ifpap[1485]: 1486 done Feb 12 18:00:57 Pingo ofpap[1481]: restarting Feb 12 18:00:57 Pingo ofpap[1481]: done Feb 12 18:00:57 Pingo ifpap[1485]: done
Jeśli coś nie działa, otrzymasz komunikat w
/usr/adm/syslog
jak ten:
Feb 12 10:04:59 Pingo papd[70]: No such printer: "lp" Feb 12 10:04:59 Pingo papd[70]: printcap problem: "lp"
(twoja domyślna zmienna lp nie jest zdefiniowana)
Feb 12 17:02:21 Pingo ofpap[1149]: 1150 died with 1 Feb 12 17:02:21 Pingo lpd[1148]: lp: output filter died (1) Feb 12 17:02:26 Pingo lpd[1148]: lp: Daemon filter 'f' terminated (11) Feb 12 17:04:48 Pingo lpd[1195]: lp: Daemon filter 'f' terminated (11) Feb 12 17:08:03 Pingo lpd[1216]: lp: Daemon filter 'f' terminated (11) Feb 12 17:10:00 Pingo lpd[1228]: cannot execv /usr/local/bin/linebreak|/usr/local/atalk/ifpap Feb 12 17:11:51 Pingo lpd[1244]: /usr/adm/lpd-errs: No such file or directory
(/etc/printcap
nie akceptuje strumieni w definicji
if
; oto dlaczego używałem skryptu
/usr/local/bin/myif
. Zapomniałem także stworzyæ pliku
/usr/adm/lpd-errs
, który zdefiniowałem w
/etc/printcap
)
Najpierw przeczytaj sekcjê o
Znanych problemach. Jeśli nie bêdzie tam nic pomocnego dla ciebie, to
wyślij do mnie list i dołącz do niego pliki /etc/printcap
oraz /usr/local/atalk/etc/papd.conf
.
nbplkup pokazuje nazwê drukarki i jej adres, ale ja nie dostajê żadnej odpowiedzi z programu papstatus od tej drukarki.
Dostajê dużo listów od ludzi, którzy mają problemy, wiêc umieszczê tutaj rozwiązania dla wszystkich. Bêdzie to rosnąca, nieposortowana lista. Po prostu sprawdź czy twój problem jest tu opisany.
Sprawdź czy nie masz w pliku /usr/adm/lpd-errs
czegoś
takiego:
unprintable character (0x9a)!
Jest to problem dotyczący psf, filtru użytego do drukowania. Zlokalizuj plik psf.c w swojej dystrybucji netatalk i uczyñ go zapisywalnym
chmod 644 psf.c
Zlokalizuj drugą liniê, w której jest łañcuch unprintable
character
. Pierwsze wystapienie (z dwóch) powino byæ w linii 402 a
drugie - w 496 lub podobnie. Druga linia to jest przypuszczalnie
ta, która ci sprawia kłopoty. Zamieñ
if ( !isascii( *p ) || !isprint( *p )) { if ( !literal ) { fprintf( stderr, "unprintable character (0x%x)!\n", (unsigned char)*p ); return( 2 ); /* Toss job */ } printf( "\\%o", (unsigned)*p );
na
if ( !isascii( *p ) || !isprint( *p )) { if ( !literal ) { fprintf( stderr, "unprintable character (0x%x) converted to ?!\n", (unsigned char)*p ); /* return( 2 );*/ /* Toss job */ putchar( '?' ); /* Don't toss job! */ } else{ printf( "\\%o", (unsigned)*p ); }
Teraz napisz "make" w wierszu poleceñ w katalogu netatalk (nie w
tym, w którym jest psf.c, bo make nie bêdzie w tym przypadku znało
ścieżki do pap !). Potem skopiuj nowe psf do odpowiedniego katalogu
(/usr/local/atalk/etc
).
To co siê dzieje to: program zamienia niedrukowalny znak na znak "?" i nie przerywa pracy. Może ktoś ma lepszy pomysł na to jak przekonwertowaæ niedrukowalny znak na jego odpowiednik w PostScripcie ?
Ale jeśli to bêdziesz robił, to uważaj na prawa autorskie w psf !
Jak właśnie wyżej wspomniałem, psf nie obsługuje rozszerzonych
zbiorów znaków. Ale nenscript
to potrafi. Ale ponieważ nie
jest to filtr, który mógłby zostaæ użyty bezpośrednio w
printcap-ie, bêdziesz musiał to obejśæ. Ja mam zdefiniowaną
dodatkową drukarkê, która obsługuje zwykły tekst używając
nenscriptu.
/etc/printcap
wygląda tak:
# # Apple LaserPrinter Select 360 on AppleTalk: # lp|Pingo LaserWriter|Theobald Chapin, III:\ :sd=/usr/spool/theobald:\ :lp=/dev/null:\ :pl#61:\ :pw#80:\ :mx#0:\ :sh:\ :sf:\ :lf=/var/adm/lpd-errs:\ :if=/usr/local/bin/myif:\ :of=/usr/local/atalk/etc/ofpap: # # Special setup for plain text files, to convert to PostScript using nenscript # instead of psf (which doesn't process the whole ISO characterset) # text:\ :sd=/usr/spool/textprinter:\ :lp=/dev/null:\ :mx#0:\ :sh:\ :sf:\ :lf=/var/adm/lpd-errs:\ :of=/usr/local/bin/textfilter:
/usr/local/bin/textfilter
jest skryptem w powłoce:
#!/bin/sh /usr/bin/nenscript -P lp -2 -r -T US -i "Werner Eugster"
Niestety nie znalazłem sposobu na zachowanie nazwy pliku do
drukowania i dlatego używam opcji -i
z moim nazwiskiem, żeby
oznaczyæ wydruk. Może znajdziesz jakiś lepszy sposób używając
np. Unix-owej zmiennej środowiskowej z loginem.
W tym ustawieniu otrzymujê tekst na papierze w układzie poziomym
(opcja -r
) w dwóch kolumnach (-2
) wysłany na standardową
drukarkê lp
. Aby wydrukowaæ zwykły plik tekstowy używam
polecenia
lpr -P text plain.txt
Tak wiêc przede wszystkim, drukarka zdefiniowana jako text
zamienia zwykły tekstowy plik na PostScript używając nenscript
(który obsługuje pełen zestaw znaków ISO), ktory przekazuje go
dalej do drukarki zdefiniowanej jako lp
. Przez to, używając
polecenia lpq
zobaczysz, że zadanie drukowania pojawi siê przy
drukarce lp
i przychodzącego ze standardowego wejścia, co jest
poprawne.
Jeśli ktoś zna jakiś sposób, żeby umieściæ na wydruku nazwê pliku, to bêdê bardzo wdziêczny za tê informacjê !
To był mój błąd. Sprawdź czêśæ powyżej, gdzie opisujê
myif
. Musisz dodaæ $* dwa razy w drugiej linii w pliku, która
teraz wygląda tak:
#!/bin/sh /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $*
Jest wiele takich problemów. Jeden, o którym dowiedziałem siê od Paolo Supino to ten:
"Podczas krótkiej inspekcji wydruku z nbplkup (żeby zobaczyæ czy
są tak jakieś dziwne rzeczy), zobaczyłem, że nasza drukarka na
sieci ma ten sam numer co serwer NT (który kolejkuje zadania z
PC-tów). To było źle.
1. Serwer NT jest bardzo złym spoolerem.
2. Powinien on kolejkowaæ tylko maszyny Windows-owe.
3. Pomimo tego, iż nie miał on przechwytywaæ wszystkiego co przez
niego przeszło - on to robił.
Rozwiązanie: Wyłączyæ zupełnie serwer drukowania dla Mac-ów na
NT. Wyedytowaæ plik .paprc
w katalogu zadañ tak,
żeby wskazywał on bezpośrednio na drukarkê. Zrestartowaæ komputer,
żeby mu siê pamiêc odświeżyła.
Domyślnie wszystko jest drukowane na papierze ze standardowego zasobnika. Jeśli chcesz tak ustawiæ drukarkê, aby brała papier z innego zasobnika niż ze standardowego, to spróbuj tego:
Zmodyfikuj swój plik /usr/local/bin/myif
i przepuśæ
wszystko przez program awk, czy jakiś inny, który potrafi zapisaæ
dodatkową liniê do strumienia po nagłówku.
Np. Ja spróbowałem tak:
#!/bin/sh /usr/local/bin/linebreak $* | awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $*
(upewnij siê, że nie ma fizycznych łamañ linii w linii
drugiej).
A informuje to drukarkê o tym, że ma wziąæ
papier z podajnika rêcznego. Dla innych podajników zamieñ tekst w
cuszysłowach ("statusdict begin /manualfeed true store
end\n"
) na odpowiednie polecenie z tej listy:
Podajnik | Polecenie PostScriptu ------------------+--------------------------------------------------- przedni | "statusdict begin 0 setpapertray end" | tylny | "statusdict begin 1 setpapertray end" | automatyczny | "statusdict begin /manualfeed true store end"
Polecenia PostScriptu do zdefiniowania wyjściowych "szufladek":
Szufladka | Polecenie PostScriptu ------------------+--------------------------------------------------- górna | "0 statusdict /setoutputtray get exec" | dolna | "1 statusdict /setoutputtray get exec"
Oczywiście jeśli chcesz zdefiniowaæ podajnik wejściowy i szufladkê wyjściową, to musisz wstawiæ dwie linie do pliku PostScriptowego.
Chociaż to działa dla wejścia, które już jest PostScriptem. Jeśli
chcesz to osiągnąæ dla tekstu, który jest dopiero zamieniany na
PostScript, to musisz zmodyfikowaæ plik psf.c
i skompilowaæ
nowy filtr psf
. (nie zapomnij zainstalowaæ go w katalogu
/usr/local/atalk/etc
!). Wszystko co musisz zrobiæ, to
znaleźæ liniê %%!PS-Adobe-2.0
(ok. linii 379, musi to byæ
funkcja textps()
. Dodaj nową liniê:
printf( "statusdict begin /manualfeed true store end\n" );
(i znowu - możesz zamieniæ tekst w cudzysłowach na ten, który ci
odpowiada). Potem skompiluj ponownie psf
i zainstaluj go.
Davis Goodman skoñczył na takim skrypcie myif
,
który sprawdza czy chcesz drukowaæ w rozmiarach
listowych czy normalnych. Jeśli jest to normalny, to
wykonywane jest polecenie PostScriptu powodujące wybór tylnego
podajnika, w innym przypadku papier pobierany jest z podajnika
standardowego.
#!/bin/sh bounding=`grep BoundingBox $8 | cut -d" " -f5 ` if [ "$bounding" = "" ]; then /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin 1 setpapertray end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $* else /usr/local/atalk/etc/ifpap $* fi
To działa z Netscape a twoje własne oprogramowanie może przyjmowaæ inne wartości. Załączyłem ten przykład tylko po to, żeby ci wskazaæ, gdzie należy zacząæ jeśli chcesz robiæ podobne sztuczki.
Jeszcze jeden przykład jest od Tomasa Pospiska, który zdefiniował
nazwy drukarek dla różnych podajników w tej samej drukarce w
/etc/printcap
. Żeby wydrukowaæ na papierze z konkretnego
podajnika wysyłasz zadanie na odpowiednią drukarkê. Jego printcap
wygląda tak:
# LaserWriter Pro 630 (Default Tray) lp:\ :sd=/usr/spool/lp1:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/var/log/lp-errs:\ :if=/usr/lib/atalk/filters/myif:\ :of=/usr/lib/atalk/filters/ofpap: # # LaserWriter Pro 630 (Manual Tray) lpm:\ :sd=/usr/spool/lpm:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/var/log/lp-errs:\ :if=/usr/lib/atalk/filters/myif_manual:\ :of=/usr/lib/atalk/filters/ofpap:
a filtr myif
wygląda tak:
#!/bin/sh /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/lib/atalk/filters/ifpap $*
Jak dotąd dostałem konstruktywne komentarze i pytania od ludzi z
COM domena 11 EDU (USA) 12 US domena (USA) 1 GOV domena USA 2 NET domena 1 Australia 1 Austria 2 Belgia 1 Francja 2 Niemcy 5 Islandia 1 Włochy 3 Japonia 1 Holandia 1 Portugalia 2 Wileka Brytania 1 Szwajcaria 1
© 13 Marca 1997 Werner Eugster ( eugster@giub.unibe.ch)
Tłumaczenie to jest chronione prawami autorskimi © Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny.
Jeśli znalazłeś jakieś rażące błêdy ortograficzne, gramatyczne, składniowe, techniczne to pisz do mnie:
Oficjalną stroną tłumaczeñ HOWTO jest http://www.jtz.org.pl/
Aktualne wersje przetłumaczonych dokumentów znajdują siê na
tejże stronie. Dostêpne są także poprzez anonimowe ftp pod adresem
ftp.ippt.gov.pl w katalogu /pub/Linux/JTZ/
.
Przetłumaczone przeze mnie dokumenty znajdują siê także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej.
Kontakt z naszą grupą, grupą tłumaczy możesz uzyskaæ poprzez listê
dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisaæ, to
wyślij list o treści subscribe jtz Imiê Nazwisko
na adres
listproc@ippt.gov.pl