LCOV - code coverage report
Current view: top level - source3/smbd - server_reload.c (source / functions) Hit Total Coverage
Test: coverage report for master 6248eab5 Lines: 52 58 89.7 %
Date: 2021-08-25 13:27:56 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    Main SMB server routines
       4             :    Copyright (C) Andrew Tridgell                1992-1998
       5             :    Copyright (C) Martin Pool                    2002
       6             :    Copyright (C) Jelmer Vernooij                2002-2003
       7             :    Copyright (C) Volker Lendecke                1993-2007
       8             :    Copyright (C) Jeremy Allison                 1993-2007
       9             : 
      10             :    This program is free software; you can redistribute it and/or modify
      11             :    it under the terms of the GNU General Public License as published by
      12             :    the Free Software Foundation; either version 3 of the License, or
      13             :    (at your option) any later version.
      14             : 
      15             :    This program is distributed in the hope that it will be useful,
      16             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      17             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      18             :    GNU General Public License for more details.
      19             : 
      20             :    You should have received a copy of the GNU General Public License
      21             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      22             : */
      23             : 
      24             : #include "includes.h"
      25             : #include "smbd/smbd.h"
      26             : #include "smbd/globals.h"
      27             : #include "nt_printing.h"
      28             : #include "printing/pcap.h"
      29             : #include "printing/printer_list.h"
      30             : #include "printing/load.h"
      31             : #include "auth.h"
      32             : #include "messages.h"
      33             : #include "lib/param/loadparm.h"
      34             : 
      35             : /*
      36             :  * The persistent pcap cache is populated by the background print process. Per
      37             :  * client smbds should only reload their printer share inventories if this
      38             :  * information has changed. Use reload_last_pcap_time to detect this.
      39             :  */
      40             : static time_t reload_last_pcap_time = 0;
      41             : 
      42       15067 : bool snum_is_shared_printer(int snum)
      43             : {
      44       15067 :         return (lp_browseable(snum) && lp_snum_ok(snum) && lp_printable(snum));
      45             : }
      46             : 
      47             : /**
      48             :  * @brief Purge stale printer shares and reload from pre-populated pcap cache.
      49             :  *
      50             :  * This function should normally only be called as a callback on a successful
      51             :  * pcap_cache_reload(), or on client enumeration.
      52             :  */
      53        1400 : void delete_and_reload_printers(void)
      54             : {
      55             :         int n_services;
      56             :         int pnum;
      57             :         int snum;
      58             :         const char *pname;
      59             :         bool ok;
      60             :         time_t pcap_last_update;
      61        1400 :         TALLOC_CTX *frame = talloc_stackframe();
      62        1400 :         const struct loadparm_substitution *lp_sub =
      63             :                 loadparm_s3_global_substitution();
      64             : 
      65        1400 :         ok = pcap_cache_loaded(&pcap_last_update);
      66        1400 :         if (!ok) {
      67         130 :                 DEBUG(1, ("pcap cache not loaded\n"));
      68         130 :                 talloc_free(frame);
      69         130 :                 return;
      70             :         }
      71             : 
      72        1270 :         if (reload_last_pcap_time == pcap_last_update) {
      73        1078 :                 DEBUG(5, ("skipping printer reload, already up to date.\n"));
      74        1078 :                 talloc_free(frame);
      75        1078 :                 return;
      76             :         }
      77         192 :         reload_last_pcap_time = pcap_last_update;
      78             : 
      79             :         /* Get pcap printers updated */
      80         192 :         load_printers();
      81             : 
      82         192 :         n_services = lp_numservices();
      83         192 :         pnum = lp_servicenumber(PRINTERS_NAME);
      84             : 
      85         192 :         DEBUG(10, ("reloading printer services from pcap cache\n"));
      86             : 
      87             :         /*
      88             :          * Add default config for printers added to smb.conf file and remove
      89             :          * stale printers
      90             :          */
      91        6297 :         for (snum = 0; snum < n_services; snum++) {
      92             :                 /* avoid removing PRINTERS_NAME */
      93        6105 :                 if (snum == pnum) {
      94           0 :                         continue;
      95             :                 }
      96             : 
      97             :                 /* skip no-printer services */
      98        6105 :                 if (!snum_is_shared_printer(snum)) {
      99        5582 :                         continue;
     100             :                 }
     101             : 
     102         523 :                 pname = lp_printername(frame, lp_sub, snum);
     103             : 
     104             :                 /* check printer, but avoid removing non-autoloaded printers */
     105         523 :                 if (lp_autoloaded(snum) &&
     106           0 :                     !printer_list_printername_exists(pname)) {
     107           0 :                         lp_killservice(snum);
     108             :                 }
     109             :         }
     110             : 
     111             :         /* Make sure deleted printers are gone */
     112         192 :         load_printers();
     113             : 
     114         192 :         talloc_free(frame);
     115             : }
     116             : 
     117             : /****************************************************************************
     118             :  Reload the services file.
     119             : **************************************************************************/
     120             : 
     121      133984 : bool reload_services(struct smbd_server_connection *sconn,
     122             :                      bool (*snumused) (struct smbd_server_connection *, int),
     123             :                      bool test)
     124             : {
     125      133984 :         const struct loadparm_substitution *lp_sub =
     126             :                 loadparm_s3_global_substitution();
     127      133984 :         struct smbXsrv_connection *xconn = NULL;
     128             :         bool ret;
     129             : 
     130      133984 :         if (lp_loaded()) {
     131      133984 :                 char *fname = lp_next_configfile(talloc_tos(), lp_sub);
     132      133984 :                 if (file_exist(fname) &&
     133           0 :                     !strcsequal(fname, get_dyn_CONFIGFILE())) {
     134           0 :                         set_dyn_CONFIGFILE(fname);
     135           0 :                         test = False;
     136             :                 }
     137      133984 :                 TALLOC_FREE(fname);
     138             :         }
     139             : 
     140      133984 :         reopen_logs();
     141             : 
     142      133984 :         if (test && !lp_file_list_changed())
     143      129910 :                 return(True);
     144             : 
     145        1188 :         lp_killunused(sconn, snumused);
     146             : 
     147        1188 :         ret = lp_load_with_shares(get_dyn_CONFIGFILE());
     148             : 
     149             :         /* perhaps the config filename is now set */
     150        1188 :         if (!test) {
     151        1025 :                 reload_services(sconn, snumused, true);
     152             :         }
     153             : 
     154        1188 :         reopen_logs();
     155             : 
     156        1188 :         load_interfaces();
     157             : 
     158        1188 :         if (sconn != NULL && sconn->client != NULL) {
     159         807 :                 xconn = sconn->client->connections;
     160             :         }
     161        1999 :         for (;xconn != NULL; xconn = xconn->next) {
     162         813 :                 set_socket_options(xconn->transport.sock, "SO_KEEPALIVE");
     163         813 :                 set_socket_options(xconn->transport.sock, lp_socket_options());
     164             :         }
     165             : 
     166        1188 :         mangle_reset_cache();
     167        1188 :         reset_stat_cache();
     168        1188 :         flush_dfree_cache();
     169             : 
     170        1188 :         return(ret);
     171             : }

Generated by: LCOV version 1.13