summaryrefslogtreecommitdiff
path: root/usr/src/lib/libsmbfs/smb/mbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libsmbfs/smb/mbuf.c')
-rw-r--r--usr/src/lib/libsmbfs/smb/mbuf.c181
1 files changed, 97 insertions, 84 deletions
diff --git a/usr/src/lib/libsmbfs/smb/mbuf.c b/usr/src/lib/libsmbfs/smb/mbuf.c
index 9380ec12e9..86710f3f94 100644
--- a/usr/src/lib/libsmbfs/smb/mbuf.c
+++ b/usr/src/lib/libsmbfs/smb/mbuf.c
@@ -53,8 +53,20 @@
#include "private.h"
#include "charsets.h"
-static int
-m_get(size_t len, struct mbuf **mpp)
+/*
+ * Note: Leaving a little space (8 bytes) between the
+ * mbuf header and the start of the data so we can
+ * prepend a NetBIOS header in that space.
+ */
+#define M_ALIGNFACTOR (sizeof (long))
+#define M_ALIGN(len) (((len) + M_ALIGNFACTOR - 1) & ~(M_ALIGNFACTOR - 1))
+#define M_BASESIZE (sizeof (struct mbuf) + 8)
+#define M_MINSIZE (1024 - M_BASESIZE)
+#define M_TOP(m) ((char *)(m) + M_BASESIZE)
+#define M_TRAILINGSPACE(m) ((m)->m_maxlen - (m)->m_len)
+
+int
+m_get(int len, struct mbuf **mpp)
{
struct mbuf *m;
@@ -132,37 +144,42 @@ m_lineup(struct mbuf *m0, struct mbuf **mpp)
}
int
-mb_init(struct mbdata *mbp, size_t size)
+mb_init(struct mbdata *mbp)
+{
+ return (mb_init_sz(mbp, M_MINSIZE));
+}
+
+int
+mb_init_sz(struct mbdata *mbp, int size)
{
struct mbuf *m;
int error;
if ((error = m_get(size, &m)) != 0)
return (error);
- return (mb_initm(mbp, m));
+ mb_initm(mbp, m);
+ return (0);
}
-int
+void
mb_initm(struct mbdata *mbp, struct mbuf *m)
{
bzero(mbp, sizeof (*mbp));
mbp->mb_top = mbp->mb_cur = m;
mbp->mb_pos = mtod(m, char *);
- return (0);
}
-int
+void
mb_done(struct mbdata *mbp)
{
if (mbp->mb_top) {
m_freem(mbp->mb_top);
mbp->mb_top = NULL;
}
- return (0);
}
int
-m_getm(struct mbuf *top, size_t len, struct mbuf **mpp)
+m_getm(struct mbuf *top, int len, struct mbuf **mpp)
{
struct mbuf *m, *mp;
int error, ts;
@@ -190,13 +207,24 @@ out:
* Routines to put data in a buffer
*/
+void *
+mb_reserve(mbchain_t *mbp, int size)
+{
+ char *p;
+
+ if (mb_fit(mbp, size, &p) != 0)
+ return (NULL);
+
+ return (p);
+}
+
/*
* Check if object of size 'size' fit to the current position and
* allocate new mbuf if not. Advance pointers and increase length of mbuf(s).
* Return pointer to the object placeholder or NULL if any error occured.
*/
int
-mb_fit(struct mbdata *mbp, size_t size, char **pp)
+mb_fit(mbchain_t *mbp, int size, char **pp)
{
struct mbuf *m, *mn;
int error;
@@ -217,56 +245,57 @@ mb_fit(struct mbdata *mbp, size_t size, char **pp)
}
int
-mb_put_uint8(struct mbdata *mbp, uint8_t x)
+mb_put_uint8(mbchain_t *mbp, uint8_t x)
{
uint8_t y = x;
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint16be(struct mbdata *mbp, uint16_t x)
+mb_put_uint16be(mbchain_t *mbp, uint16_t x)
{
uint16_t y = htobes(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint16le(struct mbdata *mbp, uint16_t x)
+mb_put_uint16le(mbchain_t *mbp, uint16_t x)
{
uint16_t y = htoles(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint32be(struct mbdata *mbp, uint32_t x)
+mb_put_uint32be(mbchain_t *mbp, uint32_t x)
{
uint32_t y = htobel(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint32le(struct mbdata *mbp, uint32_t x)
+mb_put_uint32le(mbchain_t *mbp, uint32_t x)
{
uint32_t y = htolel(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint64be(struct mbdata *mbp, uint64_t x)
+mb_put_uint64be(mbchain_t *mbp, uint64_t x)
{
uint64_t y = htobeq(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
int
-mb_put_uint64le(struct mbdata *mbp, uint64_t x)
+mb_put_uint64le(mbchain_t *mbp, uint64_t x)
{
uint64_t y = htoleq(x);
- return (mb_put_mem(mbp, &y, sizeof (y)));
+ return (mb_put_mem(mbp, &y, sizeof (y), MB_MINLINE));
}
+/* ARGSUSED */
int
-mb_put_mem(struct mbdata *mbp, const void *vmem, size_t size)
+mb_put_mem(mbchain_t *mbp, const void *vmem, int size, int type)
{
struct mbuf *m;
const char *src;
@@ -311,14 +340,14 @@ mb_put_mem(struct mbdata *mbp, const void *vmem, size_t size)
* This always consumes the passed mbuf.
*/
int
-mb_put_mbuf(struct mbdata *mbp, struct mbuf *m)
+mb_put_mbuf(mbchain_t *mbp, struct mbuf *m)
{
struct mbuf *cm = mbp->mb_cur;
int ts = M_TRAILINGSPACE(cm);
if (m->m_next == NULL && m->m_len <= ts) {
/* just copy */
- mb_put_mem(mbp, m->m_data, m->m_len);
+ mb_put_mem(mbp, m->m_data, m->m_len, MB_MSYSTEM);
m_freem(m);
return (0);
}
@@ -340,7 +369,7 @@ mb_put_mbuf(struct mbdata *mbp, struct mbuf *m)
* null terminated, and aligned if necessary.
*/
int
-mb_put_dstring(struct mbdata *mbp, const char *s, int uc)
+mb_put_string(mbchain_t *mbp, const char *s, int uc)
{
int err;
@@ -361,7 +390,7 @@ mb_put_dstring(struct mbdata *mbp, const char *s, int uc)
* Put an ASCII string (really OEM), given a UTF-8 string.
*/
int
-mb_put_astring(struct mbdata *mbp, const char *s)
+mb_put_astring(mbchain_t *mbp, const char *s)
{
char *abuf;
int err, len;
@@ -370,7 +399,7 @@ mb_put_astring(struct mbdata *mbp, const char *s)
if (abuf == NULL)
return (ENOMEM);
len = strlen(abuf) + 1;
- err = mb_put_mem(mbp, abuf, len);
+ err = mb_put_mem(mbp, abuf, len, MB_MSYSTEM);
free(abuf);
return (err);
}
@@ -379,7 +408,7 @@ mb_put_astring(struct mbdata *mbp, const char *s)
* Put UCS-2LE, given a UTF-8 string.
*/
int
-mb_put_ustring(struct mbdata *mbp, const char *s)
+mb_put_ustring(mbchain_t *mbp, const char *s)
{
uint16_t *ubuf;
int err, len;
@@ -387,8 +416,8 @@ mb_put_ustring(struct mbdata *mbp, const char *s)
ubuf = convert_utf8_to_leunicode(s);
if (ubuf == NULL)
return (ENOMEM);
- len = unicode_strlen(ubuf) + 1;
- err = mb_put_mem(mbp, ubuf, (len << 1));
+ len = 2 * (unicode_strlen(ubuf) + 1);
+ err = mb_put_mem(mbp, ubuf, len, MB_MSYSTEM);
free(ubuf);
return (err);
}
@@ -399,24 +428,18 @@ mb_put_ustring(struct mbdata *mbp, const char *s)
#define mb_left(m, p) (mtod(m, char *) + (m)->m_len - (p))
int
-mb_get_uint8(struct mbdata *mbp, uint8_t *x)
-{
- return (mb_get_mem(mbp, x, 1));
-}
-
-int
-mb_get_uint16(struct mbdata *mbp, uint16_t *x)
+md_get_uint8(mdchain_t *mbp, uint8_t *x)
{
- return (mb_get_mem(mbp, x, 2));
+ return (md_get_mem(mbp, x, 1, MB_MINLINE));
}
int
-mb_get_uint16le(struct mbdata *mbp, uint16_t *x)
+md_get_uint16le(mdchain_t *mbp, uint16_t *x)
{
uint16_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 2)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = letohs(v);
@@ -424,11 +447,11 @@ mb_get_uint16le(struct mbdata *mbp, uint16_t *x)
}
int
-mb_get_uint16be(struct mbdata *mbp, uint16_t *x) {
+md_get_uint16be(mdchain_t *mbp, uint16_t *x) {
uint16_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 2)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = betohs(v);
@@ -436,18 +459,12 @@ mb_get_uint16be(struct mbdata *mbp, uint16_t *x) {
}
int
-mb_get_uint32(struct mbdata *mbp, uint32_t *x)
-{
- return (mb_get_mem(mbp, x, 4));
-}
-
-int
-mb_get_uint32be(struct mbdata *mbp, uint32_t *x)
+md_get_uint32be(mdchain_t *mbp, uint32_t *x)
{
uint32_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 4)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = betohl(v);
@@ -455,12 +472,12 @@ mb_get_uint32be(struct mbdata *mbp, uint32_t *x)
}
int
-mb_get_uint32le(struct mbdata *mbp, uint32_t *x)
+md_get_uint32le(mdchain_t *mbp, uint32_t *x)
{
uint32_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 4)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = letohl(v);
@@ -468,18 +485,12 @@ mb_get_uint32le(struct mbdata *mbp, uint32_t *x)
}
int
-mb_get_uint64(struct mbdata *mbp, uint64_t *x)
-{
- return (mb_get_mem(mbp, x, 8));
-}
-
-int
-mb_get_uint64be(struct mbdata *mbp, uint64_t *x)
+md_get_uint64be(mdchain_t *mbp, uint64_t *x)
{
uint64_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 8)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = betohq(v);
@@ -487,20 +498,21 @@ mb_get_uint64be(struct mbdata *mbp, uint64_t *x)
}
int
-mb_get_uint64le(struct mbdata *mbp, uint64_t *x)
+md_get_uint64le(mdchain_t *mbp, uint64_t *x)
{
uint64_t v;
int err;
- if ((err = mb_get_mem(mbp, &v, 8)) != 0)
+ if ((err = md_get_mem(mbp, &v, sizeof (v), MB_MINLINE)) != 0)
return (err);
if (x != NULL)
*x = letohq(v);
return (0);
}
+/* ARGSUSED */
int
-mb_get_mem(struct mbdata *mbp, void *vmem, size_t size)
+md_get_mem(mdchain_t *mbp, void *vmem, int size, int type)
{
struct mbuf *m = mbp->mb_cur;
char *dst = vmem;
@@ -539,7 +551,7 @@ mb_get_mem(struct mbdata *mbp, void *vmem, size_t size)
* Nothing fancy here - just copy.
*/
int
-mb_get_mbuf(struct mbdata *mbp, int size, struct mbuf **ret)
+md_get_mbuf(mdchain_t *mbp, int size, mbuf_t **ret)
{
mbuf_t *m;
int err;
@@ -548,7 +560,7 @@ mb_get_mbuf(struct mbdata *mbp, int size, struct mbuf **ret)
if (err)
return (err);
- err = mb_get_mem(mbp, m->m_data, size);
+ err = md_get_mem(mbp, m->m_data, size, MB_MSYSTEM);
if (err) {
m_freem(m);
return (err);
@@ -564,26 +576,27 @@ mb_get_mbuf(struct mbdata *mbp, int size, struct mbuf **ret)
* either Unicode or OEM chars.
*/
int
-mb_get_string(struct mbdata *mbp, char **str_pp, int uc)
+md_get_string(mdchain_t *mbp, char **str_pp, int uc)
{
int err;
if (uc)
- err = mb_get_ustring(mbp, str_pp);
+ err = md_get_ustring(mbp, str_pp);
else
- err = mb_get_astring(mbp, str_pp);
+ err = md_get_astring(mbp, str_pp);
return (err);
}
/*
* Get an ASCII (really OEM) string from the mbuf chain
* and convert it to UTF-8
- * Similar to mb_get_ustring below.
+ *
+ * Similar to md_get_ustring below.
*/
int
-mb_get_astring(struct mbdata *real_mbp, char **str_pp)
+md_get_astring(mdchain_t *real_mbp, char **str_pp)
{
- struct mbdata tmp_mb, *mbp;
+ mdchain_t tmp_mb, *mbp;
char *tstr, *ostr;
int err, i, slen;
uint8_t ch;
@@ -598,7 +611,7 @@ mb_get_astring(struct mbdata *real_mbp, char **str_pp)
mbp = &tmp_mb;
slen = 0;
for (;;) {
- err = mb_get_uint8(mbp, &ch);
+ err = md_get_uint8(mbp, &ch);
if (err)
break;
if (ch == 0)
@@ -615,11 +628,11 @@ mb_get_astring(struct mbdata *real_mbp, char **str_pp)
return (ENOMEM);
mbp = real_mbp;
for (i = 0; i < slen; i++) {
- mb_get_uint8(mbp, &ch);
+ md_get_uint8(mbp, &ch);
tstr[i] = ch;
}
tstr[i] = 0;
- mb_get_uint8(mbp, NULL);
+ md_get_uint8(mbp, NULL);
/*
* Convert OEM to UTF-8
@@ -637,12 +650,12 @@ mb_get_astring(struct mbdata *real_mbp, char **str_pp)
* Get a UCS-2LE string from the mbuf chain, and
* convert it to UTF-8.
*
- * Similar to mb_get_astring below.
+ * Similar to md_get_astring above.
*/
int
-mb_get_ustring(struct mbdata *real_mbp, char **str_pp)
+md_get_ustring(mdchain_t *real_mbp, char **str_pp)
{
- struct mbdata tmp_mb, *mbp;
+ mdchain_t tmp_mb, *mbp;
uint16_t *tstr;
char *ostr;
int err, i, slen;
@@ -652,7 +665,7 @@ mb_get_ustring(struct mbdata *real_mbp, char **str_pp)
* First, align(2) on the real_mbp
*/
if (((uintptr_t)real_mbp->mb_pos) & 1)
- mb_get_uint8(real_mbp, NULL);
+ md_get_uint8(real_mbp, NULL);
/*
* Next, figure out the string length.
@@ -664,7 +677,7 @@ mb_get_ustring(struct mbdata *real_mbp, char **str_pp)
mbp = &tmp_mb;
slen = 0;
for (;;) {
- err = mb_get_uint16le(mbp, &ch);
+ err = md_get_uint16le(mbp, &ch);
if (err)
break;
if (ch == 0)
@@ -682,11 +695,11 @@ mb_get_ustring(struct mbdata *real_mbp, char **str_pp)
return (ENOMEM);
mbp = real_mbp;
for (i = 0; i < slen; i++) {
- mb_get_uint16le(mbp, &ch);
+ md_get_uint16le(mbp, &ch);
tstr[i] = ch;
}
tstr[i] = 0;
- mb_get_uint16le(mbp, NULL);
+ md_get_uint16le(mbp, NULL);
/*
* Convert UCS-2 (native!) to UTF-8