]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/uipc_mbuf2.c
xnu-792.22.5.tar.gz
[apple/xnu.git] / bsd / kern / uipc_mbuf2.c
index f534e066895b4856f37e952a3772cde1bec520e0..1a4340bb9c8e67201dc8b85871cb3396ba64f261 100644 (file)
@@ -1,14 +1,19 @@
 /*
  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -18,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*     $NetBSD: uipc_mbuf.c,v 1.40 1999/04/01 00:23:25 thorpej Exp $   */
 
@@ -434,6 +439,46 @@ m_aux_delete(m, victim)
        }
 }
 
+struct mbuf *
+m_aux_copy(struct mbuf *to, struct mbuf *from)
+{
+       struct mbuf *m;
+       struct mbuf *top = NULL, **np = ⊤
+
+       if (!(to->m_flags & M_PKTHDR) || !(from->m_flags & M_PKTHDR))
+               return (NULL);
+
+       if ((m = from->m_pkthdr.aux) == NULL)
+               return (NULL);
+
+       while (m != NULL) {
+               struct mbuf *n;
+
+               MGET(n, M_DONTWAIT, m->m_type);
+               if (n == NULL) {
+                       m_freem(top);
+                       return (NULL);
+               }
+
+               /* Set length and data offset accordingly */
+               n->m_len = m->m_len;
+               n->m_data += (m->m_data - m->m_dat);
+
+               /* Copy databuf (mauxtag + possible aux data) */
+               bcopy(m->m_dat, n->m_dat, sizeof (m->m_dat));
+
+               *np = n;
+               np = &n->m_next;
+               m = m->m_next;
+       }
+
+       if (to->m_pkthdr.aux != NULL)
+               m_freem(to->m_pkthdr.aux);
+
+       to->m_pkthdr.aux = top;
+       return (top);
+}
+
 /* Get a packet tag structure along with specified data following. */
 struct m_tag *
 m_tag_alloc(u_int32_t id, u_int16_t type, int len, int wait)