smbclient提供了类似FTP式的共享文件操作功能, 本篇从源码角度讲解smbclient的实现,smbclient命令的具体使用可通过help命令和互联网查到大量资料。
以下从源码角度分析一个smbclient命令是如何发到远端机器上和处理返回结果的。这里以一个简单的命令“close <fnum>”为例,分析程序的整个过程如下:
step 1. cmd_close(void)位于source3/client/client.c中。每个smbclient命令都有一个类似cmd_***命名的函数,这些函数作用是为step 2中的cli_***函数准备参数。
- 从全局内存stackframe获取临时内存“停靠点”。该步主要使用talloc库并配合samba自身的需要完成内存的管理。具体可参见上一篇博文的talloc加深理解。
- 分析传入的<fnum>, 简单调用atoi转换为字符串类型。
- 调用cli_close()。
Step 2. cli_close(cli, fnum)位于source3/client/client.c中。 它接收cmd_***传递的函数,做实质性的工作。这里第一个参数cli是cli_state全局类型数据,该数据结构中几乎包含了当前连接的connection的绝大多数信息,例如:
cli_state的前驱和后继、当前connection 信息、客户domain名、用户名、server domain、os、posix 能力、打开的管道list、机会锁信息、使用smb1 or smb2?及其相关联的session、tree connection、打开的句柄。第二
个参数是上面准备的打开的句柄。不同的cli_***c