Lesen von Quelltext

Heute mal was ohne grosse Scripte. Eine Sache, die meiner Meinung nach auf fuer einen „normalen“ Administrator hilfreich ist, ist die Faehigkeit Code zu lesen und zu verstehen.

Vor einigen Wochen hatte ich mich gefragt, wie snaplen fuer tcpdump eingestellt ist. Snaplen ist der Wert, der definiert wieviel Bytes an Daten je Packet mitgeschnitten werden. Ich hatte im Kopf, dass der Standard-Wert hier bei 68 Bytes stand. Allerdings war dann waerhend des Mitschnitts capture size 96 bytes zu lesen. Das Widersprach zum einem dem was ich noch im Kopf hatte und zusaetzlich auch den Angaben in der man-Page. Was also macht man? Man liest den Quellcode.

Ich habe den Effekt in der Version 4.0.0 von tcpdump gehabt und habe mir daher den Quellcode von http://www.tcpdump.org/release/tcpdump-4.0.0.tar.gz runter geladen. Ein ersten Blick habe ich in tcpdump.c geworfen. Dort ist unter anderem auch der Teil zu sehen (ab Zeile 743), wo snaplen ueber den Parameter „-s“ gesetzt werden kann.

case 's': {
char *end;
snaplen = strtol(optarg, &end, 0);
if (optarg == end  || *end != '\0'
|| snaplen < 0 || snaplen > 65535)
error("invalid snaplen %s", optarg);
else if (snaplen == 0)
snaplen = 65535;
break;
}

Vorab ist, in Zeile 517, aber auch zu sehen, dass es auch einen Defaultwert zu geben scheint. DEFAULT_SNAPLEN wiederum wird in der Datei interface.h definiert.

#ifndef INET6
#define DEFAULT_SNAPLEN 68	/* ether + IPv4 + TCP + 14 */
#else
#define DEFAULT_SNAPLEN 96	/* ether + IPv6 + TCP + 22 */
#endif

Wenn also INET6 gesetzt ist, dann wird als Defaultwert fuer Snaplen 96 Bytes definiert. Und INET6 kann im Rahmen des Kompiliervorganges ueber den Schalter –enable-ipv6 gesetzt werden. Siehe hierzu auch die Datei configure ab Zeile 4644.

{ echo "$as_me:$LINENO: checking whether to enable ipv6" >&5
echo $ECHO_N "checking whether to enable ipv6... $ECHO_C" >&6; }
# Check whether --enable-ipv6 was given.
if test "${enable_ipv6+set}" = set; then
enableval=$enable_ipv6;  case "$enableval" in
yes)   { echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6; }
LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c \
print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC"
cat >>confdefs.h <<\_ACEOF
#define INET6 1
...

Offensichtlich wurde tcpdump in der von mir verwendeten Umgebung also gleich mit –enable-ipv6 kompliliert, weshalb 96 Bytes, statt wie von mir erwartet 68 Bytes, mitgeschnitten wurden.

Das hier ist nur ein Beispiel, warum das Lesen von Code hilfreich und auch sinnvoll sein kann. Das Beispiel ist vermutlich nicht das Beste. Aber ich habe schon oefter Probleme loesen oder Funktionen verstehen koennen (wie funktioniert das beispielsweise mit der wpad.dat im Firefox?), nachdem ich den Code der Anwendung, wenn verfuegbar, gelesen hatte. Wichtig zu wissen ist auch, dass ich tatsaechlich meine „Code lesen“, nicht „Code schreiben“. Obwohl es oft auch hilft wenn man in der Lage ist eigenen Code zu schreibe, so ist es fuer die Fehlersuche oft ausreichend den Code nur lesen und verstehen zu koennen. Es gibt auch viele, die koennen Englisch verstehen oder lesen, tun sich aber schwer eigene Saetze zu formulieren.

Und ein weiterer Grund, manchmal Code zu lesen ist, dass es Spass macht.

Zurück zur Uebersicht