return ret;
}
+/* open a rpc connection to a named pipe */
+static NTSTATUS torture_rpc_tcp(struct dcerpc_pipe **p,
+ const char *pipe_name,
+ const char *pipe_uuid,
+ uint32 pipe_version)
+{
+ NTSTATUS status;
+ char *host = lp_parm_string(-1, "torture", "host");
+ const char *port_str = lp_parm_string(-1, "torture", "share");
+ uint32 port = atoi(port_str);
+
+ if (port == 0) {
+ status = dcerpc_epm_map_tcp_port(host,
+ pipe_uuid, pipe_version,
+ &port);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("Failed to map DCERPC/TCP port for '%s' - %s\n",
+ pipe_name, nt_errstr(status)));
+ return status;
+ }
+ DEBUG(1,("Mapped to DCERPC/TCP port %u\n", port));
+ }
+
+ DEBUG(2,("Connecting to dcerpc server %s:%u\n", host, port));
+
+ status = dcerpc_pipe_open_tcp(p, host, port);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("Open of pipe '%s' failed with error (%s)\n",
+ pipe_name, nt_errstr(status));
+ return status;
+ }
+
+ /* always do NDR validation in smbtorture */
+ (*p)->flags |= DCERPC_DEBUG_VALIDATE_BOTH;
+
+#if 0
+ status = dcerpc_bind_auth_none(*p, pipe_uuid, pipe_version);
+#else
+ /* enable signing on tcp connections */
+ (*p)->flags |= DCERPC_SIGN;
+
+ /* bind to the pipe, using the uuid as the key */
+ status = dcerpc_bind_auth_ntlm(*p, pipe_uuid, pipe_version,
+ lp_workgroup(),
+ lp_parm_string(-1, "torture", "username"),
+ lp_parm_string(-1, "torture", "password"));
+ if (!NT_STATUS_IS_OK(status)) {
+ dcerpc_pipe_close(*p);
+ return status;
+ }
+#endif
+
+ return status;
+}
+
+
/* open a rpc connection to a named pipe */
NTSTATUS torture_rpc_connection(struct dcerpc_pipe **p,
const char *pipe_name,
{
struct cli_state *cli;
NTSTATUS status;
+ char *transport = lp_parm_string(-1, "torture", "transport");
+
+ if (strcmp(transport, "ncacn_ip_tcp") == 0) {
+ return torture_rpc_tcp(p, pipe_name, pipe_uuid, pipe_version);
+ }
+
+ if (strcmp(transport, "ncacn_np") != 0) {
+ printf("Unsupported RPC transport '%s'\n", transport);
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ if (! *lp_parm_string(-1, "torture", "share")) {
+ lp_set_cmdline("torture:share", "ipc$");
+ }
if (!torture_open_connection(&cli)) {
return NT_STATUS_UNSUCCESSFUL;
}
- if (!(*p = dcerpc_pipe_init(cli->tree))) {
- return NT_STATUS_NO_MEMORY;
- }
-
- status = dcerpc_pipe_open_smb(*p, pipe_name, pipe_uuid, pipe_version);
+ status = dcerpc_pipe_open_smb(p, cli->tree, pipe_name);
if (!NT_STATUS_IS_OK(status)) {
printf("Open of pipe '%s' failed with error (%s)\n",
pipe_name, nt_errstr(status));
+ torture_close_connection(cli);
return status;
}
+ /* this ensures that the reference count is decremented so
+ a pipe close will really close the link */
+ cli_tree_close(cli->tree);
+
+ /* bind to the pipe, using the uuid as the key */
+#if 1
+ status = dcerpc_bind_auth_none(*p, pipe_uuid, pipe_version);
+#else
+ /* enable signing on tcp connections */
+ (*p)->flags |= DCERPC_SIGN;
+
+ /* bind to the pipe, using the uuid as the key */
+ status = dcerpc_bind_auth_ntlm(*p, pipe_uuid, pipe_version,
+ lp_workgroup(),
+ lp_parm_string(-1, "torture", "username"),
+ lp_parm_string(-1, "torture", "password"));
+#endif
+ if (!NT_STATUS_IS_OK(status)) {
+ dcerpc_pipe_close(*p);
+ return status;
+ }
+
/* always do NDR validation in smbtorture */
(*p)->flags |= DCERPC_DEBUG_VALIDATE_BOTH;
/* close a rpc connection to a named pipe */
NTSTATUS torture_rpc_close(struct dcerpc_pipe *p)
{
- union smb_close io;
- NTSTATUS status;
-
- io.close.level = RAW_CLOSE_CLOSE;
- io.close.in.fnum = p->fnum;
- io.close.in.write_time = 0;
- status = smb_raw_close(p->tree, &io);
-
dcerpc_pipe_close(p);
-
- return status;
+ return NT_STATUS_OK;
}
uint16 device, function;
int fnum;
const char *fname = "\\ioctl.dat";
- DATA_BLOB blob;
NTSTATUS status;
- struct smb_ioctl parms;
+ union smb_ioctl parms;
TALLOC_CTX *mem_ctx;
if (!torture_open_connection(&cli)) {
return False;
}
- parms.in.request = IOCTL_QUERY_JOB_INFO;
+ parms.ioctl.level = RAW_IOCTL_IOCTL;
+ parms.ioctl.in.request = IOCTL_QUERY_JOB_INFO;
status = smb_raw_ioctl(cli->tree, mem_ctx, &parms);
printf("ioctl job info: %s\n", cli_errstr(cli));
for (device=0;device<0x100;device++) {
printf("testing device=0x%x\n", device);
for (function=0;function<0x100;function++) {
- parms.in.request = (device << 16) | function;
+ parms.ioctl.in.request = (device << 16) | function;
status = smb_raw_ioctl(cli->tree, mem_ctx, &parms);
if (NT_STATUS_IS_OK(status)) {
printf("ioctl device=0x%x function=0x%x OK : %d bytes\n",
- device, function, blob.length);
- data_blob_free(&parms.out.blob);
+ device, function, parms.ioctl.out.blob.length);
}
}
}
{"RPC-DFS", torture_rpc_dfs, 0},
{"RPC-SPOOLSS", torture_rpc_spoolss, 0},
{"RPC-SAMR", torture_rpc_samr, 0},
+ {"RPC-NETLOGON", torture_rpc_netlogon, 0},
{"RPC-WKSSVC", torture_rpc_wkssvc, 0},
{"RPC-SRVSVC", torture_rpc_srvsvc, 0},
{"RPC-ATSVC", torture_rpc_atsvc, 0},
{"RPC-EVENTLOG", torture_rpc_eventlog, 0},
{"RPC-EPMAPPER", torture_rpc_epmapper, 0},
{"RPC-WINREG", torture_rpc_winreg, 0},
+ {"RPC-MGMT", torture_rpc_mgmt, 0},
+ {"RPC-SCANNER", torture_rpc_scanner, 0},
+ {"RPC-AUTOIDL", torture_rpc_autoidl, 0},
{NULL, NULL, 0}};
for(p = argv[1]; *p; p++)
if(*p == '\\')
*p = '/';
-
- if (strncmp(argv[1], "//", 2)) {
- usage();
- }
- host = strdup(&argv[1][2]);
- p = strchr_m(&host[2],'/');
- if (!p) {
- usage();
+
+ /* see if its a RPC transport specifier */
+ if (strncmp(argv[1], "ncacn", 5) == 0) {
+ char *transport = strdup(argv[1]);
+ p = strchr_m(transport, ':');
+ if (!p) usage();
+ *p = 0;
+ host = p+1;
+ p = strchr_m(host, ':');
+ if (p) {
+ *p = 0;
+ share = p+1;
+ lp_set_cmdline("torture:share", share);
+ } else {
+ share = "";
+ lp_set_cmdline("torture:share", share);
+ }
+ lp_set_cmdline("torture:host", host);
+ lp_set_cmdline("torture:transport", transport);
+ } else {
+ if (strncmp(argv[1], "//", 2)) {
+ usage();
+ }
+
+ host = strdup(&argv[1][2]);
+ p = strchr_m(&host[2],'/');
+ if (!p) {
+ usage();
+ }
+ *p = 0;
+ share = strdup(p+1);
+
+ lp_set_cmdline("torture:host", host);
+ lp_set_cmdline("torture:share", share);
+ lp_set_cmdline("torture:password", "");
+ lp_set_cmdline("torture:transport", "ncacn_np");
}
- *p = 0;
- share = strdup(p+1);
if (getenv("LOGNAME")) {
username = strdup(getenv("LOGNAME"));
}
-
- lp_set_cmdline("torture:host", host);
- lp_set_cmdline("torture:share", share);
lp_set_cmdline("torture:username", username);
- lp_set_cmdline("torture:password", "");
+
argc--;
argv++;