static size_t p0f2str(char *buf, size_t len, const tcp *t, size_t tcplen, const ipv4 *ip, size_t iplen, int mss_star) { size_t bytes = 0; p0f_fingerprint p; if (build_p0f_fingerprint(t, tcplen, ip, iplen, &p)) { char winbuf[16], optbuf[256], quirkbuf[16]; u16 mtu = p.mss + 40; if (p.mss && 0 == p.win.size % p.mss) { snprintf(winbuf, sizeof winbuf, "S%u", p.win.size / p.mss); } else if (mtu > 40 && 0 == p.win.size % mtu) { snprintf(winbuf, sizeof winbuf, "T%u", p.win.size / mtu); } else { snprintf(winbuf, sizeof winbuf, "%u", p.win.size); } opt2str(optbuf, sizeof optbuf, &p, mss_star); quirk2str(quirkbuf, sizeof quirkbuf, &p); bytes = snprintf(buf, len, "%s:%u:%u:%u:%s:%s", winbuf, p.ttl, p.df, p.synsize, optbuf, quirkbuf); } else { *buf = '\0'; } printf("TCP.SYN.Fingerprint(%u)=%s\n", (unsigned)bytes, buf); return bytes; }
/* option to string ------------------------------------------------------------- * convert option to string (keyword=value # comment) * args : opt_t *opt I option * char *buff O option string * return : length of output string *-----------------------------------------------------------------------------*/ extern int opt2buf(const opt_t *opt, char *buff) { char *p=buff; int n; trace(3,"opt2buf : name=%s\n",opt->name); p+=sprintf(p,"%-18s =",opt->name); p+=opt2str(opt,p); if (*opt->comment) { if ((n=(int)(buff+30-p))>0) p+=sprintf(p,"%*s",n,""); p+=sprintf(p," # (%s)",opt->comment); } return (int)(p-buff); }