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 352 : static void add_auto_printers(void) 30 : { 31 0 : const struct loadparm_substitution *lp_sub = 32 352 : loadparm_s3_global_substitution(); 33 0 : const char *p; 34 352 : int pnum = lp_servicenumber(PRINTERS_NAME); 35 0 : char *str; 36 0 : char *saveptr; 37 352 : char *auto_serv = NULL; 38 : 39 352 : if (pnum < 0) 40 352 : if (process_registry_service(PRINTERS_NAME)) 41 352 : pnum = lp_servicenumber(PRINTERS_NAME); 42 : 43 352 : if (pnum < 0) 44 352 : 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 352 : void load_printers(void) 69 : { 70 0 : NTSTATUS status; 71 : 72 352 : if (!pcap_cache_loaded(NULL)) { 73 352 : return; 74 : } 75 : 76 352 : add_auto_printers(); 77 : 78 352 : 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 352 : if (lp_servicenumber(PRINTERS_NAME) < 0) { 86 352 : 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 1822 : bool pcap_cache_loaded(time_t *_last_change) 97 : { 98 0 : NTSTATUS status; 99 0 : time_t last; 100 : 101 1822 : status = printer_list_get_last_refresh(&last); 102 1822 : if (!NT_STATUS_IS_OK(status)) { 103 120 : return false; 104 : } 105 1702 : if (_last_change != NULL) { 106 1350 : *_last_change = last; 107 : } 108 1702 : return true; 109 : }