mirror of
https://github.com/samba-team/samba.git
synced 2025-03-12 20:58:37 +03:00
Since commit eada8f8a, updates to the cups pcap cache are performed asynchronously - cups_cache_reload() forks a child process to request cups printer information and notify the parent smbd on completion. Currently printer shares are reloaded immediately following the call to cups_cache_reload(), this occurs prior to smbd receiving new cups pcap information from the child process. Such behaviour can result in stale print shares as outlined in bug 7836. This fix ensures print shares are only reloaded after new pcap data has been received. Pair-Programmed-With: Lars Müller <lars@samba.org>
70 lines
2.0 KiB
C
70 lines
2.0 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
load printer lists
|
|
Copyright (C) Andrew Tridgell 1992-2000
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "printing/pcap.h"
|
|
|
|
|
|
/***************************************************************************
|
|
auto-load some homes and printer services
|
|
***************************************************************************/
|
|
static void add_auto_printers(void)
|
|
{
|
|
const char *p;
|
|
int pnum = lp_servicenumber(PRINTERS_NAME);
|
|
char *str;
|
|
char *saveptr;
|
|
|
|
if (pnum < 0)
|
|
if (process_registry_service(PRINTERS_NAME))
|
|
pnum = lp_servicenumber(PRINTERS_NAME);
|
|
|
|
if (pnum < 0)
|
|
return;
|
|
|
|
if ((str = SMB_STRDUP(lp_auto_services())) == NULL)
|
|
return;
|
|
|
|
for (p = strtok_r(str, LIST_SEP, &saveptr); p;
|
|
p = strtok_r(NULL, LIST_SEP, &saveptr)) {
|
|
if (lp_servicenumber(p) >= 0)
|
|
continue;
|
|
|
|
if (pcap_printername_ok(p))
|
|
lp_add_printer(p, pnum);
|
|
}
|
|
|
|
SAFE_FREE(str);
|
|
}
|
|
|
|
/***************************************************************************
|
|
load automatic printer services from pre-populated pcap cache
|
|
***************************************************************************/
|
|
void load_printers(struct tevent_context *ev,
|
|
struct messaging_context *msg_ctx)
|
|
{
|
|
SMB_ASSERT(pcap_cache_loaded());
|
|
|
|
add_auto_printers();
|
|
|
|
/* load all printcap printers */
|
|
if (lp_load_printers() && lp_servicenumber(PRINTERS_NAME) >= 0)
|
|
pcap_printer_fn(lp_add_one_printer, NULL);
|
|
}
|