1168754Sbushman/*- 2168754Sbushman * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> 3251867Seadler * All rights reserved. 4168754Sbushman * 5168754Sbushman * Redistribution and use in source and binary forms, with or without 6168754Sbushman * modification, are permitted provided that the following conditions 7168754Sbushman * are met: 8168754Sbushman * 1. Redistributions of source code must retain the above copyright 9168754Sbushman * notice, this list of conditions and the following disclaimer. 10168754Sbushman * 2. Redistributions in binary form must reproduce the above copyright 11168754Sbushman * notice, this list of conditions and the following disclaimer in the 12168754Sbushman * documentation and/or other materials provided with the distribution. 13168754Sbushman * 14168754Sbushman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15168754Sbushman * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16168754Sbushman * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17168754Sbushman * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18168754Sbushman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19168754Sbushman * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20168754Sbushman * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21168754Sbushman * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22168754Sbushman * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23168754Sbushman * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24168754Sbushman * SUCH DAMAGE. 25168754Sbushman * 26168754Sbushman */ 27168754Sbushman 28168754Sbushman#include <sys/cdefs.h> 29168754Sbushman__FBSDID("$FreeBSD$"); 30168754Sbushman 31168754Sbushman#include <arpa/inet.h> 32168754Sbushman#include <assert.h> 33168754Sbushman#include <errno.h> 34168754Sbushman#include <netdb.h> 35168754Sbushman#include <stdio.h> 36168754Sbushman#include <stdlib.h> 37168754Sbushman#include <string.h> 38168754Sbushman#include <stringlist.h> 39168754Sbushman#include <unistd.h> 40168754Sbushman#include "testutil.h" 41168754Sbushman 42168754Sbushmanenum test_methods { 43168754Sbushman TEST_GETSERVENT, 44168754Sbushman TEST_GETSERVBYNAME, 45168754Sbushman TEST_GETSERVBYPORT, 46168754Sbushman TEST_GETSERVENT_2PASS, 47168754Sbushman TEST_BUILD_SNAPSHOT 48168754Sbushman}; 49168754Sbushman 50168754Sbushmanstatic int debug = 0; 51168754Sbushmanstatic enum test_methods method = TEST_BUILD_SNAPSHOT; 52168754Sbushman 53168754SbushmanDECLARE_TEST_DATA(servent) 54168754SbushmanDECLARE_TEST_FILE_SNAPSHOT(servent) 55168754SbushmanDECLARE_1PASS_TEST(servent) 56168754SbushmanDECLARE_2PASS_TEST(servent) 57168754Sbushman 58168754Sbushmanstatic void clone_servent(struct servent *, struct servent const *); 59168754Sbushmanstatic int compare_servent(struct servent *, struct servent *, void *); 60168754Sbushmanstatic void dump_servent(struct servent *); 61168754Sbushmanstatic void free_servent(struct servent *); 62168754Sbushman 63168754Sbushmanstatic void sdump_servent(struct servent *, char *, size_t); 64168754Sbushmanstatic int servent_read_snapshot_func(struct servent *, char *); 65168754Sbushman 66168754Sbushmanstatic int servent_check_ambiguity(struct servent_test_data *, 67168754Sbushman struct servent *); 68168754Sbushmanstatic int servent_fill_test_data(struct servent_test_data *); 69168754Sbushmanstatic int servent_test_correctness(struct servent *, void *); 70168754Sbushmanstatic int servent_test_getservbyname(struct servent *, void *); 71168754Sbushmanstatic int servent_test_getservbyport(struct servent *, void *); 72168754Sbushmanstatic int servent_test_getservent(struct servent *, void *); 73168754Sbushman 74168754Sbushmanstatic void usage(void) __attribute__((__noreturn__)); 75168754Sbushman 76168754SbushmanIMPLEMENT_TEST_DATA(servent) 77168754SbushmanIMPLEMENT_TEST_FILE_SNAPSHOT(servent) 78168754SbushmanIMPLEMENT_1PASS_TEST(servent) 79168754SbushmanIMPLEMENT_2PASS_TEST(servent) 80168754Sbushman 81168754Sbushmanstatic void 82168754Sbushmanclone_servent(struct servent *dest, struct servent const *src) 83168754Sbushman{ 84168754Sbushman assert(dest != NULL); 85168754Sbushman assert(src != NULL); 86168754Sbushman 87168754Sbushman char **cp; 88168754Sbushman int aliases_num; 89168754Sbushman 90168754Sbushman memset(dest, 0, sizeof(struct servent)); 91168754Sbushman 92168754Sbushman if (src->s_name != NULL) { 93168754Sbushman dest->s_name = strdup(src->s_name); 94168754Sbushman assert(dest->s_name != NULL); 95168754Sbushman } 96168754Sbushman 97168754Sbushman if (src->s_proto != NULL) { 98168754Sbushman dest->s_proto = strdup(src->s_proto); 99168754Sbushman assert(dest->s_proto != NULL); 100168754Sbushman } 101168754Sbushman dest->s_port = src->s_port; 102168754Sbushman 103168754Sbushman if (src->s_aliases != NULL) { 104168754Sbushman aliases_num = 0; 105168754Sbushman for (cp = src->s_aliases; *cp; ++cp) 106168754Sbushman ++aliases_num; 107168754Sbushman 108168754Sbushman dest->s_aliases = (char **)malloc((aliases_num+1) * (sizeof(char *))); 109168754Sbushman assert(dest->s_aliases != NULL); 110168754Sbushman memset(dest->s_aliases, 0, (aliases_num+1) * (sizeof(char *))); 111168754Sbushman 112168754Sbushman for (cp = src->s_aliases; *cp; ++cp) { 113168754Sbushman dest->s_aliases[cp - src->s_aliases] = strdup(*cp); 114168754Sbushman assert(dest->s_aliases[cp - src->s_aliases] != NULL); 115168754Sbushman } 116168754Sbushman } 117168754Sbushman} 118168754Sbushman 119168754Sbushmanstatic void 120168754Sbushmanfree_servent(struct servent *serv) 121168754Sbushman{ 122168754Sbushman char **cp; 123168754Sbushman 124168754Sbushman assert(serv != NULL); 125168754Sbushman 126168754Sbushman free(serv->s_name); 127168754Sbushman free(serv->s_proto); 128168754Sbushman 129168754Sbushman for (cp = serv->s_aliases; *cp; ++cp) 130168754Sbushman free(*cp); 131168754Sbushman free(serv->s_aliases); 132168754Sbushman} 133168754Sbushman 134168754Sbushmanstatic int 135168754Sbushmancompare_servent(struct servent *serv1, struct servent *serv2, void *mdata) 136168754Sbushman{ 137168754Sbushman char **c1, **c2; 138168754Sbushman 139168754Sbushman if (serv1 == serv2) 140168754Sbushman return 0; 141168754Sbushman 142168754Sbushman if ((serv1 == NULL) || (serv2 == NULL)) 143168754Sbushman goto errfin; 144168754Sbushman 145168754Sbushman if ((strcmp(serv1->s_name, serv2->s_name) != 0) || 146168754Sbushman (strcmp(serv1->s_proto, serv2->s_proto) != 0) || 147168754Sbushman (serv1->s_port != serv2->s_port)) 148168754Sbushman goto errfin; 149168754Sbushman 150168754Sbushman c1 = serv1->s_aliases; 151168754Sbushman c2 = serv2->s_aliases; 152168754Sbushman 153168754Sbushman if ((serv1->s_aliases == NULL) || (serv2->s_aliases == NULL)) 154168754Sbushman goto errfin; 155168754Sbushman 156168754Sbushman for (;*c1 && *c2; ++c1, ++c2) 157168754Sbushman if (strcmp(*c1, *c2) != 0) 158168754Sbushman goto errfin; 159168754Sbushman 160168754Sbushman if ((*c1 != '\0') || (*c2 != '\0')) 161168754Sbushman goto errfin; 162168754Sbushman 163168754Sbushman return 0; 164168754Sbushman 165168754Sbushmanerrfin: 166168754Sbushman if ((debug) && (mdata == NULL)) { 167168754Sbushman printf("following structures are not equal:\n"); 168168754Sbushman dump_servent(serv1); 169168754Sbushman dump_servent(serv2); 170168754Sbushman } 171168754Sbushman 172168754Sbushman return (-1); 173168754Sbushman} 174168754Sbushman 175168754Sbushmanstatic void 176168754Sbushmansdump_servent(struct servent *serv, char *buffer, size_t buflen) 177168754Sbushman{ 178168754Sbushman char **cp; 179168754Sbushman int written; 180168754Sbushman 181168754Sbushman written = snprintf(buffer, buflen, "%s %d %s", 182168754Sbushman serv->s_name, ntohs(serv->s_port), serv->s_proto); 183168754Sbushman buffer += written; 184168754Sbushman if (written > buflen) 185168754Sbushman return; 186168754Sbushman buflen -= written; 187168754Sbushman 188168754Sbushman if (serv->s_aliases != NULL) { 189168754Sbushman if (*(serv->s_aliases) != '\0') { 190168754Sbushman for (cp = serv->s_aliases; *cp; ++cp) { 191168754Sbushman written = snprintf(buffer, buflen, " %s",*cp); 192168754Sbushman buffer += written; 193168754Sbushman if (written > buflen) 194168754Sbushman return; 195168754Sbushman buflen -= written; 196168754Sbushman 197168754Sbushman if (buflen == 0) 198168754Sbushman return; 199168754Sbushman } 200168754Sbushman } else 201168754Sbushman snprintf(buffer, buflen, " noaliases"); 202168754Sbushman } else 203168754Sbushman snprintf(buffer, buflen, " (null)"); 204168754Sbushman} 205168754Sbushman 206168754Sbushmanstatic int 207168754Sbushmanservent_read_snapshot_func(struct servent *serv, char *line) 208168754Sbushman{ 209168754Sbushman StringList *sl; 210168754Sbushman char *s, *ps, *ts; 211168754Sbushman int i; 212168754Sbushman 213168754Sbushman if (debug) 214168754Sbushman printf("1 line read from snapshot:\n%s\n", line); 215168754Sbushman 216168754Sbushman i = 0; 217168754Sbushman sl = NULL; 218168754Sbushman ps = line; 219168754Sbushman memset(serv, 0, sizeof(struct servent)); 220168754Sbushman while ( (s = strsep(&ps, " ")) != NULL) { 221168754Sbushman switch (i) { 222168754Sbushman case 0: 223168754Sbushman serv->s_name = strdup(s); 224168754Sbushman assert(serv->s_name != NULL); 225168754Sbushman break; 226168754Sbushman 227168754Sbushman case 1: 228168754Sbushman serv->s_port = htons( 229168754Sbushman (int)strtol(s, &ts, 10)); 230168754Sbushman if (*ts != '\0') { 231168754Sbushman free(serv->s_name); 232168754Sbushman return (-1); 233168754Sbushman } 234168754Sbushman break; 235168754Sbushman 236168754Sbushman case 2: 237168754Sbushman serv->s_proto = strdup(s); 238168754Sbushman assert(serv->s_proto != NULL); 239168754Sbushman break; 240168754Sbushman 241168754Sbushman default: 242168754Sbushman if (sl == NULL) { 243168754Sbushman if (strcmp(s, "(null)") == 0) 244168754Sbushman return (0); 245168754Sbushman 246168754Sbushman sl = sl_init(); 247168754Sbushman assert(sl != NULL); 248168754Sbushman 249168754Sbushman if (strcmp(s, "noaliases") != 0) { 250168754Sbushman ts = strdup(s); 251168754Sbushman assert(ts != NULL); 252168754Sbushman sl_add(sl, ts); 253168754Sbushman } 254168754Sbushman } else { 255168754Sbushman ts = strdup(s); 256168754Sbushman assert(ts != NULL); 257168754Sbushman sl_add(sl, ts); 258168754Sbushman } 259168754Sbushman break; 260168754Sbushman }; 261168754Sbushman ++i; 262168754Sbushman } 263168754Sbushman 264168754Sbushman if (i < 3) { 265168754Sbushman free(serv->s_name); 266168754Sbushman free(serv->s_proto); 267168754Sbushman memset(serv, 0, sizeof(struct servent)); 268168754Sbushman return (-1); 269168754Sbushman } 270168754Sbushman 271168754Sbushman sl_add(sl, NULL); 272168754Sbushman serv->s_aliases = sl->sl_str; 273168754Sbushman 274168754Sbushman /* NOTE: is it a dirty hack or not? */ 275168754Sbushman free(sl); 276168754Sbushman return (0); 277168754Sbushman} 278168754Sbushman 279168754Sbushmanstatic void 280168754Sbushmandump_servent(struct servent *result) 281168754Sbushman{ 282168754Sbushman if (result != NULL) { 283168754Sbushman char buffer[1024]; 284168754Sbushman sdump_servent(result, buffer, sizeof(buffer)); 285168754Sbushman printf("%s\n", buffer); 286168754Sbushman } else 287168754Sbushman printf("(null)\n"); 288168754Sbushman} 289168754Sbushman 290168754Sbushmanstatic int 291168754Sbushmanservent_fill_test_data(struct servent_test_data *td) 292168754Sbushman{ 293168754Sbushman struct servent *serv; 294168754Sbushman 295168754Sbushman setservent(1); 296168754Sbushman while ((serv = getservent()) != NULL) { 297168754Sbushman if (servent_test_correctness(serv, NULL) == 0) 298168754Sbushman TEST_DATA_APPEND(servent, td, serv); 299168754Sbushman else 300168754Sbushman return (-1); 301168754Sbushman } 302168754Sbushman endservent(); 303168754Sbushman 304168754Sbushman return (0); 305168754Sbushman} 306168754Sbushman 307168754Sbushmanstatic int 308168754Sbushmanservent_test_correctness(struct servent *serv, void *mdata) 309168754Sbushman{ 310168754Sbushman if (debug) { 311168754Sbushman printf("testing correctness with the following data:\n"); 312168754Sbushman dump_servent(serv); 313168754Sbushman } 314168754Sbushman 315168754Sbushman if (serv == NULL) 316168754Sbushman goto errfin; 317168754Sbushman 318168754Sbushman if (serv->s_name == NULL) 319168754Sbushman goto errfin; 320168754Sbushman 321168754Sbushman if (serv->s_proto == NULL) 322168754Sbushman goto errfin; 323168754Sbushman 324168754Sbushman if (ntohs(serv->s_port < 0)) 325168754Sbushman goto errfin; 326168754Sbushman 327168754Sbushman if (serv->s_aliases == NULL) 328168754Sbushman goto errfin; 329168754Sbushman 330168754Sbushman if (debug) 331168754Sbushman printf("correct\n"); 332168754Sbushman 333168754Sbushman return (0); 334168754Sbushmanerrfin: 335168754Sbushman if (debug) 336168754Sbushman printf("incorrect\n"); 337168754Sbushman 338168754Sbushman return (-1); 339168754Sbushman} 340168754Sbushman 341168754Sbushman/* servent_check_ambiguity() is needed when one port+proto is associated with 342168754Sbushman * more than one service (these cases are usually marked as PROBLEM in 343168754Sbushman * /etc/services. This functions is needed also when one service+proto is 344168754Sbushman * associated with several ports. We have to check all the servent structures 345168754Sbushman * to make sure that serv really exists and correct */ 346168754Sbushmanstatic int 347168754Sbushmanservent_check_ambiguity(struct servent_test_data *td, struct servent *serv) 348168754Sbushman{ 349168754Sbushman 350168754Sbushman return (TEST_DATA_FIND(servent, td, serv, compare_servent, 351168754Sbushman NULL) != NULL ? 0 : -1); 352168754Sbushman} 353168754Sbushman 354168754Sbushmanstatic int 355168754Sbushmanservent_test_getservbyname(struct servent *serv_model, void *mdata) 356168754Sbushman{ 357168754Sbushman char **alias; 358168754Sbushman struct servent *serv; 359168754Sbushman 360168754Sbushman if (debug) { 361168754Sbushman printf("testing getservbyname() with the following data:\n"); 362168754Sbushman dump_servent(serv_model); 363168754Sbushman } 364168754Sbushman 365168754Sbushman serv = getservbyname(serv_model->s_name, serv_model->s_proto); 366168754Sbushman if (servent_test_correctness(serv, NULL) != 0) 367168754Sbushman goto errfin; 368168754Sbushman 369168754Sbushman if ((compare_servent(serv, serv_model, NULL) != 0) && 370168754Sbushman (servent_check_ambiguity((struct servent_test_data *)mdata, serv) 371168754Sbushman !=0)) 372168754Sbushman goto errfin; 373168754Sbushman 374168754Sbushman for (alias = serv_model->s_aliases; *alias; ++alias) { 375168754Sbushman serv = getservbyname(*alias, serv_model->s_proto); 376168754Sbushman 377168754Sbushman if (servent_test_correctness(serv, NULL) != 0) 378168754Sbushman goto errfin; 379168754Sbushman 380168754Sbushman if ((compare_servent(serv, serv_model, NULL) != 0) && 381168754Sbushman (servent_check_ambiguity( 382168754Sbushman (struct servent_test_data *)mdata, serv) != 0)) 383168754Sbushman goto errfin; 384168754Sbushman } 385168754Sbushman 386168754Sbushman if (debug) 387168754Sbushman printf("ok\n"); 388168754Sbushman return (0); 389168754Sbushman 390168754Sbushmanerrfin: 391168754Sbushman if (debug) 392168754Sbushman printf("not ok\n"); 393168754Sbushman 394168754Sbushman return (-1); 395168754Sbushman} 396168754Sbushman 397168754Sbushmanstatic int 398168754Sbushmanservent_test_getservbyport(struct servent *serv_model, void *mdata) 399168754Sbushman{ 400168754Sbushman struct servent *serv; 401168754Sbushman 402168754Sbushman if (debug) { 403168754Sbushman printf("testing getservbyport() with the following data...\n"); 404168754Sbushman dump_servent(serv_model); 405168754Sbushman } 406168754Sbushman 407168754Sbushman serv = getservbyport(serv_model->s_port, serv_model->s_proto); 408168754Sbushman if ((servent_test_correctness(serv, NULL) != 0) || 409168754Sbushman ((compare_servent(serv, serv_model, NULL) != 0) && 410168754Sbushman (servent_check_ambiguity((struct servent_test_data *)mdata, serv) 411168754Sbushman != 0))) { 412168754Sbushman if (debug) 413168754Sbushman printf("not ok\n"); 414168754Sbushman return (-1); 415168754Sbushman } else { 416168754Sbushman if (debug) 417168754Sbushman printf("ok\n"); 418168754Sbushman return (0); 419168754Sbushman } 420168754Sbushman} 421168754Sbushman 422168754Sbushmanstatic int 423168754Sbushmanservent_test_getservent(struct servent *serv, void *mdata) 424168754Sbushman{ 425168754Sbushman /* Only correctness can be checked when doing 1-pass test for 426168754Sbushman * getservent(). */ 427168754Sbushman return (servent_test_correctness(serv, NULL)); 428168754Sbushman} 429168754Sbushman 430168754Sbushmanstatic void 431168754Sbushmanusage(void) 432168754Sbushman{ 433168754Sbushman (void)fprintf(stderr, 434168754Sbushman "Usage: %s -npe2 [-d] [-s <file>]\n", 435168754Sbushman getprogname()); 436168754Sbushman exit(1); 437168754Sbushman} 438168754Sbushman 439168754Sbushmanint 440168754Sbushmanmain(int argc, char **argv) 441168754Sbushman{ 442168754Sbushman struct servent_test_data td, td_snap, td_2pass; 443168754Sbushman char *snapshot_file; 444168754Sbushman int rv; 445168754Sbushman int c; 446168754Sbushman 447168754Sbushman if (argc < 2) 448168754Sbushman usage(); 449168754Sbushman 450168754Sbushman snapshot_file = NULL; 451168754Sbushman while ((c = getopt(argc, argv, "npe2ds:")) != -1) 452168754Sbushman switch (c) { 453168754Sbushman case 'd': 454168754Sbushman debug++; 455168754Sbushman break; 456168754Sbushman case 'n': 457168754Sbushman method = TEST_GETSERVBYNAME; 458168754Sbushman break; 459168754Sbushman case 'p': 460168754Sbushman method = TEST_GETSERVBYPORT; 461168754Sbushman break; 462168754Sbushman case 'e': 463168754Sbushman method = TEST_GETSERVENT; 464168754Sbushman break; 465168754Sbushman case '2': 466168754Sbushman method = TEST_GETSERVENT_2PASS; 467168754Sbushman break; 468168754Sbushman case 's': 469168754Sbushman snapshot_file = strdup(optarg); 470168754Sbushman break; 471168754Sbushman default: 472168754Sbushman usage(); 473168754Sbushman } 474168754Sbushman 475168754Sbushman TEST_DATA_INIT(servent, &td, clone_servent, free_servent); 476168754Sbushman TEST_DATA_INIT(servent, &td_snap, clone_servent, free_servent); 477168754Sbushman if (snapshot_file != NULL) { 478168754Sbushman if (access(snapshot_file, W_OK | R_OK) != 0) { 479168754Sbushman if (errno == ENOENT) 480168754Sbushman method = TEST_BUILD_SNAPSHOT; 481168754Sbushman else { 482168754Sbushman if (debug) 483168754Sbushman printf("can't access the file %s\n", 484168754Sbushman snapshot_file); 485168754Sbushman 486168754Sbushman rv = -1; 487168754Sbushman goto fin; 488168754Sbushman } 489168754Sbushman } else { 490168754Sbushman if (method == TEST_BUILD_SNAPSHOT) { 491168754Sbushman rv = 0; 492168754Sbushman goto fin; 493168754Sbushman } 494168754Sbushman 495168754Sbushman TEST_SNAPSHOT_FILE_READ(servent, snapshot_file, 496168754Sbushman &td_snap, servent_read_snapshot_func); 497168754Sbushman } 498168754Sbushman } 499168754Sbushman 500168754Sbushman rv = servent_fill_test_data(&td); 501168754Sbushman if (rv == -1) 502168754Sbushman return (-1); 503168754Sbushman switch (method) { 504168754Sbushman case TEST_GETSERVBYNAME: 505168754Sbushman if (snapshot_file == NULL) 506168754Sbushman rv = DO_1PASS_TEST(servent, &td, 507168754Sbushman servent_test_getservbyname, (void *)&td); 508168754Sbushman else 509168754Sbushman rv = DO_1PASS_TEST(servent, &td_snap, 510168754Sbushman servent_test_getservbyname, (void *)&td_snap); 511168754Sbushman break; 512168754Sbushman case TEST_GETSERVBYPORT: 513168754Sbushman if (snapshot_file == NULL) 514168754Sbushman rv = DO_1PASS_TEST(servent, &td, 515168754Sbushman servent_test_getservbyport, (void *)&td); 516168754Sbushman else 517168754Sbushman rv = DO_1PASS_TEST(servent, &td_snap, 518168754Sbushman servent_test_getservbyport, (void *)&td_snap); 519168754Sbushman break; 520168754Sbushman case TEST_GETSERVENT: 521168754Sbushman if (snapshot_file == NULL) 522168754Sbushman rv = DO_1PASS_TEST(servent, &td, servent_test_getservent, 523168754Sbushman (void *)&td); 524168754Sbushman else 525168754Sbushman rv = DO_2PASS_TEST(servent, &td, &td_snap, 526168754Sbushman compare_servent, NULL); 527168754Sbushman break; 528168754Sbushman case TEST_GETSERVENT_2PASS: 529168754Sbushman TEST_DATA_INIT(servent, &td_2pass, clone_servent, free_servent); 530168754Sbushman rv = servent_fill_test_data(&td_2pass); 531168754Sbushman if (rv != -1) 532168754Sbushman rv = DO_2PASS_TEST(servent, &td, &td_2pass, 533168754Sbushman compare_servent, NULL); 534168754Sbushman TEST_DATA_DESTROY(servent, &td_2pass); 535168754Sbushman break; 536168754Sbushman case TEST_BUILD_SNAPSHOT: 537168754Sbushman if (snapshot_file != NULL) 538168754Sbushman rv = TEST_SNAPSHOT_FILE_WRITE(servent, snapshot_file, &td, 539168754Sbushman sdump_servent); 540168754Sbushman break; 541168754Sbushman default: 542168754Sbushman rv = 0; 543168754Sbushman break; 544168754Sbushman }; 545168754Sbushman 546168754Sbushmanfin: 547168754Sbushman TEST_DATA_DESTROY(servent, &td_snap); 548168754Sbushman TEST_DATA_DESTROY(servent, &td); 549168754Sbushman free(snapshot_file); 550168754Sbushman return (rv); 551168754Sbushman} 552