t_api.c revision 9d5ed744c46ef241b9d3ba134bf3155e0b62ac9e
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews/*
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * Copyright (C) 1999-2003 Internet Software Consortium.
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews *
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Permission to use, copy, modify, and/or distribute this software for any
7de2c6e6d51f38daeb2d346f3f21dc01ccece6daEvan Hunt * purpose with or without fee is hereby granted, provided that the above
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * copyright notice and this permission notice appear in all copies.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence *
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * PERFORMANCE OF THIS SOFTWARE.
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews */
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence/* $Id: t_api.c,v 1.62 2008/01/14 23:46:56 tbox Exp $ */
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*! \file */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington#include <config.h>
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence#include <ctype.h>
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence#include <errno.h>
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence#include <limits.h>
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley#include <signal.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <stdarg.h>
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff#include <stdio.h>
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff#include <stdlib.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <time.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <unistd.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <sys/wait.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <isc/boolean.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/commandline.h>
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence#include <isc/print.h>
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence#include <isc/string.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isc/mem.h>
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley#include <dns/compress.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <dns/result.h>
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley#include "include/tests/t_api.h"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellingtonstatic const char *Usage =
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington "\t-a : run all tests\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-b <dir> : chdir to dir before running tests"
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews "\t-c <config_file> : use specified config file\n"
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews "\t-d <debug_level> : set debug level to debug_level\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-h : print test info\n"
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley "\t-u : print usage info\n"
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley "\t-n <test_name> : run specified test name\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-t <test_number> : run specified test number\n"
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews "\t-x : don't execute tests in a subproc\n"
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews "\t-q <timeout> : use 'timeout' as the timeout value\n";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/*!<
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff * -a --> run all tests
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff * -b dir --> chdir to dir before running tests
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -c config --> use config file 'config'
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews * -d --> turn on api debugging
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews * -h --> print out available test names
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -u --> print usage info
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -n name --> run test named name
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -tn --> run test n
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -x --> don't execute testcases in a subproc
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -q timeout --> use 'timeout' as the timeout value
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington#define T_MAXTESTS 256 /*% must be 0 mod 8 */
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington#define T_MAXENV 256
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define T_DEFAULT_CONFIG "t_config"
b15c543f7957fbb4284f0fc20b3278f2a411d272Mark Andrews#define T_BUFSIZ 256
b15c543f7957fbb4284f0fc20b3278f2a411d272Mark Andrews#define T_BIGBUF 4096
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define T_TCTOUT 60
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graffint T_debug;
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graffint T_timeout;
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graffpid_t T_pid;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic const char * T_config;
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellingtonstatic char T_tvec[T_MAXTESTS / 8];
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellingtonstatic char * T_env[T_MAXENV + 1];
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic char T_buf[T_BIGBUF];
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellingtonstatic char * T_dir;
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic int
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellingtont_initconf(const char *path);
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic int
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrencet_dumpconf(const char *path);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrencestatic int
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrencet_putinfo(const char *key, const char *info);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrencestatic char *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeint_getdate(char *buf, size_t buflen);
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrencestatic void
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrenceprinthelp(void);
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrencestatic void
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinprintusage(void);
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrencestatic int T_int;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic void
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrencet_sighandler(int sig) {
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence T_int = sig;
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence}
2e61d171bc1fa47ea4d551b87546ebcf78f61e4aMark Andrews
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrenceint
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsmain(int argc, char **argv) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int c;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int tnum;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int subprocs;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews pid_t deadpid;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int status;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int len;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_boolean_t first;
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence testspec_t *pts;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein struct sigaction sa;
529ff4b4959fb157194f985394951108ff5286e4Brian Wellington
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington isc_mem_debugging = ISC_MEM_DEBUGRECORD;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein first = ISC_TRUE;
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington subprocs = 1;
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington T_timeout = T_TCTOUT;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews /*
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews * -a option is now default.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson memset(T_tvec, 0xff, sizeof(T_tvec));
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein /*
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * Parse args.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews */
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews while ((c = isc_commandline_parse(argc, argv, ":at:c:d:n:huxq:b:"))
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews != -1) {
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews if (c == 'a') {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews /*
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews * Flag all tests to be run.
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews */
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews memset(T_tvec, 0xff, sizeof(T_tvec));
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews }
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews else if (c == 'b') {
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews T_dir = isc_commandline_argument;
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews }
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews else if (c == 't') {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater tnum = atoi(isc_commandline_argument);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if ((tnum > 0) && (tnum < T_MAXTESTS)) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (first) {
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt /*
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * Turn off effect of -a default
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * and allow multiple -t and -n
9a97696b543b9957049a663b4f73245589c47921Mark Andrews * options.
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews */
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews memset(T_tvec, 0, sizeof(T_tvec));
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews first = ISC_FALSE;
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews }
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews /*
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews * Flag test tnum to be run.
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews */
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews tnum -= 1;
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews T_tvec[tnum / 8] |= (0x01 << (tnum % 8));
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews }
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews }
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews else if (c == 'c') {
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews T_config = isc_commandline_argument;
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews }
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews else if (c == 'd') {
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews T_debug = atoi(isc_commandline_argument);
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews }
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews else if (c == 'n') {
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews pts = &T_testlist[0];
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews tnum = 0;
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews while (pts->pfv != NULL) {
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews if (! strcmp(pts->func_name,
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews isc_commandline_argument)) {
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews if (first) {
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews memset(T_tvec, 0,
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews sizeof(T_tvec));
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews first = ISC_FALSE;
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews }
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews T_tvec[tnum/8] |= (0x01 << (tnum%8));
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews break;
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews }
9935447b51456f598b45246d0114b8006049244dMark Andrews ++pts;
9935447b51456f598b45246d0114b8006049244dMark Andrews ++tnum;
9935447b51456f598b45246d0114b8006049244dMark Andrews }
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews if (pts->pfv == NULL) {
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews fprintf(stderr, "no such test %s\n",
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews isc_commandline_argument);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews exit(1);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews }
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews else if (c == 'h') {
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington printhelp();
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington exit(0);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews }
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews else if (c == 'u') {
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews printusage();
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews exit(0);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews }
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews else if (c == 'x') {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews subprocs = 0;
9a97696b543b9957049a663b4f73245589c47921Mark Andrews }
9a97696b543b9957049a663b4f73245589c47921Mark Andrews else if (c == 'q') {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews T_timeout = atoi(isc_commandline_argument);
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews }
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews else if (c == ':') {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews fprintf(stderr, "Option -%c requires an argument\n",
9a97696b543b9957049a663b4f73245589c47921Mark Andrews isc_commandline_option);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews exit(1);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley else if (c == '?') {
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley fprintf(stderr, "Unrecognized option -%c\n",
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt isc_commandline_option);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt exit(1);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt }
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt }
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt /*
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt * Set cwd.
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt */
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews if (T_dir != NULL)
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews (void) chdir(T_dir);
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt /*
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt * We don't want buffered output.
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt */
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews (void)setbuf(stdout, NULL);
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews (void)setbuf(stderr, NULL);
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt /*
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt * Setup signals.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews sa.sa_flags = 0;
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt sigfillset(&sa.sa_mask);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt#ifdef SIGCHLD
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews /*
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews * This is mostly here for NetBSD's pthread implementation, until
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews * people catch up to the latest unproven-pthread package.
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews */
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews sa.sa_handler = SIG_DFL;
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews (void)sigaction(SIGCHLD, &sa, NULL);
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews#endif
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews sa.sa_handler = t_sighandler;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (void)sigaction(SIGINT, &sa, NULL);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (void)sigaction(SIGALRM, &sa, NULL);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt /*
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt * Output start stanza to journal.
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt */
9a97696b543b9957049a663b4f73245589c47921Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrews snprintf(T_buf, sizeof(T_buf), "%s:", argv[0]);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews len = strlen(T_buf);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (void) t_getdate(T_buf + len, T_BIGBUF - len);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews t_putinfo("S", T_buf);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews /*
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews * Setup the test environment using the config file.
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (T_config == NULL)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews T_config = T_DEFAULT_CONFIG;
23ac30603a7639bea1d331537634b079b046b122Mark Andrews
23ac30603a7639bea1d331537634b079b046b122Mark Andrews t_initconf(T_config);
23ac30603a7639bea1d331537634b079b046b122Mark Andrews if (T_debug)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews t_dumpconf(T_config);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews /*
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews * Now invoke all the test cases.
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews */
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews tnum = 0;
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews pts = &T_testlist[0];
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews while (*pts->pfv != NULL) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (T_tvec[tnum / 8] & (0x01 << (tnum % 8))) {
5c00d1c90030a311d2700970fa7cffc8f828a48cBob Halley if (subprocs) {
5c00d1c90030a311d2700970fa7cffc8f828a48cBob Halley T_pid = fork();
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt if (T_pid == 0) {
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt (*pts->pfv)();
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt exit(0);
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews } else if (T_pid > 0) {
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews T_int = 0;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews sa.sa_handler = t_sighandler;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (void)sigaction(SIGALRM, &sa, NULL);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews alarm(T_timeout);
5506903c9215faf42586307c2288942fd804c579Evan Hunt
5506903c9215faf42586307c2288942fd804c579Evan Hunt deadpid = (pid_t) -1;
5506903c9215faf42586307c2288942fd804c579Evan Hunt while (deadpid != T_pid) {
9935447b51456f598b45246d0114b8006049244dMark Andrews deadpid =
9935447b51456f598b45246d0114b8006049244dMark Andrews waitpid(T_pid, &status, 0);
9935447b51456f598b45246d0114b8006049244dMark Andrews if (deadpid == T_pid) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (WIFSIGNALED(status)) {
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson if (WTERMSIG(status) ==
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson SIGTERM)
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews t_info(
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews "the test case timed out\n");
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews else
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews t_info(
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews "the test case caused exception %d\n",
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews WTERMSIG(status));
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt t_result(T_UNRESOLVED);
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt }
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Hunt } else if ((deadpid == -1) &&
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews (errno == EINTR) &&
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews T_int) {
31b7a2fed64e388db772a74742a4adc95d1a21e6Mark Andrews kill(T_pid, SIGTERM);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt T_int = 0;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt }
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt else if ((deadpid == -1) &&
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt ((errno == ECHILD) ||
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt (errno == ESRCH)))
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt break;
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews }
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews alarm(0);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt sa.sa_handler = SIG_IGN;
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt (void)sigaction(SIGALRM, &sa, NULL);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt } else {
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt t_info("fork failed, errno == %d\n",
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt errno);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt t_result(T_UNRESOLVED);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews else {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (*pts->pfv)();
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews ++pts;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews ++tnum;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews snprintf(T_buf, sizeof(T_buf), "%s:", argv[0]);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews len = strlen(T_buf);
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews (void) t_getdate(T_buf + len, T_BIGBUF - len);
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews t_putinfo("E", T_buf);
dc2a0aa7aaa8b85398ae183c7274c0eeec5009afMark Andrews
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews return(0);
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews}
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrewsvoid
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrewst_assert(const char *component, int anum, int class, const char *what, ...) {
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrews va_list args;
5506903c9215faf42586307c2288942fd804c579Evan Hunt
5506903c9215faf42586307c2288942fd804c579Evan Hunt (void)printf("T:%s:%d:%s\n", component, anum, class == T_REQUIRED ?
5506903c9215faf42586307c2288942fd804c579Evan Hunt "A" : "C");
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews /*
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews * Format text to a buffer.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews */
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington va_start(args, what);
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington (void)vsnprintf(T_buf, sizeof(T_buf), what, args);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews va_end(args);
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington
134ba0e08a0ae9a564a8d8628fc633377d3fc239Bob Halley (void)t_putinfo("A", T_buf);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews (void)printf("\n");
203596d27c225ea195e4faad4f19388c6e96ac80Bob Halley}
203596d27c225ea195e4faad4f19388c6e96ac80Bob Halley
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsvoid
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewst_info(const char *format, ...) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews va_list args;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson va_start(args, format);
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson (void) vsnprintf(T_buf, sizeof(T_buf), format, args);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews va_end(args);
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley (void) t_putinfo("I", T_buf);
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley}
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsvoid
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewst_result(int result) {
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews const char *p;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews switch (result) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews case T_PASS:
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews p = "PASS";
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews break;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews case T_FAIL:
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley p = "FAIL";
15bfd48fc5552ff1aae766021f42a250c001a098Michael Graff break;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater case T_UNRESOLVED:
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater p = "UNRESOLVED";
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater break;
c4e59874fb1a750880d5ebed560c9acf69251840Mark Andrews case T_UNSUPPORTED:
9a97696b543b9957049a663b4f73245589c47921Mark Andrews p = "UNSUPPORTED";
e7fb847ed570dd8c1bcdacabb3d69bd81feb79aeMark Andrews break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case T_UNTESTED:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 p = "UNTESTED";
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case T_THREADONLY:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 p = "THREADONLY";
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt default:
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt p = "UNKNOWN";
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt break;
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews }
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews printf("R:%s\n", p);
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews}
63dd46733010bb9622810faa17d88c3e3c28b730Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrewschar *
9a97696b543b9957049a663b4f73245589c47921Mark Andrewst_getenv(const char *name) {
588f79e557cd66ef77c90378a997b0d377af9db7Tatuya JINMEI 神明達哉 char *n;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews char **p;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews size_t len;
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews n = NULL;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (name && *name) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
882350d11c90de9de6fc1cead25690c8114b0b95Michael Graff p = &T_env[0];
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews len = strlen(name);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
15bfd48fc5552ff1aae766021f42a250c001a098Michael Graff while (*p != NULL) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (strncmp(*p, name, len) == 0) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if ( *(*p + len) == '=') {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews n = *p + len + 1;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews break;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater ++p;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater }
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews return(n);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews}
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews/*
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews *
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews * Read in the config file at path, initializing T_env.
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews *
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * note: no format checking for now ...
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater *
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsstatic int
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewst_initconf(const char *path) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int n;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews int rval;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews char **p;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews FILE *fp;
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews rval = -1;
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews fp = fopen(path, "r");
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews if (fp != NULL) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater n = 0;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater p = &T_env[0];
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater while (n < T_MAXENV) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater *p = t_fgetbs(fp);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if (*p == NULL)
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater break;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if ((**p == '#') || (strchr(*p, '=') == NULL)) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater /*
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * Skip comments and other junk.
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater */
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater (void)free(*p);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews continue;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews ++p; ++n;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews (void)fclose(fp);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews rval = 0;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews }
7de2c6e6d51f38daeb2d346f3f21dc01ccece6daEvan Hunt
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews return (rval);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews}
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews/*
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews *
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews * Dump T_env to stdout.
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews *
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews */
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrewsstatic int
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrewst_dumpconf(const char *path) {
int rval;
char **p;
FILE *fp;
rval = -1;
fp = fopen(path, "r");
if (fp != NULL) {
p = &T_env[0];
while (*p != NULL) {
printf("C:%s\n", *p);
++p;
}
(void) fclose(fp);
rval = 0;
}
return(rval);
}
/*
*
* Read a newline or EOF terminated string from fp.
* On success:
* return a malloc'd buf containing the string with
* the newline converted to a '\0'.
* On error:
* return NULL.
*
* Caller is responsible for freeing buf.
*
*/
char *
t_fgetbs(FILE *fp) {
int c;
size_t n;
size_t size;
char *buf;
char *p;
n = 0;
size = T_BUFSIZ;
buf = (char *) malloc(T_BUFSIZ * sizeof(char));
if (buf != NULL) {
p = buf;
while ((c = fgetc(fp)) != EOF) {
if (c == '\n')
break;
*p++ = c;
++n;
if ( n >= size ) {
size += T_BUFSIZ;
buf = (char *)realloc(buf,
size * sizeof(char));
if (buf == NULL)
break;
p = buf + n;
}
}
*p = '\0';
if (c == EOF && n == 0U) {
free(buf);
return (NULL);
}
return (buf);
} else {
fprintf(stderr, "malloc failed %d", errno);
return(NULL);
}
}
/*
*
* Put info to log, using key.
* For now, just dump it out.
* Later format into pretty lines.
*
*/
static int
t_putinfo(const char *key, const char *info) {
int rval;
/*
* For now.
*/
rval = printf("%s:%s", key, info);
return(rval);
}
static char *
t_getdate(char *buf, size_t buflen) {
size_t n;
time_t t;
struct tm *p;
t = time(NULL);
p = localtime(&t);
n = strftime(buf, buflen - 1, "%A %d %B %H:%M:%S %Y\n", p);
return(n != 0U ? buf : NULL);
}
/*
* Some generally used utilities.
*/
struct dns_errormap {
isc_result_t result;
const char *text;
} dns_errormap[] = {
{ ISC_R_SUCCESS, "ISC_R_SUCCESS" },
{ ISC_R_EXISTS, "ISC_R_EXISTS" },
{ ISC_R_NOTFOUND, "ISC_R_NOTFOUND" },
{ ISC_R_NOSPACE, "ISC_R_NOSPACE" },
{ ISC_R_UNEXPECTED, "ISC_R_UNEXPECTED" },
{ ISC_R_UNEXPECTEDEND, "ISC_R_UNEXPECTEDEND" },
{ ISC_R_RANGE, "ISC_R_RANGE" },
{ DNS_R_LABELTOOLONG, "DNS_R_LABELTOOLONG" },
{ DNS_R_BADESCAPE, "DNS_R_BADESCAPE" },
/* { DNS_R_BADBITSTRING, "DNS_R_BADBITSTRING" }, */
/* { DNS_R_BITSTRINGTOOLONG, "DNS_R_BITSTRINGTOOLONG"}, */
{ DNS_R_EMPTYLABEL, "DNS_R_EMPTYLABEL" },
{ DNS_R_BADDOTTEDQUAD, "DNS_R_BADDOTTEDQUAD" },
{ DNS_R_UNKNOWN, "DNS_R_UNKNOWN" },
{ DNS_R_BADLABELTYPE, "DNS_R_BADLABELTYPE" },
{ DNS_R_BADPOINTER, "DNS_R_BADPOINTER" },
{ DNS_R_TOOMANYHOPS, "DNS_R_TOOMANYHOPS" },
{ DNS_R_DISALLOWED, "DNS_R_DISALLOWED" },
{ DNS_R_EXTRATOKEN, "DNS_R_EXTRATOKEN" },
{ DNS_R_EXTRADATA, "DNS_R_EXTRADATA" },
{ DNS_R_TEXTTOOLONG, "DNS_R_TEXTTOOLONG" },
{ DNS_R_SYNTAX, "DNS_R_SYNTAX" },
{ DNS_R_BADCKSUM, "DNS_R_BADCKSUM" },
{ DNS_R_BADAAAA, "DNS_R_BADAAAA" },
{ DNS_R_NOOWNER, "DNS_R_NOOWNER" },
{ DNS_R_NOTTL, "DNS_R_NOTTL" },
{ DNS_R_BADCLASS, "DNS_R_BADCLASS" },
{ DNS_R_PARTIALMATCH, "DNS_R_PARTIALMATCH" },
{ DNS_R_NEWORIGIN, "DNS_R_NEWORIGIN" },
{ DNS_R_UNCHANGED, "DNS_R_UNCHANGED" },
{ DNS_R_BADTTL, "DNS_R_BADTTL" },
{ DNS_R_NOREDATA, "DNS_R_NOREDATA" },
{ DNS_R_CONTINUE, "DNS_R_CONTINUE" },
{ DNS_R_DELEGATION, "DNS_R_DELEGATION" },
{ DNS_R_GLUE, "DNS_R_GLUE" },
{ DNS_R_DNAME, "DNS_R_DNAME" },
{ DNS_R_CNAME, "DNS_R_CNAME" },
{ DNS_R_NXDOMAIN, "DNS_R_NXDOMAIN" },
{ DNS_R_NXRRSET, "DNS_R_NXRRSET" },
{ DNS_R_BADDB, "DNS_R_BADDB" },
{ DNS_R_ZONECUT, "DNS_R_ZONECUT" },
{ DNS_R_NOTZONETOP, "DNS_R_NOTZONETOP" },
{ DNS_R_SEENINCLUDE, "DNS_R_SEENINCLUDE" },
{ DNS_R_SINGLETON, "DNS_R_SINGLETON" },
{ (isc_result_t)0, NULL }
};
isc_result_t
t_dns_result_fromtext(char *name) {
isc_result_t result;
struct dns_errormap *pmap;
result = ISC_R_UNEXPECTED;
pmap = dns_errormap;
while (pmap->text != NULL) {
if (strcmp(name, pmap->text) == 0)
break;
++pmap;
}
if (pmap->text != NULL)
result = pmap->result;
return (result);
}
struct dc_method_map {
unsigned int dc_method;
const char *text;
} dc_method_map[] = {
{ DNS_COMPRESS_NONE, "DNS_COMPRESS_NONE" },
{ DNS_COMPRESS_GLOBAL14, "DNS_COMPRESS_GLOBAL14" },
{ DNS_COMPRESS_ALL, "DNS_COMPRESS_ALL" },
{ 0, NULL }
};
unsigned int
t_dc_method_fromtext(char *name) {
unsigned int dc_method;
struct dc_method_map *pmap;
dc_method = DNS_COMPRESS_NONE;
pmap = dc_method_map;
while (pmap->text != NULL) {
if (strcmp(name, pmap->text) == 0)
break;
++pmap;
}
if (pmap->text != NULL)
dc_method = pmap->dc_method;
return(dc_method);
}
int
t_bustline(char *line, char **toks) {
int cnt;
char *p;
cnt = 0;
if (line && *line) {
while ((p = strtok(line, "\t")) && (cnt < T_MAXTOKS)) {
*toks++ = p;
line = NULL;
++cnt;
}
}
return(cnt);
}
static void
printhelp(void) {
int cnt;
testspec_t *pts;
cnt = 1;
pts = &T_testlist[0];
printf("Available tests:\n");
while (pts->func_name) {
printf("\t%d\t%s\n", cnt, pts->func_name);
++pts;
++cnt;
}
}
static void
printusage(void) {
printf("Usage:\n%s\n", Usage);
}
int
t_eval(const char *filename, int (*func)(char **), int nargs) {
FILE *fp;
char *p;
int line;
int cnt;
int result;
int nfails;
int nprobs;
int npass;
char *tokens[T_MAXTOKS + 1];
npass = 0;
nfails = 0;
nprobs = 0;
fp = fopen(filename, "r");
if (fp != NULL) {
line = 0;
while ((p = t_fgetbs(fp)) != NULL) {
++line;
/*
* Skip comment lines.
*/
if ((isspace((unsigned char)*p)) || (*p == '#')) {
(void)free(p);
continue;
}
cnt = t_bustline(p, tokens);
if (cnt == nargs) {
result = func(tokens);
switch (result) {
case T_PASS:
++npass;
break;
case T_FAIL:
++nfails;
break;
case T_UNTESTED:
break;
default:
++nprobs;
break;
}
} else {
t_info("bad format in %s at line %d\n",
filename, line);
++nprobs;
}
(void)free(p);
}
(void)fclose(fp);
} else {
t_info("Missing datafile %s\n", filename);
++nprobs;
}
result = T_UNRESOLVED;
if (nfails == 0 && nprobs == 0 && npass > 0)
result = T_PASS;
else if (nfails > 0)
result = T_FAIL;
else if (npass == 0)
result = T_UNTESTED;
return (result);
}