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 #pragma ident "%Z%%M% %I% %E% SMI" 36 /* 37 * Helper functions for smb_trantcp.c 38 * (and maybe future transports) 39 */ 40 41 #include <sys/param.h> 42 #include <sys/systm.h> 43 #include <sys/kmem.h> 44 #include <sys/cmn_err.h> 45 46 #include <netinet/in.h> 47 #include <netinet/tcp.h> 48 49 /* Like smb_dev.h, this knows about all our sockaddr formats. */ 50 #include <netsmb/netbios.h> 51 52 #ifdef APPLE 53 #include <sys/smb_apple.h> 54 #else 55 #include <netsmb/smb_osdep.h> 56 #endif 57 58 #include <netsmb/smb.h> 59 #include <netsmb/smb_conn.h> 60 #include <netsmb/smb_subr.h> 61 #include <netsmb/smb_tran.h> 62 63 /* 64 * Return the length of a sockaddr structure. 65 * Only needs to handle the address formats 66 * used by smb_dup_sockaddr. 67 */ 68 static size_t 69 SA_LEN(struct sockaddr *sa) 70 { 71 size_t len; 72 73 switch (sa->sa_family) { 74 case AF_INET: 75 len = sizeof (struct sockaddr_in); 76 break; 77 case AF_INET6: 78 len = sizeof (struct sockaddr_in6); 79 break; 80 case AF_NETBIOS: 81 len = sizeof (struct sockaddr_nb); 82 break; 83 default: 84 SMBSDEBUG("invalid address family %d\n", sa->sa_family); 85 len = sizeof (struct sockaddr); 86 break; 87 } 88 89 return (len); 90 } 91 92 /* 93 * Compare two sockaddr contents 94 * Return zero if identical. 95 */ 96 int 97 smb_cmp_sockaddr(struct sockaddr *a1, struct sockaddr *a2) 98 { 99 size_t l1, l2; 100 101 l1 = SA_LEN(a1); 102 l2 = SA_LEN(a2); 103 104 if (l1 != l2) 105 return (-1); 106 107 return (bcmp(a1, a2, l1)); 108 } 109 110 /* 111 * Copy a socket address of varying size. 112 */ 113 struct sockaddr * 114 smb_dup_sockaddr(struct sockaddr *sa) 115 { 116 struct sockaddr *sa2; 117 size_t len; 118 119 /* Get the length (varies per family) */ 120 len = SA_LEN(sa); 121 122 sa2 = kmem_alloc(len, KM_SLEEP); 123 if (sa2) 124 bcopy(sa, sa2, len); 125 126 return (sa2); 127 } 128 129 void 130 smb_free_sockaddr(struct sockaddr *sa) 131 { 132 size_t len; 133 134 /* Get the length (varies per family) */ 135 len = SA_LEN(sa); 136 137 kmem_free(sa, len); 138 } 139