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 l2tpdbone:/usr/src#
cd l2tpd-0.70-pre20031121/bone:/usr/src#
dpkg-buildpackage -b -uc
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ě.