static const u_char * isakmp_attr_print(const u_char *p, const u_char *ep) { u_int16_t *q; int totlen; u_int32_t t; q = (u_int16_t *)p; if (p[0] & 0x80) totlen = 4; else totlen = 4 + EXTRACT_16BITS(&q[1]); if (ep < p + totlen) { printf("[|attr]"); return ep + 1; } printf("("); t = EXTRACT_16BITS(&q[0]) & 0x7fff; printf("type=#%d ", t); if (p[0] & 0x80) { printf("value="); t = q[1]; rawprint((caddr_t)&q[1], 2); } else { printf("len=%d value=", EXTRACT_16BITS(&q[1])); rawprint((caddr_t)&p[2], EXTRACT_16BITS(&q[1])); } printf(")"); return p + totlen; }
static const u_char * isakmp_p_print(const struct isakmp_gen *ext, u_int item_len _U_, const u_char *ep, u_int32_t phase, u_int32_t doi0, u_int32_t proto0 _U_, int depth) { const struct isakmp_pl_p *p; struct isakmp_pl_p prop; const u_char *cp; printf("%s:", NPSTR(ISAKMP_NPTYPE_P)); p = (struct isakmp_pl_p *)ext; TCHECK(*p); safememcpy(&prop, ext, sizeof(prop)); printf(" #%d protoid=%s transform=%d", prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t); if (prop.spi_size) { printf(" spi="); if (!rawprint((caddr_t)(p + 1), prop.spi_size)) goto trunc; } ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size); TCHECK(*ext); cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0, prop.prot_id, depth); return cp; trunc: printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_P)); return NULL; }
static int fromnum(double val, unsigned char* s) { unsigned char raw[DIGITS]; unsigned char* ptr = s; int exp, digs, i=0; // Handle negatives if(val < 0) { *ptr++ = '-'; val = -val; } // Exactly an integer is a special case if(val == (int)val) { ptr += decprint(val, ptr); *ptr = 0; return ptr - s; } // Get the raw digits exp = rawprint(val, raw); // Examine trailing zeros to get a significant digit count for(i=DIGITS-1; i>0; i--) if(raw[i] != '0') break; digs = i+1; if(exp > 0 || exp < -(DIGITS+3)) { // Standard scientific notation exp += DIGITS-1; *ptr++ = raw[0]; if(digs > 1) { *ptr++ = '.'; for(i=1; i<digs; i++) *ptr++ = raw[i]; } *ptr++ = 'e'; if(exp < 0) { exp = -exp; *ptr++ = '-'; } else { *ptr++ = '+'; } if(exp < 10) *ptr++ = '0'; ptr += decprint(exp, ptr); } else if(exp < 1-DIGITS) { // Fraction with insignificant leading zeros *ptr++ = '0'; *ptr++ = '.'; for(i=0; i<-(exp+DIGITS); i++) *ptr++ = '0'; for(i=0; i<digs; i++) *ptr++ = raw[i]; } else { // Integer part for(i=0; i<DIGITS+exp; i++) *ptr++ = raw[i]; if(i < digs) { // Fraction, if any *ptr++ = '.'; while(i<digs) *ptr++ = raw[i++]; } } *ptr = 0; return ptr - s; }
static const u_char * isakmp_attrmap_print(const u_char *p, const u_char *ep, const struct attrmap *map, size_t nmap) { u_int16_t *q; int totlen; u_int32_t t, v; q = (u_int16_t *)p; if (p[0] & 0x80) totlen = 4; else totlen = 4 + EXTRACT_16BITS(&q[1]); if (ep < p + totlen) { printf("[|attr]"); return ep + 1; } printf("("); t = EXTRACT_16BITS(&q[0]) & 0x7fff; if (map && t < nmap && map[t].type) printf("type=%s ", map[t].type); else printf("type=#%d ", t); if (p[0] & 0x80) { printf("value="); v = EXTRACT_16BITS(&q[1]); if (map && t < nmap && v < map[t].nvalue && map[t].value[v]) printf("%s", map[t].value[v]); else rawprint((caddr_t)&q[1], 2); } else { printf("len=%d value=", EXTRACT_16BITS(&q[1])); rawprint((caddr_t)&p[4], EXTRACT_16BITS(&q[1])); } printf(")"); return p + totlen; }