Coverage Report

Created: 2026-07-25 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/source3/printing/load.c
Line
Count
Source
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
0
{
31
0
  const struct loadparm_substitution *lp_sub =
32
0
    loadparm_s3_global_substitution();
33
0
  const char *p;
34
0
  int pnum = lp_servicenumber(PRINTERS_NAME);
35
0
  char *str;
36
0
  char *saveptr;
37
0
  char *auto_serv = NULL;
38
39
0
  if (pnum < 0)
40
0
    if (process_registry_service(PRINTERS_NAME))
41
0
      pnum = lp_servicenumber(PRINTERS_NAME);
42
43
0
  if (pnum < 0)
44
0
    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
0
  }
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
0
  }
61
62
0
  SAFE_FREE(str);
63
0
}
64
65
/***************************************************************************
66
load automatic printer services from pre-populated pcap cache
67
***************************************************************************/
68
void load_printers(void)
69
0
{
70
0
  NTSTATUS status;
71
72
0
  if (!pcap_cache_loaded(NULL)) {
73
0
    return;
74
0
  }
75
76
0
  add_auto_printers();
77
78
0
  if (!lp_load_printers()) {
79
0
    return;
80
0
  }
81
82
  /*
83
   * Do not add printers from pcap, if we don't have a [printers] share.
84
   */
85
0
  if (lp_servicenumber(PRINTERS_NAME) < 0) {
86
0
    return;
87
0
  }
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
0
         nt_errstr(status));
93
0
  }
94
0
}
95
96
bool pcap_cache_loaded(time_t *_last_change)
97
0
{
98
0
  NTSTATUS status;
99
0
  time_t last;
100
101
0
  status = printer_list_get_last_refresh(&last);
102
0
  if (!NT_STATUS_IS_OK(status)) {
103
0
    return false;
104
0
  }
105
0
  if (_last_change != NULL) {
106
0
    *_last_change = last;
107
0
  }
108
  return true;
109
0
}