11 #include <afs/com_err.h>
12 #include <afs/vldbint.h>
13 #include <afs/cellconfig.h>
15 #include <tests/tap/basic.h>
19 /* This checks for a bug in vos where it would fail to allocate additional
20 * space for the results of multi homed VL_GetAddrsU, and so would segfault
21 * if a host with a small number of addresses was immediately followed by
22 * a host with a large number of addresses.
25 TestListAddrs(struct ubik_client
*client
, char *dirname
)
35 afs_uint32 addrsA
[] = {0x0a000000};
36 afs_uint32 addrsB
[] = {0x0a000001, 0x0a000002, 0x0a000003, 0x0a000004,
37 0x0a000005, 0x0a000006, 0x0a000007, 0x0a000008,
38 0x0a000009, 0x0a00000a, 0x0a00000b, 0x0a00000c,
39 0x0a00000d, 0x0a00000e, 0x0a00000f};
40 char uuidA
[] = {0x4F, 0x44, 0x94, 0x47, 0x76, 0xBA, 0x47, 0x2C, 0x97, 0x1A,
41 0x86, 0x6B, 0xC0, 0x10, 0x1A, 0x4B};
42 char uuidB
[] = {0x5D, 0x2A, 0x39, 0x36, 0x94, 0xB2, 0x48, 0x90, 0xA8, 0xD2,
43 0x7F, 0xBC, 0x1B, 0x29, 0xDA, 0x9B};
44 char expecting
[] = "10.0.0.0\n10.0.0.1\n10.0.0.2\n10.0.0.3\n10.0.0.4\n"
45 "10.0.0.5\n10.0.0.6\n10.0.0.7\n10.0.0.8\n10.0.0.9\n"
46 "10.0.0.10\n10.0.0.11\n10.0.0.12\n10.0.0.13\n"
47 "10.0.0.14\n10.0.0.15\n";
49 addrs
.bulkaddrs_len
= 1;
50 addrs
.bulkaddrs_val
= addrsA
;
51 code
= ubik_VL_RegisterAddrs(client
, 0, (afsUUID
*)uuidA
, 0, &addrs
);
52 is_int(0, code
, "First address registration succeeds");
54 addrs
.bulkaddrs_len
= 15;
55 addrs
.bulkaddrs_val
= addrsB
;
56 code
= ubik_VL_RegisterAddrs(client
, 0, (afsUUID
*)uuidB
, 0, &addrs
);
57 is_int(0, code
, "Second address registration succeeds");
59 /* Now we need to run vos ListAddrs and see what happens ... */
60 if (pipe(outpipe
) < 0) {
66 char *build
, *binPath
;
68 dup2(outpipe
[1], STDOUT_FILENO
); /* Redirect stdout into pipe */
72 build
= getenv("BUILD");
76 if (asprintf(&binPath
, "%s/../src/volser/vos", build
) < 0) {
77 fprintf(stderr
, "Out of memory building vos arguments\n");
81 "listaddrs", "-config", dirname
, "-noauth", NULL
);
85 buffer
= malloc(4096);
86 len
= read(outpipe
[0], buffer
, 4096);
87 waitpid(pid
, &status
, 0);
89 is_string(expecting
, buffer
, "vos output matches");
94 main(int argc
, char **argv
)
97 struct afsconf_dir
*dir
;
100 struct rx_securityClass
*secClass
;
101 struct ubik_client
*ubikClient
= NULL
;
104 /* Skip all tests if the current hostname can't be resolved */
105 afstest_SkipTestsIfBadHostname();
106 /* Skip all tests if the current hostname is on the loopback network */
107 afstest_SkipTestsIfLoopbackNetIsDefault();
113 dirname
= afstest_BuildTestConfig();
115 dir
= afsconf_Open(dirname
);
117 code
= afstest_AddDESKeyFile(dir
);
119 afs_com_err("vos-t", code
, "while adding test DES keyfile");
124 code
= afstest_StartVLServer(dirname
, &serverPid
);
126 afs_com_err("vos-t", code
, "while starting the vlserver");
131 /* Let it figure itself out ... */
133 code
= afsconf_ClientAuthSecure(dir
, &secClass
, &secIndex
);
134 is_int(code
, 0, "Successfully got security class");
136 afs_com_err("authname-t", code
, "while getting anonymous secClass");
141 code
= afstest_GetUbikClient(dir
, AFSCONF_VLDBSERVICE
, USER_SERVICE_ID
,
142 secClass
, secIndex
, &ubikClient
);
143 is_int(code
, 0, "Successfully built ubik client structure");
145 afs_com_err("vos-t", code
, "while building ubik client");
150 TestListAddrs(ubikClient
, dirname
);
152 code
= afstest_StopServer(serverPid
);
153 is_int(0, code
, "Server exited cleanly");
156 afstest_UnlinkTestConfig(dirname
);