bool cli_state_is_connected(struct cli_state *cli) { if (cli == NULL) { return false; } if (!cli->initialised) { return false; } return smbXcli_conn_is_connected(cli->conn); }
static int tstream_smbXcli_np_destructor(struct tstream_smbXcli_np *cli_nps) { NTSTATUS status; if (cli_nps->conn_ref != NULL) { cli_nps->conn_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->conn_ref); } if (cli_nps->session_ref != NULL) { cli_nps->session_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->session_ref); } if (cli_nps->tcon_ref != NULL) { cli_nps->tcon_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->tcon_ref); } if (!smbXcli_conn_is_connected(cli_nps->conn)) { return 0; } /* * TODO: do not use a sync call with a destructor!!! * * This only happens, if a caller does talloc_free(), * while the everything was still ok. * * If we get an unexpected failure within a normal * operation, we already do an async cli_close_send()/_recv(). * * Once we've fixed all callers to call * tstream_disconnect_send()/_recv(), this will * never be called. */ if (cli_nps->is_smb1) { status = smb1cli_close(cli_nps->conn, cli_nps->timeout, cli_nps->pid, cli_nps->tcon, cli_nps->session, cli_nps->fnum, UINT32_MAX); } else { status = smb2cli_close(cli_nps->conn, cli_nps->timeout, cli_nps->session, cli_nps->tcon, 0, /* flags */ cli_nps->fid_persistent, cli_nps->fid_volatile); } if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("tstream_smbXcli_np_destructor: cli_close " "failed on pipe %s. Error was %s\n", cli_nps->npipe, nt_errstr(status))); } /* * We can't do much on failure */ return 0; }