diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/utils/net_proto.h | 2 | ||||
-rw-r--r-- | source3/utils/net_rpc.c | 66 | ||||
-rw-r--r-- | source3/utils/net_rpc_join.c | 29 |
3 files changed, 67 insertions, 30 deletions
diff --git a/source3/utils/net_proto.h b/source3/utils/net_proto.h index 03fb31290f..d791708f93 100644 --- a/source3/utils/net_proto.h +++ b/source3/utils/net_proto.h @@ -145,6 +145,7 @@ int run_rpc_command(struct net_context *c, int argc, const char **argv); int net_rpc_changetrustpw(struct net_context *c, int argc, const char **argv); +int net_rpc_testjoin(struct net_context *c, int argc, const char **argv); int net_rpc_join(struct net_context *c, int argc, const char **argv); NTSTATUS rpc_info_internals(struct net_context *c, const struct dom_sid *domain_sid, @@ -205,7 +206,6 @@ NTSTATUS net_rpc_join_ok(struct net_context *c, const char *domain, const char *server, const struct sockaddr_storage *server_ss); int net_rpc_join_newstyle(struct net_context *c, int argc, const char **argv); -int net_rpc_testjoin(struct net_context *c, int argc, const char **argv); /* The following definitions come from utils/net_rpc_printer.c */ diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c index fc779a3b45..3a70e996a2 100644 --- a/source3/utils/net_rpc.c +++ b/source3/utils/net_rpc.c @@ -438,6 +438,72 @@ fail: } /** + * check that a join is OK + * + * @return A shell status integer (0 for success) + * + **/ +int net_rpc_testjoin(struct net_context *c, int argc, const char **argv) +{ + NTSTATUS status; + TALLOC_CTX *mem_ctx; + const char *domain = c->opt_target_workgroup; + const char *dc = c->opt_host; + + if (c->display_usage) { + d_printf("Usage\n" + "net rpc testjoin\n" + " Test if a join is OK\n"); + return 0; + } + + mem_ctx = talloc_init("net_rpc_testjoin"); + if (!mem_ctx) { + return -1; + } + + if (!dc) { + struct netr_DsRGetDCNameInfo *info; + + if (!c->msg_ctx) { + d_fprintf(stderr, _("Could not initialise message context. " + "Try running as root\n")); + talloc_destroy(mem_ctx); + return -1; + } + + status = dsgetdcname(mem_ctx, + c->msg_ctx, + domain, + NULL, + NULL, + DS_RETURN_DNS_NAME, + &info); + if (!NT_STATUS_IS_OK(status)) { + talloc_destroy(mem_ctx); + return -1; + } + + dc = strip_hostname(info->dc_unc); + } + + /* Display success or failure */ + status = libnet_join_ok(c->opt_workgroup, lp_netbios_name(), dc, + c->opt_kerberos); + if (!NT_STATUS_IS_OK(status)) { + fprintf(stderr,"Join to domain '%s' is not valid: %s\n", + domain, nt_errstr(status)); + talloc_destroy(mem_ctx); + return -1; + } + + printf("Join to '%s' is OK\n",domain); + talloc_destroy(mem_ctx); + + return 0; +} + +/** * 'net rpc join' entrypoint. * @param argc Standard main() style argc. * @param argv Standard main() style argv. Initial components are already diff --git a/source3/utils/net_rpc_join.c b/source3/utils/net_rpc_join.c index a6ef11b254..8d7baab401 100644 --- a/source3/utils/net_rpc_join.c +++ b/source3/utils/net_rpc_join.c @@ -552,32 +552,3 @@ done: return retval; } - -/** - * check that a join is OK - * - * @return A shell status integer (0 for success) - * - **/ -int net_rpc_testjoin(struct net_context *c, int argc, const char **argv) -{ - NTSTATUS nt_status; - - if (c->display_usage) { - d_printf(_("Usage\n" - "net rpc testjoin\n" - " Test if a join is OK\n")); - return 0; - } - - /* Display success or failure */ - nt_status = net_rpc_join_ok(c, c->opt_target_workgroup, NULL, NULL); - if (!NT_STATUS_IS_OK(nt_status)) { - fprintf(stderr, _("Join to domain '%s' is not valid: %s\n"), - c->opt_target_workgroup, nt_errstr(nt_status)); - return -1; - } - - printf(_("Join to '%s' is OK\n"), c->opt_target_workgroup); - return 0; -} |