xref: /dragonfly/contrib/dhcpcd/src/sa.h (revision 54175cef)
18d36e1dfSRoy Marples /* SPDX-License-Identifier: BSD-2-Clause */
27827cba2SAaron LI /*
37827cba2SAaron LI  * Socket Address handling for dhcpcd
480aa9461SRoy Marples  * Copyright (c) 2015-2023 Roy Marples <roy@marples.name>
57827cba2SAaron LI  * All rights reserved
67827cba2SAaron LI 
77827cba2SAaron LI  * Redistribution and use in source and binary forms, with or without
87827cba2SAaron LI  * modification, are permitted provided that the following conditions
97827cba2SAaron LI  * are met:
107827cba2SAaron LI  * 1. Redistributions of source code must retain the above copyright
117827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer.
127827cba2SAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
137827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer in the
147827cba2SAaron LI  *    documentation and/or other materials provided with the distribution.
157827cba2SAaron LI  *
167827cba2SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177827cba2SAaron LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187827cba2SAaron LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197827cba2SAaron LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207827cba2SAaron LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217827cba2SAaron LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227827cba2SAaron LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237827cba2SAaron LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247827cba2SAaron LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257827cba2SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267827cba2SAaron LI  * SUCH DAMAGE.
277827cba2SAaron LI  */
287827cba2SAaron LI 
297827cba2SAaron LI #ifndef SA_H
307827cba2SAaron LI #define SA_H
317827cba2SAaron LI 
327827cba2SAaron LI #include <sys/socket.h>
338d36e1dfSRoy Marples #include <netinet/in.h>
347827cba2SAaron LI 
357827cba2SAaron LI union sa_ss {
367827cba2SAaron LI 	struct sockaddr		sa;
377827cba2SAaron LI 	struct sockaddr_in	sin;
387827cba2SAaron LI 	struct sockaddr_in6	sin6;
397827cba2SAaron LI };
407827cba2SAaron LI 
417827cba2SAaron LI #ifdef BSD
427827cba2SAaron LI #define HAVE_SA_LEN
437827cba2SAaron LI #endif
447827cba2SAaron LI 
457827cba2SAaron LI /* Allow for a sockaddr_dl being printed too. */
467827cba2SAaron LI #define INET_MAX_ADDRSTRLEN	(20 * 3)
477827cba2SAaron LI 
487827cba2SAaron LI #ifdef INET
497827cba2SAaron LI #define satosin(sa) ((struct sockaddr_in *)(void *)(sa))
507827cba2SAaron LI #define satocsin(sa) ((const struct sockaddr_in *)(const void *)(sa))
517827cba2SAaron LI #endif
527827cba2SAaron LI #ifdef INET6
537827cba2SAaron LI #define satosin6(sa) ((struct sockaddr_in6 *)(void *)(sa))
547827cba2SAaron LI #define satocsin6(sa) ((const struct sockaddr_in6 *)(const void *)(sa))
557827cba2SAaron LI #endif
567827cba2SAaron LI 
577827cba2SAaron LI socklen_t sa_addroffset(const struct sockaddr *sa);
587827cba2SAaron LI socklen_t sa_addrlen(const struct sockaddr *sa);
598d36e1dfSRoy Marples #ifdef HAVE_SA_LEN
608d36e1dfSRoy Marples #define	sa_len(sa)	((sa)->sa_len)
618d36e1dfSRoy Marples #else
628d36e1dfSRoy Marples socklen_t sa_len(const struct sockaddr *sa);
638d36e1dfSRoy Marples #endif
647827cba2SAaron LI bool sa_is_unspecified(const struct sockaddr *);
657827cba2SAaron LI bool sa_is_allones(const struct sockaddr *);
667827cba2SAaron LI bool sa_is_loopback(const struct sockaddr *);
677827cba2SAaron LI void *sa_toaddr(struct sockaddr *);
687827cba2SAaron LI int sa_toprefix(const struct sockaddr *);
697827cba2SAaron LI int sa_fromprefix(struct sockaddr *, int);
70*54175cefSRoy Marples void in6_addr_fromprefix(struct in6_addr *, int);
717827cba2SAaron LI const char *sa_addrtop(const struct sockaddr *, char *, socklen_t);
727827cba2SAaron LI int sa_cmp(const struct sockaddr *, const struct sockaddr *);
737827cba2SAaron LI void sa_in_init(struct sockaddr *, const struct in_addr *);
747827cba2SAaron LI void sa_in6_init(struct sockaddr *, const struct in6_addr *);
757827cba2SAaron LI 
767827cba2SAaron LI #endif
77