Example #1
0
/*
 * 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);
}
Example #2
0
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);
}
Example #3
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);
}