This *minor* patch :

- just moves the file from /test/ to the /utils/ folder which is IMO more 
appropriate.
- add a new feature: now prints ot (operation type) on ack/nack responses

+            printf("E%d_ACK  \t%s\n", emimsg->ot,
+                    octstr_get_cstr(emimsg->fields[E50_ADC]));
+            printf("E%d_SM   \t%s\n", emimsg->ot,
+                    octstr_get_cstr(emimsg->fields[E50_OADC]));

- also updates credits informations.

Vincent

--- /gateway-cvs/Makefile.in    2009-03-14 18:09:31.000000000 +0100
+++ /gateway/Makefile.in        2009-04-14 12:45:23.000000000 +0200
@@ -106,6 +106,7 @@
        wmlscript/wmlsc.c \
        wmlscript/wmlsdasm.c \
        utils/seewbmp.c \
+        utils/decode_emimsg.c \
        utils/mtbatch.c
 sbinsrcs = \
        gw/bearerbox.c \
diff -rNauw /gateway-cvs/test/decode_emimsg.c /gateway/test/decode_emimsg.c
--- /gateway-cvs/test/decode_emimsg.c   2009-02-10 16:52:10.000000000 +0100
+++ /gateway/test/decode_emimsg.c       1970-01-01 01:00:00.000000000 +0100
@@ -1,276 +0,0 @@
-/* ====================================================================
- * The Kannel Software License, Version 1.0
- *
- * Copyright (c) 2001-2009 Kannel Group
- * Copyright (c) 1998-2001 WapIT Ltd.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Kannel Group (http://www.kannel.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Kannel" and "Kannel Group" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please
- *    contact [email protected].
- *
- * 5. Products derived from this software may not be called "Kannel",
- *    nor may "Kannel" appear in their name, without prior written
- *    permission of the Kannel Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Kannel Group.  For more information on
- * the Kannel Group, please see <http://www.kannel.org/>.
- *
- * Portions of this software are based upon software originally written at
- * WapIT Ltd., Helsinki, Finland for the Kannel project.
- */
-
-/*
- * decode_emimsg.c - Decoding an UCP/EMI packet. <[email protected]>
- *
- */
-
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-
-#include "gwlib/gwlib.h"
-#include "gw/smsc/emimsg.c"
-#include "gw/alt_charsets.h"
-
-static char *emi_typeop(int typeop)
-{
-    switch (typeop) {
-    case 31:
-        return "Alert Operation";
-    case 51:
-        return "Submit Short Message operation";
-    case 52:
-        return "Delivery Short Message operation";
-    case 53:
-        return "Delivery notification operation";
-    case 54:
-        return "Modify Short Message operation";
-    case 55:
-        return "Inquiry message operation";
-    case 56:
-        return "Delete message operation";
-    case 57:
-        return "Response Inquiry message operation";
-    case 58:
-        return "Response delete message operation";
-    case 60:
-        return "Session management operation";
-    case 61:
-        return "Provisioning actions operation";
-    default:
-        return "!UNRECOGNIZED CODE!";
-    }
-}
-
-int main (int argc, char **argv)
-{
-    Octstr *message, *whoami;
-    struct emimsg *emimsg;
-
-    gwlib_init();
-
-    if (argc < 2)
-        panic(0, "Syntax: %s <packet_without_STX/ETX>\n", argv[0]);
-
-    message = octstr_format("\02%s\03", argv[1]); // fit the UCP specs.
-    whoami = octstr_create("DECODE");
-
-    printf(" /* decode_emimsg - Decoding an UCP/EMI packet. 
<[email protected]> */ \n\n");
-
-    emimsg = get_fields(message, whoami);
-
-    if (emimsg != NULL) {
-        printf("\n");
-        printf("TRN      \t%d\n", emimsg->trn);
-        printf("TYPE     \t%c (%s)\n", emimsg->or, emimsg->or == 'R' ? 
"Result" : "Operation");
-        printf("OPERATION\t%d (%s)\n", emimsg->ot, emi_typeop (emimsg->ot));
-
-        if (emimsg->ot == 01) {
-            printf("E01_ADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_ADC]));
-            printf("E01_OADC \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_OADC]));
-            printf("E01_AC   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_AC]));
-            printf("E01_ADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_ADC]));
-            printf("E01_MT   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_MT]));
-            if (octstr_get_char(emimsg->fields[E01_MT], 0) == '3') {
-                charset_gsm_to_latin1(emimsg->fields[E01_AMSG]);
-            }
-            printf("E01_AMSG \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E01_AMSG]));
-        }
-
-        if ((emimsg->ot == 31 || (emimsg->ot >= 50 && emimsg->ot <= 60))
-                && emimsg->or == 'R' && 
-                (octstr_get_char(emimsg->fields[E50_ADC], 0) == 'A' ||
-                octstr_get_char(emimsg->fields[E50_ADC], 0) == 'N')) {
-            printf("E?0_ACK  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_ADC]));
-            printf("E?0_SM   \t%s\n",  
-                    octstr_get_cstr(emimsg->fields[E50_OADC]));
-        }
-
-        if (emimsg->ot == 31 && emimsg->or == 'O') {
-            printf("E50_ADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_ADC]));
-            printf("E50_PID  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_OADC]));
-        }
-
-        if (emimsg->ot >= 50 && emimsg->ot <= 59 && 
-                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' &&
-                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N') {
-            printf("E50_ADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_ADC]));
-            printf("E50_OADC \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_OADC]));
-            printf("E50_AC   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_AC]));
-            printf("E50_NRQ  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NRQ]));
-            printf("E50_NADC \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NADC]));
-            printf("E50_NT   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NT]));
-            printf("E50_NPID \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NPID]));
-            printf("E50_LRQ  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_LRQ]));
-            printf("E50_LRAD \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_LRAD]));
-            printf("E50_LPID \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_LPID]));
-            printf("E50_DD   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_DD]));
-            printf("E50_DDT  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_DDT]));
-            printf("E50_VP   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_VP]));
-            printf("E50_RPID \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RPID]));
-            printf("E50_SCTS \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_SCTS]));
-            printf("E50_DST  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_DST]));
-            printf("E50_RSN  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RSN]));
-            printf("E50_DSCTS\t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_DSCTS]));
-            printf("E50_MT   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_MT]));
-            printf("E50_NB   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NB]));
-            printf("E50_NMSG \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_NMSG]));
-            if (emimsg->fields[E50_AMSG])
-            octstr_hex_to_binary (emimsg->fields[E50_AMSG]);
-            if (octstr_get_char(emimsg->fields[E50_MT], 0) == '3') {
-                charset_gsm_to_latin1(emimsg->fields[E50_AMSG]);
-            }
-
-            printf("E50_AMSG \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_AMSG]));
-            printf("E50_TMSG \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_TMSG]));
-            printf("E50_MMS  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_MMS]));
-            printf("E50_PR   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_PR]));
-            printf("E50_DCS  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_DCS]));
-            printf("E50_MCLS \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_MCLS]));
-            printf("E50_RPI  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RPI]));
-            printf("E50_CPG  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_CPG]));
-            printf("E50_RPLY \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RPLY]));
-            printf("E50_OTOA \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_OTOA]));
-            printf("E50_HPLMN\t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_HPLMN]));
-            printf("E50_XSER \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_XSER]));
-            printf("E50_RES4 \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RES4]));
-            printf("E50_RES5 \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E50_RES5]));
-        }
-
-        if ((emimsg->ot == 60 || emimsg->ot == 61) &&
-                (octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' &&
-                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N')) {
-            printf("E60_OADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_OADC]));
-            printf("E60_OTON  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_OTON]));
-            printf("E60_ONPI  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_ONPI]));
-            printf("E60_STYP  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_STYP]));
-            if (emimsg->fields[E60_PWD])
-            octstr_hex_to_binary (emimsg->fields[E60_PWD]);
-            printf("E60_PWD   \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_PWD]));
-            printf("E60_NPWD  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_NPWD]));
-            printf("E60_VERS  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_VERS]));
-            printf("E60_LADC  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_LADC]));
-            printf("E60_LTON  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_LTON]));
-            printf("E60_LNPI  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_LNPI]));
-            printf("E60_OPID  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_OPID]));
-            printf("E60_RES1  \t%s\n",
-                    octstr_get_cstr(emimsg->fields[E60_RES1]));
-        }
-    }
-
-    octstr_destroy(message);
-    octstr_destroy(whoami);
-    gwlib_shutdown();
-    
-    return 0;
-}
diff -rNauw /gateway-cvs/utils/decode_emimsg.c /gateway/utils/decode_emimsg.c
--- /gateway-cvs/utils/decode_emimsg.c  1970-01-01 01:00:00.000000000 +0100
+++ /gateway/utils/decode_emimsg.c      2009-04-14 14:41:07.000000000 +0200
@@ -0,0 +1,276 @@
+/* ====================================================================
+ * The Kannel Software License, Version 1.0
+ *
+ * Copyright (c) 2001-2009 Kannel Group
+ * Copyright (c) 1998-2001 WapIT Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Kannel Group (http://www.kannel.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Kannel" and "Kannel Group" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please
+ *    contact [email protected].
+ *
+ * 5. Products derived from this software may not be called "Kannel",
+ *    nor may "Kannel" appear in their name, without prior written
+ *    permission of the Kannel Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Kannel Group.  For more information on
+ * the Kannel Group, please see <http://www.kannel.org/>.
+ *
+ * Portions of this software are based upon software originally written at
+ * WapIT Ltd., Helsinki, Finland for the Kannel project.
+ */
+
+/*
+ * decode_emimsg.c - This tool can decode an UCP/EMI packet. 
<[email protected]>
+ *
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "gwlib/gwlib.h"
+#include "gw/smsc/emimsg.c"
+#include "gw/alt_charsets.h"
+
+static char *emi_typeop(int typeop)
+{
+    switch (typeop) {
+    case 31:
+        return "Alert Operation";
+    case 51:
+        return "Submit Short Message operation";
+    case 52:
+        return "Delivery Short Message operation";
+    case 53:
+        return "Delivery notification operation";
+    case 54:
+        return "Modify Short Message operation";
+    case 55:
+        return "Inquiry message operation";
+    case 56:
+        return "Delete message operation";
+    case 57:
+        return "Response Inquiry message operation";
+    case 58:
+        return "Response delete message operation";
+    case 60:
+        return "Session management operation";
+    case 61:
+        return "Provisioning actions operation";
+    default:
+        return "!UNRECOGNIZED CODE!";
+    }
+}
+
+int main (int argc, char **argv)
+{
+    Octstr *message, *whoami;
+    struct emimsg *emimsg;
+
+    printf("/* This tool can decode an UCP/EMI packet. 
<[email protected]> */\n\n");
+
+    gwlib_init();
+
+    if (argc < 2)
+        panic(0, "Syntax: %s <packet_without_STX/ETX>\n", argv[0]);
+
+    message = octstr_format("\02%s\03", argv[1]); // fit the UCP specs.
+    whoami = octstr_create("DECODE");
+
+    emimsg = get_fields(message, whoami);
+
+    if (emimsg != NULL) {
+        printf("\n");
+        printf("TRN      \t%d\n", emimsg->trn);
+        printf("TYPE     \t%c (%s)\n", emimsg->or, emimsg->or == 'R' ? 
"Result" : "Operation");
+        printf("OPERATION\t%d (%s)\n", emimsg->ot, emi_typeop (emimsg->ot));
+
+        if (emimsg->ot == 01) {
+            printf("E01_ADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_ADC]));
+            printf("E01_OADC \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_OADC]));
+            printf("E01_AC   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_AC]));
+            printf("E01_ADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_ADC]));
+            printf("E01_MT   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_MT]));
+            if (octstr_get_char(emimsg->fields[E01_MT], 0) == '3') {
+                charset_gsm_to_latin1(emimsg->fields[E01_AMSG]);
+            }
+            printf("E01_AMSG \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E01_AMSG]));
+        }
+
+        if ((emimsg->ot == 31 || (emimsg->ot >= 50 && emimsg->ot <= 60))
+                && emimsg->or == 'R' && 
+                (octstr_get_char(emimsg->fields[E50_ADC], 0) == 'A' ||
+                octstr_get_char(emimsg->fields[E50_ADC], 0) == 'N')) {
+            printf("E%d_ACK  \t%s\n", emimsg->ot,
+                    octstr_get_cstr(emimsg->fields[E50_ADC]));
+            printf("E%d_SM   \t%s\n", emimsg->ot,
+                    octstr_get_cstr(emimsg->fields[E50_OADC]));
+        }
+
+        if (emimsg->ot == 31 && emimsg->or == 'O') {
+            printf("E50_ADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_ADC]));
+            printf("E50_PID  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_OADC]));
+        }
+
+        if (emimsg->ot >= 50 && emimsg->ot <= 59 && 
+                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' &&
+                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N') {
+            printf("E50_ADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_ADC]));
+            printf("E50_OADC \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_OADC]));
+            printf("E50_AC   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_AC]));
+            printf("E50_NRQ  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NRQ]));
+            printf("E50_NADC \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NADC]));
+            printf("E50_NT   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NT]));
+            printf("E50_NPID \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NPID]));
+            printf("E50_LRQ  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_LRQ]));
+            printf("E50_LRAD \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_LRAD]));
+            printf("E50_LPID \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_LPID]));
+            printf("E50_DD   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_DD]));
+            printf("E50_DDT  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_DDT]));
+            printf("E50_VP   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_VP]));
+            printf("E50_RPID \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RPID]));
+            printf("E50_SCTS \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_SCTS]));
+            printf("E50_DST  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_DST]));
+            printf("E50_RSN  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RSN]));
+            printf("E50_DSCTS\t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_DSCTS]));
+            printf("E50_MT   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_MT]));
+            printf("E50_NB   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NB]));
+            printf("E50_NMSG \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_NMSG]));
+            if (emimsg->fields[E50_AMSG])
+                octstr_hex_to_binary (emimsg->fields[E50_AMSG]);
+            if (octstr_get_char(emimsg->fields[E50_MT], 0) == '3') {
+                charset_gsm_to_latin1(emimsg->fields[E50_AMSG]);
+            }
+
+            printf("E50_AMSG \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_AMSG]));
+            printf("E50_TMSG \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_TMSG]));
+            printf("E50_MMS  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_MMS]));
+            printf("E50_PR   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_PR]));
+            printf("E50_DCS  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_DCS]));
+            printf("E50_MCLS \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_MCLS]));
+            printf("E50_RPI  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RPI]));
+            printf("E50_CPG  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_CPG]));
+            printf("E50_RPLY \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RPLY]));
+            printf("E50_OTOA \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_OTOA]));
+            printf("E50_HPLMN\t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_HPLMN]));
+            printf("E50_XSER \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_XSER]));
+            printf("E50_RES4 \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RES4]));
+            printf("E50_RES5 \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E50_RES5]));
+        }
+
+        if ((emimsg->ot == 60 || emimsg->ot == 61) &&
+                (octstr_get_char(emimsg->fields[E50_ADC], 0) != 'A' &&
+                octstr_get_char(emimsg->fields[E50_ADC], 0) != 'N')) {
+            printf("E60_OADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_OADC]));
+            printf("E60_OTON  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_OTON]));
+            printf("E60_ONPI  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_ONPI]));
+            printf("E60_STYP  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_STYP]));
+            if (emimsg->fields[E60_PWD])
+                octstr_hex_to_binary (emimsg->fields[E60_PWD]);
+            printf("E60_PWD   \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_PWD]));
+            printf("E60_NPWD  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_NPWD]));
+            printf("E60_VERS  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_VERS]));
+            printf("E60_LADC  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_LADC]));
+            printf("E60_LTON  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_LTON]));
+            printf("E60_LNPI  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_LNPI]));
+            printf("E60_OPID  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_OPID]));
+            printf("E60_RES1  \t%s\n",
+                    octstr_get_cstr(emimsg->fields[E60_RES1]));
+        }
+    }
+
+    octstr_destroy(message);
+    octstr_destroy(whoami);
+    gwlib_shutdown();
+    
+    return 0;
+}

Reply via email to