1 /* $NetBSD: t_ether_aton.c,v 1.1 2011/11/01 22:36:53 pgoyette Exp $ */ 2 3 /*- 4 * Copyright (c) 2010 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Christos Zoulas. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 #include <sys/cdefs.h> 39 __RCSID("$NetBSD: t_ether_aton.c,v 1.1 2011/11/01 22:36:53 pgoyette Exp $"); 40 41 #include <atf-c.h> 42 #include <stdio.h> 43 #include <ctype.h> 44 #include <sys/types.h> 45 #include <err.h> 46 #include <string.h> 47 #include <errno.h> 48 49 #ifndef __NetBSD__ 50 #ifdef __linux__ 51 #include <netinet/ether.h> 52 #endif 53 #include <net/ethernet.h> 54 #endif 55 56 #ifdef __NetBSD__ 57 #define ETHER_ADDR_LEN 6 58 59 int ether_aton_r(u_char *dest, size_t len, const char *str); 60 #endif 61 62 static const struct { 63 u_char res[ETHER_ADDR_LEN]; 64 const char *str; 65 int error; 66 } tests[] = { 67 { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }, "01:23:45:67:89:ab", 0 }, 68 #ifdef __NetBSD__ 69 { { 0x00, 0x01, 0x22, 0x03, 0x14, 0x05 }, "0:1:22-3:14:05", 0 }, 70 { { 0x00, 0x01, 0x22, 0x03, 0x14, 0x05 }, "000122031405", 0 }, 71 { { 0x0a, 0x0B, 0xcc, 0xdD, 0xEE, 0x0f }, "0a0BccdDEE0f", 0 }, 72 #endif 73 #define ZERO { 0, 0, 0, 0, 0, 0 } 74 { ZERO, "0:1:2-3:04:05:06", ENAMETOOLONG }, 75 { ZERO, "0:1:2-3:04:", ENOBUFS }, 76 { ZERO, "0:1:2-3:04:x7", EINVAL }, 77 { ZERO, "1:x-3:04:05:7", EINVAL }, 78 { ZERO, NULL, 0 }, 79 }; 80 81 ATF_TC(tc_ether_aton); 82 ATF_TC_HEAD(tc_ether_aton, tc) 83 { 84 atf_tc_set_md_var(tc, "descr", "Check that ether_aton(3) works"); 85 } 86 87 ATF_TC_BODY(tc_ether_aton, tc) 88 { 89 #ifdef __NetBSD__ 90 u_char dest[ETHER_ADDR_LEN]; 91 #else 92 struct ether_addr dest; 93 #endif 94 size_t t; 95 #ifdef __NetBSD__ 96 int e, r; 97 #else 98 int e; 99 struct ether_addr *r; 100 #endif 101 const char *s; 102 103 for (t = 0; tests[t].str; t++) { 104 s = tests[t].str; 105 if ((e = tests[t].error) == 0) { 106 #ifdef __NetBSD__ 107 if (ether_aton_r(dest, sizeof(dest), s) != e) 108 atf_tc_fail("failed on `%s'", s); 109 if (memcmp(dest, tests[t].res, sizeof(dest)) != 0) 110 atf_tc_fail("unexpected result on `%s'", s); 111 #else 112 if (ether_aton_r(s, &dest) == NULL && e == 0) 113 atf_tc_fail("failed on `%s'", s); 114 if (memcmp(&dest, tests[t].res, sizeof(dest)) != 0) 115 atf_tc_fail("unexpected result on `%s'", s); 116 #endif 117 } else { 118 #ifdef __NetBSD__ 119 if ((r = ether_aton_r(dest, sizeof(dest), s)) != e) 120 atf_tc_fail("unexpectedly succeeded on `%s' " 121 "(%d != %d)", s, r, e); 122 #else 123 if ((r = ether_aton_r(s, &dest)) != NULL && e != 0) 124 atf_tc_fail("unexpectedly succeeded on `%s' " 125 "(%p != %d)", s, r, e); 126 #endif 127 } 128 } 129 } 130 131 ATF_TP_ADD_TCS(tp) 132 { 133 134 ATF_TP_ADD_TC(tp, tc_ether_aton); 135 136 return atf_no_error(); 137 } 138