Beispiel #1
0
int
mb_put_mem(struct mbdata *mbp, const char *source, size_t size)
{
	struct mbuf *m;
	char * dst;
	size_t cplen;
	int error;

	if (size == 0)
		return 0;
	m = mbp->mb_cur;
	if ((error = m_getm(m, size, &m)) != 0)
		return error;
	while (size > 0) {
		cplen = M_TRAILINGSPACE(m);
		if (cplen == 0) {
			m = m->m_next;
			continue;
		}
		if (cplen > size)
			cplen = size;
		dst = mtod(m, char *) + m->m_len;
		if (source) {
			bcopy(source, dst, cplen);
			source += cplen;
		} else
			bzero(dst, cplen);
		size -= cplen;
		m->m_len += cplen;
		mbp->mb_count += cplen;
	}
	mbp->mb_pos = mtod(m, char *) + m->m_len;
	mbp->mb_cur = m;
	return 0;
}
Beispiel #2
0
int
smb_rq_dmem(struct mbdata *mbp, char *src, size_t size)
{
	struct mbuf *m;
	char * dst;
	int cplen, error;

	if (size == 0)
		return 0;
	m = mbp->mb_cur;
	if ((error = m_getm(m, size, &m)) != 0)
		return error;
	while (size > 0) {
		cplen = M_TRAILINGSPACE(m);
		if (cplen == 0) {
			m = m->m_next;
			continue;
		}
		if (cplen > (int)size)
			cplen = size;
		dst = mtod(m, char *) + m->m_len;
		nls_mem_toext(dst, src, cplen);
		size -= cplen;
		src += cplen;
		m->m_len += cplen;
		mbp->mb_count += cplen;
	}
	mbp->mb_pos = mtod(m, char *) + m->m_len;
	mbp->mb_cur = m;
	return 0;
}
Beispiel #3
0
int
mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type)
{
	struct mbuf *m;
	caddr_t dst;
	c_caddr_t src;
	int cplen, error, mleft, count;
	size_t srclen, dstlen;

	m = mbp->mb_cur;
	mleft = mbp->mb_mleft;

	while (size > 0) {
		if (mleft == 0) {
			if (m->m_next == NULL)
				m = m_getm(m, size, M_WAIT, MT_DATA);
			else
				m = m->m_next;
			mleft = M_TRAILINGSPACE(m);
			continue;
		}
		cplen = mleft > size ? size : mleft;
		srclen = dstlen = cplen;
		dst = mtod(m, caddr_t) + m->m_len;
		switch (type) {
		    case MB_MCUSTOM:
			srclen = size;
			dstlen = mleft;
			error = mbp->mb_copy(mbp, source, dst, &srclen, &dstlen);
			if (error)
				return error;
			break;
		    case MB_MINLINE:
			for (src = source, count = cplen; count; count--)
				*dst++ = *src++;
			break;
		    case MB_MSYSTEM:
			bcopy(source, dst, cplen);
			break;
		    case MB_MUSER:
			error = copyin(source, dst, cplen);
			if (error)
				return error;
			break;
		    case MB_MZERO:
			bzero(dst, cplen);
			break;
		}
		size -= srclen;
		source += srclen;
		m->m_len += dstlen;
		mleft -= dstlen;
		mbp->mb_count += dstlen;
	}
	mbp->mb_cur = m;
	mbp->mb_mleft = mleft;
	return 0;
}
Beispiel #4
0
int
mb_put_mem(struct mbchain *mbp, const char *source, size_t size, int type)
{
    struct mbuf *m;
    char *dst;
    const char *src;
    int error;
    size_t cplen, mleft, count;

    m = mbp->mb_cur;
    mleft = mbp->mb_mleft;

    while (size > 0) {
        if (mleft == 0) {
            if (m->m_next == NULL) {
                m = m_getm(m, size, M_WAIT, MT_DATA);
                if (m == NULL)
                    return ENOBUFS;
            }
            m = m->m_next;
            mleft = M_TRAILINGSPACE(m);
            continue;
        }
        cplen = mleft > size ? size : mleft;
        dst = mtod(m, char *) + m->m_len;
        switch (type) {
        case MB_MCUSTOM:
            error = mbp->mb_copy(mbp, source, dst, cplen);
            if (error)
                return error;
            break;
        case MB_MINLINE:
            for (src = source, count = cplen; count; count--)
                *dst++ = *src++;
            break;
        case MB_MSYSTEM:
            memcpy(dst, source, cplen);
            break;
        case MB_MUSER:
            error = copyin(source, dst, cplen);
            if (error)
                return error;
            break;
        case MB_MZERO:
            memset(dst, 0, cplen);
            break;
        }
        size -= cplen;
        source += cplen;
        m->m_len += cplen;
        mleft -= cplen;
        mbp->mb_count += cplen;
    }
    mbp->mb_cur = m;
    mbp->mb_mleft = mleft;
    return 0;
}