void cli_shutdown(struct cli_state *cli) { cli_nt_pipes_close(cli); /* * tell our peer to free his resources. Wihtout this, when an * application attempts to do a graceful shutdown and calls * smbc_free_context() to clean up all connections, some connections * can remain active on the peer end, until some (long) timeout period * later. This tree disconnect forces the peer to clean up, since the * connection will be going away. * * Also, do not do tree disconnect when cli->smb_rw_error is SMB_DO_NOT_DO_TDIS * the only user for this so far is smbmount which passes opened connection * down to kernel's smbfs module. */ if ( (cli->cnum != (uint16)-1) && (cli->smb_rw_error != SMB_DO_NOT_DO_TDIS ) ) { cli_tdis(cli); } SAFE_FREE(cli->outbuf); SAFE_FREE(cli->inbuf); cli_free_signing_context(cli); data_blob_free(&cli->secblob); data_blob_free(&cli->user_session_key); if (cli->fd != -1) { close(cli->fd); } cli->fd = -1; cli->smb_rw_error = SMB_READ_OK; TALLOC_FREE(cli); }
static void _cli_shutdown(struct cli_state *cli) { cli_nt_pipes_close(cli); /* * tell our peer to free his resources. Wihtout this, when an * application attempts to do a graceful shutdown and calls * smbc_free_context() to clean up all connections, some connections * can remain active on the peer end, until some (long) timeout period * later. This tree disconnect forces the peer to clean up, since the * connection will be going away. */ if (cli_state_has_tcon(cli)) { cli_tdis(cli); } smbXcli_conn_disconnect(cli->conn, NT_STATUS_OK); TALLOC_FREE(cli); }
void cli_shutdown(struct cli_state *cli) { if (cli == NULL) { return; } if (cli->prev == NULL) { /* * Possible head of a DFS list, * shutdown all subsidiary DFS * connections. */ struct cli_state *p, *next; for (p = cli->next; p; p = next) { next = p->next; cli_shutdown(p); } } else { /* * We're a subsidiary connection. * Just remove ourselves from the * DFS list. */ DLIST_REMOVE(cli->prev, cli); } cli_nt_pipes_close(cli); /* * tell our peer to free his resources. Wihtout this, when an * application attempts to do a graceful shutdown and calls * smbc_free_context() to clean up all connections, some connections * can remain active on the peer end, until some (long) timeout period * later. This tree disconnect forces the peer to clean up, since the * connection will be going away. * * Also, do not do tree disconnect when cli->smb_rw_error is SMB_DO_NOT_DO_TDIS * the only user for this so far is smbmount which passes opened connection * down to kernel's smbfs module. */ if ( (cli->cnum != (uint16)-1) && (cli->smb_rw_error != SMB_DO_NOT_DO_TDIS ) ) { cli_tdis(cli); } SAFE_FREE(cli->outbuf); SAFE_FREE(cli->inbuf); data_blob_free(&cli->secblob); data_blob_free(&cli->user_session_key); if (cli->fd != -1) { close(cli->fd); } cli->fd = -1; cli->smb_rw_error = SMB_READ_OK; /* * Need to free pending first, they remove themselves */ while (cli->pending) { talloc_free(cli->pending[0]); } TALLOC_FREE(cli); }