1 /* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Boris Popov. 16 * 4. Neither the name of the author nor the names of any co-contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * Selected code from smb_conn.c 33 */ 34 35 /* 36 * Helper functions for smb_trantcp.c 37 * (and maybe future transports) 38 */ 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/kmem.h> 43 #include <sys/cmn_err.h> 44 45 #include <netinet/in.h> 46 #include <netinet/tcp.h> 47 48 #include <netsmb/smb_osdep.h> 49 #include <netsmb/netbios.h> 50 51 #include <netsmb/smb.h> 52 #include <netsmb/smb_conn.h> 53 #include <netsmb/smb_subr.h> 54 #include <netsmb/smb_tran.h> 55 56 /* 57 * Return the length of a sockaddr structure. 58 * Only needs to handle the address formats 59 * used by smb_dup_sockaddr. 60 */ 61 static size_t 62 SA_LEN(struct sockaddr *sa) 63 { 64 size_t len; 65 66 switch (sa->sa_family) { 67 case AF_INET: 68 len = sizeof (struct sockaddr_in); 69 break; 70 case AF_INET6: 71 len = sizeof (struct sockaddr_in6); 72 break; 73 case AF_NETBIOS: 74 len = sizeof (struct sockaddr_nb); 75 break; 76 default: 77 SMBSDEBUG("invalid address family %d\n", sa->sa_family); 78 len = sizeof (struct sockaddr); 79 break; 80 } 81 82 return (len); 83 } 84 85 /* 86 * Compare two sockaddr contents 87 * Return zero if identical. 88 */ 89 int 90 smb_cmp_sockaddr(struct sockaddr *a1, struct sockaddr *a2) 91 { 92 size_t l1, l2; 93 94 l1 = SA_LEN(a1); 95 l2 = SA_LEN(a2); 96 97 if (l1 != l2) 98 return (-1); 99 100 return (bcmp(a1, a2, l1)); 101 } 102 103 /* 104 * Copy a socket address of varying size. 105 */ 106 struct sockaddr * 107 smb_dup_sockaddr(struct sockaddr *sa) 108 { 109 struct sockaddr *sa2; 110 size_t len; 111 112 /* Get the length (varies per family) */ 113 len = SA_LEN(sa); 114 115 sa2 = kmem_alloc(len, KM_SLEEP); 116 if (sa2) 117 bcopy(sa, sa2, len); 118 119 return (sa2); 120 } 121 122 void 123 smb_free_sockaddr(struct sockaddr *sa) 124 { 125 size_t len; 126 127 /* Get the length (varies per family) */ 128 len = SA_LEN(sa); 129 130 kmem_free(sa, len); 131 } 132