27.3.1. Překlad ze zdrojů

Po přečtení řady informací jako IPSec v kernelu 2.6 část I a II jsem dospěl k názoru že si l2tpd preventívně přeložím. Použil jsem virtuální server bone jenž mám k tomuto účelu vytvořen. Takže po obnovení čistého serveru jsem upravil zdroje v /etc/apt/sources.list a přidal jsem tam řádky:

deb-src http://localhost:9999/main/ stable main non-free contrib
deb-src http://localhost:9999/main/ sarge main non-free contrib
deb-src http://localhost:9999/main/ sid main non-free contrib

Poté jsem přistoupil k instalování programů:

bone:/usr/src# apt-get install dpkg-dev debhelper gcc libc-dev

A závěrečné stažení zdrojů:

bone:/usr/src# apt-get source -t sarge l2tpd
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 150kB of source archives.
Get:1 http://localhost sid/main l2tpd 0.70-pre20031121-2 (dsc) [589B]
Get:2 http://localhost sid/main l2tpd 0.70-pre20031121-2 (tar) [127kB]
Get:3 http://localhost sid/main l2tpd 0.70-pre20031121-2 (diff) [22.2kB]
Fetched 150kB in 56s (2662B/s)
dpkg-source: extracting l2tpd in l2tpd-0.70-pre20031121

Nyní jsem si v klidu prohlédl zdroje programu l2tpd, prozkoumal závislosti a vůbec se v něm porozhlédl. Takže ze závislostí jsem narazil na

Build-Depends: debhelper (>= 3.0.5)

Poté jsem l2tpd jednoduše přeložil:

bone:/usr/src# apt-get source -t sarge --build l2tpd
bone:/usr/src# cd l2tpd-0.70-pre20031121/
bone:/usr/src# dpkg-buildpackage -b -uc

Poznámka

Ve skutečnosti jsem se pokusil nejdříve stáhnout a přeložit zdroje l2tpd. A podle chybových hlášek doinstlovával potřebné balíčky s programy a knihovnami. Nezapomeňte že virtuální server bone je čistě nainstalovaný s minimem programů.

Protokol o překladu:

bone:/usr/src# apt-get source -t sarge --build l2tpd
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 150kB of source archives.
Get:1 http://localhost sid/main l2tpd 0.70-pre20031121-2 (dsc) [589B]
Get:2 http://localhost sid/main l2tpd 0.70-pre20031121-2 (tar) [127kB]
Get:3 http://localhost sid/main l2tpd 0.70-pre20031121-2 (diff) [22.2kB]
Fetched 150kB in 56s (2661B/s)
Skipping unpack of already unpacked source in l2tpd-0.70-pre20031121
dpkg-buildpackage: source package is l2tpd
dpkg-buildpackage: source version is 0.70-pre20031121-2
dpkg-buildpackage: source maintainer is Jean-Francois Dive <jef@debian.org>
dpkg-buildpackage: host architecture is i386
 debian/rules clean
dh_testdir
dh_testroot
rm -f build-stamp
/usr/bin/make clean
make[1]: Entering directory `/usr/src/l2tpd-0.70-pre20031121'
rm -f l2tpd.o pty.o misc.o control.o avp.o call.o network.o avpsend.o scheduler.o file.o aaa.o md5.o l2tpd
make[1]: Leaving directory `/usr/src/l2tpd-0.70-pre20031121'
dh_clean
 debian/rules build
dh_testdir
/usr/bin/make
make[1]: Entering directory `/usr/src/l2tpd-0.70-pre20031121'
cc -ggdb -Wall -DDEBUG_PPPD -DDEBUG_CONTROL -DDEBUG_ENTROPY -Wall -DSANITY -DLINUX  -DIP_ALLOCATION     -c -o l2t
pd.o l2tpd.c
cc -ggdb -Wall -DDEBUG_PPPD -DDEBUG_CONTROL -DDEBUG_ENTROPY -Wall -DSANITY -DLINUX  -DIP_ALLOCATION     -c -o pty
.o pty.c
cc -ggdb -Wall -DDEBUG_PPPD -DDEBUG_CONTROL -DDEBUG_ENTROPY -Wall -DSANITY -DLINUX  -DIP_ALLOCATION     -c -o mis
c.o misc.c
cc -ggdb -Wall -DDEBUG_PPPD -DDEBUG_CONTROL -DDEBUG_ENTROPY -Wall -DSANITY -DLINUX  -DIP_ALLOCATION     -c -o con
trol.o control.c
control.c: In function `handle_packet':
control.c:1660: warning: unused variable `tv'
cc -ggdb -Wall -DDEBUG_PPPD -DDEBUG_CONTROL -DDEBUG_ENTROPY -Wall -DSANITY -DLINUX  -DIP_ALLOCATION     -c -o avp
.o avp.c
avp.c: In function `validate_gen_avp':
avp.c:303: parse error before `int'
avp.c:306: `i' undeclared (first use in this function)
avp.c:306: (Each undeclared identifier is reported only once
avp.c:306: for each function it appears in.)
avp.c:308: `found' undeclared (first use in this function)
make[1]: *** [avp.o] Error 1
make[1]: Leaving directory `/usr/src/l2tpd-0.70-pre20031121'
make: *** [build-stamp] Error 2
Build command 'cd l2tpd-0.70-pre20031121 && dpkg-buildpackage -b -uc' failed.
E: Child process failed
bone:/usr/src# 

Kritická část souboru avp.c

    300 int validate_gen_avp(int attr,  struct tunnel *t, struct call *c,
    301                                          void *data, int datalen) {
    302         (void)data; (void)datalen;
    303         int i = 0, found = 0;
    304
    305     if(t->sanity) {
    306                 for(i = 0; i < 8; i++) {
    307                         if(c->msgtype == avps[attr].allowed_states[i])
    308                                 found++;
    309                 }
    310                 if(!found)
    311                         return -EINVAL;
    312         }
    313         return 0;
    314 }

Letmým pohledem na kód se domnívám že překladači gcc verze 2.95.4-14 se asi nelíbí konstrukce na řádku 302. Protože se dále nikde oba parametry nepožívají, tak jsem celý řádek zakomentoval. Překlad pak proběhl úspěšně.