]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:param: make "servicename" a substituted option
authorRalph Boehme <slow@samba.org>
Thu, 7 Nov 2019 10:01:05 +0000 (11:01 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 27 Nov 2019 10:25:37 +0000 (10:25 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
37 files changed:
lib/afs/afs_funcs.c
source3/include/proto.h
source3/modules/vfs_default.c
source3/modules/vfs_dfs_samba4.c
source3/modules/vfs_expand_msdfs.c
source3/modules/vfs_fileid.c
source3/modules/vfs_full_audit.c
source3/modules/vfs_recycle.c
source3/modules/vfs_virusfilter_utils.c
source3/param/loadparm.c
source3/printing/notify.c
source3/printing/nt_printing.c
source3/printing/nt_printing_ads.c
source3/printing/print_generic.c
source3/printing/printing.c
source3/printing/printspoolss.c
source3/printing/queue_process.c
source3/rpc_server/spoolss/srv_spoolss_nt.c
source3/rpc_server/srvsvc/srv_srvsvc_nt.c
source3/smbd/conn_idle.c
source3/smbd/connection.c
source3/smbd/dosmode.c
source3/smbd/durable.c
source3/smbd/fake_file.c
source3/smbd/lanman.c
source3/smbd/msdfs.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/process.c
source3/smbd/reply.c
source3/smbd/service.c
source3/smbd/share_access.c
source3/smbd/smb2_tcon.c
source3/smbd/trans2.c
source3/torture/cmd_vfs.c
source3/utils/sharesec.c
source3/utils/testparm.c

index 6645166546265ebf1797a373d83b47787600adaf..c7b263c7e731b2d6bac7ba0df1d5fe6beb61f76e 100644 (file)
@@ -221,6 +221,8 @@ char *afs_createtoken_str(const char *username, const char *cell)
 
 bool afs_login(connection_struct *conn)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        DATA_BLOB ticket;
        char *afs_username = NULL;
        char *cell = NULL;
@@ -239,7 +241,7 @@ bool afs_login(connection_struct *conn)
        }
 
        afs_username = talloc_sub_advanced(ctx,
-                               lp_servicename(ctx, SNUM(conn)),
+                               lp_servicename(ctx, lp_sub, SNUM(conn)),
                                conn->session_info->unix_info->unix_name,
                                conn->connectpath,
                                conn->session_info->unix_token->gid,
index fa023141076e72cfc34eaf5430df03084463aff5..ebb956c0d5e6757dc540229b733e2bc66107e5ef 100644 (file)
@@ -742,7 +742,7 @@ char *lp_parm_substituted_string(TALLOC_CTX *mem_ctx,
 
 #include "source3/param/param_proto.h"
 
-char *lp_servicename(TALLOC_CTX *ctx, int);
+char *lp_servicename(TALLOC_CTX *ctx, const struct loadparm_substitution *, int);
 const char *lp_const_servicename(int);
 bool lp_autoloaded(int);
 const char *lp_dnsdomain(void);
index 421772da3774b9edcec7682020d0a8f8f9b88d63..368f1e255665d8875c150281d65c06771a547acc 100644 (file)
@@ -123,6 +123,8 @@ static int vfswrap_statvfs(struct vfs_handle_struct *handle,
 static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
                enum timestamp_set_resolution *p_ts_res)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn = handle->conn;
        uint32_t caps = FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES;
        struct smb_filename *smb_fname_cpath = NULL;
@@ -174,7 +176,7 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
                        "resolution of %s "
                        "available on share %s, directory %s\n",
                        *p_ts_res == TIMESTAMP_SET_MSEC ? "msec" : "sec",
-                       lp_servicename(talloc_tos(), conn->params->service),
+                       lp_servicename(talloc_tos(), lp_sub, conn->params->service),
                        conn->connectpath ));
        }
        TALLOC_FREE(smb_fname_cpath);
index 1c7b50e99c6441d0c93b8776fe8b9b5566a25174..2900c29156e3435548d619949b457550c2289000 100644 (file)
@@ -97,8 +97,11 @@ static int dfs_samba4_connect(struct vfs_handle_struct *handle,
 
 static void dfs_samba4_disconnect(struct vfs_handle_struct *handle)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        DEBUG(10,("dfs_samba4_disconnect() connect to service[%s].\n",
-                 lp_servicename(talloc_tos(), SNUM(handle->conn))));
+                 lp_servicename(talloc_tos(), lp_sub, SNUM(handle->conn))));
 
        SMB_VFS_NEXT_DISCONNECT(handle);
 }
index 23ea136620cb288a5ecd6f28253aebb1a177d1dd..6845b81b0cb08dda9fa06618266e4a60e9a25932 100644 (file)
@@ -112,6 +112,8 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
                                connection_struct *conn,
                                char *target)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *mapfilename = NULL;
        char *filename_start = strchr_m(target, '@');
        char *filename_end = NULL;
@@ -155,7 +157,7 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
        }
 
        targethost = talloc_sub_full(ctx,
-                               lp_servicename(talloc_tos(), SNUM(conn)),
+                               lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                conn->session_info->unix_info->unix_name,
                                conn->connectpath,
                                conn->session_info->unix_token->gid,
index d7e9090bc18ca8eae79c7911ef131e51afbbe8f9..4157e1d1b4062bafe34b5dd36cca9ace907d42b8 100644 (file)
@@ -467,8 +467,11 @@ static int fileid_connect(struct vfs_handle_struct *handle,
 
 static void fileid_disconnect(struct vfs_handle_struct *handle)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        DEBUG(10,("fileid_disconnect() connect to service[%s].\n",
-                 lp_servicename(talloc_tos(), SNUM(handle->conn))));
+                 lp_servicename(talloc_tos(), lp_sub, SNUM(handle->conn))));
 
        SMB_VFS_NEXT_DISCONNECT(handle);
 }
index b89996b7a56f25afefa88a4e740f27874286549f..ea16443a05d16071785bb018ca9256d28c82d602 100644 (file)
@@ -475,6 +475,8 @@ static int audit_syslog_priority(vfs_handle_struct *handle)
 
 static char *audit_prefix(TALLOC_CTX *ctx, connection_struct *conn)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *prefix = NULL;
        char *result;
 
@@ -485,7 +487,7 @@ static char *audit_prefix(TALLOC_CTX *ctx, connection_struct *conn)
                return NULL;
        }
        result = talloc_sub_full(ctx,
-                       lp_servicename(talloc_tos(), SNUM(conn)),
+                       lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                        conn->session_info->unix_info->unix_name,
                        conn->connectpath,
                        conn->session_info->unix_token->gid,
@@ -771,10 +773,13 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
 
 static void smb_full_audit_disconnect(vfs_handle_struct *handle)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        SMB_VFS_NEXT_DISCONNECT(handle);
 
        do_log(SMB_VFS_OP_DISCONNECT, True, handle,
-              "%s", lp_servicename(talloc_tos(), SNUM(handle->conn)));
+              "%s", lp_servicename(talloc_tos(), lp_sub, SNUM(handle->conn)));
 
        /* The bitmaps will be disconnected when the private
           data is deleted. */
index 46a4fcb16bff36bd272f19b6cab3874a1c906c19..6c8c6a76f30f37eb840e9644268ad046f436577c 100644 (file)
@@ -454,6 +454,8 @@ static int recycle_unlink_internal(vfs_handle_struct *handle,
                                const struct smb_filename *smb_fname,
                                int flags)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn = handle->conn;
        char *path_name = NULL;
                char *temp_name = NULL;
@@ -467,7 +469,7 @@ static int recycle_unlink_internal(vfs_handle_struct *handle,
        bool exist;
        int rc = -1;
 
-       repository = talloc_sub_full(NULL, lp_servicename(talloc_tos(), SNUM(conn)),
+       repository = talloc_sub_full(NULL, lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                        conn->session_info->unix_info->unix_name,
                                        conn->connectpath,
                                        conn->session_info->unix_token->gid,
index 480279f90d6f5b45f70b769977e8135834c5e7a3..0ee17ef7479ae63305c75e461959967becdbc9f4 100644 (file)
@@ -35,8 +35,11 @@ char *virusfilter_string_sub(
        connection_struct *conn,
        const char *str)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        return talloc_sub_full(mem_ctx,
-               lp_servicename(mem_ctx, SNUM(conn)),
+               lp_servicename(mem_ctx, lp_sub, SNUM(conn)),
                conn->session_info->unix_info->unix_name,
                conn->connectpath,
                conn->session_info->unix_token->gid,
index 0ed469e86fd1706ea501756088bad5f2ddf178a6..462de4f0b5f83bfa7e06806eb71cc9aaae56a1ad 100644 (file)
@@ -1097,7 +1097,7 @@ int lp_winbind_max_domain_connections(void)
 
 #include "lib/param/param_functions.c"
 
-FN_LOCAL_STRING(servicename, szService)
+FN_LOCAL_SUBSTITUTED_STRING(servicename, szService)
 FN_LOCAL_CONST_STRING(const_servicename, szService)
 
 /* These functions cannot be auto-generated */
@@ -3795,13 +3795,15 @@ int load_usershare_shares(struct smbd_server_connection *sconn,
        tmp_ctx = talloc_stackframe();
        for (iService = iNumServices - 1; iService >= 0; iService--) {
                if (VALID(iService) && (ServicePtrs[iService]->usershare == USERSHARE_PENDING_DELETE)) {
+                       const struct loadparm_substitution *lp_sub =
+                               loadparm_s3_global_substitution();
                        char *servname;
 
                        if (snumused && snumused(sconn, iService)) {
                                continue;
                        }
 
-                       servname = lp_servicename(tmp_ctx, iService);
+                       servname = lp_servicename(tmp_ctx, lp_sub, iService);
 
                        /* Remove from the share ACL db. */
                        DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
@@ -4292,7 +4294,7 @@ const char *volume_label(TALLOC_CTX *ctx, int snum)
        size_t end = 32;
 
        if (!*label) {
-               label = lp_servicename(ctx, snum);
+               label = lp_servicename(ctx, lp_sub, snum);
        }
 
        /*
index 56747272394460962a0ada18a04f1c8a8585ca4c..d09c12ade775ae2a57254d6810ef78404a97e1a2 100644 (file)
@@ -423,7 +423,9 @@ void notify_printer_status(struct tevent_context *ev,
                           struct messaging_context *msg_ctx,
                           int snum, uint32_t status)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        if (sharename)
                notify_printer_status_byname(ev, msg_ctx, sharename, status);
@@ -511,7 +513,9 @@ void notify_printer_driver(struct tevent_context *ev,
                           struct messaging_context *msg_ctx,
                           int snum, const char *driver_name)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -523,7 +527,9 @@ void notify_printer_comment(struct tevent_context *ev,
                            struct messaging_context *msg_ctx,
                            int snum, const char *comment)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -535,7 +541,9 @@ void notify_printer_sharename(struct tevent_context *ev,
                              struct messaging_context *msg_ctx,
                              int snum, const char *share_name)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -547,7 +555,9 @@ void notify_printer_printername(struct tevent_context *ev,
                                struct messaging_context *msg_ctx,
                                int snum, const char *printername)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -559,7 +569,9 @@ void notify_printer_port(struct tevent_context *ev,
                         struct messaging_context *msg_ctx,
                         int snum, const char *port_name)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -571,7 +583,9 @@ void notify_printer_location(struct tevent_context *ev,
                             struct messaging_context *msg_ctx,
                             int snum, const char *location)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
@@ -583,7 +597,9 @@ void notify_printer_sepfile(struct tevent_context *ev,
                            struct messaging_context *msg_ctx,
                            int snum, const char *sepfile)
 {
-       const char *sharename = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *sharename = lp_servicename(talloc_tos(), lp_sub, snum);
 
        send_notify_field_buffer(
                ev, msg_ctx,
index cd9ca9f945284cddfd8cea7e917151892ba28aeb..98536017b5b1836a6c154c676b066c1ad2479f43 100644 (file)
@@ -1713,6 +1713,8 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
                           struct dcerpc_binding_handle *b,
                           const struct spoolss_DriverInfo8 *r)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int snum;
        int n_services = lp_numservices();
        bool in_use = false;
@@ -1733,7 +1735,7 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
                }
 
                result = winreg_get_printer(mem_ctx, b,
-                                           lp_servicename(talloc_tos(), snum),
+                                           lp_servicename(talloc_tos(), lp_sub, snum),
                                            &pinfo2);
                if (!W_ERROR_IS_OK(result)) {
                        continue; /* skip */
index a82f1361fc83f8e3d88119f72f3c287e5d38a899..478d1231b0012460a660cff62f0e0752334633be 100644 (file)
@@ -619,6 +619,8 @@ done:
 
 WERROR check_published_printers(struct messaging_context *msg_ctx)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        ADS_STATUS ads_rc;
        ADS_STRUCT *ads = NULL;
        int snum;
@@ -666,7 +668,7 @@ WERROR check_published_printers(struct messaging_context *msg_ctx)
                }
 
                result = winreg_get_printer_internal(tmp_ctx, session_info, msg_ctx,
-                                           lp_servicename(talloc_tos(), snum),
+                                           lp_servicename(talloc_tos(), lp_sub, snum),
                                            &pinfo2);
                if (!W_ERROR_IS_OK(result)) {
                        continue;
index 77000bf55ec9346604ee3881e9d8df07cad798fd..0059fad23c568587e68a78100cbfa79520fe9c05 100644 (file)
@@ -82,7 +82,7 @@ static int print_run_command(int snum, const char* printername, bool do_sub,
 
        if (do_sub && snum != -1) {
                syscmd = talloc_sub_advanced(ctx,
-                               lp_servicename(talloc_tos(), snum),
+                               lp_servicename(talloc_tos(), lp_sub, snum),
                                current_user_info.unix_name,
                                "",
                                get_current_gid(NULL),
index 3d43887c5c08c0973935bf2c6ac77aa295fa455b..3c74efb9657b4c2fc61126131a419596ec4505ea 100644 (file)
@@ -1727,7 +1727,7 @@ static void print_queue_update(struct messaging_context *msg_ctx,
                return;
        }
        lpqcommand = talloc_sub_full(ctx,
-                       lp_servicename(talloc_tos(), snum),
+                       lp_servicename(talloc_tos(), lp_sub, snum),
                        current_user_info.unix_name,
                        "",
                        get_current_gid(NULL),
@@ -1747,7 +1747,7 @@ static void print_queue_update(struct messaging_context *msg_ctx,
                return;
        }
        lprmcommand = talloc_sub_full(ctx,
-                       lp_servicename(talloc_tos(), snum),
+                       lp_servicename(talloc_tos(), lp_sub, snum),
                        current_user_info.unix_name,
                        "",
                        get_current_gid(NULL),
@@ -3054,7 +3054,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum,
                goto fail;
        }
        lpq_cmd = talloc_sub_full(tmp_ctx,
-                                     lp_servicename(talloc_tos(), snum),
+                                     lp_servicename(talloc_tos(), lp_sub, snum),
                                      current_user_info.unix_name,
                                      "",
                                      get_current_gid(NULL),
@@ -3105,6 +3105,8 @@ static bool get_stored_queue_info(struct messaging_context *msg_ctx,
                                  struct tdb_print_db *pdb, int snum,
                                  int *pcount, print_queue_struct **ppqueue)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        TDB_DATA data, cgdata, jcdata;
        print_queue_struct *queue = NULL;
        uint32_t qcount = 0;
@@ -3115,7 +3117,7 @@ static bool get_stored_queue_info(struct messaging_context *msg_ctx,
        uint32_t i;
        int max_reported_jobs = lp_max_reported_print_jobs(snum);
        bool ret = false;
-       const char* sharename = lp_servicename(talloc_tos(), snum);
+       const char* sharename = lp_servicename(talloc_tos(), lp_sub, snum);
        TALLOC_CTX *tmp_ctx = talloc_new(msg_ctx);
        if (tmp_ctx == NULL) {
                return false;
index 68e94fd163528e47c6cbbb5aa3badfc05e59eaa4..523e429b205b3f790b64e796aa987f8ff3ad9a24 100644 (file)
@@ -80,7 +80,7 @@ NTSTATUS print_spool_open(files_struct *fsp,
                status = NT_STATUS_NO_MEMORY;
                goto done;
        }
-       pf->svcname = lp_servicename(pf, SNUM(fsp->conn));
+       pf->svcname = lp_servicename(pf, lp_sub, SNUM(fsp->conn));
 
        /* the document name is derived from the file name.
         * "Remote Downlevel Document" is added in front to
index 38d50eeffa83f7cd008e1cef750d094ba5db6ba6..0b6dc9fca9fec179bea58b38797cf9a15d6bd5b5 100644 (file)
@@ -103,6 +103,7 @@ static void delete_and_reload_printers_full(struct tevent_context *ev,
                                                 msg_ctx,
                                                 NULL,
                                                 lp_servicename(session_info,
+                                                               lp_sub,
                                                                snum),
                                                 &pinfo2)) {
                                nt_printer_publish(session_info,
index 33eaca5dea54e98a1251ad7d627bbdc11165cb3f..d92963ec32a9be782456176fe96d0e39980f0679 100644 (file)
@@ -2764,7 +2764,10 @@ static void spoolss_notify_share_name(struct messaging_context *msg_ctx,
                                      struct spoolss_PrinterInfo2 *pinfo2,
                                      TALLOC_CTX *mem_ctx)
 {
-       SETUP_SPOOLSS_NOTIFY_DATA_STRING(data, lp_servicename(talloc_tos(), snum));
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
+       SETUP_SPOOLSS_NOTIFY_DATA_STRING(data, lp_servicename(talloc_tos(), lp_sub, snum));
 }
 
 /*******************************************************************
@@ -3376,6 +3379,8 @@ static bool construct_notify_printer_info(struct messaging_context *msg_ctx,
                                          uint32_t id,
                                          TALLOC_CTX *mem_ctx)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int field_num,j;
        enum spoolss_NotifyType type;
        uint16_t field;
@@ -3386,7 +3391,7 @@ static bool construct_notify_printer_info(struct messaging_context *msg_ctx,
 
        DEBUG(4,("construct_notify_printer_info: Notify type: [%s], number of notify info: [%d] on printer: [%s]\n",
                (type == PRINTER_NOTIFY_TYPE ? "PRINTER_NOTIFY_TYPE" : "JOB_NOTIFY_TYPE"),
-               option_type->count, lp_servicename(talloc_tos(), snum)));
+               option_type->count, lp_servicename(talloc_tos(), lp_sub, snum)));
 
        for(field_num=0; field_num < option_type->count; field_num++) {
                field = option_type->fields[field_num].field;
@@ -3510,6 +3515,8 @@ static WERROR printserver_notify_info(struct pipes_struct *p,
                                      struct spoolss_NotifyInfo *info,
                                      TALLOC_CTX *mem_ctx)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int snum;
        struct printer_handle *Printer = find_printer_index_by_hnd(p, hnd);
        int n_services=lp_numservices();
@@ -3553,12 +3560,12 @@ static WERROR printserver_notify_info(struct pipes_struct *p,
                        result = winreg_get_printer_internal(mem_ctx,
                                                    get_session_info_system(),
                                                    p->msg_ctx,
-                                                   lp_servicename(talloc_tos(), snum),
+                                                   lp_servicename(talloc_tos(), lp_sub, snum),
                                                    &pinfo2);
                        if (!W_ERROR_IS_OK(result)) {
                                DEBUG(4, ("printserver_notify_info: "
                                          "Failed to get printer [%s]\n",
-                                         lp_servicename(talloc_tos(), snum)));
+                                         lp_servicename(talloc_tos(), lp_sub, snum)));
                                continue;
                        }
 
@@ -3603,6 +3610,8 @@ static WERROR printer_notify_info(struct pipes_struct *p,
                                  struct spoolss_NotifyInfo *info,
                                  TALLOC_CTX *mem_ctx)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int snum;
        struct printer_handle *Printer = find_printer_index_by_hnd(p, hnd);
        int i;
@@ -3647,7 +3656,7 @@ static WERROR printer_notify_info(struct pipes_struct *p,
        result = winreg_get_printer_internal(mem_ctx,
                                    get_session_info_system(),
                                    p->msg_ctx,
-                                   lp_servicename(talloc_tos(), snum), &pinfo2);
+                                   lp_servicename(talloc_tos(), lp_sub, snum), &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
                result = WERR_INVALID_HANDLE;
                goto err_pdb_drop;
@@ -4033,7 +4042,7 @@ static WERROR construct_printer_info2(TALLOC_CTX *mem_ctx,
                return result;
        }
 
-       r->sharename            = lp_servicename(mem_ctx, snum);
+       r->sharename            = lp_servicename(mem_ctx, lp_sub, snum);
        W_ERROR_HAVE_NO_MEMORY(r->sharename);
        r->portname             = talloc_strdup(mem_ctx, info2->portname);
        W_ERROR_HAVE_NO_MEMORY(r->portname);
@@ -4241,6 +4250,8 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
                                      struct spoolss_PrinterInfo7 *r,
                                      int snum)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        const struct auth_session_info *session_info;
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
        char *printer;
@@ -4253,7 +4264,7 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
        session_info = get_session_info_system();
        SMB_ASSERT(session_info != NULL);
 
-       printer = lp_servicename(tmp_ctx, snum);
+       printer = lp_servicename(tmp_ctx, lp_sub, snum);
        if (printer == NULL) {
                DEBUG(0, ("invalid printer snum %d\n", snum));
                werr = WERR_INVALID_PARAMETER;
@@ -7052,6 +7063,8 @@ static WERROR publish_or_unpublish_printer(struct pipes_struct *p,
                                           struct spoolss_SetPrinterInfo7 *info7)
 {
 #ifdef HAVE_ADS
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
        WERROR result;
        int snum;
@@ -7074,7 +7087,7 @@ static WERROR publish_or_unpublish_printer(struct pipes_struct *p,
        result = winreg_get_printer_internal(p->mem_ctx,
                                    get_session_info_system(),
                                    p->msg_ctx,
-                                   lp_servicename(talloc_tos(), snum),
+                                   lp_servicename(talloc_tos(), lp_sub, snum),
                                    &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
                return WERR_INVALID_HANDLE;
@@ -7328,13 +7341,15 @@ static WERROR fill_job_info1(TALLOC_CTX *mem_ctx,
                             int position, int snum,
                             struct spoolss_PrinterInfo2 *pinfo2)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct tm *t;
 
        t = gmtime(&queue->time);
 
        r->job_id               = jobid;
 
-       r->printer_name         = lp_servicename(mem_ctx, snum);
+       r->printer_name         = lp_servicename(mem_ctx, lp_sub, snum);
        W_ERROR_HAVE_NO_MEMORY(r->printer_name);
        r->server_name          = talloc_strdup(mem_ctx, pinfo2->servername);
        W_ERROR_HAVE_NO_MEMORY(r->server_name);
@@ -7370,13 +7385,15 @@ static WERROR fill_job_info2(TALLOC_CTX *mem_ctx,
                             struct spoolss_PrinterInfo2 *pinfo2,
                             struct spoolss_DeviceMode *devmode)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct tm *t;
 
        t = gmtime(&queue->time);
 
        r->job_id               = jobid;
 
-       r->printer_name         = lp_servicename(mem_ctx, snum);
+       r->printer_name         = lp_servicename(mem_ctx, lp_sub, snum);
        W_ERROR_HAVE_NO_MEMORY(r->printer_name);
        r->server_name          = talloc_strdup(mem_ctx, pinfo2->servername);
        W_ERROR_HAVE_NO_MEMORY(r->server_name);
@@ -9998,6 +10015,8 @@ done:
 WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
                                 struct spoolss_SetPrinterDataEx *r)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
        int                     snum = 0;
        WERROR                  result = WERR_OK;
@@ -10055,7 +10074,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
        }
 
        result = winreg_get_printer(tmp_ctx, b,
-                                   lp_servicename(talloc_tos(), snum),
+                                   lp_servicename(talloc_tos(), lp_sub, snum),
                                    &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
                goto done;
index 01f6028dbbf364dda9a78509da167b932178adb9..797443445379cbcb9f82a84d14654d30b699ee8c 100644 (file)
@@ -210,7 +210,10 @@ static enum srvsvc_ShareType get_share_type(int snum)
 static void init_srv_share_info_0(struct pipes_struct *p,
                                  struct srvsvc_NetShareInfo0 *r, int snum)
 {
-       r->name         = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
+       r->name         = lp_servicename(talloc_tos(), lp_sub, snum);
 }
 
 /*******************************************************************
@@ -223,12 +226,12 @@ static void init_srv_share_info_1(struct pipes_struct *p,
 {
        const struct loadparm_substitution *lp_sub =
                loadparm_s3_global_substitution();
-       char *net_name = lp_servicename(talloc_tos(), snum);
+       char *net_name = lp_servicename(talloc_tos(), lp_sub, snum);
        char *remark = lp_comment(p->mem_ctx, lp_sub, snum);
 
        if (remark) {
                remark = talloc_sub_full(
-                       p->mem_ctx, lp_servicename(talloc_tos(), snum),
+                       p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum),
                        get_current_username(), lp_path(talloc_tos(), lp_sub, snum),
                        p->session_info->unix_token->uid, get_current_username(),
                        "", remark);
@@ -253,12 +256,12 @@ static void init_srv_share_info_2(struct pipes_struct *p,
        char *path = NULL;
        int max_connections = lp_max_connections(snum);
        uint32_t max_uses = max_connections!=0 ? max_connections : (uint32_t)-1;
-       char *net_name = lp_servicename(talloc_tos(), snum);
+       char *net_name = lp_servicename(talloc_tos(), lp_sub, snum);
 
        remark = lp_comment(p->mem_ctx, lp_sub, snum);
        if (remark) {
                remark = talloc_sub_full(
-                       p->mem_ctx, lp_servicename(talloc_tos(), snum),
+                       p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum),
                        get_current_username(), lp_path(talloc_tos(), lp_sub, snum),
                        p->session_info->unix_token->uid, get_current_username(),
                        "", remark);
@@ -320,12 +323,12 @@ static void init_srv_share_info_501(struct pipes_struct *p,
 {
        const struct loadparm_substitution *lp_sub =
                loadparm_s3_global_substitution();
-       const char *net_name = lp_servicename(talloc_tos(), snum);
+       const char *net_name = lp_servicename(talloc_tos(), lp_sub, snum);
        char *remark = lp_comment(p->mem_ctx, lp_sub, snum);
 
        if (remark) {
                remark = talloc_sub_full(
-                       p->mem_ctx, lp_servicename(talloc_tos(), snum),
+                       p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum),
                        get_current_username(), lp_path(talloc_tos(), lp_sub, snum),
                        p->session_info->unix_token->uid, get_current_username(),
                        "", remark);
@@ -351,7 +354,7 @@ static void init_srv_share_info_502(struct pipes_struct *p,
 {
        const struct loadparm_substitution *lp_sub =
                loadparm_s3_global_substitution();
-       const char *net_name = lp_servicename(talloc_tos(), snum);
+       const char *net_name = lp_servicename(talloc_tos(), lp_sub, snum);
        char *path = NULL;
        struct security_descriptor *sd = NULL;
        struct sec_desc_buf *sd_buf = NULL;
@@ -361,7 +364,7 @@ static void init_srv_share_info_502(struct pipes_struct *p,
 
        if (remark) {
                remark = talloc_sub_full(
-                       p->mem_ctx, lp_servicename(talloc_tos(), snum),
+                       p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum),
                        get_current_username(), lp_path(talloc_tos(), lp_sub, snum),
                        p->session_info->unix_token->uid, get_current_username(),
                        "", remark);
@@ -375,7 +378,7 @@ static void init_srv_share_info_502(struct pipes_struct *p,
                string_replace(path, '/', '\\');
        }
 
-       sd = get_share_security(ctx, lp_servicename(talloc_tos(), snum), &sd_size);
+       sd = get_share_security(ctx, lp_servicename(talloc_tos(), lp_sub, snum), &sd_size);
 
        sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
 
@@ -404,7 +407,7 @@ static void init_srv_share_info_1004(struct pipes_struct *p,
 
        if (remark) {
                remark = talloc_sub_full(
-                       p->mem_ctx, lp_servicename(talloc_tos(), snum),
+                       p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum),
                        get_current_username(), lp_path(talloc_tos(), lp_sub, snum),
                        p->session_info->unix_token->uid, get_current_username(),
                        "", remark);
@@ -463,12 +466,14 @@ static void init_srv_share_info_1501(struct pipes_struct *p,
                                     struct sec_desc_buf **r,
                                     int snum)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct security_descriptor *sd;
        struct sec_desc_buf *sd_buf = NULL;
        size_t sd_size;
        TALLOC_CTX *ctx = p->mem_ctx;
 
-       sd = get_share_security(ctx, lp_servicename(talloc_tos(), snum), &sd_size);
+       sd = get_share_security(ctx, lp_servicename(talloc_tos(), lp_sub, snum), &sd_size);
        if (sd) {
                sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
        }
@@ -482,7 +487,9 @@ static void init_srv_share_info_1501(struct pipes_struct *p,
 
 static bool is_hidden_share(int snum)
 {
-       const char *net_name = lp_servicename(talloc_tos(), snum);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+       const char *net_name = lp_servicename(talloc_tos(), lp_sub, snum);
 
        return (net_name[strlen(net_name) - 1] == '$') ? True : False;
 }
@@ -493,6 +500,9 @@ static bool is_hidden_share(int snum)
 static bool is_enumeration_allowed(struct pipes_struct *p,
                                    int snum)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        if (!lp_access_based_share_enum(snum)) {
                return true;
        }
@@ -504,7 +514,7 @@ static bool is_enumeration_allowed(struct pipes_struct *p,
        }
 
        return share_access_check(p->session_info->security_token,
-                                 lp_servicename(talloc_tos(), snum),
+                                 lp_servicename(talloc_tos(), lp_sub, snum),
                                  FILE_READ_DATA, NULL);
 }
 
@@ -561,6 +571,8 @@ static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
                                      uint32_t *total_entries,
                                      bool all_shares)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        uint32_t num_entries = 0;
        uint32_t alloc_entries = 0;
        int num_services = 0;
@@ -591,12 +603,12 @@ static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
                     is_enumeration_allowed(p, snum) &&
                     (all_shares || !is_hidden_share(snum)) ) {
                         DEBUG(10, ("counting service %s\n",
-                               lp_servicename(talloc_tos(), snum) ? lp_servicename(talloc_tos(), snum) : "(null)"));
+                               lp_servicename(talloc_tos(), lp_sub, snum) ? lp_servicename(talloc_tos(), lp_sub, snum) : "(null)"));
                         allowed[snum] = true;
                         num_entries++;
                 } else {
                         DEBUG(10, ("NOT counting service %s\n",
-                               lp_servicename(talloc_tos(), snum) ? lp_servicename(talloc_tos(), snum) : "(null)"));
+                               lp_servicename(talloc_tos(), lp_sub, snum) ? lp_servicename(talloc_tos(), lp_sub, snum) : "(null)"));
                 }
         }
 
@@ -1955,7 +1967,7 @@ WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p,
                size_t sd_size;
                NTSTATUS status;
 
-               old_sd = get_share_security(p->mem_ctx, lp_servicename(talloc_tos(), snum), &sd_size);
+               old_sd = get_share_security(p->mem_ctx, lp_servicename(talloc_tos(), lp_sub, snum), &sd_size);
 
                if (old_sd && !security_descriptor_equal(old_sd, psd)) {
                        status = set_share_security(share_name, psd);
index 1934e9cc1302c0c40c3db945b57d66e5467f34d0..078a0ed691702aefbb7116e57c6b6b3ce3073f6a 100644 (file)
@@ -83,6 +83,8 @@ bool conn_idle_all(struct smbd_server_connection *sconn, time_t t)
 
 void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn, *next;
        bool close_all = false;
 
@@ -107,7 +109,7 @@ void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename
 
                if (close_all) {
                        do_close = true;
-               } else if (strequal(lp_servicename(talloc_tos(), SNUM(conn)),
+               } else if (strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                    sharename)) {
                        DEBUG(1, ("conn_force_tdis: Forcing close of "
                                  "share '%s' (wire_id=0x%08x)\n",
index c2dae6c73c446c2d91ce532bb5908dbd13db6f62..8dea205e4c7d45171b37bc3549e03c4ab0959188 100644 (file)
@@ -83,9 +83,11 @@ int count_current_connections(const char *sharename, bool verify)
 
 bool connections_snum_used(struct smbd_server_connection *unused, int snum)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int active;
 
-       active = count_current_connections(lp_servicename(talloc_tos(), snum),
+       active = count_current_connections(lp_servicename(talloc_tos(), lp_sub, snum),
                                           true);
        if (active > 0) {
                return true;
index 38d34623336ed1285830572cacaea2e01ef6797a..b4ca23741181ab65b89e74f4b36c82e62ac946b4 100644 (file)
@@ -1122,6 +1122,8 @@ NTSTATUS file_set_sparse(connection_struct *conn,
                         files_struct *fsp,
                         bool sparse)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        uint32_t old_dosmode;
        uint32_t new_dosmode;
        NTSTATUS status;
@@ -1131,7 +1133,7 @@ NTSTATUS file_set_sparse(connection_struct *conn,
                        "on readonly share[%s]\n",
                        smb_fname_str_dbg(fsp->fsp_name),
                        sparse,
-                       lp_servicename(talloc_tos(), SNUM(conn))));
+                       lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                return NT_STATUS_MEDIA_WRITE_PROTECTED;
        }
 
index c71a948191a0f73a814fab3c72d8972b6adcd9dd..9a2e639bdcd0910bc529a62ec2ff9b51014e02fe 100644 (file)
@@ -520,6 +520,8 @@ NTSTATUS vfs_default_durable_reconnect(struct connection_struct *conn,
                                       files_struct **result,
                                       DATA_BLOB *new_cookie)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct share_mode_lock *lck;
        struct share_mode_entry e;
        struct files_struct *fsp = NULL;
@@ -650,7 +652,7 @@ NTSTATUS vfs_default_durable_reconnect(struct connection_struct *conn,
        {
                DEBUG(5, ("vfs_default_durable_reconnect: denying durable "
                          "share[%s] is not writeable anymore\n",
-                         lp_servicename(talloc_tos(), SNUM(conn))));
+                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                TALLOC_FREE(lck);
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
index 83b66d6bd39742e4572c26bd5c52f3791331414a..81ccbde6aab5fc351cef5e6971c487e717c104e1 100644 (file)
@@ -126,6 +126,8 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
                                uint32_t access_mask,
                                files_struct **result)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        files_struct *fsp = NULL;
        NTSTATUS status;
 
@@ -134,7 +136,7 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(10, ("open_fake_file: smbd_calculate_access_mask "
                        "on service[%s] file[%s] returned %s\n",
-                       lp_servicename(talloc_tos(), SNUM(conn)),
+                       lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                        smb_fname_str_dbg(smb_fname),
                        nt_errstr(status)));
                return status;
@@ -144,7 +146,7 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
        if (geteuid() != sec_initial_uid()) {
                DEBUG(3, ("open_fake_file_shared: access_denied to "
                          "service[%s] file[%s] user[%s]\n",
-                         lp_servicename(talloc_tos(), SNUM(conn)),
+                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                          smb_fname_str_dbg(smb_fname),
                          conn->session_info->unix_info->unix_name));
                return NT_STATUS_ACCESS_DENIED;
index 679f46364313e049ceb5dd261386435d21e2a23f..9babb65f33f89045d8cb8b41378c8250ad1c5408 100644 (file)
@@ -97,6 +97,8 @@ static int CopyExpanded(connection_struct *conn,
                        int snum, char **dst, char *src, int *p_space_remaining)
 {
        TALLOC_CTX *ctx = talloc_tos();
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *buf = NULL;
        int l;
 
@@ -110,13 +112,13 @@ static int CopyExpanded(connection_struct *conn,
                *p_space_remaining = 0;
                return 0;
        }
-       buf = talloc_string_sub(ctx, buf,"%S", lp_servicename(ctx, snum));
+       buf = talloc_string_sub(ctx, buf,"%S", lp_servicename(ctx, lp_sub, snum));
        if (!buf) {
                *p_space_remaining = 0;
                return 0;
        }
        buf = talloc_sub_full(ctx,
-                                 lp_servicename(ctx, SNUM(conn)),
+                                 lp_servicename(ctx, lp_sub, SNUM(conn)),
                                conn->session_info->unix_info->unix_name,
                                conn->connectpath,
                                conn->session_info->unix_token->gid,
@@ -154,6 +156,8 @@ static int CopyAndAdvance(char **dst, char *src, int *n)
 static int StrlenExpanded(connection_struct *conn, int snum, char *s)
 {
        TALLOC_CTX *ctx = talloc_tos();
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *buf = NULL;
        if (!s) {
                return 0;
@@ -162,12 +166,12 @@ static int StrlenExpanded(connection_struct *conn, int snum, char *s)
        if (!buf) {
                return 0;
        }
-       buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(ctx, snum));
+       buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(ctx, lp_sub, snum));
        if (!buf) {
                return 0;
        }
        buf = talloc_sub_full(ctx,
-                                 lp_servicename(ctx, SNUM(conn)),
+                                 lp_servicename(ctx, lp_sub, SNUM(conn)),
                                conn->session_info->unix_info->unix_name,
                                conn->connectpath,
                                conn->session_info->unix_token->gid,
@@ -1949,7 +1953,7 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel,
                baseaddr = p;
        }
 
-       push_ascii(p,lp_servicename(talloc_tos(), snum),13, STR_TERMINATE);
+       push_ascii(p,lp_servicename(talloc_tos(), lp_sub, snum),13, STR_TERMINATE);
 
        if (uLevel > 0) {
                int type;
@@ -2076,6 +2080,8 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
                                int               *rdata_len,
                                int               *rparam_len )
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
        char *str2 = skip_string(param,tpscnt,str1);
        char *p = skip_string(param,tpscnt,str2);
@@ -2113,7 +2119,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
                if (!(lp_browseable(i) && lp_snum_ok(i))) {
                        continue;
                }
-               push_ascii_fstring(servicename_dos, lp_servicename(talloc_tos(), i));
+               push_ascii_fstring(servicename_dos, lp_servicename(talloc_tos(), lp_sub, i));
                /* Maximum name length = 13. */
                if( lp_browseable( i ) && lp_snum_ok( i ) && (strlen(servicename_dos) < 13)) {
                        total++;
@@ -2146,7 +2152,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
                }
 
                push_ascii_fstring(servicename_dos,
-                                  lp_servicename(talloc_tos(), i));
+                                  lp_servicename(talloc_tos(), lp_sub, i));
                if (lp_browseable(i) && lp_snum_ok(i) && (strlen(servicename_dos) < 13)) {
                        if (fill_share_info( conn,i,uLevel,&p,&f_len,&p2,&s_len,*rdata ) < 0) {
                                break;
index 0e865829751a56329b2c16edfab539900c5f97e2..a70e795f0caf9b3c8ac376d7a0aeae20b7960e1a 100644 (file)
@@ -61,6 +61,8 @@ static NTSTATUS parse_dfs_path(connection_struct *conn,
                                struct dfs_path *pdp, /* MUST BE TALLOCED */
                                bool *ppath_contains_wcard)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *pathname_local;
        char *p,*temp;
        char *servicename;
@@ -162,9 +164,9 @@ static NTSTATUS parse_dfs_path(connection_struct *conn,
        }
 
        /* Is this really our servicename ? */
-       if (conn && !( strequal(servicename, lp_servicename(talloc_tos(), SNUM(conn)))
+       if (conn && !( strequal(servicename, lp_servicename(talloc_tos(), lp_sub, SNUM(conn)))
                        || (strequal(servicename, HOMES_NAME)
-                       && strequal(lp_servicename(talloc_tos(), SNUM(conn)),
+                       && strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                get_current_username()) )) ) {
                DEBUG(10,("parse_dfs_path: %s is not our servicename\n",
                        servicename));
@@ -872,6 +874,8 @@ static NTSTATUS dfs_redirect(TALLOC_CTX *ctx,
                        char **pp_path_out,
                        bool *ppath_contains_wcard)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        NTSTATUS status;
        bool search_wcard_flag = (ucf_flags &
                (UCF_COND_ALLOW_WCARD_LCOMP|UCF_ALWAYS_ALLOW_WCARD_LCOMP));
@@ -923,9 +927,9 @@ static NTSTATUS dfs_redirect(TALLOC_CTX *ctx,
                return NT_STATUS_OK;
        }
 
-       if (!( strequal(pdp->servicename, lp_servicename(talloc_tos(), SNUM(conn)))
+       if (!( strequal(pdp->servicename, lp_servicename(talloc_tos(), lp_sub, SNUM(conn)))
                        || (strequal(pdp->servicename, HOMES_NAME)
-                       && strequal(lp_servicename(talloc_tos(), SNUM(conn)),
+                       && strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                conn->session_info->unix_info->sanitized_username) )) ) {
 
                /* The given sharename doesn't match this connection. */
@@ -1598,7 +1602,7 @@ static int form_junctions(TALLOC_CTX *ctx,
        const char *dname = NULL;
        char *talloced = NULL;
        const char *connect_path = lp_path(frame, lp_sub, snum);
-       char *service_name = lp_servicename(frame, snum);
+       char *service_name = lp_servicename(frame, lp_sub, snum);
        const char *msdfs_proxy = lp_msdfs_proxy(frame, lp_sub, snum);
        struct conn_struct_tos *c = NULL;
        connection_struct *conn = NULL;
index a083f3522619fc4614edd5da9e2c843bc6309110..857581f824fd331a36963ca3c350bba8ea286f81 100644 (file)
@@ -2603,6 +2603,8 @@ static void call_nt_transact_get_user_quota(connection_struct *conn,
                                            uint32_t data_count,
                                            uint32_t max_data_count)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        NTSTATUS nt_status = NT_STATUS_OK;
        char *params = *ppparams;
        char *pdata = *ppdata;
@@ -2625,7 +2627,7 @@ static void call_nt_transact_get_user_quota(connection_struct *conn,
        /* access check */
        if (get_current_uid(conn) != sec_initial_uid()) {
                DEBUG(1,("get_user_quota: access_denied service [%s] user "
-                        "[%s]\n", lp_servicename(talloc_tos(), SNUM(conn)),
+                        "[%s]\n", lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                         conn->session_info->unix_info->unix_name));
                nt_status = NT_STATUS_ACCESS_DENIED;
                goto error;
@@ -2733,6 +2735,8 @@ static void call_nt_transact_set_user_quota(connection_struct *conn,
                                            uint32_t data_count,
                                            uint32_t max_data_count)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *params = *ppparams;
        char *pdata = *ppdata;
        int data_len=0,param_len=0;
@@ -2749,7 +2753,7 @@ static void call_nt_transact_set_user_quota(connection_struct *conn,
        /* access check */
        if (get_current_uid(conn) != sec_initial_uid()) {
                DEBUG(1,("set_user_quota: access_denied service [%s] user "
-                        "[%s]\n", lp_servicename(talloc_tos(), SNUM(conn)),
+                        "[%s]\n", lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                         conn->session_info->unix_info->unix_name));
                status = NT_STATUS_ACCESS_DENIED;
                goto error;
index 1d4b86bed6f6c95f447e336231a040e3611ecd8a..d7202d015cb1802f8372d8be2b3a7b0f9701a31e 100644 (file)
@@ -4049,6 +4049,8 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
                               struct smb_filename *smb_dname,
                               uint32_t file_attributes)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        mode_t mode;
        char *parent_dir = NULL;
        NTSTATUS status;
@@ -4059,7 +4061,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
 
        if (!CAN_WRITE(conn) || (access_mask & ~(conn->share_access))) {
                DEBUG(5,("mkdir_internal: failing share access "
-                        "%s\n", lp_servicename(talloc_tos(), SNUM(conn))));
+                        "%s\n", lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                return NT_STATUS_ACCESS_DENIED;
        }
 
index c2952ddfc93f1bc3e08404d8f8d9af5da9374759..df6f22bc37056be813160b0daaa8f1bcc7eefc8f 100644 (file)
@@ -1503,6 +1503,8 @@ static void smb1srv_update_crypto_flags(struct smbXsrv_session *session,
 
 static connection_struct *switch_message(uint8_t type, struct smb_request *req)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int flags;
        uint64_t session_tag;
        connection_struct *conn = NULL;
@@ -1671,7 +1673,7 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
                        if (req->cmd != SMBtrans2 && req->cmd != SMBtranss2) {
                                DEBUG(1,("service[%s] requires encryption"
                                        "%s ACCESS_DENIED. mid=%llu\n",
-                                       lp_servicename(talloc_tos(), SNUM(conn)),
+                                       lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                        smb_fn_name(type),
                                        (unsigned long long)req->mid));
                                reply_nterror(req, NT_STATUS_ACCESS_DENIED);
index 0e591417860556171727594aee35eaca92575bb6..386283f46c938e545f6cddc34c150e5d6042ac4f 100644 (file)
@@ -868,6 +868,8 @@ void reply_tcon(struct smb_request *req)
 
 void reply_tcon_and_X(struct smb_request *req)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn = req->conn;
        const char *service = NULL;
        TALLOC_CTX *ctx = talloc_tos();
@@ -1142,7 +1144,7 @@ void reply_tcon_and_X(struct smb_request *req)
 
                if (lp_msdfs_root(SNUM(conn)) && lp_host_msdfs()) {
                        DEBUG(2,("Serving %s as a Dfs root\n",
-                                lp_servicename(ctx, SNUM(conn)) ));
+                                lp_servicename(ctx, lp_sub, SNUM(conn)) ));
                        optional_support |= SMB_SHARE_IN_DFS;
                }
 
@@ -1183,6 +1185,8 @@ void reply_unknown_new(struct smb_request *req, uint8_t type)
 
 void reply_ioctl(struct smb_request *req)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn = req->conn;
        uint16_t device;
        uint16_t function;
@@ -1249,6 +1253,7 @@ void reply_ioctl(struct smb_request *req)
                                status = srvstr_push((char *)req->outbuf, req->flags2,
                                            p+18,
                                            lp_servicename(talloc_tos(),
+                                                          lp_sub,
                                                           SNUM(conn)),
                                            13, STR_TERMINATE|STR_ASCII, &len);
                                if (!NT_STATUS_IS_OK(status)) {
@@ -6210,6 +6215,8 @@ void reply_printclose(struct smb_request *req)
 
 void reply_printqueue(struct smb_request *req)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        connection_struct *conn = req->conn;
        int max_count;
        int start_index;
@@ -6248,7 +6255,7 @@ void reply_printqueue(struct smb_request *req)
                TALLOC_CTX *mem_ctx = talloc_tos();
                NTSTATUS status;
                WERROR werr;
-               const char *sharename = lp_servicename(mem_ctx, SNUM(conn));
+               const char *sharename = lp_servicename(mem_ctx, lp_sub, SNUM(conn));
                struct rpc_pipe_client *cli = NULL;
                struct dcerpc_binding_handle *b = NULL;
                struct policy_handle handle;
index a1a2b97c1f3efda820bc1989c09b9a76bb4cba44..f5c85bb455437c84672e408e2c6fef00a8148b19 100644 (file)
@@ -922,6 +922,8 @@ static connection_struct *make_connection_smb1(struct smb_request *req,
                                        const char *pdev,
                                        NTSTATUS *pstatus)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct smbXsrv_tcon *tcon;
        NTSTATUS status;
        struct connection_struct *conn;
@@ -957,7 +959,7 @@ static connection_struct *make_connection_smb1(struct smb_request *req,
                return NULL;
        }
 
-       tcon->global->share_name = lp_servicename(tcon->global, SNUM(conn));
+       tcon->global->share_name = lp_servicename(tcon->global, lp_sub, SNUM(conn));
        if (tcon->global->share_name == NULL) {
                conn_free(conn);
                TALLOC_FREE(tcon);
index 3cbf7f318a27b90a46466c233f65134ec2c1fc9f..0b8f6e48e34f158523767ff4ce8815725b410ecd 100644 (file)
@@ -194,9 +194,12 @@ bool token_contains_name_in_list(const char *username,
 bool user_ok_token(const char *username, const char *domain,
                   const struct security_token *token, int snum)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
        if (lp_invalid_users(snum) != NULL) {
                if (token_contains_name_in_list(username, domain,
-                                               lp_servicename(talloc_tos(), snum),
+                                               lp_servicename(talloc_tos(), lp_sub, snum),
                                                token,
                                                lp_invalid_users(snum))) {
                        DEBUG(10, ("User %s in 'invalid users'\n", username));
@@ -206,7 +209,7 @@ bool user_ok_token(const char *username, const char *domain,
 
        if (lp_valid_users(snum) != NULL) {
                if (!token_contains_name_in_list(username, domain,
-                                                lp_servicename(talloc_tos(), snum),
+                                                lp_servicename(talloc_tos(), lp_sub, snum),
                                                 token,
                                                 lp_valid_users(snum))) {
                        DEBUG(10, ("User %s not in 'valid users'\n",
@@ -216,7 +219,7 @@ bool user_ok_token(const char *username, const char *domain,
        }
 
        DEBUG(10, ("user_ok_token: share %s is ok for unix user %s\n",
-                  lp_servicename(talloc_tos(), snum), username));
+                  lp_servicename(talloc_tos(), lp_sub, snum), username));
 
        return True;
 }
@@ -240,12 +243,14 @@ bool is_share_read_only_for_token(const char *username,
                                  const struct security_token *token,
                                  connection_struct *conn)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int snum = SNUM(conn);
        bool result = conn->read_only;
 
        if (lp_read_list(snum) != NULL) {
                if (token_contains_name_in_list(username, domain,
-                                               lp_servicename(talloc_tos(), snum),
+                                               lp_servicename(talloc_tos(), lp_sub, snum),
                                                token,
                                                lp_read_list(snum))) {
                        result = True;
@@ -254,7 +259,7 @@ bool is_share_read_only_for_token(const char *username,
 
        if (lp_write_list(snum) != NULL) {
                if (token_contains_name_in_list(username, domain,
-                                               lp_servicename(talloc_tos(), snum),
+                                               lp_servicename(talloc_tos(), lp_sub, snum),
                                                token,
                                                lp_write_list(snum))) {
                        result = False;
@@ -262,7 +267,7 @@ bool is_share_read_only_for_token(const char *username,
        }
 
        DEBUG(10,("is_share_read_only_for_user: share %s is %s for unix user "
-                 "%s\n", lp_servicename(talloc_tos(), snum),
+                 "%s\n", lp_servicename(talloc_tos(), lp_sub, snum),
                  result ? "read-only" : "read-write", username));
 
        return result;
index 4ae75d79dd606ed011705862ca7a6b1c59fd47d3..c87bf2ea8d25fb024aee93f16a41df73d7896f36 100644 (file)
@@ -261,7 +261,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                snum = compat_vuser->homes_snum;
        } else if ((compat_vuser->homes_snum != -1)
                    && strequal(service,
-                       lp_servicename(talloc_tos(), compat_vuser->homes_snum))) {
+                       lp_servicename(talloc_tos(), lp_sub, compat_vuser->homes_snum))) {
                snum = compat_vuser->homes_snum;
        } else {
                snum = find_service(talloc_tos(), service, &service);
@@ -341,6 +341,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
        }
 
        tcon->global->share_name = lp_servicename(tcon->global,
+                                                 lp_sub,
                                                  SNUM(compat_conn));
        if (tcon->global->share_name == NULL) {
                conn_free(compat_conn);
index 26939ad636d5ad01c06db43007d40f6cbadd6f08..080159be32a9b3ef11e59cb98c2d61b9e8fef181 100644 (file)
@@ -3522,7 +3522,10 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
 
 unsigned char *create_volume_objectid(connection_struct *conn, unsigned char objid[16])
 {
-       E_md4hash(lp_servicename(talloc_tos(), SNUM(conn)),objid);
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
+       E_md4hash(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),objid);
        return objid;
 }
 
@@ -3572,6 +3575,8 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
                         char **ppdata,
                         int *ret_data_len)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *pdata, *end_data;
        int data_len = 0;
        size_t len = 0;
@@ -3680,7 +3685,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
                         * Add volume serial number - hash of a combination of
                         * the called hostname and the service name.
                         */
-                       SIVAL(pdata,0,str_checksum(lp_servicename(talloc_tos(), snum)) ^ (str_checksum(get_local_machine_name())<<16) );
+                       SIVAL(pdata,0,str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^ (str_checksum(get_local_machine_name())<<16) );
                        /*
                         * Win2k3 and previous mess this up by sending a name length
                         * one byte short. I believe only older clients (OS/2 Win9x) use
@@ -3762,7 +3767,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
                         * Add volume serial number - hash of a combination of
                         * the called hostname and the service name.
                         */
-                       SIVAL(pdata,8,str_checksum(lp_servicename(talloc_tos(), snum)) ^
+                       SIVAL(pdata,8,str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^
                                (str_checksum(get_local_machine_name())<<16));
 
                        /* Max label len is 32 characters. */
@@ -3777,7 +3782,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 
                        DEBUG(5,("smbd_do_qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol=%s serv=%s\n",
                                (int)strlen(vname),vname,
-                               lp_servicename(talloc_tos(), snum)));
+                               lp_servicename(talloc_tos(), lp_sub, snum)));
                        if (max_data_bytes >= 24 && data_len > max_data_bytes) {
                                /* the client only requested a portion of the
                                   volume label */
@@ -3910,7 +3915,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                        if (get_current_uid(conn) != 0) {
                                DEBUG(0,("get_user_quota: access_denied "
                                         "service [%s] user [%s]\n",
-                                        lp_servicename(talloc_tos(), SNUM(conn)),
+                                        lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                                         conn->session_info->unix_info->unix_name));
                                return NT_STATUS_ACCESS_DENIED;
                        }
@@ -3918,14 +3923,14 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                        status = vfs_get_ntquota(&fsp, SMB_USER_FS_QUOTA_TYPE,
                                                 NULL, &quotas);
                        if (!NT_STATUS_IS_OK(status)) {
-                               DEBUG(0,("vfs_get_ntquota() failed for service [%s]\n",lp_servicename(talloc_tos(), SNUM(conn))));
+                               DEBUG(0,("vfs_get_ntquota() failed for service [%s]\n",lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                                return status;
                        }
 
                        data_len = 48;
 
                        DEBUG(10,("SMB_FS_QUOTA_INFORMATION: for service [%s]\n",
-                                 lp_servicename(talloc_tos(), SNUM(conn))));
+                                 lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
 
                        /* Unknown1 24 NULL bytes*/
                        SBIG_UINT(pdata,0,(uint64_t)0);
@@ -4071,7 +4076,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                                return NT_STATUS_INVALID_LEVEL;
 #endif /* EOPNOTSUPP */
                        } else {
-                               DEBUG(0,("vfs_statvfs() failed for service [%s]\n",lp_servicename(talloc_tos(), SNUM(conn))));
+                               DEBUG(0,("vfs_statvfs() failed for service [%s]\n",lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                                return NT_STATUS_DOS(ERRSRV, ERRerror);
                        }
                        break;
@@ -4202,6 +4207,8 @@ static NTSTATUS smb_set_fsquota(connection_struct *conn,
                        files_struct *fsp,
                        const DATA_BLOB *qdata)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        NTSTATUS status;
        SMB_NTQUOTA_STRUCT quotas;
 
@@ -4210,7 +4217,7 @@ static NTSTATUS smb_set_fsquota(connection_struct *conn,
        /* access check */
        if ((get_current_uid(conn) != 0) || !CAN_WRITE(conn)) {
                DEBUG(3, ("set_fsquota: access_denied service [%s] user [%s]\n",
-                         lp_servicename(talloc_tos(), SNUM(conn)),
+                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
                          conn->session_info->unix_info->unix_name));
                return NT_STATUS_ACCESS_DENIED;
        }
@@ -4247,7 +4254,7 @@ static NTSTATUS smb_set_fsquota(connection_struct *conn,
        /* now set the quotas */
        if (vfs_set_ntquota(fsp, SMB_USER_FS_QUOTA_TYPE, NULL, &quotas)!=0) {
                DEBUG(1, ("vfs_set_ntquota() failed for service [%s]\n",
-                         lp_servicename(talloc_tos(), SNUM(conn))));
+                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
                status =  map_nt_error_from_unix(errno);
        } else {
                status = NT_STATUS_OK;
@@ -4343,13 +4350,15 @@ static void call_trans2setfsinfo(connection_struct *conn,
                                 char **ppdata, int total_data,
                                 unsigned int max_data_bytes)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        struct smbXsrv_connection *xconn = req->xconn;
        char *pdata = *ppdata;
        char *params = *pparams;
        uint16_t info_level;
 
        DEBUG(10,("call_trans2setfsinfo: for service [%s]\n",
-                 lp_servicename(talloc_tos(), SNUM(conn))));
+                 lp_servicename(talloc_tos(), lp_sub, SNUM(conn))));
 
        /*  */
        if (total_params < 4) {
@@ -9667,6 +9676,8 @@ static void call_trans2ioctl(connection_struct *conn,
                             char **ppdata, int total_data,
                             unsigned int max_data_bytes)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        char *pdata = *ppdata;
        files_struct *fsp = file_fsp(req, SVAL(req->vwv+15, 0));
        NTSTATUS status;
@@ -9702,7 +9713,7 @@ static void call_trans2ioctl(connection_struct *conn,
                        return;
                }
                status = srvstr_push(pdata, req->flags2, pdata+18,
-                           lp_servicename(talloc_tos(), SNUM(conn)), 13,
+                           lp_servicename(talloc_tos(), lp_sub, SNUM(conn)), 13,
                            STR_ASCII|STR_TERMINATE, &len); /* Service name */
                if (!NT_STATUS_IS_OK(status)) {
                        reply_nterror(req, status);
index be4990db3fc856e85f5a51f13670da62c0a91d77..fb9615e26a356300d4538f69c750845c50ae51fb 100644 (file)
@@ -104,7 +104,10 @@ static NTSTATUS cmd_show_data(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int ar
 
 static NTSTATUS cmd_connect(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
-       SMB_VFS_CONNECT(vfs->conn, lp_servicename(talloc_tos(), SNUM(vfs->conn)), "vfstest");
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
+
+       SMB_VFS_CONNECT(vfs->conn, lp_servicename(talloc_tos(), lp_sub, SNUM(vfs->conn)), "vfstest");
        return NT_STATUS_OK;
 }
 
index d22f96be5eb4caeb5b843808046813372e266ed5..454c5bfe36b029d678006d21f1a995b7a6cb358c 100644 (file)
@@ -534,7 +534,9 @@ int main(int argc, const char *argv[])
 
                for (i=0; i<lp_numservices(); i++) {
                        TALLOC_CTX *frame = talloc_stackframe();
-                       const char *service = lp_servicename(frame, i);
+                       const struct loadparm_substitution *lp_sub =
+                               loadparm_s3_global_substitution();
+                       const char *service = lp_servicename(frame, lp_sub, i);
 
                        if (service == NULL) {
                                continue;
index 264eea1916c8524765577ba6fbf55f4e0c5ce658..e4c805da9a3f3cf3d3a18d27cfe673ac7263587a 100644 (file)
@@ -532,6 +532,8 @@ static int do_global_checks(void)
  */
 static void do_per_share_checks(int s)
 {
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        const char **deny_list = lp_hosts_deny(s);
        const char **allow_list = lp_hosts_allow(s);
        const char **vfs_objects = NULL;
@@ -550,7 +552,7 @@ static void do_per_share_checks(int s)
                                        "(%s) for service %s.\n\n",
                                        hasstar ? *hasstar : *hasquery,
                                        deny_list[i],
-                                       lp_servicename(talloc_tos(), s));
+                                       lp_servicename(talloc_tos(), lp_sub, s));
                        }
                }
        }
@@ -565,7 +567,7 @@ static void do_per_share_checks(int s)
                                        "list (%s) for service %s.\n\n",
                                        hasstar ? *hasstar : *hasquery,
                                        allow_list[i],
-                                       lp_servicename(talloc_tos(), s));
+                                       lp_servicename(talloc_tos(), lp_sub, s));
                        }
                }
        }
@@ -574,7 +576,7 @@ static void do_per_share_checks(int s)
                fprintf(stderr, "Invalid combination of parameters for service "
                                "%s. Level II oplocks can only be set if oplocks "
                                "are also set.\n\n",
-                               lp_servicename(talloc_tos(), s));
+                               lp_servicename(talloc_tos(), lp_sub, s));
        }
 
        if (!lp_store_dos_attributes(s) && lp_map_hidden(s)
@@ -584,7 +586,7 @@ static void do_per_share_checks(int s)
                        "Invalid combination of parameters for service %s. Map "
                        "hidden can only work if create mask includes octal "
                        "01 (S_IXOTH).\n\n",
-                       lp_servicename(talloc_tos(), s));
+                       lp_servicename(talloc_tos(), lp_sub, s));
        }
        if (!lp_store_dos_attributes(s) && lp_map_hidden(s)
            && (lp_force_create_mode(s) & S_IXOTH))
@@ -593,7 +595,7 @@ static void do_per_share_checks(int s)
                        "Invalid combination of parameters for service "
                        "%s. Map hidden can only work if force create mode "
                        "excludes octal 01 (S_IXOTH).\n\n",
-                       lp_servicename(talloc_tos(), s));
+                       lp_servicename(talloc_tos(), lp_sub, s));
        }
        if (!lp_store_dos_attributes(s) && lp_map_system(s)
            && !(lp_create_mask(s) & S_IXGRP))
@@ -602,7 +604,7 @@ static void do_per_share_checks(int s)
                        "Invalid combination of parameters for service "
                        "%s. Map system can only work if create mask includes "
                        "octal 010 (S_IXGRP).\n\n",
-                       lp_servicename(talloc_tos(), s));
+                       lp_servicename(talloc_tos(), lp_sub, s));
        }
        if (!lp_store_dos_attributes(s) && lp_map_system(s)
            && (lp_force_create_mode(s) & S_IXGRP))
@@ -611,13 +613,13 @@ static void do_per_share_checks(int s)
                        "Invalid combination of parameters for service "
                        "%s. Map system can only work if force create mode "
                        "excludes octal 010 (S_IXGRP).\n\n",
-                       lp_servicename(talloc_tos(), s));
+                       lp_servicename(talloc_tos(), lp_sub, s));
        }
        if (lp_printing(s) == PRINT_CUPS && *(lp_print_command(s)) != '\0') {
                fprintf(stderr,
                        "Warning: Service %s defines a print command, but "
                        "parameter is ignored when using CUPS libraries.\n\n",
-                       lp_servicename(talloc_tos(), s));
+                       lp_servicename(talloc_tos(), lp_sub, s));
        }
 
        vfs_objects = lp_vfs_objects(s);
@@ -638,6 +640,8 @@ static void do_per_share_checks(int s)
  int main(int argc, const char *argv[])
 {
        const char *config_file = get_dyn_CONFIGFILE();
+       const struct loadparm_substitution *lp_sub =
+               loadparm_s3_global_substitution();
        int s;
        static int silent_mode = False;
        static int show_all_parameters = False;
@@ -817,10 +821,10 @@ static void do_per_share_checks(int s)
                                if (allow_access(lp_hosts_deny(-1), lp_hosts_allow(-1), cname, caddr)
                                    && allow_access(lp_hosts_deny(s), lp_hosts_allow(s), cname, caddr)) {
                                        fprintf(stderr,"Allow connection from %s (%s) to %s\n",
-                                                  cname,caddr,lp_servicename(talloc_tos(), s));
+                                                  cname,caddr,lp_servicename(talloc_tos(), lp_sub, s));
                                } else {
                                        fprintf(stderr,"Deny connection from %s (%s) to %s\n",
-                                                  cname,caddr,lp_servicename(talloc_tos(), s));
+                                                  cname,caddr,lp_servicename(talloc_tos(), lp_sub, s));
                                }
                        }
                }