+
+ case '$':
+ /* Guys we can't handle with one of the usual cases */
+ switch (tag) {
+
+ case TAG_NETBIOS_NODE:
+ tag = *bp++;
+ --size;
+ fputs(tok2str(nbo2str, NULL, tag), stdout);
+ break;
+
+ case TAG_OPT_OVERLOAD:
+ tag = *bp++;
+ --size;
+ fputs(tok2str(oo2str, NULL, tag), stdout);
+ break;
+
+ case TAG_CLIENT_FQDN:
+ /* option 81 should be at least 4 bytes long */
+ if (len < 4) {
+ printf("ERROR: options 81 len %u < 4 bytes", len);
+ break;
+ }
+ if (*bp++)
+ printf("[svrreg]");
+ if (*bp)
+ printf("%u/%u/", *bp, *(bp+1));
+ bp += 2;
+ putchar('"');
+ if (fn_printn(bp, size - 3, snapend)) {
+ putchar('"');
+ goto trunc;
+ }
+ putchar('"');
+ bp += size - 3;
+ size = 0;
+ break;
+
+ case TAG_CLIENT_ID:
+ { int type = *bp++;
+ size--;
+ if (type == 0) {
+ putchar('"');
+ if (fn_printn(bp, size, snapend)) {
+ putchar('"');
+ goto trunc;
+ }
+ putchar('"');
+ bp += size;
+ size = 0;
+ break;
+ } else {
+ printf("%s ", tok2str(arp2str, "hardware-type %u,", type));
+ }
+ while (size > 0) {
+ if (!first)
+ putchar(':');
+ printf("%02x", *bp);
+ ++bp;
+ --size;
+ first = 0;
+ }
+ break;
+ }
+
+ case TAG_AGENT_CIRCUIT:
+ {
+ while (size > 0 ) {
+ subopt = *bp++;
+ suboptlen = *bp++;
+ size -= 2;
+ printf("\n\t %s SubOption %u, length %u: ",
+ tok2str(agent_suboption_values, "Unknown", subopt),
+ subopt,
+ suboptlen);
+
+ if (subopt == 0 || suboptlen == 0) {
+ break;
+ }
+
+ switch(subopt) {
+ case AGENT_SUBOPTION_CIRCUIT_ID:
+ for (idx = 0; idx < suboptlen; idx++) {
+ safeputchar(*(bp+idx));
+ }
+ break;
+ default:
+ print_unknown_data(bp, "\n\t\t", suboptlen);
+ }
+
+ size -= suboptlen;
+ bp += suboptlen;
+ }
+ }
+ break;
+
+ default:
+ printf("[unknown special tag %u, size %u]",
+ tag, size);
+ bp += size;
+ size = 0;
+ break;
+ }
+ break;