108ca345cSEnji Cooper /*- 208ca345cSEnji Cooper * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> 308ca345cSEnji Cooper * All rights reserved. 408ca345cSEnji Cooper * 508ca345cSEnji Cooper * Redistribution and use in source and binary forms, with or without 608ca345cSEnji Cooper * modification, are permitted provided that the following conditions 708ca345cSEnji Cooper * are met: 808ca345cSEnji Cooper * 1. Redistributions of source code must retain the above copyright 908ca345cSEnji Cooper * notice, this list of conditions and the following disclaimer. 1008ca345cSEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1108ca345cSEnji Cooper * notice, this list of conditions and the following disclaimer in the 1208ca345cSEnji Cooper * documentation and/or other materials provided with the distribution. 1308ca345cSEnji Cooper * 1408ca345cSEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1508ca345cSEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1608ca345cSEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1708ca345cSEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1808ca345cSEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1908ca345cSEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2008ca345cSEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2108ca345cSEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2208ca345cSEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2308ca345cSEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2408ca345cSEnji Cooper * SUCH DAMAGE. 2508ca345cSEnji Cooper * 2608ca345cSEnji Cooper */ 2708ca345cSEnji Cooper 2808ca345cSEnji Cooper #include <sys/cdefs.h> 2908ca345cSEnji Cooper __FBSDID("$FreeBSD$"); 3008ca345cSEnji Cooper 3108ca345cSEnji Cooper #include <arpa/inet.h> 3208ca345cSEnji Cooper #include <assert.h> 3308ca345cSEnji Cooper #include <errno.h> 3408ca345cSEnji Cooper #include <netdb.h> 3508ca345cSEnji Cooper #include <stdio.h> 3608ca345cSEnji Cooper #include <stdlib.h> 3708ca345cSEnji Cooper #include <string.h> 3808ca345cSEnji Cooper #include <stringlist.h> 3908ca345cSEnji Cooper #include <unistd.h> 4008ca345cSEnji Cooper 4108ca345cSEnji Cooper #include <atf-c.h> 4208ca345cSEnji Cooper 4308ca345cSEnji Cooper #include "testutil.h" 4408ca345cSEnji Cooper 4508ca345cSEnji Cooper enum test_methods { 4608ca345cSEnji Cooper TEST_GETPROTOENT, 4708ca345cSEnji Cooper TEST_GETPROTOBYNAME, 4808ca345cSEnji Cooper TEST_GETPROTOBYNUMBER, 4908ca345cSEnji Cooper TEST_GETPROTOENT_2PASS, 5008ca345cSEnji Cooper TEST_BUILD_SNAPSHOT 5108ca345cSEnji Cooper }; 5208ca345cSEnji Cooper 5308ca345cSEnji Cooper DECLARE_TEST_DATA(protoent) 5408ca345cSEnji Cooper DECLARE_TEST_FILE_SNAPSHOT(protoent) 5508ca345cSEnji Cooper DECLARE_1PASS_TEST(protoent) 5608ca345cSEnji Cooper DECLARE_2PASS_TEST(protoent) 5708ca345cSEnji Cooper 5808ca345cSEnji Cooper static void clone_protoent(struct protoent *, struct protoent const *); 5908ca345cSEnji Cooper static int compare_protoent(struct protoent *, struct protoent *, void *); 6008ca345cSEnji Cooper static void dump_protoent(struct protoent *); 6108ca345cSEnji Cooper static void free_protoent(struct protoent *); 6208ca345cSEnji Cooper 6308ca345cSEnji Cooper static void sdump_protoent(struct protoent *, char *, size_t); 6408ca345cSEnji Cooper static int protoent_read_snapshot_func(struct protoent *, char *); 6508ca345cSEnji Cooper 6608ca345cSEnji Cooper static int protoent_check_ambiguity(struct protoent_test_data *, 6708ca345cSEnji Cooper struct protoent *); 6808ca345cSEnji Cooper static int protoent_fill_test_data(struct protoent_test_data *); 6908ca345cSEnji Cooper static int protoent_test_correctness(struct protoent *, void *); 7008ca345cSEnji Cooper static int protoent_test_getprotobyname(struct protoent *, void *); 7108ca345cSEnji Cooper static int protoent_test_getprotobynumber(struct protoent *, void *); 7208ca345cSEnji Cooper static int protoent_test_getprotoent(struct protoent *, void *); 7308ca345cSEnji Cooper 7408ca345cSEnji Cooper IMPLEMENT_TEST_DATA(protoent) 7508ca345cSEnji Cooper IMPLEMENT_TEST_FILE_SNAPSHOT(protoent) 7608ca345cSEnji Cooper IMPLEMENT_1PASS_TEST(protoent) 7708ca345cSEnji Cooper IMPLEMENT_2PASS_TEST(protoent) 7808ca345cSEnji Cooper 7908ca345cSEnji Cooper static void 8008ca345cSEnji Cooper clone_protoent(struct protoent *dest, struct protoent const *src) 8108ca345cSEnji Cooper { 8208ca345cSEnji Cooper assert(dest != NULL); 8308ca345cSEnji Cooper assert(src != NULL); 8408ca345cSEnji Cooper 8508ca345cSEnji Cooper char **cp; 8608ca345cSEnji Cooper int aliases_num; 8708ca345cSEnji Cooper 8808ca345cSEnji Cooper memset(dest, 0, sizeof(struct protoent)); 8908ca345cSEnji Cooper 9008ca345cSEnji Cooper if (src->p_name != NULL) { 9108ca345cSEnji Cooper dest->p_name = strdup(src->p_name); 9208ca345cSEnji Cooper assert(dest->p_name != NULL); 9308ca345cSEnji Cooper } 9408ca345cSEnji Cooper 9508ca345cSEnji Cooper dest->p_proto = src->p_proto; 9608ca345cSEnji Cooper 9708ca345cSEnji Cooper if (src->p_aliases != NULL) { 9808ca345cSEnji Cooper aliases_num = 0; 9908ca345cSEnji Cooper for (cp = src->p_aliases; *cp; ++cp) 10008ca345cSEnji Cooper ++aliases_num; 10108ca345cSEnji Cooper 10208ca345cSEnji Cooper dest->p_aliases = calloc(1, (aliases_num+1) * sizeof(char *)); 10308ca345cSEnji Cooper assert(dest->p_aliases != NULL); 10408ca345cSEnji Cooper 10508ca345cSEnji Cooper for (cp = src->p_aliases; *cp; ++cp) { 10608ca345cSEnji Cooper dest->p_aliases[cp - src->p_aliases] = strdup(*cp); 10708ca345cSEnji Cooper assert(dest->p_aliases[cp - src->p_aliases] != NULL); 10808ca345cSEnji Cooper } 10908ca345cSEnji Cooper } 11008ca345cSEnji Cooper } 11108ca345cSEnji Cooper 11208ca345cSEnji Cooper static void 11308ca345cSEnji Cooper free_protoent(struct protoent *pe) 11408ca345cSEnji Cooper { 11508ca345cSEnji Cooper char **cp; 11608ca345cSEnji Cooper 11708ca345cSEnji Cooper assert(pe != NULL); 11808ca345cSEnji Cooper 11908ca345cSEnji Cooper free(pe->p_name); 12008ca345cSEnji Cooper 12108ca345cSEnji Cooper for (cp = pe->p_aliases; *cp; ++cp) 12208ca345cSEnji Cooper free(*cp); 12308ca345cSEnji Cooper free(pe->p_aliases); 12408ca345cSEnji Cooper } 12508ca345cSEnji Cooper 12608ca345cSEnji Cooper static int 12708ca345cSEnji Cooper compare_protoent(struct protoent *pe1, struct protoent *pe2, void *mdata) 12808ca345cSEnji Cooper { 12908ca345cSEnji Cooper char **c1, **c2; 13008ca345cSEnji Cooper 13108ca345cSEnji Cooper if (pe1 == pe2) 13208ca345cSEnji Cooper return 0; 13308ca345cSEnji Cooper 13408ca345cSEnji Cooper if ((pe1 == NULL) || (pe2 == NULL)) 13508ca345cSEnji Cooper goto errfin; 13608ca345cSEnji Cooper 13708ca345cSEnji Cooper if ((strcmp(pe1->p_name, pe2->p_name) != 0) || 13808ca345cSEnji Cooper (pe1->p_proto != pe2->p_proto)) 13908ca345cSEnji Cooper goto errfin; 14008ca345cSEnji Cooper 14108ca345cSEnji Cooper c1 = pe1->p_aliases; 14208ca345cSEnji Cooper c2 = pe2->p_aliases; 14308ca345cSEnji Cooper 14408ca345cSEnji Cooper if ((pe1->p_aliases == NULL) || (pe2->p_aliases == NULL)) 14508ca345cSEnji Cooper goto errfin; 14608ca345cSEnji Cooper 14708ca345cSEnji Cooper for (;*c1 && *c2; ++c1, ++c2) 14808ca345cSEnji Cooper if (strcmp(*c1, *c2) != 0) 14908ca345cSEnji Cooper goto errfin; 15008ca345cSEnji Cooper 15108ca345cSEnji Cooper if ((*c1 != '\0') || (*c2 != '\0')) 15208ca345cSEnji Cooper goto errfin; 15308ca345cSEnji Cooper 15408ca345cSEnji Cooper return 0; 15508ca345cSEnji Cooper 15608ca345cSEnji Cooper errfin: 15708ca345cSEnji Cooper if (mdata == NULL) { 15808ca345cSEnji Cooper printf("following structures are not equal:\n"); 15908ca345cSEnji Cooper dump_protoent(pe1); 16008ca345cSEnji Cooper dump_protoent(pe2); 16108ca345cSEnji Cooper } 16208ca345cSEnji Cooper 16308ca345cSEnji Cooper return (-1); 16408ca345cSEnji Cooper } 16508ca345cSEnji Cooper 16608ca345cSEnji Cooper static void 16708ca345cSEnji Cooper sdump_protoent(struct protoent *pe, char *buffer, size_t buflen) 16808ca345cSEnji Cooper { 16908ca345cSEnji Cooper char **cp; 17008ca345cSEnji Cooper int written; 17108ca345cSEnji Cooper 17208ca345cSEnji Cooper written = snprintf(buffer, buflen, "%s %d", 17308ca345cSEnji Cooper pe->p_name, pe->p_proto); 17408ca345cSEnji Cooper buffer += written; 17508ca345cSEnji Cooper if (written > buflen) 17608ca345cSEnji Cooper return; 17708ca345cSEnji Cooper buflen -= written; 17808ca345cSEnji Cooper 17908ca345cSEnji Cooper if (pe->p_aliases != NULL) { 18008ca345cSEnji Cooper if (*(pe->p_aliases) != '\0') { 18108ca345cSEnji Cooper for (cp = pe->p_aliases; *cp; ++cp) { 18208ca345cSEnji Cooper written = snprintf(buffer, buflen, " %s",*cp); 18308ca345cSEnji Cooper buffer += written; 18408ca345cSEnji Cooper if (written > buflen) 18508ca345cSEnji Cooper return; 18608ca345cSEnji Cooper buflen -= written; 18708ca345cSEnji Cooper 18808ca345cSEnji Cooper if (buflen == 0) 18908ca345cSEnji Cooper return; 19008ca345cSEnji Cooper } 19108ca345cSEnji Cooper } else 19208ca345cSEnji Cooper snprintf(buffer, buflen, " noaliases"); 19308ca345cSEnji Cooper } else 19408ca345cSEnji Cooper snprintf(buffer, buflen, " (null)"); 19508ca345cSEnji Cooper } 19608ca345cSEnji Cooper 19708ca345cSEnji Cooper static int 19808ca345cSEnji Cooper protoent_read_snapshot_func(struct protoent *pe, char *line) 19908ca345cSEnji Cooper { 20008ca345cSEnji Cooper StringList *sl; 20108ca345cSEnji Cooper char *s, *ps, *ts; 20208ca345cSEnji Cooper int i; 20308ca345cSEnji Cooper 20408ca345cSEnji Cooper printf("1 line read from snapshot:\n%s\n", line); 20508ca345cSEnji Cooper 20608ca345cSEnji Cooper i = 0; 20708ca345cSEnji Cooper sl = NULL; 20808ca345cSEnji Cooper ps = line; 20908ca345cSEnji Cooper memset(pe, 0, sizeof(struct protoent)); 21008ca345cSEnji Cooper while ( (s = strsep(&ps, " ")) != NULL) { 21108ca345cSEnji Cooper switch (i) { 21208ca345cSEnji Cooper case 0: 21308ca345cSEnji Cooper pe->p_name = strdup(s); 21408ca345cSEnji Cooper assert(pe->p_name != NULL); 21508ca345cSEnji Cooper break; 21608ca345cSEnji Cooper 21708ca345cSEnji Cooper case 1: 21808ca345cSEnji Cooper pe->p_proto = (int)strtol(s, &ts, 10); 21908ca345cSEnji Cooper if (*ts != '\0') { 22008ca345cSEnji Cooper free(pe->p_name); 22108ca345cSEnji Cooper return (-1); 22208ca345cSEnji Cooper } 22308ca345cSEnji Cooper break; 22408ca345cSEnji Cooper 22508ca345cSEnji Cooper default: 22608ca345cSEnji Cooper if (sl == NULL) { 22708ca345cSEnji Cooper if (strcmp(s, "(null)") == 0) 22808ca345cSEnji Cooper return (0); 22908ca345cSEnji Cooper 23008ca345cSEnji Cooper sl = sl_init(); 23108ca345cSEnji Cooper assert(sl != NULL); 23208ca345cSEnji Cooper 23308ca345cSEnji Cooper if (strcmp(s, "noaliases") != 0) { 23408ca345cSEnji Cooper ts = strdup(s); 23508ca345cSEnji Cooper assert(ts != NULL); 23608ca345cSEnji Cooper sl_add(sl, ts); 23708ca345cSEnji Cooper } 23808ca345cSEnji Cooper } else { 23908ca345cSEnji Cooper ts = strdup(s); 24008ca345cSEnji Cooper assert(ts != NULL); 24108ca345cSEnji Cooper sl_add(sl, ts); 24208ca345cSEnji Cooper } 24308ca345cSEnji Cooper break; 24408ca345cSEnji Cooper } 24508ca345cSEnji Cooper ++i; 24608ca345cSEnji Cooper } 24708ca345cSEnji Cooper 24808ca345cSEnji Cooper if (i < 3) { 24908ca345cSEnji Cooper free(pe->p_name); 25008ca345cSEnji Cooper memset(pe, 0, sizeof(struct protoent)); 25108ca345cSEnji Cooper return (-1); 25208ca345cSEnji Cooper } 25308ca345cSEnji Cooper 25408ca345cSEnji Cooper sl_add(sl, NULL); 25508ca345cSEnji Cooper pe->p_aliases = sl->sl_str; 25608ca345cSEnji Cooper 25708ca345cSEnji Cooper /* NOTE: is it a dirty hack or not? */ 25808ca345cSEnji Cooper free(sl); 25908ca345cSEnji Cooper return (0); 26008ca345cSEnji Cooper } 26108ca345cSEnji Cooper 26208ca345cSEnji Cooper static void 26308ca345cSEnji Cooper dump_protoent(struct protoent *result) 26408ca345cSEnji Cooper { 26508ca345cSEnji Cooper if (result != NULL) { 26608ca345cSEnji Cooper char buffer[1024]; 26708ca345cSEnji Cooper sdump_protoent(result, buffer, sizeof(buffer)); 26808ca345cSEnji Cooper printf("%s\n", buffer); 26908ca345cSEnji Cooper } else 27008ca345cSEnji Cooper printf("(null)\n"); 27108ca345cSEnji Cooper } 27208ca345cSEnji Cooper 27308ca345cSEnji Cooper static int 27408ca345cSEnji Cooper protoent_fill_test_data(struct protoent_test_data *td) 27508ca345cSEnji Cooper { 27608ca345cSEnji Cooper struct protoent *pe; 27708ca345cSEnji Cooper 27808ca345cSEnji Cooper setprotoent(1); 27908ca345cSEnji Cooper while ((pe = getprotoent()) != NULL) { 28008ca345cSEnji Cooper if (protoent_test_correctness(pe, NULL) == 0) 28108ca345cSEnji Cooper TEST_DATA_APPEND(protoent, td, pe); 28208ca345cSEnji Cooper else 28308ca345cSEnji Cooper return (-1); 28408ca345cSEnji Cooper } 28508ca345cSEnji Cooper endprotoent(); 28608ca345cSEnji Cooper 28708ca345cSEnji Cooper return (0); 28808ca345cSEnji Cooper } 28908ca345cSEnji Cooper 29008ca345cSEnji Cooper static int 29108ca345cSEnji Cooper protoent_test_correctness(struct protoent *pe, void *mdata) 29208ca345cSEnji Cooper { 29308ca345cSEnji Cooper printf("testing correctness with the following data:\n"); 29408ca345cSEnji Cooper dump_protoent(pe); 29508ca345cSEnji Cooper 29608ca345cSEnji Cooper if (pe == NULL) 29708ca345cSEnji Cooper goto errfin; 29808ca345cSEnji Cooper 29908ca345cSEnji Cooper if (pe->p_name == NULL) 30008ca345cSEnji Cooper goto errfin; 30108ca345cSEnji Cooper 30208ca345cSEnji Cooper if (pe->p_proto < 0) 30308ca345cSEnji Cooper goto errfin; 30408ca345cSEnji Cooper 30508ca345cSEnji Cooper if (pe->p_aliases == NULL) 30608ca345cSEnji Cooper goto errfin; 30708ca345cSEnji Cooper 30808ca345cSEnji Cooper printf("correct\n"); 30908ca345cSEnji Cooper 31008ca345cSEnji Cooper return (0); 31108ca345cSEnji Cooper errfin: 31208ca345cSEnji Cooper printf("incorrect\n"); 31308ca345cSEnji Cooper 31408ca345cSEnji Cooper return (-1); 31508ca345cSEnji Cooper } 31608ca345cSEnji Cooper 31708ca345cSEnji Cooper /* protoent_check_ambiguity() is needed when one port+proto is associated with 318*32223c1bSPedro F. Giffuni * more than one piece (these cases are usually marked as PROBLEM in 319*32223c1bSPedro F. Giffuni * /etc/peices. This functions is needed also when one piece+proto is 32008ca345cSEnji Cooper * associated with several ports. We have to check all the protoent structures 32108ca345cSEnji Cooper * to make sure that pe really exists and correct */ 32208ca345cSEnji Cooper static int 32308ca345cSEnji Cooper protoent_check_ambiguity(struct protoent_test_data *td, struct protoent *pe) 32408ca345cSEnji Cooper { 32508ca345cSEnji Cooper 32608ca345cSEnji Cooper return (TEST_DATA_FIND(protoent, td, pe, compare_protoent, 32708ca345cSEnji Cooper NULL) != NULL ? 0 : -1); 32808ca345cSEnji Cooper } 32908ca345cSEnji Cooper 33008ca345cSEnji Cooper static int 33108ca345cSEnji Cooper protoent_test_getprotobyname(struct protoent *pe_model, void *mdata) 33208ca345cSEnji Cooper { 33308ca345cSEnji Cooper char **alias; 33408ca345cSEnji Cooper struct protoent *pe; 33508ca345cSEnji Cooper 33608ca345cSEnji Cooper printf("testing getprotobyname() with the following data:\n"); 33708ca345cSEnji Cooper dump_protoent(pe_model); 33808ca345cSEnji Cooper 33908ca345cSEnji Cooper pe = getprotobyname(pe_model->p_name); 34008ca345cSEnji Cooper if (protoent_test_correctness(pe, NULL) != 0) 34108ca345cSEnji Cooper goto errfin; 34208ca345cSEnji Cooper 34308ca345cSEnji Cooper if ((compare_protoent(pe, pe_model, NULL) != 0) && 34408ca345cSEnji Cooper (protoent_check_ambiguity((struct protoent_test_data *)mdata, pe) 34508ca345cSEnji Cooper !=0)) 34608ca345cSEnji Cooper goto errfin; 34708ca345cSEnji Cooper 34808ca345cSEnji Cooper for (alias = pe_model->p_aliases; *alias; ++alias) { 34908ca345cSEnji Cooper pe = getprotobyname(*alias); 35008ca345cSEnji Cooper 35108ca345cSEnji Cooper if (protoent_test_correctness(pe, NULL) != 0) 35208ca345cSEnji Cooper goto errfin; 35308ca345cSEnji Cooper 35408ca345cSEnji Cooper if ((compare_protoent(pe, pe_model, NULL) != 0) && 35508ca345cSEnji Cooper (protoent_check_ambiguity( 35608ca345cSEnji Cooper (struct protoent_test_data *)mdata, pe) != 0)) 35708ca345cSEnji Cooper goto errfin; 35808ca345cSEnji Cooper } 35908ca345cSEnji Cooper 36008ca345cSEnji Cooper printf("ok\n"); 36108ca345cSEnji Cooper return (0); 36208ca345cSEnji Cooper 36308ca345cSEnji Cooper errfin: 36408ca345cSEnji Cooper printf("not ok\n"); 36508ca345cSEnji Cooper 36608ca345cSEnji Cooper return (-1); 36708ca345cSEnji Cooper } 36808ca345cSEnji Cooper 36908ca345cSEnji Cooper static int 37008ca345cSEnji Cooper protoent_test_getprotobynumber(struct protoent *pe_model, void *mdata) 37108ca345cSEnji Cooper { 37208ca345cSEnji Cooper struct protoent *pe; 37308ca345cSEnji Cooper 37408ca345cSEnji Cooper printf("testing getprotobyport() with the following data...\n"); 37508ca345cSEnji Cooper dump_protoent(pe_model); 37608ca345cSEnji Cooper 37708ca345cSEnji Cooper pe = getprotobynumber(pe_model->p_proto); 37808ca345cSEnji Cooper if ((protoent_test_correctness(pe, NULL) != 0) || 37908ca345cSEnji Cooper ((compare_protoent(pe, pe_model, NULL) != 0) && 38008ca345cSEnji Cooper (protoent_check_ambiguity((struct protoent_test_data *)mdata, pe) 38108ca345cSEnji Cooper != 0))) { 38208ca345cSEnji Cooper printf("not ok\n"); 38308ca345cSEnji Cooper return (-1); 38408ca345cSEnji Cooper } else { 38508ca345cSEnji Cooper printf("ok\n"); 38608ca345cSEnji Cooper return (0); 38708ca345cSEnji Cooper } 38808ca345cSEnji Cooper } 38908ca345cSEnji Cooper 39008ca345cSEnji Cooper static int 39108ca345cSEnji Cooper protoent_test_getprotoent(struct protoent *pe, void *mdata) 39208ca345cSEnji Cooper { 39308ca345cSEnji Cooper /* Only correctness can be checked when doing 1-pass test for 39408ca345cSEnji Cooper * getprotoent(). */ 39508ca345cSEnji Cooper return (protoent_test_correctness(pe, NULL)); 39608ca345cSEnji Cooper } 39708ca345cSEnji Cooper 39808ca345cSEnji Cooper int 39908ca345cSEnji Cooper run_tests(const char *snapshot_file, enum test_methods method) 40008ca345cSEnji Cooper { 40108ca345cSEnji Cooper struct protoent_test_data td, td_snap, td_2pass; 40208ca345cSEnji Cooper int rv; 40308ca345cSEnji Cooper 40408ca345cSEnji Cooper TEST_DATA_INIT(protoent, &td, clone_protoent, free_protoent); 40508ca345cSEnji Cooper TEST_DATA_INIT(protoent, &td_snap, clone_protoent, free_protoent); 40608ca345cSEnji Cooper if (snapshot_file != NULL) { 40708ca345cSEnji Cooper if (access(snapshot_file, W_OK | R_OK) != 0) { 40808ca345cSEnji Cooper if (errno == ENOENT) 40908ca345cSEnji Cooper method = TEST_BUILD_SNAPSHOT; 41008ca345cSEnji Cooper else { 41108ca345cSEnji Cooper printf("can't access the file %s\n", 41208ca345cSEnji Cooper snapshot_file); 41308ca345cSEnji Cooper 41408ca345cSEnji Cooper rv = -1; 41508ca345cSEnji Cooper goto fin; 41608ca345cSEnji Cooper } 41708ca345cSEnji Cooper } else { 41808ca345cSEnji Cooper if (method == TEST_BUILD_SNAPSHOT) { 41908ca345cSEnji Cooper rv = 0; 42008ca345cSEnji Cooper goto fin; 42108ca345cSEnji Cooper } 42208ca345cSEnji Cooper 42308ca345cSEnji Cooper TEST_SNAPSHOT_FILE_READ(protoent, snapshot_file, 42408ca345cSEnji Cooper &td_snap, protoent_read_snapshot_func); 42508ca345cSEnji Cooper } 42608ca345cSEnji Cooper } 42708ca345cSEnji Cooper 42808ca345cSEnji Cooper rv = protoent_fill_test_data(&td); 42908ca345cSEnji Cooper if (rv == -1) 43008ca345cSEnji Cooper return (-1); 43108ca345cSEnji Cooper switch (method) { 43208ca345cSEnji Cooper case TEST_GETPROTOBYNAME: 43308ca345cSEnji Cooper if (snapshot_file == NULL) 43408ca345cSEnji Cooper rv = DO_1PASS_TEST(protoent, &td, 43508ca345cSEnji Cooper protoent_test_getprotobyname, (void *)&td); 43608ca345cSEnji Cooper else 43708ca345cSEnji Cooper rv = DO_1PASS_TEST(protoent, &td_snap, 43808ca345cSEnji Cooper protoent_test_getprotobyname, (void *)&td_snap); 43908ca345cSEnji Cooper break; 44008ca345cSEnji Cooper case TEST_GETPROTOBYNUMBER: 44108ca345cSEnji Cooper if (snapshot_file == NULL) 44208ca345cSEnji Cooper rv = DO_1PASS_TEST(protoent, &td, 44308ca345cSEnji Cooper protoent_test_getprotobynumber, (void *)&td); 44408ca345cSEnji Cooper else 44508ca345cSEnji Cooper rv = DO_1PASS_TEST(protoent, &td_snap, 44608ca345cSEnji Cooper protoent_test_getprotobynumber, (void *)&td_snap); 44708ca345cSEnji Cooper break; 44808ca345cSEnji Cooper case TEST_GETPROTOENT: 44908ca345cSEnji Cooper if (snapshot_file == NULL) 45008ca345cSEnji Cooper rv = DO_1PASS_TEST(protoent, &td, 45108ca345cSEnji Cooper protoent_test_getprotoent, (void *)&td); 45208ca345cSEnji Cooper else 45308ca345cSEnji Cooper rv = DO_2PASS_TEST(protoent, &td, &td_snap, 45408ca345cSEnji Cooper compare_protoent, NULL); 45508ca345cSEnji Cooper break; 45608ca345cSEnji Cooper case TEST_GETPROTOENT_2PASS: 45708ca345cSEnji Cooper TEST_DATA_INIT(protoent, &td_2pass, clone_protoent, 45808ca345cSEnji Cooper free_protoent); 45908ca345cSEnji Cooper rv = protoent_fill_test_data(&td_2pass); 46008ca345cSEnji Cooper if (rv != -1) 46108ca345cSEnji Cooper rv = DO_2PASS_TEST(protoent, &td, &td_2pass, 46208ca345cSEnji Cooper compare_protoent, NULL); 46308ca345cSEnji Cooper TEST_DATA_DESTROY(protoent, &td_2pass); 46408ca345cSEnji Cooper break; 46508ca345cSEnji Cooper case TEST_BUILD_SNAPSHOT: 46608ca345cSEnji Cooper if (snapshot_file != NULL) 46708ca345cSEnji Cooper rv = TEST_SNAPSHOT_FILE_WRITE(protoent, snapshot_file, 46808ca345cSEnji Cooper &td, sdump_protoent); 46908ca345cSEnji Cooper break; 47008ca345cSEnji Cooper default: 47108ca345cSEnji Cooper rv = 0; 47208ca345cSEnji Cooper break; 47308ca345cSEnji Cooper } 47408ca345cSEnji Cooper 47508ca345cSEnji Cooper fin: 47608ca345cSEnji Cooper TEST_DATA_DESTROY(protoent, &td_snap); 47708ca345cSEnji Cooper TEST_DATA_DESTROY(protoent, &td); 47808ca345cSEnji Cooper 47908ca345cSEnji Cooper return (rv); 48008ca345cSEnji Cooper } 48108ca345cSEnji Cooper 48208ca345cSEnji Cooper #define SNAPSHOT_FILE "snapshot_proto" 48308ca345cSEnji Cooper 48408ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(build_snapshot); 48508ca345cSEnji Cooper ATF_TC_BODY(build_snapshot, tc) 48608ca345cSEnji Cooper { 48708ca345cSEnji Cooper 48808ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0); 48908ca345cSEnji Cooper } 49008ca345cSEnji Cooper 49108ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotoent); 49208ca345cSEnji Cooper ATF_TC_BODY(getprotoent, tc) 49308ca345cSEnji Cooper { 49408ca345cSEnji Cooper 49508ca345cSEnji Cooper ATF_REQUIRE(run_tests(NULL, TEST_GETPROTOENT) == 0); 49608ca345cSEnji Cooper } 49708ca345cSEnji Cooper 49808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotoent_with_snapshot); 49908ca345cSEnji Cooper ATF_TC_BODY(getprotoent_with_snapshot, tc) 50008ca345cSEnji Cooper { 50108ca345cSEnji Cooper 50208ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0); 50308ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPROTOENT) == 0); 50408ca345cSEnji Cooper } 50508ca345cSEnji Cooper 50608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotoent_with_two_pass); 50708ca345cSEnji Cooper ATF_TC_BODY(getprotoent_with_two_pass, tc) 50808ca345cSEnji Cooper { 50908ca345cSEnji Cooper 51008ca345cSEnji Cooper ATF_REQUIRE(run_tests(NULL, TEST_GETPROTOENT_2PASS) == 0); 51108ca345cSEnji Cooper } 51208ca345cSEnji Cooper 51308ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotobyname); 51408ca345cSEnji Cooper ATF_TC_BODY(getprotobyname, tc) 51508ca345cSEnji Cooper { 51608ca345cSEnji Cooper 51708ca345cSEnji Cooper ATF_REQUIRE(run_tests(NULL, TEST_GETPROTOBYNAME) == 0); 51808ca345cSEnji Cooper } 51908ca345cSEnji Cooper 52008ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotobyname_with_snapshot); 52108ca345cSEnji Cooper ATF_TC_BODY(getprotobyname_with_snapshot, tc) 52208ca345cSEnji Cooper { 52308ca345cSEnji Cooper 52408ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0); 52508ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPROTOBYNAME) == 0); 52608ca345cSEnji Cooper } 52708ca345cSEnji Cooper 52808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotobynumber); 52908ca345cSEnji Cooper ATF_TC_BODY(getprotobynumber, tc) 53008ca345cSEnji Cooper { 53108ca345cSEnji Cooper 53208ca345cSEnji Cooper ATF_REQUIRE(run_tests(NULL, TEST_GETPROTOBYNUMBER) == 0); 53308ca345cSEnji Cooper } 53408ca345cSEnji Cooper 53508ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getprotobynumber_with_snapshot); 53608ca345cSEnji Cooper ATF_TC_BODY(getprotobynumber_with_snapshot, tc) 53708ca345cSEnji Cooper { 53808ca345cSEnji Cooper 53908ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0); 54008ca345cSEnji Cooper ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPROTOBYNUMBER) == 0); 54108ca345cSEnji Cooper } 54208ca345cSEnji Cooper 54308ca345cSEnji Cooper ATF_TP_ADD_TCS(tp) 54408ca345cSEnji Cooper { 54508ca345cSEnji Cooper 54608ca345cSEnji Cooper ATF_TP_ADD_TC(tp, build_snapshot); 54708ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotoent); 54808ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotoent_with_snapshot); 54908ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotoent_with_two_pass); 55008ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotobyname); 55108ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotobyname_with_snapshot); 55208ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotobynumber); 55308ca345cSEnji Cooper ATF_TP_ADD_TC(tp, getprotobynumber_with_snapshot); 55408ca345cSEnji Cooper 55508ca345cSEnji Cooper return (atf_no_error()); 55608ca345cSEnji Cooper } 557