Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : load printer lists
4 : Copyright (C) Andrew Tridgell 1992-2000
5 :
6 : This program is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 : #include "printing/pcap.h"
22 : #include "printing/printer_list.h"
23 : #include "printing/load.h"
24 : #include "lib/param/loadparm.h"
25 :
26 : /***************************************************************************
27 : auto-load some homes and printer services
28 : ***************************************************************************/
29 12 : static void add_auto_printers(void)
30 : {
31 6 : const struct loadparm_substitution *lp_sub =
32 6 : loadparm_s3_global_substitution();
33 : const char *p;
34 12 : int pnum = lp_servicenumber(PRINTERS_NAME);
35 : char *str;
36 : char *saveptr;
37 12 : char *auto_serv = NULL;
38 :
39 12 : if (pnum < 0)
40 12 : if (process_registry_service(PRINTERS_NAME))
41 12 : pnum = lp_servicenumber(PRINTERS_NAME);
42 :
43 12 : if (pnum < 0)
44 18 : return;
45 :
46 0 : auto_serv = lp_auto_services(talloc_tos(), lp_sub);
47 0 : str = SMB_STRDUP(auto_serv);
48 0 : TALLOC_FREE(auto_serv);
49 0 : if (str == NULL) {
50 0 : return;
51 : }
52 :
53 0 : for (p = strtok_r(str, LIST_SEP, &saveptr); p;
54 0 : p = strtok_r(NULL, LIST_SEP, &saveptr)) {
55 0 : if (lp_servicenumber(p) >= 0)
56 0 : continue;
57 :
58 0 : if (printer_list_printername_exists(p))
59 0 : lp_add_printer(p, pnum);
60 : }
61 :
62 0 : SAFE_FREE(str);
63 : }
64 :
65 : /***************************************************************************
66 : load automatic printer services from pre-populated pcap cache
67 : ***************************************************************************/
68 12 : void load_printers(void)
69 : {
70 : NTSTATUS status;
71 :
72 12 : if (!pcap_cache_loaded(NULL)) {
73 12 : return;
74 : }
75 :
76 12 : add_auto_printers();
77 :
78 12 : if (!lp_load_printers()) {
79 0 : return;
80 : }
81 :
82 : /*
83 : * Do not add printers from pcap, if we don't have a [printers] share.
84 : */
85 12 : if (lp_servicenumber(PRINTERS_NAME) < 0) {
86 12 : return;
87 : }
88 :
89 0 : status = printer_list_read_run_fn(lp_add_one_printer, NULL);
90 0 : if (!NT_STATUS_IS_OK(status)) {
91 0 : DBG_NOTICE("printer_list_read_run_fn failed: %s\n",
92 : nt_errstr(status));
93 : }
94 : }
95 :
96 73 : bool pcap_cache_loaded(time_t *_last_change)
97 : {
98 : NTSTATUS status;
99 : time_t last;
100 :
101 73 : status = printer_list_get_last_refresh(&last);
102 73 : if (!NT_STATUS_IS_OK(status)) {
103 33 : return false;
104 : }
105 40 : if (_last_change != NULL) {
106 28 : *_last_change = last;
107 : }
108 40 : return true;
109 : }
|