summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd.h5
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_main.c8
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_spool.c9
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_opipe.c8
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_print.c9
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_server.c35
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_tree.c7
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);