samba-bgqd: fix startup and logging
[samba.git] / source3 / printing / load.c
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 static void add_auto_printers(void)
30 {
31         const struct loadparm_substitution *lp_sub =
32                 loadparm_s3_global_substitution();
33         const char *p;
34         int pnum = lp_servicenumber(PRINTERS_NAME);
35         char *str;
36         char *saveptr;
37         char *auto_serv = NULL;
38
39         if (pnum < 0)
40                 if (process_registry_service(PRINTERS_NAME))
41                         pnum = lp_servicenumber(PRINTERS_NAME);
42
43         if (pnum < 0)
44                 return;
45
46         auto_serv = lp_auto_services(talloc_tos(), lp_sub);
47         str = SMB_STRDUP(auto_serv);
48         TALLOC_FREE(auto_serv);
49         if (str == NULL) {
50                 return;
51         }
52
53         for (p = strtok_r(str, LIST_SEP, &saveptr); p;
54              p = strtok_r(NULL, LIST_SEP, &saveptr)) {
55                 if (lp_servicenumber(p) >= 0)
56                         continue;
57                 
58                 if (printer_list_printername_exists(p))
59                         lp_add_printer(p, pnum);
60         }
61
62         SAFE_FREE(str);
63 }
64
65 /***************************************************************************
66 load automatic printer services from pre-populated pcap cache
67 ***************************************************************************/
68 void load_printers(void)
69 {
70         NTSTATUS status;
71
72         if (!pcap_cache_loaded(NULL)) {
73                 return;
74         }
75
76         add_auto_printers();
77
78         if (!lp_load_printers()) {
79                 return;
80         }
81
82         /*
83          * Do not add printers from pcap, if we don't have a [printers] share.
84          */
85         if (lp_servicenumber(PRINTERS_NAME) < 0) {
86                 return;
87         }
88
89         status = printer_list_read_run_fn(lp_add_one_printer, NULL);
90         if (!NT_STATUS_IS_OK(status)) {
91                 DBG_NOTICE("printer_list_read_run_fn failed: %s\n",
92                            nt_errstr(status));
93         }
94 }