diff options
-rw-r--r-- | source3/Makefile.in | 1 | ||||
-rw-r--r-- | source3/torture/proto.h | 1 | ||||
-rw-r--r-- | source3/torture/test_addrchange.c | 93 | ||||
-rw-r--r-- | source3/torture/torture.c | 1 |
4 files changed, 96 insertions, 0 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index a338460eee..074013384d 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1194,6 +1194,7 @@ SMBTORTURE_OBJ1 = torture/torture.o torture/nbio.o torture/scanner.o torture/uta torture/nbench.o \ torture/test_async_echo.o \ torture/test_smbsock_any_connect.o \ + torture/test_addrchange.o \ torture/test_posix_append.o SMBTORTURE_OBJ = $(SMBTORTURE_OBJ1) $(PARAM_OBJ) $(TLDAP_OBJ) \ diff --git a/source3/torture/proto.h b/source3/torture/proto.h index a22113e7c6..c7a4cbcfec 100644 --- a/source3/torture/proto.h +++ b/source3/torture/proto.h @@ -86,5 +86,6 @@ bool run_posix_append(int dummy); bool run_nbench2(int dummy); bool run_async_echo(int dummy); bool run_smb_any_connect(int dummy); +bool run_addrchange(int dummy); #endif /* __TORTURE_H__ */ diff --git a/source3/torture/test_addrchange.c b/source3/torture/test_addrchange.c new file mode 100644 index 0000000000..003bea6568 --- /dev/null +++ b/source3/torture/test_addrchange.c @@ -0,0 +1,93 @@ +/* + Unix SMB/CIFS implementation. + test for the addrchange functionality + Copyright (C) Volker Lendecke 2011 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "lib/addrchange.h" +#include "proto.h" + +extern int torture_numops; + +bool run_addrchange(int dummy) +{ + struct addrchange_context *ctx; + struct tevent_context *ev; + NTSTATUS status; + int i; + + ev = tevent_context_init(talloc_tos()); + if (ev == NULL) { + d_fprintf(stderr, "tevent_context_init failed\n"); + return -1; + } + + status = addrchange_context_create(talloc_tos(), &ctx); + if (!NT_STATUS_IS_OK(status)) { + d_fprintf(stderr, "addrchange_context_create failed: %s\n", + nt_errstr(status)); + return false; + } + + for (i=0; i<torture_numops; i++) { + enum addrchange_type type; + struct sockaddr_storage addr; + struct tevent_req *req; + const char *typestr; + char addrstr[INET6_ADDRSTRLEN]; + + req = addrchange_send(talloc_tos(), ev, ctx); + if (req == NULL) { + d_fprintf(stderr, "addrchange_send failed\n"); + return -1; + } + + if (!tevent_req_poll_ntstatus(req, ev, &status)) { + d_fprintf(stderr, "tevent_req_poll_ntstatus failed: " + "%s\n", nt_errstr(status)); + TALLOC_FREE(req); + return -1; + } + + status = addrchange_recv(req, &type, &addr); + TALLOC_FREE(req); + if (!NT_STATUS_IS_OK(status)) { + d_fprintf(stderr, "addrchange_recv failed: %s\n", + nt_errstr(status)); + return -1; + } + + switch(type) { + case ADDRCHANGE_ADD: + typestr = "add"; + break; + case ADDRCHANGE_DEL: + typestr = "del"; + break; + default: + typestr = talloc_asprintf(talloc_tos(), "unknown %d", + (int)type); + break; + } + + printf("Got %s %s\n", typestr, + print_sockaddr(addrstr, sizeof(addrstr), &addr)); + } + TALLOC_FREE(ctx); + TALLOC_FREE(ev); + return 0; +} diff --git a/source3/torture/torture.c b/source3/torture/torture.c index df559400ad..48eb708a70 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -8074,6 +8074,7 @@ static struct { {"ASYNC-ECHO", run_async_echo, 0}, { "UID-REGRESSION-TEST", run_uid_regression_test, 0}, { "SHORTNAME-TEST", run_shortname_test, 0}, + { "ADDRCHANGE", run_addrchange, 0}, #if 1 {"OPENATTR", run_openattrtest, 0}, #endif |