Add support for "--with-plugindir=<plugin install dir>" to configure.
[metze/wireshark/wip.git] / packet-tftp.c
index de1cb3eb1f540dc6579687e5e6a377378d0d5c25..b04c937b0ecdb561eed0835afdb6f40f03352045 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Richard Sharpe <rsharpe@ns.aus.com>
  *
- * $Id: packet-tftp.c,v 1.3 1999/05/13 05:46:04 guy Exp $
+ * $Id: packet-tftp.c,v 1.7 1999/11/16 11:43:00 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@unicom.net>
 #include <glib.h>
 #include "packet.h"
 
+static int proto_tftp = -1;
+static int hf_tftp_type = -1;
+static int hf_tftp_error_code = -1;
+
+static gint ett_tftp = -1;
+
 #define        RRQ     1
 #define        WRQ     2
 #define        DATA    3
@@ -88,58 +94,84 @@ dissect_tftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
        if (tree) {
 
-         ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
-                               "Trivial File Transfer Protocol");
-         tftp_tree = proto_tree_new();
-         proto_item_add_subtree(ti, tftp_tree, ETT_TFTP);
+         ti = proto_tree_add_item(tree, proto_tftp, offset, END_OF_FRAME, NULL);
+         tftp_tree = proto_item_add_subtree(ti, ett_tftp);
 
-         switch (i1 = pntohs(pd+offset)) {
+         i1 = pntohs(pd+offset);
+         proto_tree_add_item_hidden(tftp_tree, hf_tftp_type, offset, 2, i1);
+           
+         switch (i1) {
          case RRQ:
-           proto_tree_add_item(tftp_tree, offset, 2, "Read Request");
+           proto_tree_add_text(tftp_tree, offset, 2, "Read Request");
            offset += 2;
            i1 = strlen(pd+offset);
-           proto_tree_add_item(tftp_tree, offset, i1+1, "Source File: %s", pd+offset);
+           proto_tree_add_text(tftp_tree, offset, i1+1, "Source File: %s", pd+offset);
            offset += i1 + 1;
-           proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset);
+           proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset);
            break;
          case WRQ:
-           proto_tree_add_item(tftp_tree, offset, 2, "Write Request");
+           proto_tree_add_text(tftp_tree, offset, 2, "Write Request");
            offset += 2;
            i1 = strlen(pd+offset);
-           proto_tree_add_item(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset);
+           proto_tree_add_text(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset);
            offset += i1 + 1;
-           proto_tree_add_item(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset);
+           proto_tree_add_text(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset);
            break;
          case DATA:
-           proto_tree_add_item(tftp_tree, offset, 2, "Data Packet");
+           proto_tree_add_text(tftp_tree, offset, 2, "Data Packet");
            offset += 2;
            i1 = pntohs(pd+offset);
-           proto_tree_add_item(tftp_tree, offset, 2, "Block = %u", i1);
+           proto_tree_add_text(tftp_tree, offset, 2, "Block = %u", i1);
            offset += 2;
-           proto_tree_add_item(tftp_tree, offset, END_OF_FRAME,
+           proto_tree_add_text(tftp_tree, offset, END_OF_FRAME,
                "Data (%d bytes)", END_OF_FRAME);
            break;
          case ACK:
-           proto_tree_add_item(tftp_tree, offset, 2, "Acknowledgement");
+           proto_tree_add_text(tftp_tree, offset, 2, "Acknowledgement");
            offset += 2;
            i1 = pntohs(pd+offset);
-           proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1);
+           proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1);
            break;
          case ERROR:
-           proto_tree_add_item(tftp_tree, offset, 2, "Error Code");
+           proto_tree_add_text(tftp_tree, offset, 2, "Error Code");
            offset += 2;
            i1 = pntohs(pd+offset);
-           proto_tree_add_item(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]);
+           proto_tree_add_item_hidden(tftp_tree, hf_tftp_error_code, offset, 2, i1);
+           proto_tree_add_text(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]);
            offset += 2;
-           proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset);
+           proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset);
            break;
          default:
-           proto_tree_add_item(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1);
+           proto_tree_add_text(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1);
            offset += 2;
-           proto_tree_add_item(tftp_tree, offset, END_OF_FRAME,
+           proto_tree_add_text(tftp_tree, offset, END_OF_FRAME,
                "Data (%d bytes)", END_OF_FRAME);
            break;
          }
 
        }
 }
+
+void
+proto_register_tftp(void)
+{
+
+  static hf_register_info hf[] = {
+    { &hf_tftp_type,
+      { "Type",                      "tftp.type",
+       FT_UINT16, BASE_DEC, NULL, 0x0,
+       "TFTP message type" }},
+
+    { &hf_tftp_error_code,
+      { "Error code",         "tftp.error.code",
+       FT_UINT16, BASE_DEC, NULL, 0x0,
+       "Error code in case of TFTP error message" }}
+  };
+  static gint *ett[] = {
+    &ett_tftp,
+  };
+
+  proto_tftp = proto_register_protocol("Trivial File Transfer Protocol", "tftp");
+  proto_register_field_array(proto_tftp, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+}