1 /* $OpenBSD: t_gettimeofday.c,v 1.5 2021/12/13 16:56:48 deraadt Exp $ */ 2 /* $NetBSD: t_gettimeofday.c,v 1.1 2011/07/07 06:57:53 jruoho Exp $ */ 3 4 /*- 5 * Copyright (c) 2011 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Jukka Ruohonen. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include "macros.h" 34 35 #include <sys/time.h> 36 37 #include "atf-c.h" 38 #include <errno.h> 39 #include <signal.h> 40 #include <string.h> 41 42 #ifdef __OpenBSD__ 43 static void sighandler(int); 44 45 static void 46 sighandler(int signo) 47 { 48 _exit(0); 49 } 50 #endif 51 52 ATF_TC(gettimeofday_err); 53 ATF_TC_HEAD(gettimeofday_err, tc) 54 { 55 atf_tc_set_md_var(tc, "descr", "Test errors from gettimeofday(2)"); 56 } 57 58 ATF_TC_BODY(gettimeofday_err, tc) 59 { 60 61 #ifdef __OpenBSD__ 62 /* 63 * With userland timecounters we will generate SIGSEGV instead 64 * of failing with errno set to EFAULT. POSIX explicitly 65 * allows this behaviour. 66 */ 67 ATF_REQUIRE(signal(SIGSEGV, sighandler) != SIG_ERR); 68 /* On sparc64 dereferencing -1 causes SIGBUS */ 69 ATF_REQUIRE(signal(SIGBUS, sighandler) != SIG_ERR); 70 #endif 71 errno = 0; 72 73 ATF_REQUIRE_ERRNO(EFAULT, gettimeofday((void *)-1, NULL) != 0); 74 } 75 76 ATF_TC(gettimeofday_mono); 77 ATF_TC_HEAD(gettimeofday_mono, tc) 78 { 79 atf_tc_set_md_var(tc, "descr", "Test monotonicity of gettimeofday(2)"); 80 } 81 82 ATF_TC_BODY(gettimeofday_mono, tc) 83 { 84 static const size_t maxiter = 100; 85 struct timeval tv1, tv2; 86 size_t i; 87 88 for (i = 0; i < maxiter; i++) { 89 90 (void)memset(&tv1, 0, sizeof(struct timeval)); 91 (void)memset(&tv2, 0, sizeof(struct timeval)); 92 93 ATF_REQUIRE(gettimeofday(&tv1, NULL) == 0); 94 ATF_REQUIRE(gettimeofday(&tv2, NULL) == 0); 95 96 if (timercmp(&tv2, &tv1, <) != 0) 97 atf_tc_fail("time went backwards"); 98 } 99 } 100 101 ATF_TP_ADD_TCS(tp) 102 { 103 104 ATF_TP_ADD_TC(tp, gettimeofday_err); 105 ATF_TP_ADD_TC(tp, gettimeofday_mono); 106 107 return atf_no_error(); 108 } 109