Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

adminstorieslesenvonquelltext [20120823 09:58] (aktuell)
Dirk Deimeke angelegt
Zeile 1: Zeile 1:
 +====== Lesen von Quelltext ======
  
 +  * Urspruenglicher Autor: Ramon Kukla
 +  * Urspruengliches Datum: 01.07.2011
 +
 +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.
 +
 +<code c>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;
 +}</​code>​
 +
 +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.
 +
 +<code c>#​ifndef INET6
 +#define DEFAULT_SNAPLEN 68 /* ether + IPv4 + TCP + 14 */
 +#else
 +#define DEFAULT_SNAPLEN 96 /* ether + IPv6 + TCP + 22 */
 +#​endif</​code>​
 +
 +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.
 +
 +<code c>{ 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
 +...</​code>​
 +
 +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.
 +
 +[[adminstoriesartikel|Zurück zur Uebersicht]]