int decode_imap(u_char *buf, int len, u_char *obuf, int olen) { struct buf *line, inbuf, outbuf; int i; buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); while ((i = buf_index(&inbuf, "\r\n", 2)) != -1) { line = buf_tok(&inbuf, NULL, i); buf_skip(&inbuf, 2); if ((i = buf_index(line, " ", 1)) != -1) { buf_skip(line, i + 1); if (buf_cmp(line, "LOGIN ", 6) == 0) { buf_putf(&outbuf, "%.*s\n", buf_len(line), buf_ptr(line)); } } } buf_end(&outbuf); return (buf_len(&outbuf)); }
/* * Print out an error message. actions contain a set of flags that determine * what needs to get done. If BUG is set, it is an internal error. If SYS is * set, a system error is printed. If RET is set, we return rather than exit. */ static int error(int actions, const char *fmt, ...) { va_list alist; char *p = error_message; char *q = p + sizeof(error_message); if ((actions & BUG) != 0) buf_app(&p, q, "internal error: "); va_start(alist, fmt); p += vsnprintf(p, q-p, fmt, alist); va_end(alist); if ((actions & SYS) != 0 && errno) { buf_app(&p, q, ": "); buf_app(&p, q, strerror(errno)); } buf_end(&p, q); fwrite(error_message, 1, p+1-error_message, stdout); if ((actions & RET) != 0) return 0; #if 0 if (RemoteFD >= 0) { send(RemoteFD, "?", 1, MSG_OOB); (void) write(RemoteFD, error_message, p-error_message); shutdown(RemoteFD, SHUT_WR); timeout_set(ERROR_TIMEOUT, sig_alrm_die); while (read(RemoteFD, error_message, sizeof(error_message)) > 0) ; } #endif return -1; }
int decode_vrrp(u_char *buf, int len, u_char *obuf, int olen) { struct buf *b, inbuf, outbuf; struct vrrp_header *vrrp; buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); vrrp = (struct vrrp_header *)buf_ptr(&inbuf); if (buf_len(&inbuf) < sizeof(*vrrp)) return (0); /* We only care about VRRP_AUTH_SIMPLE */ if (ntohs(vrrp->vr_auth) != VRRP_AUTH_SIMPLE) return (0); /* XXX - probably want to verify checksum */ /* Forward to Authentication Data */ buf_skip(&inbuf, sizeof(*vrrp) + 8 + (vrrp->vr_naddr * 4)); if ((b = buf_tok(&inbuf, NULL, VRRP_AUTH_DATA_LEN)) == NULL) return (0); buf_put(&outbuf, buf_ptr(b), buf_len(b)); buf_put(&outbuf, "\n", 1); buf_end(&outbuf); return (buf_len(&outbuf)); }
bool string::scan_line(string& out, bool nonl /* = true */, size_t* n /* = NULL */, bool move /* = false */) { if (n) *n = 0; char* pEnd = buf_end(); if (pEnd == NULL) return false; size_t len = pEnd - scan_ptr_; char *ln = (char*) memchr(scan_ptr_, '\n', len); if (ln == NULL) return false; char *next = ln + 1; len = ln - scan_ptr_ + 1; if (nonl) { ln--; len--; if (ln >= scan_ptr_ && *ln == '\r') { ln--; len--; } if (len > 0) out.append(scan_ptr_, len); } else out.append(scan_ptr_, len); if (move) { if (pEnd > next) { acl_vstring_memmove(vbf_, next, pEnd - next); TERM(vbf_); scan_ptr_ = STR(vbf_); } else clear(); } else { if (next >= pEnd) clear(); else scan_ptr_ = next; } if (n) *n = len; return true; }
int decode_mountd(u_char *buf, int len, u_char *obuf, int olen) { XDR xdrs; struct buf outbuf; struct rpc_msg msg; struct xid_map *xm; struct fhstatus fhstat; char *p, *dir; int i, hdrlen; buf_init(&outbuf, obuf, olen); if ((hdrlen = rpc_decode(buf, len, &msg)) == 0) return (0); if (msg.rm_direction == CALL && msg.rm_call.cb_prog == MOUNTPROG && msg.rm_call.cb_proc == MOUNTPROC_MNT) { xdrmem_create(&xdrs, buf + hdrlen, len - hdrlen, XDR_DECODE); dir = NULL; if (xdr_string(&xdrs, &dir, MAXPATHLEN)) { xid_map_enter(msg.rm_xid, MOUNTPROG, MOUNTVERS, MOUNTPROC_MNT, (void *) dir); } xdr_destroy(&xdrs); } else if (msg.rm_direction == REPLY && (xm = xid_map_find(msg.rm_xid)) != NULL) { if (msg.rm_reply.rp_stat == MSG_ACCEPTED && msg.acpted_rply.ar_stat == SUCCESS) { xdrmem_create(&xdrs, buf + hdrlen, len - hdrlen, XDR_DECODE); if (xdr_fhstatus(&xdrs, &fhstat)) { if (fhstat.fhs_status == 0) { buf_putf(&outbuf, "%s [", (char *)xm->data); p = fhstat.fhstatus_u.fhs_fhandle; for (i = 0; i < FHSIZE; i++) { buf_putf(&outbuf, "%.2x ", p[i] & 0xff); } buf_put(&outbuf, "]\n", 2); } } xdr_destroy(&xdrs); } free(xm->data); memset(xm, 0, sizeof(*xm)); } buf_end(&outbuf); return (buf_len(&outbuf)); }
buf_t buf_getword(buf_t buf, void *sep, int len) { buf_t b; int off; if ((off = buf_index(buf, sep, len)) < 0) return (NULL); if ((b = buf_new(off)) != NULL) { buf_put(b, buf_ptr(buf), off); buf_end(b); buf_skip(buf, off + len); } return (b); }
int decode_citrix(u_char *buf, int len, u_char *obuf, int olen) { struct buf inbuf, outbuf; u_char key, c, t[2]; int i; buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); while ((i = buf_index(&inbuf, ica_magic, sizeof(ica_magic))) >= 0) { buf_skip(&inbuf, i); if (buf_len(&inbuf) < 60) break; buf_skip(&inbuf, 17); if (buf_get(&inbuf, &key, 1) != 1) break; buf_skip(&inbuf, 42); if (buf_get(&inbuf, &c, 1) != 1) break; c ^= ('C' | key); buf_put(&outbuf, &c, 1); i = 0; while (buf_get(&inbuf, t, 2) == 2) { c = t[0] ^ t[1] ^ key; if (c == '\0') { buf_put(&outbuf, "\n", 1); if (++i > 2) break; } buf_put(&outbuf, &c, 1); } } buf_end(&outbuf); return (buf_len(&outbuf)); }
buf_t buf_getbuf(buf_t buf, int offset, int len) { buf_t b; if (buf->offset + offset + len > buf->end) return (NULL); buf_skip(buf, offset); if ((b = buf_new(len)) != NULL) { buf_put(b, buf_ptr(buf), len); buf_end(b); } buf_skip(buf, len); return (b); }
x_putc(int c) #endif { /* this uses \n as an indicator of record-end */ if(c == '\n' && f__recpos < f__hiwater) { /* fseek calls fflush, a loss */ #ifndef NON_UNIX_STDIO if(f__cf->_ptr + f__hiwater - f__recpos < buf_end(f__cf)) f__cf->_ptr += f__hiwater - f__recpos; else #endif (void) fseek(f__cf, (long)(f__hiwater - f__recpos), SEEK_CUR); } #ifdef OMIT_BLANK_CC if (!f__recpos++ && c == ' ') return c; #else f__recpos++; #endif return putc(c,f__cf); }
int decode_ftp(u_char *buf, int len, u_char *obuf, int olen) { struct buf *line, inbuf, outbuf; int i, n; if ((len = strip_telopts(buf, len)) == 0) return (0); buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); if (!buf_isascii(&inbuf)) return (0); n = 0; while ((i = buf_index(&inbuf, "\n", 1)) != -1) { line = buf_tok(&inbuf, NULL, i); buf_skip(&inbuf, 1); if (i > 0 && line->base[i - 1] == '\r') line->end--; line->base[line->end] = '\0'; if (strncasecmp(buf_ptr(line), "USER ", 5) == 0 || strncasecmp(buf_ptr(line), "ACCT ", 5) == 0 || strncasecmp(buf_ptr(line), "PASS ", 5) == 0) { buf_putf(&outbuf, "%s\n", buf_ptr(line)); n++; } } if (n < 2) return (0); buf_end(&outbuf); return (buf_len(&outbuf)); }
size_t string::scan_buf(void* pbuf, size_t n, bool move /* = false */) { if (pbuf == NULL || n == 0) return 0; const char *pEnd = buf_end(); if (pEnd == NULL) return 0; size_t len = pEnd - scan_ptr_; if (len > n) len = n; memcpy(pbuf, scan_ptr_, len); if (move) { acl_vstring_memmove(vbf_, scan_ptr_, len); TERM(vbf_); scan_ptr_ = STR(vbf_); } else scan_ptr_ += len; return len; }
int decode_mmxp(u_char *buf, int len, u_char *obuf, int olen) { struct buf inbuf, outbuf; u_char *p, c; u_int32_t i; int encrypt; buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, len); while ((i = buf_index(&inbuf, "\x00\x00\x24\x55", 4)) != -1) { buf_skip(&inbuf, i + 4); if (buf_cmp(&inbuf, "\x7f\xff", 2) == 0) encrypt = 1; else if (buf_cmp(&inbuf, "\xff\xff", 2) == 0) encrypt = 0; else continue; buf_skip(&inbuf, 4); /* LPPPg? */ if (buf_get(&inbuf, &i, sizeof(i)) < 0) break; i = ntohl(i); if (buf_skip(&inbuf, i + 4 + 4) < 0) continue; /* Server. */ if (buf_get(&inbuf, &c, 1) != 1) break; if (buf_len(&inbuf) < c) break; buf_put(&outbuf, buf_ptr(&inbuf), c); buf_put(&outbuf, "\n", 1); buf_skip(&inbuf, c + 4); /* Username. */ if (buf_get(&inbuf, &c, 1) != 1) break; if (buf_len(&inbuf) < c) break; buf_put(&outbuf, buf_ptr(&inbuf), c); buf_put(&outbuf, "\n", 1); buf_skip(&inbuf, c + 4); /* Password. */ if (buf_get(&inbuf, &c, 1) != 1) break; if (buf_len(&inbuf) < c) break; p = buf_ptr(&inbuf); if (encrypt) { for (i = 0; i < c; i++) p[i] ^= mm_xor[i % (sizeof(MM_SECRET) - 1)]; } buf_put(&outbuf, p, c); buf_put(&outbuf, "\n", 1); } buf_end(&outbuf); return (buf_len(&outbuf)); }
int decode_aim(u_char *buf, int len, u_char *obuf, int olen) { struct buf *msg, inbuf, outbuf; struct flap *flap; u_char c, *p; int i, j; buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); if (buf_cmp(&inbuf, "FLAPON\r\n\r\n", 10) == 0) buf_skip(&inbuf, 10); while (buf_len(&inbuf) > sizeof(*flap)) { flap = (struct flap *)buf_ptr(&inbuf); flap->datalen = ntohs(flap->datalen); i = sizeof(*flap) + flap->datalen; if ((msg = buf_tok(&inbuf, NULL, i)) == NULL) break; buf_skip(msg, sizeof(*flap)); if (buf_cmp(msg, "toc_signon ", 11) == 0) { msg->base[msg->end - 1] = '\0'; p = buf_ptr(msg); for (i = 0; i < 4; i++) { if ((j = strcspn(p, " ")) > 0) p += (j + 1); } if (strtok(p, " ") == NULL) continue; buf_putf(&outbuf, "%s ", buf_ptr(msg)); i = strlen(p); j = hex_decode(p, i, p, i); for (i = 0; i < j; i++) p[i] = p[i] ^ aim_xor1[i % 7]; p[i] = '\0'; buf_putf(&outbuf, "[%s]\n", p); } else if (flap->start == 0x2a && flap->channel == 0x01 && buf_cmp(msg, "\x00\x00\x00\x01", 4) == 0) { buf_skip(msg, 7); buf_get(msg, &c, 1); p = buf_ptr(msg); if (c == 0 || buf_skip(msg, c + 3) < 0) continue; p[c] = '\0'; buf_get(msg, &c, 1); if (buf_len(msg) < c + 1) continue; buf_putf(&outbuf, "%s\n", p); p = buf_ptr(msg); for (i = 0; i < c; i++) { p[i] = p[i] ^ aim_xor2[i % sizeof(aim_xor2)]; } p[i] = '\0'; buf_putf(&outbuf, "%s\n", p); break; } } buf_end(&outbuf); return (buf_len(&outbuf)); }
mv_cur() /* shouldn't use fseek because it insists on calling fflush */ /* instead we know too much about stdio */ { if(external == 0) { if(cursor < 0) { if(hiwater < recpos) hiwater = recpos; recpos += cursor; icptr += cursor; cursor = 0; if(recpos < 0) err(elist->cierr, 110, "left off"); } else if(cursor > 0) { if(recpos + cursor >= svic->icirlen) err(elist->cierr, 110, "recend"); if(hiwater <= recpos) for(; cursor > 0; cursor--) (*putn)(' '); else if(hiwater <= recpos + cursor) { cursor -= hiwater - recpos; icptr += hiwater - recpos; recpos = hiwater; for(; cursor > 0; cursor--) (*putn)(' '); } else { icptr += cursor; recpos += cursor; } cursor = 0; } return(0); } if(cursor > 0) { if(hiwater <= recpos) for(;cursor>0;cursor--) (*putn)(' '); else if(hiwater <= recpos + cursor) { #ifndef NON_UNIX_STDIO if(cf->_ptr + hiwater - recpos < buf_end(cf)) cf->_ptr += hiwater - recpos; else #endif (void) fseek(cf, (long) (hiwater - recpos), 1); cursor -= hiwater - recpos; recpos = hiwater; for(; cursor > 0; cursor--) (*putn)(' '); } else { #ifndef NON_UNIX_STDIO if(cf->_ptr + cursor < buf_end(cf)) cf->_ptr += cursor; else #endif (void) fseek(cf, (long)cursor, 1); recpos += cursor; } } if(cursor<0) { if(cursor+recpos<0) err(elist->cierr,110,"left off"); #ifndef NON_UNIX_STDIO if(cf->_ptr + cursor >= cf->_base) cf->_ptr += cursor; else #endif if(curunit->useek) (void) fseek(cf,(long)cursor,1); else err(elist->cierr,106,"fmt"); if(hiwater < recpos) hiwater = recpos; recpos += cursor; cursor=0; } return(0); }