diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd.h | 5 | ||||
-rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd_main.c | 8 | ||||
-rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd_spool.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_opipe.c | 8 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_print.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_server.c | 35 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_tree.c | 7 |
7 files changed, 56 insertions, 25 deletions
diff --git a/usr/src/cmd/smbsrv/smbd/smbd.h b/usr/src/cmd/smbsrv/smbd/smbd.h index c5130d6986..e0bc6c8f82 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd.h +++ b/usr/src/cmd/smbsrv/smbd/smbd.h @@ -20,6 +20,7 @@ */ /* + * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -55,8 +56,8 @@ void smbd_set_secmode(int); boolean_t smbd_online(void); void smbd_online_wait(const char *); -void smbd_spool_init(void); -void smbd_spool_fini(void); +void smbd_spool_start(void); +void smbd_spool_stop(void); int smbd_cups_init(void); void smbd_cups_fini(void); void smbd_load_printers(void); diff --git a/usr/src/cmd/smbsrv/smbd/smbd_main.c b/usr/src/cmd/smbsrv/smbd/smbd_main.c index 4df18b3cdf..ef1f887a51 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd_main.c +++ b/usr/src/cmd/smbsrv/smbd/smbd_main.c @@ -49,7 +49,6 @@ #include <libgen.h> #include <pwd.h> #include <grp.h> -#include <cups/cups.h> #include <smbsrv/smb_door.h> #include <smbsrv/smb_ioctl.h> @@ -535,6 +534,7 @@ smbd_service_init(void) if (smbd.s_door_lmshr < 0) smbd_report("share initialization failed"); + /* This reloads the kernel config info. */ if (smbd_kernel_bind() != 0) { (void) mutex_unlock(&smbd_service_mutex); return (-1); @@ -542,6 +542,7 @@ smbd_service_init(void) smbd_load_shares(); smbd_load_printers(); + smbd_spool_start(); smbd.s_initialized = B_TRUE; smbd_report("service initialized"); @@ -582,6 +583,7 @@ smbd_service_fini(void) smb_lgrp_stop(); smbd_opipe_stop(); smbd_door_stop(); + smbd_spool_stop(); smbd_refresh_fini(); smbd_kernel_unbind(); smbd_share_stop(); @@ -677,6 +679,7 @@ smbd_refresh_monitor(void *arg) (void) mutex_lock(&smbd_service_mutex); + smbd_spool_stop(); smbd_dc_monitor_refresh(); smb_ccache_remove(SMB_CCACHE_PATH); @@ -695,6 +698,7 @@ smbd_refresh_monitor(void *arg) (void) smbd_kernel_bind(); smbd_load_shares(); smbd_load_printers(); + smbd_spool_start(); (void) mutex_unlock(&smbd_service_mutex); } @@ -833,7 +837,6 @@ smbd_kernel_start(void) if (rc != 0) return (rc); - smbd_spool_init(); return (0); } @@ -843,7 +846,6 @@ smbd_kernel_start(void) static void smbd_kernel_unbind(void) { - smbd_spool_fini(); smb_kmod_unbind(); smbd.s_kbound = B_FALSE; } diff --git a/usr/src/cmd/smbsrv/smbd/smbd_spool.c b/usr/src/cmd/smbsrv/smbd/smbd_spool.c index e562aec189..107a2ddbad 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd_spool.c +++ b/usr/src/cmd/smbsrv/smbd/smbd_spool.c @@ -95,15 +95,18 @@ static void smbd_spool_copyfile(smb_inaddr_t *, char *, char *, char *); extern smbd_t smbd; /* - * Initialize the spool thread. + * Start the spool thread. * Returns 0 on success, an error number if thread creation fails. */ void -smbd_spool_init(void) +smbd_spool_start(void) { pthread_attr_t attr; int rc; + if (!smb_config_getbool(SMB_CI_PRINT_ENABLE)) + return; + (void) pthread_attr_init(&attr); (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); rc = pthread_create(&smbd.s_spool_tid, &attr, smbd_spool_monitor, NULL); @@ -120,7 +123,7 @@ smbd_spool_init(void) * around signal delivery. */ void -smbd_spool_fini(void) +smbd_spool_stop(void) { int i; diff --git a/usr/src/uts/common/fs/smbsrv/smb_opipe.c b/usr/src/uts/common/fs/smbsrv/smb_opipe.c index e7673de96a..bb178f3952 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_opipe.c +++ b/usr/src/uts/common/fs/smbsrv/smb_opipe.c @@ -19,6 +19,7 @@ * CDDL HEADER END */ /* + * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -120,6 +121,13 @@ smb_opipe_open(smb_request_t *sr) if ((pipe_name = smb_opipe_lookup(op->fqi.fq_path.pn_path)) == NULL) return (NT_STATUS_OBJECT_NAME_NOT_FOUND); + /* + * If printing is disabled, pretend spoolss does not exist. + */ + if (sr->sr_server->sv_cfg.skc_print_enable == 0 && + strcmp(pipe_name, "SPOOLSS") == 0) + return (NT_STATUS_OBJECT_NAME_NOT_FOUND); + op->create_options = 0; of = smb_ofile_open(sr->tid_tree, NULL, sr->smb_pid, op, diff --git a/usr/src/uts/common/fs/smbsrv/smb_print.c b/usr/src/uts/common/fs/smbsrv/smb_print.c index 759c5d6e10..b3bbedfd1b 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_print.c +++ b/usr/src/uts/common/fs/smbsrv/smb_print.c @@ -109,7 +109,8 @@ smb_com_open_print_file(smb_request_t *sr) smb_kshare_t *si; struct open_param *op = &sr->arg.open; - if (!STYPE_ISPRN(sr->tid_tree->t_res_type)) { + if (sr->sr_server->sv_cfg.skc_print_enable == 0 || + !STYPE_ISPRN(sr->tid_tree->t_res_type)) { cmn_err(CE_WARN, "smb_com_open_print_file: bad device"); smbsr_error(sr, NT_STATUS_BAD_DEVICE_TYPE, ERRDOS, ERROR_BAD_DEV_TYPE); @@ -182,7 +183,8 @@ smb_com_close_print_file(smb_request_t *sr) { smb_sdrc_t rc; - if (!STYPE_ISPRN(sr->tid_tree->t_res_type)) { + if (sr->sr_server->sv_cfg.skc_print_enable == 0 || + !STYPE_ISPRN(sr->tid_tree->t_res_type)) { smbsr_error(sr, NT_STATUS_BAD_DEVICE_TYPE, ERRDOS, ERROR_BAD_DEV_TYPE); cmn_err(CE_WARN, "smb_com_close_print_file: SDRC_ERROR"); @@ -269,7 +271,8 @@ smb_com_write_print_file(smb_request_t *sr) smb_attr_t attr; int rc; - if (!STYPE_ISPRN(sr->tid_tree->t_res_type)) { + if (sr->sr_server->sv_cfg.skc_print_enable == 0 || + !STYPE_ISPRN(sr->tid_tree->t_res_type)) { smbsr_error(sr, NT_STATUS_BAD_DEVICE_TYPE, ERRDOS, ERROR_BAD_DEV_TYPE); return (SDRC_ERROR); diff --git a/usr/src/uts/common/fs/smbsrv/smb_server.c b/usr/src/uts/common/fs/smbsrv/smb_server.c index 676100f9a4..bef039cfea 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_server.c +++ b/usr/src/uts/common/fs/smbsrv/smb_server.c @@ -754,6 +754,11 @@ smb_server_spooldoc(smb_ioc_spooldoc_t *ioc) if ((rc = smb_server_lookup(&sv)) != 0) return (rc); + if (sv->sv_cfg.skc_print_enable == 0) { + rc = ENOTTY; + goto out; + } + mutex_enter(&sv->sv_mutex); for (;;) { if (sv->sv_state != SMB_SERVER_STATE_RUNNING) { @@ -770,22 +775,24 @@ smb_server_spooldoc(smb_ioc_spooldoc_t *ioc) } } mutex_exit(&sv->sv_mutex); - if (rc == 0) { - spdoc = kmem_zalloc(sizeof (*spdoc), KM_SLEEP); - if (smb_spool_lookup_doc_byfid(sv, fid, spdoc)) { - ioc->spool_num = spdoc->sd_spool_num; - ioc->ipaddr = spdoc->sd_ipaddr; - (void) strlcpy(ioc->path, spdoc->sd_path, - MAXPATHLEN); - (void) strlcpy(ioc->username, - spdoc->sd_username, MAXNAMELEN); - } else { - /* Did not find that print job. */ - rc = EAGAIN; - } - kmem_free(spdoc, sizeof (*spdoc)); + if (rc != 0) + goto out; + + spdoc = kmem_zalloc(sizeof (*spdoc), KM_SLEEP); + if (smb_spool_lookup_doc_byfid(sv, fid, spdoc)) { + ioc->spool_num = spdoc->sd_spool_num; + ioc->ipaddr = spdoc->sd_ipaddr; + (void) strlcpy(ioc->path, spdoc->sd_path, + MAXPATHLEN); + (void) strlcpy(ioc->username, + spdoc->sd_username, MAXNAMELEN); + } else { + /* Did not find that print job. */ + rc = EAGAIN; } + kmem_free(spdoc, sizeof (*spdoc)); +out: smb_server_release(sv); return (rc); } diff --git a/usr/src/uts/common/fs/smbsrv/smb_tree.c b/usr/src/uts/common/fs/smbsrv/smb_tree.c index 03a4e856c1..24dd27cdc5 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_tree.c +++ b/usr/src/uts/common/fs/smbsrv/smb_tree.c @@ -20,6 +20,7 @@ */ /* + * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -760,6 +761,12 @@ smb_tree_connect_printq(smb_request_t *sr, const char *sharename) ASSERT(user); ASSERT(user->u_cred); + if (sr->sr_server->sv_cfg.skc_print_enable == 0) { + smb_tree_log(sr, sharename, "printing disabled"); + smbsr_error(sr, 0, ERRSRV, ERRinvnetname); + return (NULL); + } + if ((strcmp(service, any) != 0) && (strcasecmp(service, "LPT1:") != 0)) { smb_tree_log(sr, sharename, "invalid service (%s)", service); |