1 /* 2 * 3 * Copyright (c) International Business Machines Corp., 2002 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* 21 * http://www.opengroup.org/onlinepubs/009695399/functions/sysconf.html 22 * 23 * NAME : 24 * sysconf01 : test for sysconf( get configurable system variables) sys call. 25 * 26 * USAGE : 27 * sysconf01 28 */ 29 30 #define _GNU_SOURCE 1 31 #include <stdio.h> 32 #include <sys/types.h> 33 #include <errno.h> 34 #include <unistd.h> 35 36 #define INVAL_FLAG -1 37 38 /** LTP Port **/ 39 #include "test.h" 40 41 char *TCID = "sysconf01"; 42 int TST_TOTAL = 56; 43 44 static void _test_sysconf(long name, const char *strname) 45 { 46 long retval; 47 48 /* make sure we reset this as sysconf() will not */ 49 errno = 0; 50 retval = sysconf(name); 51 if (retval == -1) { 52 53 /* 54 * The manpage for sysconf(2) specifically states that: 55 * 1. If -1 is returned and errno is EINVAL, then the resource 56 * name doesn't exist. 57 * 2. If errno remains 0, then the limit isn't implemented. 58 * 3. Else, something weird happened with the syscall. 59 */ 60 switch (errno) { 61 case EINVAL: 62 tst_resm(TCONF, "Resource doesn't exist: %s", strname); 63 break; 64 case 0: 65 tst_resm(TCONF, "Not supported sysconf resource: %s", 66 strname); 67 break; 68 default: 69 tst_resm(TFAIL | TERRNO, "Unexpected errno value for " 70 "%s", strname); 71 break; 72 } 73 } else 74 tst_resm(TPASS, "%s = %li", strname, retval); 75 76 } 77 78 #define test_sysconf(name) _test_sysconf(name, #name) 79 80 int main(void) 81 { 82 /* 1 - 5 */ 83 test_sysconf(_SC_CLK_TCK); 84 test_sysconf(_SC_ARG_MAX); 85 test_sysconf(_SC_CHILD_MAX); 86 test_sysconf(_SC_OPEN_MAX); 87 test_sysconf(_SC_JOB_CONTROL); 88 /* 6 - 10 */ 89 test_sysconf(_SC_SAVED_IDS); 90 test_sysconf(_SC_VERSION); 91 test_sysconf(_SC_PASS_MAX); 92 test_sysconf(_SC_LOGIN_NAME_MAX); 93 test_sysconf(_SC_XOPEN_VERSION); 94 /* 11 - 15 */ 95 test_sysconf(_SC_TZNAME_MAX); 96 test_sysconf(_SC_STREAM_MAX); 97 test_sysconf(_SC_XOPEN_CRYPT); 98 test_sysconf(_SC_XOPEN_ENH_I18N); 99 test_sysconf(_SC_XOPEN_SHM); 100 /* 16 - 20 */ 101 test_sysconf(_SC_XOPEN_XCU_VERSION); 102 test_sysconf(_SC_ATEXIT_MAX); 103 test_sysconf(_SC_2_C_BIND); 104 test_sysconf(_SC_2_C_DEV); 105 #ifdef _SC_2_C_VERSION 106 test_sysconf(_SC_2_C_VERSION); 107 #else 108 tst_resm(TCONF, "_SC_2_C_VERSION not defined"); 109 #endif 110 /* 21 - 25 */ 111 test_sysconf(_SC_2_CHAR_TERM); 112 test_sysconf(_SC_2_FORT_DEV); 113 test_sysconf(_SC_2_FORT_RUN); 114 test_sysconf(_SC_2_LOCALEDEF); 115 test_sysconf(_SC_2_SW_DEV); 116 /* 26 - 30 */ 117 test_sysconf(_SC_2_UPE); 118 test_sysconf(_SC_2_VERSION); 119 test_sysconf(_SC_BC_BASE_MAX); 120 test_sysconf(_SC_BC_DIM_MAX); 121 test_sysconf(_SC_BC_SCALE_MAX); 122 /* 31 - 35 */ 123 test_sysconf(_SC_BC_STRING_MAX); 124 test_sysconf(_SC_COLL_WEIGHTS_MAX); 125 test_sysconf(_SC_EXPR_NEST_MAX); 126 test_sysconf(_SC_LINE_MAX); 127 test_sysconf(_SC_RE_DUP_MAX); 128 /* 36 - 40 */ 129 test_sysconf(_SC_XOPEN_UNIX); 130 test_sysconf(_SC_PAGESIZE); 131 test_sysconf(_SC_PHYS_PAGES); 132 test_sysconf(_SC_AVPHYS_PAGES); 133 test_sysconf(_SC_AIO_MAX); 134 /* 41 - 45 */ 135 test_sysconf(_SC_AIO_PRIO_DELTA_MAX); 136 test_sysconf(_SC_SEMAPHORES); 137 test_sysconf(_SC_SEM_NSEMS_MAX); 138 test_sysconf(_SC_SEM_VALUE_MAX); 139 test_sysconf(_SC_MEMORY_PROTECTION); 140 /* 46 - 50 */ 141 test_sysconf(_SC_FSYNC); 142 test_sysconf(_SC_MEMORY_PROTECTION); 143 test_sysconf(_SC_TIMERS); 144 test_sysconf(_SC_TIMER_MAX); 145 test_sysconf(_SC_MAPPED_FILES); 146 /* 51 - 55 */ 147 test_sysconf(_SC_THREAD_PRIORITY_SCHEDULING); 148 test_sysconf(_SC_XOPEN_LEGACY); 149 test_sysconf(_SC_MEMLOCK); 150 test_sysconf(_SC_XBS5_ILP32_OFF32); 151 test_sysconf(_SC_XBS5_ILP32_OFFBIG); 152 153 /* 56 */ 154 { 155 int retval, actual; 156 errno = 0; 157 retval = sysconf(INVAL_FLAG); 158 actual = errno; 159 if (retval != -1) { 160 tst_resm(TFAIL, 161 "sysconf succeeded for invalid flag (%i), " 162 " retval=%d errno=%d: %s", 163 INVAL_FLAG, retval, actual, strerror(actual)); 164 } else if (actual != EINVAL) { 165 tst_resm(TFAIL, 166 "sysconf correctly failed, but expected " 167 "errno (%i) != actual (%i)", EINVAL, actual); 168 } else 169 tst_resm(TPASS, "The invalid sysconf key was trapped " 170 "appropriately"); 171 } 172 173 tst_exit(); 174 } 175