📄 clientgen.c
字号:
cli = SMB_MALLOC_P(struct cli_state); if (!cli) return NULL; ZERO_STRUCTP(cli); alloced_cli = True; } if (cli->initialised) cli_close_connection(cli); ZERO_STRUCTP(cli); cli->port = 0; cli->fd = -1; cli->cnum = -1; cli->pid = (uint16)sys_getpid(); cli->mid = 1; cli->vuid = UID_FIELD_INVALID; cli->protocol = PROTOCOL_NT1; cli->timeout = 20000; /* Timeout is in milliseconds. */ cli->bufsize = CLI_BUFFER_SIZE+4; cli->max_xmit = cli->bufsize; cli->outbuf = (char *)SMB_MALLOC(cli->bufsize+SAFETY_MARGIN); cli->inbuf = (char *)SMB_MALLOC(cli->bufsize+SAFETY_MARGIN); cli->oplock_handler = cli_oplock_ack; cli->case_sensitive = False; cli->smb_rw_error = 0; cli->use_spnego = lp_client_use_spnego(); cli->capabilities = CAP_UNICODE | CAP_STATUS32 | CAP_DFS; /* Set the CLI_FORCE_DOSERR environment variable to test client routines using DOS errors instead of STATUS32 ones. This intended only as a temporary hack. */ if (getenv("CLI_FORCE_DOSERR")) cli->force_dos_errors = True; if (lp_client_signing()) cli->sign_info.allow_smb_signing = True; if (lp_client_signing() == Required) cli->sign_info.mandatory_signing = True; if (!cli->outbuf || !cli->inbuf) goto error; if ((cli->mem_ctx = talloc_init("cli based talloc")) == NULL) goto error; memset(cli->outbuf, 0, cli->bufsize); memset(cli->inbuf, 0, cli->bufsize);#if defined(DEVELOPER) /* just because we over-allocate, doesn't mean it's right to use it */ clobber_region(FUNCTION_MACRO, __LINE__, cli->outbuf+cli->bufsize, SAFETY_MARGIN); clobber_region(FUNCTION_MACRO, __LINE__, cli->inbuf+cli->bufsize, SAFETY_MARGIN);#endif /* initialise signing */ cli_null_set_signing(cli); cli->initialised = 1; cli->allocated = alloced_cli; return cli; /* Clean up after malloc() error */ error: SAFE_FREE(cli->inbuf); SAFE_FREE(cli->outbuf); if (alloced_cli) SAFE_FREE(cli); return NULL;}/**************************************************************************** External interface. Close an open named pipe over SMB. Free any authentication data. ****************************************************************************/void cli_rpc_pipe_close(struct rpc_pipe_client *cli){ BOOL ret; if (!cli) { return; } ret = cli_close(cli->cli, cli->fnum); if (!ret) { DEBUG(0,("cli_rpc_pipe_close: cli_close failed on pipe %s, " "fnum 0x%x " "to machine %s. Error was %s\n", cli->pipe_name, (int) cli->fnum, cli->cli->desthost, cli_errstr(cli->cli))); } if (cli->auth.cli_auth_data_free_func) { (*cli->auth.cli_auth_data_free_func)(&cli->auth); } DEBUG(10,("cli_rpc_pipe_close: closed pipe %s to machine %s\n", cli->pipe_name, cli->cli->desthost )); DLIST_REMOVE(cli->cli->pipe_list, cli); talloc_destroy(cli->mem_ctx);}/**************************************************************************** Close all pipes open on this session.****************************************************************************/void cli_nt_pipes_close(struct cli_state *cli){ struct rpc_pipe_client *cp, *next; for (cp = cli->pipe_list; cp; cp = next) { next = cp->next; cli_rpc_pipe_close(cp); }}/**************************************************************************** Close a client connection and free the memory without destroying cli itself.****************************************************************************/void cli_close_connection(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 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 != 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->mem_ctx) { talloc_destroy(cli->mem_ctx); cli->mem_ctx = NULL; } if (cli->fd != -1) { close(cli->fd); } cli->fd = -1; cli->smb_rw_error = 0;}/**************************************************************************** Shutdown a client structure.****************************************************************************/void cli_shutdown(struct cli_state *cli){ BOOL allocated = cli->allocated; cli_close_connection(cli); ZERO_STRUCTP(cli); if (allocated) { free(cli); }}/**************************************************************************** Set socket options on a open connection.****************************************************************************/void cli_sockopt(struct cli_state *cli, const char *options){ set_socket_options(cli->fd, options);}/**************************************************************************** Set the PID to use for smb messages. Return the old pid.****************************************************************************/uint16 cli_setpid(struct cli_state *cli, uint16 pid){ uint16 ret = cli->pid; cli->pid = pid; return ret;}/**************************************************************************** Set the case sensitivity flag on the packets. Returns old state.****************************************************************************/BOOL cli_set_case_sensitive(struct cli_state *cli, BOOL case_sensitive){ BOOL ret = cli->case_sensitive; cli->case_sensitive = case_sensitive; return ret;}/****************************************************************************Send a keepalive packet to the server****************************************************************************/BOOL cli_send_keepalive(struct cli_state *cli){ if (cli->fd == -1) { DEBUG(3, ("cli_send_keepalive: fd == -1\n")); return False; } if (!send_keepalive(cli->fd)) { close(cli->fd); cli->fd = -1; DEBUG(0,("Error sending keepalive packet to client.\n")); return False; } return True;}/**************************************************************************** Send/receive a SMBecho command: ping the server****************************************************************************/BOOL cli_echo(struct cli_state *cli, unsigned char *data, size_t length){ char *p; SMB_ASSERT(length < 1024); memset(cli->outbuf,'\0',smb_size); set_message(cli->outbuf,1,length,True); SCVAL(cli->outbuf,smb_com,SMBecho); SSVAL(cli->outbuf,smb_tid,65535); SSVAL(cli->outbuf,smb_vwv0,1); cli_setup_packet(cli); p = smb_buf(cli->outbuf); memcpy(p, data, length); p += length; cli_setup_bcc(cli, p); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (cli_is_error(cli)) { return False; } return True;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -