libsmbclient for Samba4: initial design issues

derrell at samba.org derrell at samba.org
Fri Aug 12 19:25:03 GMT 2005


I have been working on an initial design of libsmbclient for Samba4.  My
goals for this design are as follows:

 - Provide the full capability of the "raw" interface in Samba4.

 - Add a layer on top of the "raw" interface that provides "simpler" usage
   than the "raw" interface provides.  This layer will be along the lines of
   the current Samba4 libcli/* functions, which use a "typical" set of
   parameters to each of the functions to make them easier to use.  A mix of
   these higher-level functions and the "raw" functions will work.

 - Allow for an asynchronous interface with event notification.

 - Keep the interface "pure"; i.e. no global or static variables.  Handles
   (context variables, if you like) will be allocated and passed into each of
   the functions.  This "may" allow the client library to be thread safe,
   depending upon on what lies beneath it, but also meets the documented goals
   of Samba4 and provides a clean interface.

 - Ensure that a backwards compatibility layer is available, for easy
   transition by users of Samba3's libsmbclient.  The backwards compatibility
   layer provides the POSIX-like functions called smbc_*() in Samba3.
   Clearly, the POSIX backwards compatibility layer will not meet the "pure"
   goal, as this interface does not pass handles about, but must remain
   backward compatible.  This layer can, I believe, isolate the non-pure state
   information solely to its own code.)

One characteristic of good code libraries is that they maintain a consistent
"namespace" to avoid conflicts with other libraries that may be used in the
same application.  By namespace consistency, I mean that all public symbols
have a single prefix (or possibly a very small number of prefixes).  Namespace
issues apply to both compile-time and run-time consistency.  Run-time
consistency means that all non-static functions (and variables if any must
exist) begin with the module's defined prefix or "module descriptor", say
"smb_".  Compile-time consistency means that all macros and manifest constants
(#define) begin with the module descriptor, say "SMB_".  Also, because the
defined values of enums reside in the global namespace, they, too, must begin
with the module descriptor.

When a small group of engineers is working on a "closed system" (e.g. smbd)
rather than a library, these namespace issues do not matter much.  As I look
through the code towards building a clean library, I'd like to work towards
organizing the namespace somewhat.  On the run-time front, I see a number of
public functions that could easily be defined in other libraries or in a
user's own code and cause conflicts, e.g. BlockSignals(), StrCaseCmp(),
check_error(), etc.  There are also multiple prefixes in use, e.g. alloc_sub_,
auth_, base64_, cli_credentials, etc.  A somewhat complete list of public
symbols found in Samba4 is appended at the end of this message.

I'd like to see all public symbols be given a module descriptor of "smb_".
BlockSignals() would then become smb_BlockSignals(); cli_credentials_init()
would become smb_cli_credentials_init(), etc.

In the naming scheme that I've used for years, I go one step further.  Since C
does not provide a compiler-independent method of making functions private to
a set of C files, yet there are clearly times when functions are needed
internally by a number of C files but are not part of a "public" interface, I
use an upper-case module descriptor to indicate that the function must be
public (it has a module descriptor), yet is only used internally.  Functions
with a lower-case module descriptor are public because they are intended to be
used outside of the module.  Functions which are not public do not use a
module descriptor.  (I understand that Samba4 likes module descriptors on all
functions so that etags and such tools find them easily.  In that case, I'd
use some modification of the module descriptor to indicate that a function is
not public.  If Samba4 were to adopt this scheme, the "raw" functions, for
example, would provide lower-case module descriptors since those functions are
intended for use by external applications (and used internally as well, of
course), while auth_anonymous_server_info(), if I understand how it's used,
would become SMB_auth_anonymous_server_info() because it is intended for use
only within the Samba core itself and not by external callers.

As to compile-time consistency, looking at smb.h is somewhat of a nightmare
for application writers.  Again, for a "closed system", it's fine, but if
exposed by a library's header file, there are just too many potential
conflicts.  Similarly, in smb_interfaces.h which is intended to be an
externally accessed file, the enum definitions have no namespace consistency
except, in most cases, for a "RAW_" prefix.  All of those should become
SMB_RAW_* names.  Unfortunately, many of the RAW_* enum values are defined in
terms of manifest constants from trans2.h and other header files, so
smb_interfaces.h currently has dependency on a number of other header files.

I believe that the compile-time consistency issue can be fairly easily solved.
To fix smb_interfaces.h, it must not depend on any other header file.
Currently, it depends on smb.h, trans2.h, ndr_security.h, etc.  Structures
used in smb_interfaces.h which come from the PIDL-generated files will have to
be duplicated (e.g. struct security_descriptor), but there are only a few of
these.  The biggest issue is that the enums use macros which are defined in
smb.h, trans2.h, etc.  This can be solved by having smb.h, trans2.h,
etc. include smb_interfaces.h , rather than the other way around as is
currently done.  In other words, move smb_interfaces.h to near the top of
includes.h so that smb.h and trans2.h will have the benefit of any manifest
constants defined in smb_interfaces.h.  The literal values of, for example,
RAW_FILEINFO_BASIC_INFO (which will become SMB_RAW_FILEINFO_BASIC_INFO) will
be defined in smb_interfaces.h as 0x101, and the trans2.h manifest constant
SMB_QFILEINFO_STANDARD will be defined as SMB_RAW_FILEINFO_STANDARD.

The run-time namespace consistency issues are the most difficult to deal with,
but it is certainly easier to deal with them now than 2 years from now when
there is a metric boatload more code.  I can guess that with judicious (and
careful) use of etags-query-replace, the code could be namespace-clean in a
day of tedious work.

The compile-time namespace consistency issues "just" require some reorganizing
of the code and defining a few duplicate structure definitions.

I realize that I'm asking for some large changes, but I really feel that the
benefits will be huge in terms of cleanliness of code.

Thoughts?

Cheers,

Derrell

ps. Here are the current list of symbols gleaned from the following script:

  nm */*.o | sed 's/^.........//' | grep '^T' | grep -v '__' | sort | uniq

We care about D (Data) and B (BSS) symbols as well, so this is only
representative.

T BlockSignals
T CatchChild
T CatchChildLeaveStatus
T CatchSignal
T GetTimeOfDay
T StrCaseCmp
T StrnCpy
T add_string_to_array
T all_string_sub
T all_zero
T alloc_sub_advanced
T alloc_sub_basic
T alloc_sub_specified
T alloc_sub_tcon
T alpha_strcpy
T ascii_len_n
T attrib_string
T auth_anonymous_init
T auth_anonymous_server_info
T auth_backend_byname
T auth_challenge_may_be_modified
T auth_check_password
T auth_context_create
T auth_context_set_challenge
T auth_convert_server_info_sambaseinfo
T auth_convert_server_info_saminfo3
T auth_developer_init
T auth_domain_init
T auth_generate_session_info
T auth_get_challenge
T auth_get_challenge_not_implemented
T auth_interface_version
T auth_nt_status_squash
T auth_register
T auth_sam_init
T auth_session_info_debug
T auth_unix_init
T auth_winbind_init
T base64_decode_data_blob
T base64_decode_inplace
T base64_encode_data_blob
T become_daemon
T call_backtrace
T chain_reply
T check_error
T check_password_quality
T cldapd_netlogon_request
T cldapd_startup_interfaces
T cli_credentials_get_domain
T cli_credentials_get_kvno
T cli_credentials_get_netlogon_creds
T cli_credentials_get_nt_hash
T cli_credentials_get_password
T cli_credentials_get_principal
T cli_credentials_get_realm
T cli_credentials_get_secure_channel_type
T cli_credentials_get_username
T cli_credentials_get_workstation
T cli_credentials_guess
T cli_credentials_init
T cli_credentials_is_anonymous
T cli_credentials_parse_file
T cli_credentials_parse_password_fd
T cli_credentials_parse_password_file
T cli_credentials_parse_string
T cli_credentials_set_anonymous
T cli_credentials_set_conf
T cli_credentials_set_domain
T cli_credentials_set_kvno
T cli_credentials_set_machine_account
T cli_credentials_set_machine_account_pending
T cli_credentials_set_netlogon_creds
T cli_credentials_set_nt_hash
T cli_credentials_set_password
T cli_credentials_set_realm
T cli_credentials_set_secure_channel_type
T cli_credentials_set_username
T cli_credentials_set_workstation
T close_low_fds
T close_sock
T codepoint_cmpi
T count_chars
T create_complex_file
T create_directory_handle
T d_fprintf
T d_printf
T d_vfprintf
T data_blob_append
T data_blob_clear
T data_blob_clear_free
T data_blob_const
T data_blob_equal
T data_blob_free
T data_blob_hex_string
T data_blob_named
T data_blob_string_const
T data_blob_talloc_named
T data_blob_talloc_reference
T data_blob_talloc_zero
T dcerpc_module_version
T dcerpc_register_ep_server
T dcesrv_auth_alter
T dcesrv_auth_alter_ack
T dcesrv_auth_auth3
T dcesrv_auth_bind
T dcesrv_auth_bind_ack
T dcesrv_auth_request
T dcesrv_auth_response
T dcesrv_endpoint_connect
T dcesrv_endpoint_search_connect
T dcesrv_ep_server_byname
T dcesrv_fetch_session_key
T dcesrv_generic_session_key
T dcesrv_handle_fetch
T dcesrv_handle_new
T dcesrv_init_ipc_context
T dcesrv_input
T dcesrv_input_process
T dcesrv_interface_register
T dcesrv_output
T dcesrv_reply
T dcesrv_sock_init
T directory_exist
T display_set_stderr
T do_debug
T do_debug_tab
T do_list
T dos_clean_name
T dump_all_info
T dump_data
T dump_data_pw
T ejs_exception
T encrypt_user_info
T fault_setup
T fcntl_lock
T fd_lines_load
T fd_load
T fgets_slash
T file_exist
T file_exists
T file_lines_load
T file_lines_slashcont
T file_load
T file_modtime
T file_save
T free_response
T gen_fnmatch
T gendb_add_ldif
T gendb_search
T gendb_search_dn
T gendb_search_v
T generate_random
T generate_random_buffer
T generate_random_str
T generate_random_str_list
T get_file_size
T get_myname
T get_task_id
T get_time_t_max
T getfileline
T hash_password_check
T hdb_ldb_create
T hex_encode
T http_error
T http_error_unix
T http_parse_header
T http_process_input
T http_setup_esp
T http_timestring
T idr_find
T idr_get_new
T idr_get_new_above
T idr_get_new_random
T idr_init
T idr_remove
T in_list
T init_request
T init_response
T init_smb_request
T interpret_addr
T interpret_addr2
T interpret_protocol
T is_exe_filename
T is_ipaddress
T is_myname
T is_zero_ip
T kdc_startup_interfaces
T krb5_get_all_client_addrs
T ldap_parse_dn
T ldap_string_to_time
T ldap_timestring
T ldapsrv_BindRequest
T ldapsrv_UnbindRequest
T ldapsrv_do_call
T ldapsrv_get_hldb_partition_ops
T ldapsrv_get_partition
T ldapsrv_get_rootdse_partition_ops
T ldapsrv_get_sldb_partition_ops
T ldapsrv_init_reply
T ldapsrv_queue_reply
T ldapsrv_sam_connect
T ldapsrv_unwilling
T ldb_wrap_connect
T lib_path
T libnet_AddShare
T libnet_ChangePassword
T libnet_CreateUser
T libnet_DelShare
T libnet_Join
T libnet_JoinDomain
T libnet_ListShares
T libnet_Lookup
T libnet_LookupHost
T libnet_LookupHost_send
T libnet_LookupPdc
T libnet_LookupPdc_send
T libnet_Lookup_recv
T libnet_Lookup_send
T libnet_RemoteTOD
T libnet_RpcConnect
T libnet_SamDump
T libnet_SamSync_netlogon
T libnet_SetPassword
T libnet_context_init
T libnet_rpc_domain_open
T libnet_rpc_domain_open_recv
T libnet_rpc_domain_open_send
T libnet_rpc_useradd
T libnet_rpc_useradd_recv
T libnet_rpc_useradd_send
T libnet_rpc_userdel
T libnet_rpc_userdel_recv
T libnet_rpc_userdel_send
T libnet_rpc_userinfo
T libnet_rpc_userinfo_recv
T libnet_rpc_userinfo_send
T libnet_rpc_usermod
T libnet_rpc_usermod_recv
T libnet_rpc_usermod_send
T libnet_samsync_ldb
T lock_path
T log_suspicious_usage
T log_task_id
T lp_add_home
T lp_add_one_printer
T lp_add_printer
T lp_add_service
T lp_addmachine_script
T lp_adduser_script
T lp_admin_users
T lp_ads_server
T lp_allow_trusted_domains
T lp_auth_methods
T lp_auto_services
T lp_autoloaded
T lp_bind_interfaces_only
T lp_browseable
T lp_ci_filesystem
T lp_cldap_port
T lp_client_lanman_auth
T lp_client_ntlmv2_auth
T lp_client_plaintext_auth
T lp_client_signing
T lp_comment
T lp_configfile
T lp_const_servicename
T lp_copy_service
T lp_csc_policy
T lp_dcerpc_endpoint_servers
T lp_default_server_announce
T lp_defaultservice
T lp_dgram_port
T lp_disable_netbios
T lp_disable_spoolss
T lp_display_charset
T lp_dns_proxy
T lp_do_parameter
T lp_domain_logons
T lp_domain_master
T lp_dos_charset
T lp_dump
T lp_dump_one
T lp_encrypted_passwords
T lp_enhanced_browsing
T lp_file_list_changed
T lp_fstype
T lp_get_parametric
T lp_guest_ok
T lp_guest_only
T lp_guestaccount
T lp_hide_local_users
T lp_host_msdfs
T lp_hostname_lookups
T lp_hosts_equiv
T lp_hostsallow
T lp_hostsdeny
T lp_idmap_backend
T lp_interfaces
T lp_invalid_users
T lp_js_include
T lp_killservice
T lp_killunused
T lp_krb5_port
T lp_lanman_auth
T lp_large_readwrite
T lp_level2_oplocks
T lp_lm_announce
T lp_lm_interval
T lp_load
T lp_load_printers
T lp_loaded
T lp_local_master
T lp_local_ptr
T lp_lock_sleep_time
T lp_lock_spin_count
T lp_lockdir
T lp_locking
T lp_logfile
T lp_logon_drive
T lp_logon_home
T lp_logon_path
T lp_logon_script
T lp_lppausecommand
T lp_lpqcachetime
T lp_lpqcommand
T lp_lpresumecommand
T lp_lprmcommand
T lp_machine_password_timeout
T lp_map_archive
T lp_map_hidden
T lp_map_system
T lp_max_connections
T lp_max_ttl
T lp_max_wins_ttl
T lp_max_xmit
T lp_maxmux
T lp_maxprintjobs
T lp_maxprotocol
T lp_min_wins_ttl
T lp_minprintspace
T lp_minprotocol
T lp_msdfs_proxy
T lp_msdfs_root
T lp_name_cache_timeout
T lp_name_resolve_order
T lp_nbt_port
T lp_ncalrpc_dir
T lp_netbios_aliases
T lp_netbios_name
T lp_netbios_scope
T lp_next_parameter
T lp_non_unix_account_range
T lp_nt_status_support
T lp_ntlm_auth
T lp_ntptr_providor
T lp_ntvfs_handler
T lp_null_passwords
T lp_numservices
T lp_obey_pam_restrictions
T lp_onlyuser
T lp_oplocks
T lp_os_level
T lp_pam_password_change
T lp_panic_action
T lp_paranoid_server_security
T lp_parm_bool
T lp_parm_int
T lp_parm_ptr
T lp_parm_string
T lp_parm_string_list
T lp_parm_struct
T lp_parm_table
T lp_parm_ulong
T lp_passwd_chat
T lp_passwd_program
T lp_passwordlevel
T lp_passwordserver
T lp_pathname
T lp_piddir
T lp_plaintext_auth
T lp_posix_locking
T lp_preferred_master
T lp_preload_modules
T lp_print_ok
T lp_printcapname
T lp_printcommand
T lp_printername
T lp_printing
T lp_private_dir
T lp_queuepausecommand
T lp_queueresumecommand
T lp_readonly
T lp_readraw
T lp_realm
T lp_remote_announce
T lp_remote_browse_sync
T lp_remove_service
T lp_resetnumservices
T lp_restrict_anonymous
T lp_rootdir
T lp_rpc_big_endian
T lp_sam_url
T lp_security
T lp_server_role
T lp_server_services
T lp_server_signing
T lp_serverstring
T lp_servicename
T lp_servicenumber
T lp_set_cmdline
T lp_set_option
T lp_setupdir
T lp_share_modes
T lp_smb_passwd_file
T lp_smb_ports
T lp_snum_ok
T lp_socket_address
T lp_socket_options
T lp_spoolss_url
T lp_strict_locking
T lp_strict_sync
T lp_swat_directory
T lp_talloc_free
T lp_template_homedir
T lp_template_shell
T lp_time_offset
T lp_tls_cafile
T lp_tls_certfile
T lp_tls_crlfile
T lp_tls_enabled
T lp_tls_keyfile
T lp_unicode
T lp_unix_charset
T lp_unix_extensions
T lp_use_mmap
T lp_use_spnego
T lp_username
T lp_usernamelevel
T lp_valid_users
T lp_we_are_a_wins_server
T lp_web_port
T lp_winbind_cache_time
T lp_winbind_enum_groups
T lp_winbind_enum_users
T lp_winbind_gid
T lp_winbind_separator
T lp_winbind_uid
T lp_winbind_use_default_domain
T lp_wins_hook
T lp_wins_partners
T lp_wins_proxy
T lp_wins_server_list
T lp_wins_support
T lp_wins_url
T lp_workgroup
T lp_writeraw
T main
T make_server_info_netlogon_validation
T map_file
T map_user_info
T mask_match
T memdup
T ms_fnmatch
T msleep
T myhostname
T name_to_fqdn
T nbtd_address_list
T nbtd_bad_packet
T nbtd_find_iname
T nbtd_name_query_reply
T nbtd_name_registration_reply
T nbtd_name_release_reply
T nbtd_negative_name_query_reply
T nbtd_query_status
T nbtd_register_names
T nbtd_request_defense
T nbtd_request_query
T nbtd_self_packet
T nbtd_startup_interfaces
T nbtd_wack_reply
T next_token
T nt_status_to_pam
T nt_time_equal
T nt_time_string
T nt_time_to_unix
T ntlm_password_check
T ntptr_AddJob
T ntptr_AddPrintServerForm
T ntptr_AddPrinter
T ntptr_AddPrinterDriver
T ntptr_AddPrinterForm
T ntptr_DeletePrintServerData
T ntptr_DeletePrintServerForm
T ntptr_DeletePrinter
T ntptr_DeletePrinterData
T ntptr_DeletePrinterDriver
T ntptr_DeletePrinterForm
T ntptr_EndDocPrinter
T ntptr_EndPagePrinter
T ntptr_EnumJobs
T ntptr_EnumMonitors
T ntptr_EnumPorts
T ntptr_EnumPrintProcessors
T ntptr_EnumPrintServerData
T ntptr_EnumPrintServerForms
T ntptr_EnumPrinterData
T ntptr_EnumPrinterDrivers
T ntptr_EnumPrinterForms
T ntptr_EnumPrinters
T ntptr_GetJob
T ntptr_GetPrintServerData
T ntptr_GetPrinter
T ntptr_GetPrinterData
T ntptr_GetPrinterDriver
T ntptr_GetPrinterDriverDirectory
T ntptr_GetPrinterForm
T ntptr_OpenMonitor
T ntptr_OpenPort
T ntptr_OpenPrintServer
T ntptr_OpenPrinter
T ntptr_ReadPrinter
T ntptr_ScheduleJob
T ntptr_SetJob
T ntptr_SetPrintServerData
T ntptr_SetPrintServerForm
T ntptr_SetPrinter
T ntptr_SetPrinterData
T ntptr_SetPrinterForm
T ntptr_StartDocPrinter
T ntptr_StartPagePrinter
T ntptr_WritePrinter
T ntptr_backend_byname
T ntptr_init_context
T ntptr_interface_version
T ntptr_register
T nttime_from_string
T ntvfs_async_setup
T ntvfs_async_state_pop
T ntvfs_async_state_push
T ntvfs_backend_byname
T ntvfs_cancel
T ntvfs_chkpath
T ntvfs_close
T ntvfs_connect
T ntvfs_copy
T ntvfs_disconnect
T ntvfs_exit
T ntvfs_flush
T ntvfs_fsinfo
T ntvfs_init_connection
T ntvfs_interface_version
T ntvfs_ioctl
T ntvfs_lock
T ntvfs_logoff
T ntvfs_lpq
T ntvfs_map_close
T ntvfs_map_fileinfo
T ntvfs_map_fsinfo
T ntvfs_map_lock
T ntvfs_map_open
T ntvfs_map_qfileinfo
T ntvfs_map_qpathinfo
T ntvfs_map_read
T ntvfs_map_write
T ntvfs_mkdir
T ntvfs_next_async_setup
T ntvfs_next_cancel
T ntvfs_next_chkpath
T ntvfs_next_close
T ntvfs_next_connect
T ntvfs_next_copy
T ntvfs_next_disconnect
T ntvfs_next_exit
T ntvfs_next_flush
T ntvfs_next_fsinfo
T ntvfs_next_ioctl
T ntvfs_next_lock
T ntvfs_next_logoff
T ntvfs_next_lpq
T ntvfs_next_mkdir
T ntvfs_next_openfile
T ntvfs_next_qfileinfo
T ntvfs_next_qpathinfo
T ntvfs_next_read
T ntvfs_next_rename
T ntvfs_next_rmdir
T ntvfs_next_search_close
T ntvfs_next_search_first
T ntvfs_next_search_next
T ntvfs_next_seek
T ntvfs_next_setfileinfo
T ntvfs_next_setpathinfo
T ntvfs_next_trans
T ntvfs_next_trans2
T ntvfs_next_unlink
T ntvfs_next_write
T ntvfs_openfile
T ntvfs_qfileinfo
T ntvfs_qpathinfo
T ntvfs_read
T ntvfs_register
T ntvfs_rename
T ntvfs_rmdir
T ntvfs_search_close
T ntvfs_search_first
T ntvfs_search_next
T ntvfs_seek
T ntvfs_setfileinfo
T ntvfs_setpathinfo
T ntvfs_trans
T ntvfs_trans2
T ntvfs_unlink
T ntvfs_write
T null_nttime
T null_time
T pam_to_nt_status
T pidfile_create
T pidfile_pid
T pm_process
T print_suspicious_usage
T private_path
T process_exists
T process_model_byname
T process_model_single_init
T process_model_standard_init
T process_model_startup
T process_model_version
T pull_dos_date
T pull_dos_date2
T pull_dos_date3
T pull_nttime
T push_dos_date
T push_dos_date2
T push_dos_date3
T push_nttime
T read_reply
T realloc_array
T register_debug_handlers
T register_fault_handler
T register_mutex_handlers
T register_process_model
T register_server_service
T reopen_logs
T reply_chkpth
T reply_close
T reply_copy
T reply_ctemp
T reply_dskattr
T reply_echo
T reply_exit
T reply_fclose
T reply_findclose
T reply_findnclose
T reply_flush
T reply_getatr
T reply_getattrE
T reply_ioctl
T reply_lock
T reply_lockingX
T reply_lockread
T reply_lseek
T reply_mkdir
T reply_mknew
T reply_mv
T reply_negprot
T reply_ntcancel
T reply_ntcreate_and_X
T reply_ntrename
T reply_nttrans
T reply_nttranss
T reply_open
T reply_open_and_X
T reply_printclose
T reply_printopen
T reply_printqueue
T reply_printqueue_send
T reply_printwrite
T reply_read
T reply_read_and_X
T reply_readbmpx
T reply_readbraw
T reply_rmdir
T reply_search
T reply_sendend
T reply_sends
T reply_sendstrt
T reply_sendtxt
T reply_sesssetup
T reply_setatr
T reply_setattrE
T reply_special
T reply_tcon
T reply_tcon_and_X
T reply_tdis
T reply_trans
T reply_trans2
T reply_trans_generic
T reply_transs
T reply_transs2
T reply_ulogoffX
T reply_unknown
T reply_unlink
T reply_unlock
T reply_write
T reply_write_and_X
T reply_writebmpx
T reply_writebraw
T reply_writebs
T reply_writeclose
T reply_writeunlock
T req_append_bytes
T req_append_var_block
T req_data_oob
T req_destroy
T req_fnum
T req_grow_data
T req_max_data
T req_pull_ascii4
T req_pull_blob
T req_pull_string
T req_push_str
T req_reply_dos_error
T req_reply_error
T req_send_oplock_break
T req_send_reply
T req_send_reply_nosign
T req_setup_error
T req_setup_reply
T req_setup_secondary
T req_sign_packet
T req_signing_check_incoming
T req_signing_no_reply
T rfc1738_unescape
T root_privileges
T safe_free
T safe_strcat
T safe_strcpy
T sam_get_server_info
T samba_get_pac
T samba_version_string
T same_net
T secrets_db_connect
T secrets_fetch_machine_password
T secrets_init
T secrets_shutdown
T server_service_auth_init
T server_service_cldapd_init
T server_service_kdc_init
T server_service_ldap_init
T server_service_nbtd_init
T server_service_rpc_init
T server_service_smb_init
T server_service_startup
T server_service_web_init
T server_service_winbind_init
T sesssetup_backend
T set_blocking
T set_need_random_reseed
T set_rand_reseed_callback
T set_socket_options
T setup_logging
T shlib_ext
T shm_setup
T smb_mkstemp
T smb_panic
T smb_xmalloc
T smb_xmemdup
T smb_xstrdup
T smbcli_chkpath
T smbcli_close
T smbcli_ctemp
T smbcli_deltree
T smbcli_dskattr
T smbcli_full_connection
T smbcli_getatr
T smbcli_getattrE
T smbcli_list
T smbcli_list_new
T smbcli_list_old
T smbcli_lock
T smbcli_lock64
T smbcli_locktype
T smbcli_message_end
T smbcli_message_start
T smbcli_message_text
T smbcli_mkdir
T smbcli_negprot
T smbcli_nt_create_full
T smbcli_nt_delete_on_close
T smbcli_open
T smbcli_parse_unc
T smbcli_qfileinfo
T smbcli_qfilename
T smbcli_qpathinfo
T smbcli_qpathinfo2
T smbcli_qpathinfo_alt_name
T smbcli_read
T smbcli_rename
T smbcli_rmdir
T smbcli_session_setup
T smbcli_setatr
T smbcli_smbwrite
T smbcli_socket_connect
T smbcli_state_init
T smbcli_tconX
T smbcli_tdis
T smbcli_transport_establish
T smbcli_unix_chmod
T smbcli_unix_chown
T smbcli_unix_hardlink
T smbcli_unix_symlink
T smbcli_unlink
T smbcli_unlock
T smbcli_unlock64
T smbcli_write
T smbd_tmp_path
T smbsrv_invalidate_vuid
T smbsrv_management_init
T smbsrv_register_session
T smbsrv_session_find
T smbsrv_session_find_sesssetup
T smbsrv_tcon_find
T smbsrv_tcon_init
T smbsrv_tcon_new
T smbsrv_terminate_connection
T smbsrv_vuid_init
T split_unc_name
T srv_init_signing
T srv_pull_dos_date
T srv_pull_dos_date2
T srv_pull_dos_date3
T srv_push_dos_date
T srv_push_dos_date2
T srv_push_dos_date3
T srv_setup_signing
T srv_signing_restart
T standard_sub_basic
T standard_sub_snum
T standard_sub_tcon
T str_format_nbt_domain
T str_list_add
T str_list_check
T str_list_check_ci
T str_list_copy
T str_list_equal
T str_list_length
T str_list_make
T str_list_remove
T strchr_m
T strcmp_safe
T strcsequal
T stream_setup_socket
T stream_terminate_connection
T strequal
T strhex_to_data_blob
T strhex_to_str
T string_free
T string_replace
T string_set
T string_sub
T strlen_m
T strlen_m_term
T strlower_m
T strlower_talloc
T strrchr_m
T strupper_m
T strupper_talloc
T strwicmp
T sub_set_context
T sub_set_remote_arch
T sub_set_remote_proto
T sub_set_user_name
T sys_chroot
T sys_dlerror
T sys_dlopen
T sys_dlsym
T sys_fsusage
T sys_gethostbyname
T sys_getwd
T sys_inet_addr
T sys_inet_makeaddr
T sys_inet_ntoa
T sys_read
T sys_select
T sys_select_intr
T sys_select_signal
T sys_usleep
T sys_write
T talloc_sub_advanced
T talloc_sub_basic
T talloc_sub_specified
T talloc_sub_tcon
T task_server_startup
T task_server_terminate
T tcon_backend
T tdb_wrap_open
T timestring
T timeval_add
T timeval_compare
T timeval_current
T timeval_current_ofs
T timeval_elapsed
T timeval_elapsed2
T timeval_expired
T timeval_is_zero
T timeval_max
T timeval_min
T timeval_set
T timeval_sum
T timeval_to_nttime
T timeval_until
T timeval_zero
T tmpdir
T tolower_w
T torture_all_info
T torture_check_ea
T torture_chkpath_test
T torture_close_connection
T torture_create_procs
T torture_ioctl_test
T torture_open_connection
T torture_open_connection_share
T torture_rpc_connection
T torture_rpc_connection_transport
T torture_set_file_attribute
T torture_set_sparse
T torture_setup_dir
T toupper_w
T trim_string
T ucs2_align
T unix_perms_to_wire
T unix_to_nt_time
T update_server_announce_as_printserver
T usec_time_diff
T utf16_len
T utf16_len_n
T volume_label
T winbind_off
T winbind_on
T winbind_open_pipe_sock
T winbindd_get_response
T winbindd_request
T winbindd_send_request
T wire_bad_flags
T write_sock
T x_fclose
T x_feof
T x_ferror
T x_fflush
T x_fgetc
T x_fgets
T x_fileno
T x_fopen
T x_fprintf
T x_fread
T x_fwrite
T x_setbuf
T x_setbuffer
T x_setlinebuf
T x_setvbuf
T x_tseek
T x_vfprintf
T zero_ip


More information about the samba-technical mailing list