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 59int ether_aton_r(u_char *dest, size_t len, const char *str); 60#endif 61 62static 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 81ATF_TC(tc_ether_aton); 82ATF_TC_HEAD(tc_ether_aton, tc) 83{ 84 atf_tc_set_md_var(tc, "descr", "Check that ether_aton(3) works"); 85} 86 87ATF_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 131ATF_TP_ADD_TCS(tp) 132{ 133 134 ATF_TP_ADD_TC(tp, tc_ether_aton); 135 136 return atf_no_error(); 137} 138