/* * Active Router Transport Protocol (ARTP) implementation * Copyright (c) 2004, Tomas Rebok * All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the "BSD License" which is * distributed with the software in the file LICENSE. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the BSD * License for more details. */ /** @file * @c ARTP socket address manipulating functions. * @author Tomas Rebok * @date 2004 */ #include #include "net.h" #include "errors.h" int rcvrcmp(struct sockaddr *r1, struct sockaddr *r2) { /* check whether pointers point to non-NULL memory block and both address * families are identical. */ if ((r1 == NULL) || (r2 == NULL) || (r1->sa_family != r2->sa_family)) return E_DIFF_ADDR; /* compare both socket addresses depending on their address family */ switch (r1->sa_family) { case AF_INET: /* IPv4 */ if ((((struct sockaddr_in *) r1)->sin_port == ((struct sockaddr_in *) r2)->sin_port) && (((struct sockaddr_in *) r1)->sin_addr.s_addr == ((struct sockaddr_in *) r2)->sin_addr.s_addr)) return 0; else return E_DIFF_ADDR; break; case AF_INET6: /* IPv6 */ if ((((struct sockaddr_in6 *) r1)->sin6_port == ((struct sockaddr_in6 *) r2)->sin6_port) && (memcmp( (void*) &(((struct sockaddr_in6 *) r1)->sin6_addr), (void*) &(((struct sockaddr_in6 *) r2)->sin6_addr), sizeof(struct in6_addr)))) return 0; else return E_DIFF_ADDR; break; default: return E_UNSUPPORTED_AF; } } int rcvrcpy(struct sockaddr *dest_rcvr, struct sockaddr *source_rcvr) { /* check whether both pointers point to non-NULL memory block. */ if ((source_rcvr == NULL) || (dest_rcvr == NULL)) return E_NULL_PTR; /* copy socket address depending on source address family */ switch (source_rcvr->sa_family) { case AF_INET: /* IPv4 */ *((struct sockaddr_in *) dest_rcvr) = *((struct sockaddr_in *) source_rcvr); break; case AF_INET6: /* IPv6 */ *((struct sockaddr_in6 *) dest_rcvr) = *((struct sockaddr_in6 *) source_rcvr); break; default: return E_UNSUPPORTED_AF; } return 0; } int rcvrsz(struct sockaddr *rcvr) { /* check whether pointer points to non-NULL memory block. */ if (rcvr == NULL) return E_NULL_PTR; /* return the size of socket address depending on its address family */ switch (rcvr->sa_family) { case AF_INET: /* IPv4 */ return sizeof(struct sockaddr_in); case AF_INET6: /* IPv6 */ return sizeof(struct sockaddr_in6); default: return E_UNSUPPORTED_AF; } } /* vim: set ts=4 : */