Wireshark-dev: [Wireshark-dev] Patches for gsm-packet_sms dissector
From: Willem Dekker <wd-it@xxxxxxxxx>
Date: Sun, 2 Jul 2006 23:06:51 +0200
Dear wireshark developers, After running same test trace files I noticed a lot of non-utf8 error messages from wireshark. The attached patch fixes this and converts the sms content (7 bit encoded, gms 03.38 alphabet) into utf8. The only difficutily I had is how to handle the platforms without a glib 2 library (windows? / older unix versions). I made some code for this, but have not tested this. Attached are is a patch to packet-gsm_sms.c (unified diff to the latest wireshark source tar files). If desired I can send a trace file exhibiting the problem. Regards, Willem Dekker
--- packet-gsm_sms.c.org 2006-07-01 13:07:24.000000000 +0200 +++ packet-gsm_sms.c 2006-07-01 16:42:56.000000000 +0200 @@ -53,6 +53,10 @@ #include "epan/packet.h" #include <epan/prefs.h> +#if GLIB_MAJOR_VERSION >= 2 +#include <glib.h> +#endif + #include "packet-gsm_sms.h" @@ -223,6 +227,7 @@ guint32 numdigocts; guint32 length; guint32 i, j; + char addrbuf[20]; offset = *offset_p; @@ -314,9 +319,9 @@ switch ((oct & 0x70) >> 4) { case 0x05: /* "Alphanumeric (coded according to 3GPP TS 23.038 GSM 7-bit default alphabet)" */ - i = gsm_sms_char_7bit_unpack(0, numdigocts, sizeof(bigbuf), tvb_get_ptr(tvb, offset, numdigocts), bigbuf); - bigbuf[i] = '\0'; - gsm_sms_char_ascii_decode(bigbuf, bigbuf, i); + i = gsm_sms_char_7bit_unpack(0, numdigocts, sizeof(addrbuf), tvb_get_ptr(tvb, offset, numdigocts), addrbuf); + addrbuf[i] = '\0'; + gsm_sms_char_ascii_decode(bigbuf, addrbuf, i); break; default: for (i = 0; i < numdigocts; i++) @@ -1444,18 +1449,28 @@ #define GN_CHAR_ALPHABET_SIZE 128 #define GN_CHAR_ESCAPE 0x1b +#if GLIB_MAJOR_VERSION < 2 +typedef unsigned int gunichar; + +int g_unichar_to_utf8(gunichar c, char * outbuf) { + *outbuf = (unsigned char) c; + return 1; +} + +#endif -static unsigned char gsm_default_alphabet[GN_CHAR_ALPHABET_SIZE] = { +static gunichar gsm_default_alphabet[GN_CHAR_ALPHABET_SIZE] = { /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */ + /* Fixed to use unicode */ /* Characters in hex position 10, [12 to 1a] and 24 are not present on latin1 charset, so we cannot reproduce on the screen, however they are greek symbol not present even on my Nokia */ - '@', 0xa3, '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec, + '@', 0xa3, '$' , 0xa5, 0xe8, 0xe9, 0xf9, 0xec, 0xf2, 0xc7, '\n', 0xd8, 0xf8, '\r', 0xc5, 0xe5, - '?', '_', '?', '?', '?', '?', '?', '?', - '?', '?', '?', '?', 0xc6, 0xe6, 0xdf, 0xc9, + 0x394, '_', 0x3a6,0x393,0x39b,0x3a9,0x3a0,0x3a8, + 0x3a3,0x398,0x39e, 0xa0, 0xc6, 0xe6, 0xdf, 0xc9, ' ', '!', '\"', '#', 0xa4, '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', @@ -1476,7 +1491,6 @@ return (value == GN_CHAR_ESCAPE); } -static unsigned char char_def_alphabet_ext_decode(unsigned char value) { switch (value) @@ -1490,12 +1504,12 @@ case 0x3d: return '~'; break; case 0x3e: return ']'; break; case 0x40: return '|'; break; - case 0x65: return 0xa4; break; /* euro */ + case 0x65: return 0x20ac; break; /* euro */ default: return '?'; break; /* invalid character */ } } -static unsigned char +static gunichar char_def_alphabet_decode(unsigned char value) { if (value < GN_CHAR_ALPHABET_SIZE) @@ -1509,18 +1523,24 @@ } void -gsm_sms_char_ascii_decode(unsigned char* dest, const unsigned char* src, int len) +gsm_sms_char_ascii_decode(unsigned char * dest, const unsigned char* src, int len) { int i, j; + gunichar buf; + - for (i = 0, j = 0; j < len; i++, j++) + for (i = 0, j = 0; j < len; j++) { - if (char_is_escape(src[j])) - dest[i] = char_def_alphabet_ext_decode(src[++j]); - else - dest[i] = char_def_alphabet_decode(src[j]); + if (char_is_escape(src[j])) { + buf = char_def_alphabet_ext_decode(src[++j]); + i += g_unichar_to_utf8(buf,&(dest[i])); + } + else { + buf = char_def_alphabet_decode(src[j]); + i += g_unichar_to_utf8(buf,&(dest[i])); + } } - dest[i] = 0; + dest[i]=0; return; } @@ -1771,6 +1791,7 @@ guint fill_bits; guint32 out_len; char *ustr; + char messagebuf[160]; fill_bits = 0; @@ -1839,11 +1860,10 @@ if (seven_bit) { out_len = - gsm_sms_char_7bit_unpack(fill_bits, length, sizeof(bigbuf), - tvb_get_ptr(tvb, offset, length), bigbuf); - bigbuf[out_len] = '\0'; - gsm_sms_char_ascii_decode(bigbuf, bigbuf, out_len); - bigbuf[udl] = '\0'; + gsm_sms_char_7bit_unpack(fill_bits, length, sizeof(messagebuf), + tvb_get_ptr(tvb, offset, length), messagebuf); + messagebuf[out_len] = '\0'; + gsm_sms_char_ascii_decode(bigbuf, messagebuf, out_len); proto_tree_add_text(subtree, tvb, offset, length, "%s", bigbuf); }
- Follow-Ups:
- Re: [Wireshark-dev] Patches for gsm-packet_sms dissector
- From: Anders Broman
- Re: [Wireshark-dev] Patches for gsm-packet_sms dissector
- From: Anders Broman
- Re: [Wireshark-dev] Patches for gsm-packet_sms dissector
- Prev by Date: Re: [Wireshark-dev] listen_rtp plugin
- Next by Date: Re: [Wireshark-dev] listen_rtp plugin
- Previous by thread: Re: [Wireshark-dev] listen_rtp plugin
- Next by thread: Re: [Wireshark-dev] Patches for gsm-packet_sms dissector
- Index(es):