/* * Encode a door header structure into an XDR buffer. */ int smb_doorhdr_encode(smb_doorhdr_t *hdr, uint8_t *buf, uint32_t buflen) { XDR xdrs; int rc = 0; xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE); if (!smb_doorhdr_xdr(&xdrs, hdr)) rc = -1; xdr_destroy(&xdrs); return (rc); }
static int smb_door_encode(smb_doorarg_t *da, uint32_t cmd) { XDR xdrs; char *buf; uint32_t buflen; buflen = xdr_sizeof(smb_doorhdr_xdr, &da->da_hdr); if (da->da_req_xdr != NULL) buflen += xdr_sizeof(da->da_req_xdr, da->da_req_data); smb_door_sethdr(&da->da_hdr, cmd, buflen); if ((buf = malloc(buflen)) == NULL) return (-1); xdrmem_create(&xdrs, buf, buflen, XDR_ENCODE); if (!smb_doorhdr_xdr(&xdrs, &da->da_hdr)) { errno = EPROTO; free(buf); xdr_destroy(&xdrs); return (-1); } if (da->da_req_xdr != NULL) { if (!da->da_req_xdr(&xdrs, da->da_req_data)) { errno = EPROTO; free(buf); xdr_destroy(&xdrs); return (-1); } } da->da_arg.data_ptr = buf; da->da_arg.data_size = buflen; da->da_arg.desc_ptr = NULL; da->da_arg.desc_num = 0; da->da_arg.rbuf = buf; da->da_arg.rsize = buflen; xdr_destroy(&xdrs); return (0); }
/* * Decode the response in rbuf and rsize. */ static int smb_door_decode(smb_doorarg_t *da) { XDR xdrs; smb_doorhdr_t hdr; char *rbuf = da->da_arg.rbuf; uint32_t rsize = da->da_arg.rsize; if (rbuf == NULL || rsize == 0) { errno = EINVAL; return (-1); } xdrmem_create(&xdrs, rbuf, rsize, XDR_DECODE); if (!smb_doorhdr_xdr(&xdrs, &hdr)) { errno = EPROTO; xdr_destroy(&xdrs); return (-1); } if (!smb_door_chkhdr(da, &hdr)) { errno = EPROTO; xdr_destroy(&xdrs); return (-1); } if (da->da_rsp_xdr != NULL) { if (!da->da_rsp_xdr(&xdrs, da->da_rsp_data)) { errno = EPROTO; xdr_destroy(&xdrs); return (-1); } } xdr_destroy(&xdrs); return (0); }