samba开发篇---samba源码框架分析

samba开发篇–框架

Samba在设计和编写受到了内核代码的影响,它的代码风格与内核类似。Samba的目标之一是提供类似于Windows的功能,并且能够在各种Unix和Linux操作系统上运行。为此,需要处理系统调用和各种操作系统相关的问题,这些问题与内核代码中的问题非常相似。因此,Samba采用了类似于内核的代码风格,以便更容易地与操作系统交互并进行维护。此外,Samba也广泛使用了Unix编程的最佳实践,例如使用系统调用而不是库函数,以获得更好的性能和可移植性。


前言

本篇主体也是以samba-4.13.17版本为例,但是框架可以在整套大体一致


一、samba源码框架介绍

在samba源码里。samba源码树可以分为以下几个组

  • Top-level libraries
  • source3
  • source4
  • Infrastructure components
  • Autogenerated code
    这不是全部的目录,只涵盖主要组件。以下为更详细的布局。

Top-level libraries

  • Third-party:Samba需要一些特定的库来构建。其中一些包含在 Samba 源代码树中,以帮助在旧的和非 Linux 平台上构建。
  • General purpose libraries(lib):像所有用C编写的大型程序一样,Samba有许多内部帮助函数,它们不实现协议,但是需要共享代码并使Samba的其余部分变得可能。talloc、tdb、tevent和ldb子项目位于lib目录下。
  • Common RPC client library (librpc): Samba的RPC客户端实现的共同部分(source3和source4之间)。
  • Common client library (libcli):Samba协议的客户端实现的共同部分(source3和source4之间)。
  • Common authentication library (auth):Samba身份验证实现的共同部分(source3和source4之间)。
  • PIDL :Samba的代码自动生成系统,用于从IDL生成C代码和C-Python绑定。
  • python:包含Samba的Python库。它通常不用于文件服务器,但对于AD DC至关重要。
  • CTDB:Samba的集群数据库(使集群文件服务器成为可能)。

source3

source3目录是主要由文件服务器和域成员使用的代码目录,我们能够正常使用samba,source3部分的代码至关重要。
source3包含以下主要组件:

  • The SMB file server (smbd):大多数人在想到Samba时想到的文件服务器。
  • The NBT name server (nmbd):为希望使用NetBIOS over TCP/IP(NBT)的用户提供服务。
  • Winbindd:提供Samba与其加入的AD域之间的连接,用于认证和名称查找。它还管理IDMAP,即在Unix UID/GID值和Windows SID值之间的映射。winbindd在域成员和AD域控制器模式下都使用。
  • RPC client library (librpc):包含Samba的RPC客户端实现的特定于source3子树的部分。
  • SMB client library (libsmb):包含在source3子树中使用的Samba的SMB客户端实现的部分。
  • Authentication server (auth):包含在source3子树中使用的Samba的NTLM认证服务器的部分。当Samba是AD DC时,一个shim模块将其连接到source4认证代码。
  • Password database (passdb): 包含在source3子树中使用的NTLM密码数据库。当Samba是AD DC时,一个shim模块将其连接到sam.ldb数据存储。
  • RPC server:包含source3 RPC服务器。然而,大部分此部分在AD DC中不使用,而是重定向到source4/rpc_server的相应部分。当使用时,这提供了经典的或类似NT4的DC,无论是作为DC还是为每个成员或独立服务器上的SAM提供服务(每台Windows机器都有一个以自己的名称命名的数据库,Samba也是如此)。
  • Print server:功能位于打印目录中。还相关的是source3/rpc_server/spoolss代码。

source4

  • Active Directory Database templates:位于setup目录中。这些模板填充了sam.ldb中Active Directory DC的基本结构,包括完整的模式定义。
  • Heimdal:是一个旧的分支/分叉,带有一些更改。尝试将此Samba分支与一个名为lorikeet-heimdal的树进行同步(这是一个真正的Heimdal分支/分叉)。应先将补丁应用于上游,但并非总是这样做。
  • General purpose libraries (lib):尚未迁移到顶级目录。
  • Client library (libcli):包含Samba的客户端实现部分,针对source4代码库的特定协议。
  • RPC client library (librpc):包含Samba的RPC客户端实现部分,针对该代码库的特定部分。
  • libgpo:包含组策略对象支持。
  • smbtorture:二进制文件,用于测试Samba和Windows。由于历史原因,有两个smbtorture框架,source4框架是当前扩展的框架,但某些测试将保留在source3/torture中。
  • Old NTVFS file server and VFS layer. 尝试了一个新的文件服务器架构,这些目录展示了一个围绕SMB和NTFS语义而不是Samba在smbd中使用的POSIX语义的新VFS层(smbd现在使用混合方法)。
    source4/ntvfs。
    source4/smb_server。
  • AD Services.核心AD DC在每个组件的命名文件夹中实现:
    source4/ldap_server
    source4/cldap_server (Connectionless LDAP)
    source4/rpc_server
    source4/dns_server
    source4/nbt_server (NetBIOS over TCP/IP)
    source4/kdc
  • Authentication server (auth):包含Samba的认证服务器部分,用于AD DC。当Samba作为AD DC时,一个shim模块将smbd连接到此身份验证代码。
  • The Directory Services DB (DSDB):提供了sam.ldb数据库背后的主要实现(下面将更详细地介绍)。

Directory Services DB (DSDB)

实现主要AD数据库的代码位于source4/dsdb目录中。dsdb目录包含以下值得注意的组件:

  • LDB modules: LDB库提供了一个通用框架,可以添加自定义插件模块来修改数据库的行为。DSDB使用LDB库框架,并定义了自己的一组插件模块(位于dsdb/samdb/ldb_modules中),这些模块特定于Active Directory。结果是提供完整AD语义的数据库。
  • Schema handling: sam.ldb数据库遵循并符合AD模式。负责加载和使用完整AD模式的处理位于source4/dsdb/schema中。
  • Replication handling (part):一些与处理AD的DRS复制相关的代码位于source4/dsdb/repl中。
  • KCC The Knowledge Consistency Checker (KCC):是一个进程,确保维护有效的复制图并进行其他定期清理工作。实现的部分位于source4/dsdb/kcc中,主要是出于历史原因。其他KCC处理也位于python/samba/kcc中。
  • Infrastructure components

Infrastructure components

源代码树包含用于构建和测试Samba的以下组件。

  • Selftest:是一个定制的单元和集成测试框架。测试本身位于源代码树的许多不同部分中。
    python/samba/tests包含许多Python单元测试。
    selftest/selftest.pl是用于运行make test的运行程序。
    selftest/target是构建Samba测试环境的Perl代码。
    selftest/tests.py声明了所有Samba测试(包括单元测试和集成测试)以及它们应该运行的测试环境。请注意,make test也分布在source3和source4中。
  • Wintest:是一个位于Samba自测之外的系统。Wintest构建和安装Samba,并针对Windows自动运行一些有限的测试。请注意,此系统目前未维护和使用。
  • Build system:buildtools中的代码使用源代码树中每个目录中的wscript文件来构建Samba。
  • Documentation:Samba的man页是从XML构建的,位于docs-xml目录中。特别是smb.conf man页是从此处的整个子目录中的文件构建的。
  • 请注意,Samba中有效参数的内部列表是从每个配置参数的XML文档中创建的,确保代码和文档始终保持一致。文档中记录的默认值也会在自动化测试套件中进行一致性检查。

Autogenerated code

Samba代码库的大部分都是从IDL(接口定义语言)文件自动生成的。这些代码分布在源代码树中(即source3、source4和顶级库)。
PIDL为使用IDL描述的所有结构生成拉(序列化或打包)和推(反序列化或解包)函数,并且标记为[public]的结构暴露在C和Python的公共函数中。这对于解析不仅仅是DCE/RPC数据包,而是任何其他具有规律结构的缓冲区非常有帮助。IDL文件位于:

  • librpc/idl
  • source3/librpc/idl
  • source4/librpc/idl
    对于不太适合IDL的复杂结构,可以指定标记[nopull]、[nopush]或[noprint]。然后可以编写手写解析器来处理这些结构。这些手动解析器位于:
  • librpc/ndr
  • source3/librpc/ndr
  • source4/librpc/ndr

二、浅谈source3

source3是文件服务器和域成员主要是用的代码

下图就是samba-4.13.17的source3目录下的文件夹和相关waf脚本

auth    Doxyfile  include  libads  librpc  locking       nmbd    printing  rpc_client  script    smbadduser.in  utils     wscript
build   exports   intl     libgpo  libsmb  mainpage.dox  param   profile   rpcclient   selftest  smbd           web       wscript_build
client  groupdb   lib      libnet  locale  modules       passdb  registry  rpc_server  services  torture        winbindd  wscript_configure_system_ncurses
auth: 包含用于身份验证的代码和模块,如Kerberos和NTLM。

client: 包含SMB客户端代码,用于与远程SMB服务器进行通信。

groupdb: 提供组管理功能。

include: 包含用于构建Samba库和应用程序的头文件。

lib: 包含Samba库的代码和头文件。

libads: 提供Active Directory集成支持。

libgpo: 提供组策略支持。

libnet: 提供用于管理网络的API。

librpc: 实现远程过程调用(RPC)功能。

libsmb: 包含SMB协议的实现。

locale: 包含Samba支持的各种语言的本地化文件。

locking: 提供文件锁定功能。

modules: 提供用于加载Samba模块的代码和头文件。

nmbd: 提供NetBIOS名称解析器(nmb)服务。

param: 包含Samba配置文件的示例。

passdb: 提供用户身份验证的密码数据库。

printing: 提供打印支持功能。

rpc_client: 实现RPC客户端。

rpc_server: 实现RPC服务器。

script: 包含用于管理脚本的代码和头文件。

selftest: 提供Samba测试套件。

smbd: 提供SMB服务器功能。

smbadduser.in: 提供向Samba中添加用户的脚本。

torture: 提供Samba性能和稳定性测试的代码。

utils: 包含各种Samba工具,如smbpasswd和smbstatus。

web: 提供Web界面支持。

wscript: Samba构建系统的主要脚本。

wscript_build: 提供用于构建Samba的辅助脚本。

wscript_configure_system_ncurses: 提供用于配置Samba的ncurses界面脚本。

1.smbd

smbd目录是samba核心代码之一,实现了SMB协议的服务端。
整个目录下文件如下

aio.c                    fileio.c                 notify_msg.c             seal.c                   smb2_glue.c              smb2_write.c
avahi_register.c         filename.c               ntquotas.c               sec_ctx.c                smb2_ioctl.c             smbd_cleanupd.c
blocking.c               files.c                  nttrans.c                server.c                 smb2_ioctl_dfs.c         smbd_cleanupd.h
close.c                  globals.c                open.c                   server_exit.c            smb2_ioctl_filesys.c     smbd.h
conn.c                   globals.h                oplock.c                 server_reload.c          smb2_ioctl_named_pipe.c  smbXsrv_client.c
connection.c             ipc.c                    oplock_linux.c           service.c                smb2_ioctl_network_fs.c  smbXsrv_open.c
conn_idle.c              lanman.c                 password.c               session.c                smb2_ioctl_private.h     smbXsrv_session.c
conn_msg.c               mangle.c                 perfcount.c              sesssetup.c              smb2_keepalive.c         smbXsrv_tcon.c
dfree.c                  mangle_hash2.c           pipes.c                  share_access.c           smb2_lock.c              smbXsrv_version.c
dir.c                    mangle_hash.c            posix_acls.c             signing.c                smb2_negprot.c           srvstr.c
dmapi.c                  message.c                process.c                smb1_utils.c             smb2_notify.c            statcache.c
dnsregister.c            msdfs.c                  proto.h                  smb1_utils.h             smb2_query_directory.c   statvfs.c
dosmode.c                negprot.c                pysmbd.c                 smb2_break.c             smb2_read.c              trans2.c
durable.c                notify.c                 quotas.c                 smb2_close.c             smb2_server.c            uid.c
error.c                  notifyd/                 reply.c                  smb2_create.c            smb2_sesssetup.c         utmp.c
fake_file.c              notify_fam.c             scavenger.c              smb2_flush.c             smb2_setinfo.c           vfs.c
file_access.c            notify_inotify.c         scavenger.h              smb2_getinfo.c           smb2_tcon.c 

smbd的框架主要分为以下几个部分:

  1. server.c:是smbd的主要入口程序,提供smbd的主要处理逻辑,也就是我们的服务器端程序。初始化:包括解析命令行参数、读取配置文件、初始化日志系统等。
  2. vfs.c:提供了smbd的虚拟文件系统(VFS)层,可以将Samba连接到各种不同类型的文件系统上。
  3. 以下暂时省略

2.lib库

如下图所示,库文件包含了一些常用的功能,如字符串处理、内存分配、配置库。此外,还包括一些特定功能的实现,如文件ID、SID(安全标识符)管理、ACL(访问控制列表)管理等等。在Samba的各个模块中被广泛使用,为Samba提供了一些基础的支持和通用的功能。

ABI                 ctdb_dummy.c          ldap_escape.c          recvfile.c             srprs.h               tevent_barrier.c          util_file.h         util_transfer_file.c
addrchange.c        dbwrap                lsa.c                  sendfile.c             string_replace.c      tevent_barrier.h          util_macstreams.c   util_tsock.c
addrchange.h        dmallocmsg.c          messages.c             serverid.c             string_replace.h      tevent_glib_glue.c        util_macstreams.h   util_tsock.h
adouble.c           dumpcore.c            messages_ctdb.c        server_id_db_util.c    substitute.c          tevent_glib_glue.h        util_malloc.c       util_unixsids.c
adouble.h           errmap_unix.c         messages_ctdb.h        server_id_db_util.h    substitute_generic.c  tevent_glib_glue_tests.c  util_names.c        util_unixsids.h
adt_tree.c          eventlog              messages_ctdb_ref.c    server_id_watch.c      sysacls.c             time.c                    util_nscd.c         util_wellknown.c
audit.c             file_id.c             messages_ctdb_ref.h    server_id_watch.h      sysquotas_4A.c        tldap.c                   util_nttoken.c      version.c
avahi.c             file_id.h             messages_util.c        server_mutex.c         sysquotas_4B.c        tldap_gensec_bind.c       util_path.c         version_test.c
background.c        filename_util.c       messages_util.h        server_prefork.c       sysquotas.c           tldap_gensec_bind.h       util_path.h         winbind_util.c
background.h        fstring.c             ms_fnmatch.c           server_prefork.h       sysquotas_jfs2.c      tldap_util.c              util_procid.c       winbind_util.h
cbuf.c              gencache.c            namearray.c            server_prefork_util.c  sysquotas_linux.c     username.c                util_procid.h       wins_srv.c
cbuf.h              gencache.h            namemap_cache.c        server_prefork_util.h  sysquotas_nfs.c       util_builtin.c            util_sd.c           xattr_tdb.c
charcnv.c           global_contexts.c     namemap_cache.h        sessionid_tdb.c        sysquotas_xfs.c       util.c                    util_sec.c          xattr_tdb.h
cleanupdb.c         g_lock.c              netapi                 sharesec.c             system.c              util_cluster.c            util_sid.c
cleanupdb.h         id_cache.c            per_thread_cwd.c       smbconf                system_smbd.c         util_cluster.h            util_sid_passdb.c
cluster_support.c   id_cache.h            popt_common.c          smbd_shim.c            tallocmsg.c           util_cmdline.c            util_sid_passdb.h
cluster_support.h   idmap_cache.c         popt_common_cmdline.c  smbd_shim.h            tdb_validate.c        util_ea.c                 util_sock.c
cmdline_contexts.c  idmap_cache.h         privileges.c           smbldap.c              tdb_validate.h        util_ea.h                 util_specialsids.c
cmdline_contexts.h  interface.c           privileges.h           smbrun.c               test_adouble.c        util_event.c              util_str.c
ctdbd_conn.c        ldap_debug_handler.c  readdir_attr.h         srprs.c                test_tldap.c          util_file.c               util_tdb.c

还有部分是提供给smbd服务端的对外的接口,比如message.c,smbconf目录等等。不过这个目录一般来说是不太需要用到的,samba有一个top-level库会对source3,source4,等等还有其他库进行进一步封装,然后供开发者使用。

1)message.c

这个文件封装了一些接口来对smbd进行控制,比如debug功能,强制关闭,重新加载配置,关闭共享,休眠等等一些控制信号。

2)smbconf目录

smbconf目录是用来对smbd的smb.conf文件进行的一些配置修改的api。比如创建共享,删除共享等等修改共享的操作。

3.param目录

这里主要是对配置文件的加载部分做的一个中间件,就类似于smbd和smb.conf之间的,当然也不仅仅是这些,和nmbd也有相关。

loadparm.c  loadparm_ctx.c  pyparam.c  service.c  test_lp_load.c  util.c  wscript_build

4.module目录

这里主要是针对于samba的vfs层的一些可用模块,可以通过相关文档来编写新的vfs模块。

developer.c          nfs4acl_xattr_util.c   util_reparse.c     vfs_cacheprime.c      vfs_fake_acls.c       vfs_not_implemented.c  vfs_solarisacl.h          vfs_virusfilter_utils.h
getdate.c            nfs4acl_xattr_util.h   util_reparse.h     vfs_cap.c             vfs_fake_dfq.c        vfs_offline.c          vfs_streams_depot.c       vfs_vxfs.c
getdate.h            nfs4acl_xattr_xdr.c    vfs_acl_common.c   vfs_catia.c           vfs_fake_perms.c      vfs_posixacl.c         vfs_streams_xattr.c       vfs_vxfs.h
getdate.y            nfs4acl_xattr_xdr.h    vfs_acl_common.h   vfs_ceph.c            vfs_fileid.c          vfs_posixacl.h         vfs_syncops.c             vfs_widelinks.c
hash_inode.c         non_posix_acls.c       vfs_acl_tdb.c      vfs_ceph_snapshots.c  vfs_fruit.c           vfs_posix_eadb.c       vfs_time_audit.c          vfs_worm.c
hash_inode.h         non_posix_acls.h       vfs_acl_xattr.c    vfs_commit.c          vfs_full_audit.c      vfs_prealloc.c         vfs_tru64acl.c            vfs_xattr_tdb.c
lib_vxfs.c           offload_token.c        vfs_afsacl.c       vfs_crossrename.c     vfs_glusterfs.c       vfs_preopen.c          vfs_tru64acl.h            vfs_zfsacl.c
nfs41acl.x           offload_token.h        vfs_aio_fork.c     vfs_default.c         vfs_glusterfs_fuse.c  vfs_readahead.c        vfs_tsmsm.c               wscript_build
nfs4_acls.c          perfcount_test.c       vfs_aio_pthread.c  vfs_default_quota.c   vfs_gpfs.c            vfs_readonly.c         vfs_unityed_media.c
nfs4_acls.h          posixacl_xattr.c       vfs_aixacl2.c      vfs_delay_inject.c    vfs_hpuxacl.c         vfs_recycle.c          vfs_virusfilter.c
nfs4acl_xattr.h      posixacl_xattr.h       vfs_aixacl.c       vfs_dfs_samba4.c      vfs_hpuxacl.h         vfs_shadow_copy2.c     vfs_virusfilter_clamav.c
nfs4acl_xattr_ndr.c  README-gpfs-acl.txt    vfs_aixacl_util.c  vfs_dirsort.c         vfs_io_uring.c        vfs_shadow_copy.c      vfs_virusfilter_common.h
nfs4acl_xattr_ndr.h  README.nfs4acls.txt    vfs_aixacl_util.h  vfs_error_inject.c    vfs_linux_xfs_sgid.c  vfs_shell_snap.c       vfs_virusfilter_fsav.c
nfs4acl_xattr_nfs.c  test_nfs4_acls.c       vfs_audit.c        vfs_expand_msdfs.c    vfs_media_harmony.c   vfs_snapper.c          vfs_virusfilter_sophos.c
nfs4acl_xattr_nfs.h  test_vfs_full_audit.c  vfs_btrfs.c        vfs_extd_audit.c      vfs_nfs4acl_xattr.c   vfs_solarisacl.c       vfs_virusfilter_utils.c

VFS(Virtual File System)是Samba中的一个核心模块,它提供了一个抽象层,使得Samba可以与不同的文件系统交互,而不需要知道底层文件系统的细节。VFS提供了一组API,这些API允许Samba操作文件系统中的文件和目录,包括文件读写、文件元数据的读写、权限控制等等。Samba中的VFS模块包括很多文件,这些文件实现了各种不同的VFS操作,例如处理ACL、文件系统快照、文件压缩等等。其中一些常见的VFS模块包括:

  • vfs_acl_tdb.c:处理ACL(访问控制列表)的模块,将ACL存储在TDB(Trivial Database)数据库中。
  • vfs_zfsacl.c:提供了对ZFS文件系统的ACL支持。
  • vfs_full_audit.c:提供了samba共享的用户操作的日志功能。
    除了这些模块,Samba还提供了很多其他的VFS模块,开发人员可以根据需要选择和定制。

5.passdb 目录

source3下的passdb目录包含了Samba服务器中用于身份验证和授权的passdb接口和模块。

ABI            lookup_sid.h               passdb.c         pdb_ldap.c         pdb_ldap_util.c  pdb_samba_dsdb.c  pdb_smbpasswd.h  py_passdb.c
account_pol.c  machine_account_secrets.c  pdb_compat.c     pdb_ldap.h         pdb_ldap_util.h  pdb_secrets.c     pdb_tdb.c        secrets.c
login_cache.c  machine_sid.c              pdb_get_set.c    pdb_ldap_schema.c  pdb_nds.c        pdb_secrets.h     pdb_tdb.h        secrets_lsa.c
lookup_sid.c   machine_sid.h              pdb_interface.c  pdb_ldap_schema.h  pdb_nds.h        pdb_smbpasswd.c   pdb_util.c       wscript_build

通俗讲,也就是我们常用的创建用户,删除用户,修改密码的数据库端实现以及对外接口,当然这些对外接口依然是提供给samba内部的,通过内部封装再提供一层对外API可以给开发人员使用。

6.nmbd目录

此目录和smbd目录是类似的,作为nmbd的服务器端,负责处理NetBIOS名字服务(NetBIOS Name Service)。NetBIOS是一个早期的计算机网络协议,它使用一种名字服务来将网络上的计算机映射到易于理解的名字(如“COMPUTER1”)。nmbd提供了NetBIOS名字注册和解析功能,使得Samba服务器可以被其他计算机使用NetBIOS名字访问。除此之外,nmbd还处理了一些其他的NetBIOS相关的任务,例如查询网络上的Master Browser,以及响应NetBIOS广播和查询请求等。

asyncdns.c         nmbd_browsesync.c  nmbd_incomingdgrams.c    nmbd_mynames.c       nmbd_namerelease.c   nmbd_proto.h              nmbd_subnetdb.c    nmbd_workgroupdb.c
nmbd_become_dmb.c  nmbd.c             nmbd_incomingrequests.c  nmbd_namelistdb.c    nmbd_nodestatus.c    nmbd_responserecordsdb.c  nmbd_synclists.c   wscript_build
nmbd_become_lmb.c  nmbd_elections.c   nmbd_lmhosts.c           nmbd_namequery.c     nmbd_packets.c       nmbd_sendannounce.c       nmbd_winsproxy.c
nmbd_browserdb.c   nmbd.h             nmbd_logonnames.c        nmbd_nameregister.c  nmbd_processlogon.c  nmbd_serverlistdb.c       nmbd_winsserver.c

可以很清楚看到主程序入口是nmbd.c

7.include目录

这是samba的source3下的include目录。其中包含了一些常见的头文件,例如passdb.h用于管理用户账号和密码的存储、client.h用于连接到远程smb服务器等等。另外,还有一些特定功能的头文件,如smbldap.h用于支持LDAP账号存储、vfs.h用于实现虚拟文件系统,smb.h是smb协议结构体的实现,貌似没有像dpdk一样单独做出一个守护进程。

ads.h           client.h       idmap_autorid_tdb.h  libsmb_internal.h  messages.h  nt_printing.h          proto.h        serverid.h  smbldap.h        sysquotas.h      util_sd.h
adt_tree.h      ctdbd_conn.h   idmap.h              local.h            msdfs.h     ntquotas.h             registry.h     session.h   smb_macros.h     tldap.h          util_tdb.h
async_smb.h     ctdb_srvids.h  includes.h           locking.h          nameserv.h  passdb.h               rpc_dce.h      smb_acls.h  smb_perfcount.h  tldap_util.h     vfs.h
auth_generic.h  debugparse.h   intl.h               lsa.h              nss_info.h  popt_common_cmdline.h  rpc_misc.h     smb.h       smbprofile.h     trans2.h         vfs_macros.h
auth.h          fake_file.h    krb5_env.h           MacExtensions.h    ntdomain.h  popt_common.h          safe_string.h  smb_krb5.h  srvstr.h         transfer_file.h
auth_info.h     g_lock.h       libsmbclient.h       mangle.h           ntioctl.h   printing.h             secrets.h      smb_ldap.h  stamp-h.in       util_event.h

1)includes.h文件

当然这里面最主要的还是includes.h文件,includes.h是Samba软件源代码中source3/include目录下的一个头文件。该文件被许多其他Samba源代码中的头文件包含,它本身也包含了许多其他常用的头文件,这些头文件在整个Samba组件中都需要。

includes.h的目的是提供一个集中的位置,包含通用系统头文件和Samba特定的头文件,这些头文件在整个代码库中都需要。通过在其他头文件或源文件中包含此文件,开发人员可以避免手动逐个包含每个头文件。

includes.h包含的一些头文件包括stdio.h、stdlib.h、string.h、sys/types.h、sys/stat.h、fcntl.h、unistd.h、stdarg.h、errno.h、stdbool.h等等。此外,includes.h还包括一些Samba特定的头文件,例如config.h,其中包含Samba的各种配置选项,以及replace.h,它提供了各种可移植代码的函数。

(1)注意:

因为samba里面有很多自动化生成的代码文件,如果单独做一个耦合性低的工具单独使用includes.h,需要编译samba源码来使用,因为有些头文件需要编译完才会出现。

8.utils目录

samba source3下的utils目录中包含了许多实用工具程序。这些程序的功能各不相同,包括文件操作、网络连接、配置管理、用户管理等等,我们常用的工具都是由这里的文件生成的。

async-tracker.c               mdfind.c         net_eventlog.c     netlookup.c           net_rpc_registry.c  net_usershare.c          regedit_dialog.h     smbcontrol.c
clirap2.c                     mvxattr.c        net_file.c         net_notify.c          net_rpc_rights.c    net_util.c               regedit.h            smbcquotas.c
clirap2.h                     net_ads.c        net_g_lock.c       net_printing.c        net_rpc_samsync.c   net_vfs.c                regedit_hexedit.c    smbfilter.c
conn_tdb.c                    net_ads_gpo.c    net_group.c        net_proto.h           net_rpc_service.c   nmblookup.c              regedit_hexedit.h    smbget.c
conn_tdb.h                    net_afs.c        net_groupmap.c     net_rap.c             net_rpc_sh_acct.c   ntlm_auth.c              regedit_list.c       smbpasswd.c
dbwrap_tool.c                 net_afs.h        net.h              net_registry.c        net_rpc_shell.c     ntlm_auth_diagnostics.c  regedit_list.h       smbtree.c
dbwrap_torture.c              net.c            net_help.c         net_registry_check.c  net_rpc_trust.c     ntlm_auth.h              regedit_samba3.c     split_tokens.c
debug2html.c                  net_cache.c      net_help_common.c  net_registry_check.h  net_sam.c           ntlm_auth_proto.h        regedit_treeview.c   status.c
debugparse.c                  net_conf.c       net_help_common.h  net_registry_util.c   net_serverid.c      passwd_proto.h           regedit_treeview.h   status_profile.c
destroy_netlogon_creds_cli.c  net_conf_util.c  net_idmap.c        net_registry_util.h   net_share.c         passwd_util.c            regedit_valuelist.c  status_profile_dummy.c
eventlogadm.c                 net_conf_util.h  net_idmap_check.c  net_rpc_audit.c       net_status.c        pdbedit.c                regedit_valuelist.h  status_profile.h
interact.c                    net_dns.c        net_idmap_check.h  net_rpc.c             net_tdb.c           profiles.c               regedit_wrap.c       testparm.c
interact.h                    net_dns.h        net_join.c         net_rpc_conf.c        net_time.c          regedit.c                sharesec.c           wscript_build
log2pcaphex.c                 net_dom.c        net_lookup.c       net_rpc_printer.c     net_user.c          regedit_dialog.c         smbcacls.c

例如,smbpasswd.c是一个用于管理Samba用户密码的命令行工具。它可以添加、删除、修改和列出Samba用户的密码。此外,它还提供了一些其他功能,如更改密码策略、强制用户重置密码等。

pdbedit.c是一个命令行工具,它用于管理Samba用户数据库。它可以添加、删除和修改用户、组、机器帐户等。此外,它还可以显示用户和组信息、设置密码和帐户锁定策略等。它还可以与LDAP、MySQL等外部数据库集成使用。

9.libsmb目录

source3下的libsmb目录包含了许多用于实现SMB/CIFS协议的库函数。这些函数封装了许多底层细节,使得Samba应用程序能够使用这些协议来实现文件和打印机共享等功能。

ABI             clidgram.h   climessage.c  clireadwrite.c   clisymlink.c   errormap_wbc.c    libsmb_file.c      libsmb_setget.c        namequery.c     proto.h            smberr.c
async_smb.c     clientgen.c  clioplock.c   clisecdesc.c     clitrans.c     errormap_wbc.h    libsmb.h           libsmb_stat.c          namequery_dc.c  pylibsmb.c         smbsock_connect.c
auth_generic.c  clierror.c   cliprint.c    cli_smb2_fnum.c  conncache.c    libsmb_cache.c    libsmb_misc.c      libsmb_thread_impl.c   namequery.h     reparse_symlink.c  trusts_util.c
cliconnect.c    clifile.c    cliquota.c    cli_smb2_fnum.h  dsgetdcname.c  libsmb_compat.c   libsmb_path.c      libsmb_thread_posix.c  nmblib.c        samlogon_cache.c   unexpected.c
clidfs.c        clifsinfo.c  clirap.c      clispnego.c      dsgetdcname.h  libsmb_context.c  libsmb_printjob.c  libsmb_xattr.c         nmblib.h        samlogon_cache.h   unexpected.h
clidgram.c      clilist.c    clirap.h      clistr.c         errormap.c     libsmb_dir.c      libsmb_server.c    namecache.c            passchange.c    smbclient.pc.in    wscript

当然你可以调用这些库来自己实现一个基于SMB协议的连接,它的主要功能如下:
网络连接管理、认证授权、文件/目录操作、打印作业操作、以及一些辅助函数。其中,网络连接管理提供了与SMB/CIFS服务器进行连接、关闭连接、发送接收数据等功能。认证授权提供了SMB/CIFS协议所需的各种认证和授权功能。文件/目录操作提供了SMB/CIFS协议下的文件和目录访问操作,包括读写文件、打开/关闭文件、创建/删除目录等。打印作业操作提供了SMB/CIFS协议下的打印作业操作功能,包括打印作业提交、查询打印作业状态等。

libsmb还提供了一些辅助函数,例如解析SMB/CIFS消息、打印调试信息、处理SMB/CIFS错误码等。这些函数可以方便地被应用程序使用,从而使得应用程序开发者可以更加方便地实现SMB/CIFS客户端功能。

9.其他模块

samba source3下还有很多模块,这里就不一个个去介绍了。如auth,client目录等等。web目录,web目录下的swat管理工具已经在samba-4.13.17被移除。我目前主体也是介绍常用的目录。

三、浅谈source4目录

Samba source3和source4是Samba软件的两个主要版本。Samba source3是旧版本,它在发布后长时间被广泛使用。Samba source4则是新版本,是对Samba软件进行了重构和重写。Samba source4在设计和实现上与Samba source3有很大不同,它包含了许多新的功能和改进。Samba source4中使用的是Active Directory兼容的协议。
总的来说,Samba source4是一个更为现代化和功能更加丰富的Samba版本,但Samba source3在很多组织中仍然广泛使用,并且在某些情况下,Samba source3可能会更加适合特定的用例。
目前后续也是说,据说要把source4给取消掉,貌似是个失败的构造,当然我也找不到那句话在哪了,毕竟samba实在是太臃肿了。

四、顶级库 (top-level)中的 General purpose libraries(lib)

在samba源码根目录下有个lib库目录,这个库目录是samba架构里面顶级库的其中之一的通用库,这里面包含多个通用库文件,是对外可以使用的api,整体samba用了分层处理,对外经过了一个top封装来可以使用各种api来调用实现对samba的处理。

addns  async_req      compression  dbwrap   krb5_wrap  ldb-samba  mscat  printer_driver  README   smbconf  talloc  tdb_wrap  tevent   torture  util
afs    audit_logging  crypto       fuzzing  ldb        messaging  param  pthreadpool     replace  socket   tdb     tdr       texpect  tsocket  wscript_build
  • addns:实现DNS解析、转换等功能。
  • afs:实现AFS(Andrew File System)文件系统访问协议。
  • async_req:提供异步请求处理的支持。
  • audit_logging:实现审计日志记录功能。compression:提供数据压缩和解压缩功能。
  • crypto:提供加密和解密功能。
  • dbwrap:提供数据库访问的封装,支持多种后端。
  • fuzzing:提供模糊测试相关的工具和库。
  • krb5_wrap:提供对Kerberos认证协议的支持。
  • ldb-samba:基于LDB库的Samba扩展库。
  • messaging:提供消息传输相关的工具和库。
  • mscat:提供多个库文件打包为一个库文件的支持。
  • param:提供解析命令行参数的支持。
  • printer_driver:提供打印机驱动相关的工具和库。
  • pthreadpool:提供多线程线程池的支持。
  • replace:提供字符串替换相关的工具和库。
  • smbconf:提供解析和生成Samba配置文件的支持。
  • talloc:提供内存分配和管理相关的工具和库。
  • tdb_wrap:提供对TDB(Trivial Database)的封装。
  • tevent:提供事件处理的支持。
  • torture:提供测试工具和库。
  • tsocket:提供对套接字的封装。
  • util:提供常用工具函数的支持。

talloc内存池

这里说明下talloc内存池,samba源码中的内存池是以talloc为中心。
Samba使用talloc内存池是为了提高内存分配和管理的效率和可靠性。

talloc是一个C语言的内存管理库,它可以自动追踪分配的内存和关联的上下文。使用talloc,开发者可以轻松地创建和管理内存池,从而简化了内存管理的复杂性。与标准的内存分配方式相比,talloc可以更好地支持内存分配的追踪和垃圾回收,从而避免了内存泄漏和野指针等问题。

对于Samba这样的大型开源软件项目来说,使用talloc内存池可以减少内存管理的工作量,提高开发效率,同时也能够减少内存泄漏等问题的发生,提高代码的稳定性和可靠性。因此,talloc内存池被广泛应用于Samba的各个组件中。
所以如果要参与samba开发可以去了解下talloc内存池如何使用。samba毕竟是C语言写的。


总结

主要还是讲解了samba源码框架的介绍,主体还是以source3为目标。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值