1*347267dcSEnji Cooper /*- 2*347267dcSEnji Cooper * Copyright (c) 2001 Wes Peters <wes@FreeBSD.org> 3*347267dcSEnji Cooper * All rights reserved. 4*347267dcSEnji Cooper * 5*347267dcSEnji Cooper * Redistribution and use in source and binary forms, with or without 6*347267dcSEnji Cooper * modification, are permitted provided that the following conditions 7*347267dcSEnji Cooper * are met: 8*347267dcSEnji Cooper * 1. Redistributions of source code must retain the above copyright 9*347267dcSEnji Cooper * notice, this list of conditions and the following disclaimer. 10*347267dcSEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 11*347267dcSEnji Cooper * notice, this list of conditions and the following disclaimer in the 12*347267dcSEnji Cooper * documentation and/or other materials provided with the distribution. 13*347267dcSEnji Cooper * 14*347267dcSEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*347267dcSEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*347267dcSEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*347267dcSEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*347267dcSEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*347267dcSEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*347267dcSEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*347267dcSEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*347267dcSEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*347267dcSEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*347267dcSEnji Cooper * SUCH DAMAGE. 25*347267dcSEnji Cooper * 26*347267dcSEnji Cooper * $FreeBSD$ 27*347267dcSEnji Cooper */ 28*347267dcSEnji Cooper 29*347267dcSEnji Cooper #include <assert.h> 30*347267dcSEnji Cooper #include <errno.h> 31*347267dcSEnji Cooper #include <limits.h> 32*347267dcSEnji Cooper #include <stdio.h> 33*347267dcSEnji Cooper #include <stdlib.h> 34*347267dcSEnji Cooper #include <string.h> 35*347267dcSEnji Cooper 36*347267dcSEnji Cooper #include <atf-c.h> 37*347267dcSEnji Cooper 38*347267dcSEnji Cooper static char buf[64]; 39*347267dcSEnji Cooper static char *sret; 40*347267dcSEnji Cooper static int iret; 41*347267dcSEnji Cooper 42*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_unknown_error); 43*347267dcSEnji Cooper ATF_TC_BODY(strerror_unknown_error, tc) 44*347267dcSEnji Cooper { 45*347267dcSEnji Cooper 46*347267dcSEnji Cooper errno = 0; 47*347267dcSEnji Cooper sret = strerror(INT_MAX); 48*347267dcSEnji Cooper snprintf(buf, sizeof(buf), "Unknown error: %d", INT_MAX); 49*347267dcSEnji Cooper ATF_CHECK(strcmp(sret, buf) == 0); 50*347267dcSEnji Cooper ATF_CHECK(errno == EINVAL); 51*347267dcSEnji Cooper } 52*347267dcSEnji Cooper 53*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_no_error); 54*347267dcSEnji Cooper ATF_TC_BODY(strerror_no_error, tc) 55*347267dcSEnji Cooper { 56*347267dcSEnji Cooper 57*347267dcSEnji Cooper errno = 0; 58*347267dcSEnji Cooper sret = strerror(0); 59*347267dcSEnji Cooper ATF_CHECK(strcmp(sret, "No error: 0") == 0); 60*347267dcSEnji Cooper ATF_CHECK(errno == 0); 61*347267dcSEnji Cooper } 62*347267dcSEnji Cooper 63*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_EPERM_test); 64*347267dcSEnji Cooper ATF_TC_BODY(strerror_EPERM_test, tc) 65*347267dcSEnji Cooper { 66*347267dcSEnji Cooper 67*347267dcSEnji Cooper errno = 0; 68*347267dcSEnji Cooper sret = strerror(EPERM); 69*347267dcSEnji Cooper ATF_CHECK(strcmp(sret, "Operation not permitted") == 0); 70*347267dcSEnji Cooper ATF_CHECK(errno == 0); 71*347267dcSEnji Cooper } 72*347267dcSEnji Cooper 73*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_EPFNOSUPPORT_test); 74*347267dcSEnji Cooper ATF_TC_BODY(strerror_EPFNOSUPPORT_test, tc) 75*347267dcSEnji Cooper { 76*347267dcSEnji Cooper 77*347267dcSEnji Cooper errno = 0; 78*347267dcSEnji Cooper sret = strerror(EPFNOSUPPORT); 79*347267dcSEnji Cooper ATF_CHECK(strcmp(sret, "Protocol family not supported") == 0); 80*347267dcSEnji Cooper ATF_CHECK(errno == 0); 81*347267dcSEnji Cooper } 82*347267dcSEnji Cooper 83*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_ELAST_test); 84*347267dcSEnji Cooper ATF_TC_BODY(strerror_ELAST_test, tc) 85*347267dcSEnji Cooper { 86*347267dcSEnji Cooper 87*347267dcSEnji Cooper errno = 0; 88*347267dcSEnji Cooper sret = strerror(ELAST); 89*347267dcSEnji Cooper ATF_CHECK(errno == 0); 90*347267dcSEnji Cooper } 91*347267dcSEnji Cooper 92*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__unknown_error); 93*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__unknown_error, tc) 94*347267dcSEnji Cooper { 95*347267dcSEnji Cooper 96*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 97*347267dcSEnji Cooper iret = strerror_r(-1, buf, sizeof(buf)); 98*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Unknown error: -1") == 0); 99*347267dcSEnji Cooper ATF_CHECK(iret == EINVAL); 100*347267dcSEnji Cooper } 101*347267dcSEnji Cooper 102*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_one_byte_short); 103*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_one_byte_short, tc) 104*347267dcSEnji Cooper { 105*347267dcSEnji Cooper 106*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 107*347267dcSEnji Cooper /* One byte too short. */ 108*347267dcSEnji Cooper iret = strerror_r(EPERM, buf, strlen("Operation not permitted")); 109*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Operation not permitte") == 0); 110*347267dcSEnji Cooper ATF_CHECK(iret == ERANGE); 111*347267dcSEnji Cooper } 112*347267dcSEnji Cooper 113*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_one_byte_short); 114*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_one_byte_short, tc) 115*347267dcSEnji Cooper { 116*347267dcSEnji Cooper 117*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 118*347267dcSEnji Cooper /* One byte too short. */ 119*347267dcSEnji Cooper iret = strerror_r(-1, buf, strlen("Unknown error: -1")); 120*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Unknown error: -") == 0); 121*347267dcSEnji Cooper ATF_CHECK(iret == EINVAL); 122*347267dcSEnji Cooper } 123*347267dcSEnji Cooper 124*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_two_bytes_short); 125*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_two_bytes_short, tc) 126*347267dcSEnji Cooper { 127*347267dcSEnji Cooper 128*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 129*347267dcSEnji Cooper /* Two bytes too short. */ 130*347267dcSEnji Cooper iret = strerror_r(-2, buf, strlen("Unknown error: -2") - 1); 131*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Unknown error: ") == 0); 132*347267dcSEnji Cooper ATF_CHECK(iret == EINVAL); 133*347267dcSEnji Cooper } 134*347267dcSEnji Cooper 135*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_three_bytes_short); 136*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_three_bytes_short, tc) 137*347267dcSEnji Cooper { 138*347267dcSEnji Cooper 139*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 140*347267dcSEnji Cooper /* Three bytes too short. */ 141*347267dcSEnji Cooper iret = strerror_r(-2, buf, strlen("Unknown error: -2") - 2); 142*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Unknown error:") == 0); 143*347267dcSEnji Cooper ATF_CHECK(iret == EINVAL); 144*347267dcSEnji Cooper } 145*347267dcSEnji Cooper 146*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPERM_unknown_error_12345_one_byte_short); 147*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPERM_unknown_error_12345_one_byte_short, tc) 148*347267dcSEnji Cooper { 149*347267dcSEnji Cooper 150*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 151*347267dcSEnji Cooper /* One byte too short. */ 152*347267dcSEnji Cooper iret = strerror_r(12345, buf, strlen("Unknown error: 12345")); 153*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Unknown error: 1234") == 0); 154*347267dcSEnji Cooper ATF_CHECK(iret == EINVAL); 155*347267dcSEnji Cooper } 156*347267dcSEnji Cooper 157*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__no_error); 158*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__no_error, tc) 159*347267dcSEnji Cooper { 160*347267dcSEnji Cooper 161*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 162*347267dcSEnji Cooper iret = strerror_r(0, buf, sizeof(buf)); 163*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "No error: 0") == 0); 164*347267dcSEnji Cooper ATF_CHECK(iret == 0); 165*347267dcSEnji Cooper } 166*347267dcSEnji Cooper 167*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EDEADLK); 168*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EDEADLK, tc) 169*347267dcSEnji Cooper { 170*347267dcSEnji Cooper 171*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 172*347267dcSEnji Cooper iret = strerror_r(EDEADLK, buf, sizeof(buf)); 173*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Resource deadlock avoided") == 0); 174*347267dcSEnji Cooper ATF_CHECK(iret == 0); 175*347267dcSEnji Cooper } 176*347267dcSEnji Cooper 177*347267dcSEnji Cooper ATF_TC_WITHOUT_HEAD(strerror_r__EPROCLIM); 178*347267dcSEnji Cooper ATF_TC_BODY(strerror_r__EPROCLIM, tc) 179*347267dcSEnji Cooper { 180*347267dcSEnji Cooper 181*347267dcSEnji Cooper memset(buf, '*', sizeof(buf)); 182*347267dcSEnji Cooper iret = strerror_r(EPROCLIM, buf, sizeof(buf)); 183*347267dcSEnji Cooper ATF_CHECK(strcmp(buf, "Too many processes") == 0); 184*347267dcSEnji Cooper ATF_CHECK(iret == 0); 185*347267dcSEnji Cooper } 186*347267dcSEnji Cooper 187*347267dcSEnji Cooper ATF_TP_ADD_TCS(tp) 188*347267dcSEnji Cooper { 189*347267dcSEnji Cooper 190*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_unknown_error); 191*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_no_error); 192*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_EPERM_test); 193*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_EPFNOSUPPORT_test); 194*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_ELAST_test); 195*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__unknown_error); 196*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPERM_one_byte_short); 197*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_one_byte_short); 198*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_two_bytes_short); 199*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_three_bytes_short); 200*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPERM_unknown_error_12345_one_byte_short); 201*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__no_error); 202*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EDEADLK); 203*347267dcSEnji Cooper ATF_TP_ADD_TC(tp, strerror_r__EPROCLIM); 204*347267dcSEnji Cooper 205*347267dcSEnji Cooper return (atf_no_error()); 206*347267dcSEnji Cooper } 207