#
# this file defines some utilities for printing various structures
# found in the net-snmp source code.  You can source it from within
# gdb and then use it to print variable chains, oids, etc directly
# from memory.
# 
# as an example, consider the variables:
#
#   oid    *name;
#   size_t name_len;
#
# normally display oids is difficult under gdb, and the best you can
# do is to use x/12dw name or so to print the first 12 numbers of the
# oid array.  however, with this file you can now use:
#
#   gdb> printoid name_len name
#   .1.3.6.1.2.1.1.0
#
# which will print oids in a more readable fashion.  etc...
#

define initme
  set $varindent = ""
end

define hookpost-run
  initme
end

define printvarval
  printf "value: "
  if $arg0->type == 2
    printf "int: %d\n", $arg0->val.integer
  end
  if $arg0->type == 4
    printf "string: %s\n", $arg0->val.string
  end
  if $arg0->type == 5
    printf "ASN NULL\n"
  end
  if $arg0->type == 6
    printoid (($arg0->val_len)/sizeof(oid)) $arg0->val.objid
  end
  if $arg0->type == 128
    printf "NO SUCH NAME\n"
  end
  if $arg0->type == 129
    printf "NO SUCH INSTANCE\n"
  end
  if $arg0->type == 130
    printf "END OF MIB VIEW\n"
  end
  if $arg0->type == 194
    printf "AGENTX INCL RANGE: "
    printoid (($arg0->val_len)/sizeof(oid)) $arg0->val.objid
  end
  if $arg0->type == 195
    printf "AGENTX EXCL RANGE: "
    printoid (($arg0->val_len)/sizeof(oid)) $arg0->val.objid
  end
end
document printvarval
  printvarval VARPTR
  prints the value part of a net-snmp "struct variable".
  This is called from inside printvar.
end

  

define printvar
  printf "%stype: %d\n", $varindent, $arg0->type
  printf "%soid: ", $varindent
  printoid $arg0->name_length $arg0->name
  printf "%s", $varindent
  printvarval $arg0
end
document printvar
  printvar VARPTR
  prints the variable information contained in a net-snmp struct
  variable.  printvarval POINTER will print it's oid, value type and
  value contents
end

define printvars
  set $tmpcount = 1
  set $tmpvar = $arg0
  set $varindent = "  "
  while $tmpvar != 0
    printf "VARIABLE #%d\n", $tmpcount
    printvar $tmpvar
    set $tmpvar = $tmpvar->next_variable
    set $tmpcount = $tmpcount + 1
  end
  set $varindent = ""
end
document printvars
  printvars VARPTR
  calls printvar repeatedly on a chain of variables, displaying all
  the variables in a net-snmp struct variable chain.
end

define printoid
  set $printoid_tmp = 0
  while $printoid_tmp < $arg0
    printf ".%d", $arg1[$printoid_tmp]
    set $printoid_tmp = $printoid_tmp + 1
  end
  printf "\n"
end
document printoid
  printoid LENGTH OIDPTR
  prints an oid (.x.y.z...) given it's length and a pointer.
end

define poid
  printoid $arg0_len $arg0
end
document poid
  poid NAME
  shorthand for 'printoid NAME_len NAME"
end

define poidl
  printoid $arg0_length $arg0
end
document poidl
  poid NAME
  shorthand for 'printoid NAME_length NAME"
end

define printindex
  printoid $arg0->len $arg0->oids
end
document printindex
  printindex NETSNMP_INDEX_PTR
  prints the OID contained in a netsnmp_index struct variable.
end

