Skip to content

Commit

Permalink
dnssd.c: Enable service registration on loopback
Browse files Browse the repository at this point in the history
In case users would like to prevent sharing services from printer
applications to local network, restrict it to localhost and let CUPS do
the sharing.

This can be done by setting `listen-hostname` in PAPPL API - this
prevents accessing the public addresses, but the service is still
published on those public addresses. This can be prevented if the
machine hostname is changed to localhost, but that's not desired on
machines IIUC.

The PR does the following:

- introduced new pappl system member `reghost`, which is used for saving
  `listen-hostname`,
- new public accessors for that member, `papplSystemSetRegHostName()`
  and `papplSystemGetRegHostName()` - user can set the member to
  localhost or to the current hostname
- dnssd functions will check this member, and if it is localhost, it
  will use loopback index
- in case of Avahi it passes NULL as hostname to let Avahi decide what
  hostname to use (in case of hostname conflicts)

The result is that if reghost is set to localhost, the service is
published on `.local` address, but resolved to loopback because CUPS
uses DNS-SD names in URIs.
  • Loading branch information
zdohnal committed Feb 29, 2024
1 parent cf6c821 commit a893937
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 22 deletions.
40 changes: 20 additions & 20 deletions pappl/dnssd.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,12 +389,12 @@ _papplPrinterRegisterDNSSDNoLock(
if (!printer->dns_sd_name || !printer->system->is_running)
return (false);

papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Registering DNS-SD name '%s' on '%s'", printer->dns_sd_name, printer->system->hostname);
papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Registering DNS-SD name '%s' on '%s'", printer->dns_sd_name, printer->system->reghost);

# ifdef HAVE_MDNSRESPONDER
if_index = !strcmp(system->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
if_index = !strcasecmp(system->reghost, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
# else
if_index = !strcmp(system->hostname, "localhost") ? if_nametoindex("lo") : AVAHI_IF_UNSPEC;
if_index = !strcasecmp(system->reghost, "localhost") ? if_nametoindex("lo") : AVAHI_IF_UNSPEC;
# endif // HAVE_MDNSRESPONDER

// Get attributes and values for the TXT record...
Expand Down Expand Up @@ -473,7 +473,7 @@ _papplPrinterRegisterDNSSDNoLock(
break;
}

httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, printer->system->hostname, printer->system->port, "%s/", printer->uriname);
httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, printer->system->reghost, printer->system->port, "%s/", printer->uriname);

if (printer->geo_location)
dns_sd_geo_to_loc(printer->geo_location, printer->dns_sd_loc);
Expand Down Expand Up @@ -566,7 +566,7 @@ _papplPrinterRegisterDNSSDNoLock(

printer->dns_sd_printer_ref = master;

if ((error = DNSServiceRegister(&printer->dns_sd_printer_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_printer._tcp", NULL /* domain */, system->hostname, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&printer->dns_sd_printer_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_printer._tcp", NULL /* domain */, system->reghost, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._printer._tcp': %s", printer->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand All @@ -584,7 +584,7 @@ _papplPrinterRegisterDNSSDNoLock(
else
papplCopyString(regtype, "_ipp._tcp", sizeof(regtype));

if ((error = DNSServiceRegister(&printer->dns_sd_ipp_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, regtype, NULL /* domain */, system->hostname, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&printer->dns_sd_ipp_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, regtype, NULL /* domain */, system->reghost, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s.%s': %s", printer->dns_sd_name, regtype, _papplDNSSDStrError(error));
ret = false;
Expand All @@ -611,7 +611,7 @@ _papplPrinterRegisterDNSSDNoLock(
else
papplCopyString(regtype, "_ipps._tcp", sizeof(regtype));

if ((error = DNSServiceRegister(&printer->dns_sd_ipps_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, regtype, NULL /* domain */, system->hostname, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&printer->dns_sd_ipps_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, regtype, NULL /* domain */, system->reghost, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s.%s': %s", printer->dns_sd_name, regtype, _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -662,7 +662,7 @@ _papplPrinterRegisterDNSSDNoLock(

printer->dns_sd_pdl_ref = master;

if ((error = DNSServiceRegister(&printer->dns_sd_pdl_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_pdl-datastream._tcp", NULL /* domain */, system->hostname, htons(9099 + printer->printer_id), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&printer->dns_sd_pdl_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_pdl-datastream._tcp", NULL /* domain */, system->reghost, htons(9099 + printer->printer_id), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s.%s': %s", printer->dns_sd_name, "_pdl-datastream._tcp", _papplDNSSDStrError(error));
ret = false;
Expand All @@ -683,7 +683,7 @@ _papplPrinterRegisterDNSSDNoLock(

printer->dns_sd_http_ref = master;

if ((error = DNSServiceRegister(&printer->dns_sd_http_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_http._tcp,_printer", NULL /* domain */, system->hostname, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&printer->dns_sd_http_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, printer->dns_sd_name, "_http._tcp,_printer", NULL /* domain */, system->reghost, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_printer_callback, printer)) != kDNSServiceErr_NoError)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s.%s': %s", printer->dns_sd_name, "_http._tcp,_printer", _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -741,7 +741,7 @@ _papplPrinterRegisterDNSSDNoLock(
}

// Then register the IPP/IPPS services...
if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_ipp._tcp", NULL, system->hostname, system->port, txt)) < 0)
if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_ipp._tcp", NULL, NULL, system->port, txt)) < 0)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._ipp._tcp': %s", printer->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -772,7 +772,7 @@ _papplPrinterRegisterDNSSDNoLock(

if (!(printer->system->options & PAPPL_SOPTIONS_NO_TLS))
{
if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_ipps._tcp", NULL, system->hostname, system->port, txt)) < 0)
if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_ipps._tcp", NULL, NULL, system->port, txt)) < 0)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._ipps._tcp': %s", printer->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -827,7 +827,7 @@ _papplPrinterRegisterDNSSDNoLock(
txt = avahi_string_list_add_printf(txt, "PaperMax=%s", papermax);
txt = avahi_string_list_add_printf(txt, "Scan=F");

if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_pdl-datastream._tcp", NULL, system->hostname, 9099 + printer->printer_id, txt)) < 0)
if ((error = avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_pdl-datastream._tcp", NULL, NULL, 9099 + printer->printer_id, txt)) < 0)
{
papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._pdl-datastream._tcp': %s", printer->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -860,7 +860,7 @@ _papplPrinterRegisterDNSSDNoLock(
txt = NULL;
txt = avahi_string_list_add_printf(txt, "path=%s/", printer->uriname);

avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_http._tcp", NULL, system->hostname, system->port, txt);
avahi_entry_group_add_service_strlst(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_http._tcp", NULL, NULL, system->port, txt);
avahi_entry_group_add_service_subtype(printer->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, printer->dns_sd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");

avahi_string_list_free(txt);
Expand Down Expand Up @@ -945,15 +945,15 @@ _papplSystemRegisterDNSSDNoLock(


// Make sure we have all of the necessary information to register the system...
if (!system->dns_sd_name || !system->hostname || !system->uuid || !system->is_running)
if (!system->dns_sd_name || !system->reghost || !system->hostname || !system->uuid || !system->is_running)
return (false);

papplLog(system, PAPPL_LOGLEVEL_DEBUG, "Registering DNS-SD name '%s' on '%s'", system->dns_sd_name, system->hostname);

# ifdef HAVE_MDNSRESPONDER
if_index = !strcmp(system->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
if_index = !strcasecmp(system->reghost, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
# else
if_index = !strcmp(system->hostname, "localhost") ? if_nametoindex("lo") : AVAHI_IF_UNSPEC;
if_index = !strcasecmp(system->reghost, "localhost") ? if_nametoindex("lo") : AVAHI_IF_UNSPEC;
# endif // HAVE_MDNSRESPONDER

if (system->geo_location)
Expand Down Expand Up @@ -1019,7 +1019,7 @@ _papplSystemRegisterDNSSDNoLock(
{
system->dns_sd_ipps_ref = master;

if ((error = DNSServiceRegister(&system->dns_sd_ipps_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, system->dns_sd_name, "_ipps-system._tcp", NULL /* domain */, system->hostname, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_system_callback, system)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&system->dns_sd_ipps_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, system->dns_sd_name, "_ipps-system._tcp", NULL /* domain */, system->reghost, htons(system->port), TXTRecordGetLength(&txt), TXTRecordGetBytesPtr(&txt), (DNSServiceRegisterReply)dns_sd_system_callback, system)) != kDNSServiceErr_NoError)
{
papplLog(system, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._ipps-system._tcp': %s", system->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -1050,7 +1050,7 @@ _papplSystemRegisterDNSSDNoLock(

system->dns_sd_http_ref = master;

if ((error = DNSServiceRegister(&system->dns_sd_http_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, system->dns_sd_name, "_http._tcp,_printer", NULL /* domain */, system->hostname, htons(system->port), 0 /* txtlen */, NULL /* txt */, (DNSServiceRegisterReply)dns_sd_system_callback, system)) != kDNSServiceErr_NoError)
if ((error = DNSServiceRegister(&system->dns_sd_http_ref, kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, if_index, system->dns_sd_name, "_http._tcp,_printer", NULL /* domain */, system->reghost, htons(system->port), 0 /* txtlen */, NULL /* txt */, (DNSServiceRegisterReply)dns_sd_system_callback, system)) != kDNSServiceErr_NoError)
{
papplLog(system, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s.%s': %s", system->dns_sd_name, "_http._tcp,_printer", _papplDNSSDStrError(error));
ret = false;
Expand Down Expand Up @@ -1080,7 +1080,7 @@ _papplSystemRegisterDNSSDNoLock(

if (!(system->options & PAPPL_SOPTIONS_NO_TLS))
{
if ((error = avahi_entry_group_add_service_strlst(system->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, system->dns_sd_name, "_ipps-system._tcp", NULL, system->hostname, system->port, txt)) < 0)
if ((error = avahi_entry_group_add_service_strlst(system->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, system->dns_sd_name, "_ipps-system._tcp", NULL, NULL, system->port, txt)) < 0)
{
papplLog(system, PAPPL_LOGLEVEL_ERROR, "Unable to register '%s._ipps-system._tcp': %s", system->dns_sd_name, _papplDNSSDStrError(error));
ret = false;
Expand All @@ -1104,7 +1104,7 @@ _papplSystemRegisterDNSSDNoLock(
// Finally _http.tcp (HTTP) for the web interface...
if (system->options & PAPPL_SOPTIONS_MULTI_QUEUE)
{
avahi_entry_group_add_service_strlst(system->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, system->dns_sd_name, "_http._tcp", NULL, system->hostname, system->port, NULL);
avahi_entry_group_add_service_strlst(system->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, system->dns_sd_name, "_http._tcp", NULL, NULL, system->port, NULL);
avahi_entry_group_add_service_subtype(system->dns_sd_ref, if_index, AVAHI_PROTO_UNSPEC, 0, system->dns_sd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
}

Expand Down
6 changes: 5 additions & 1 deletion pappl/mainloop-subcommands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1630,6 +1630,8 @@ default_system_cb(
// Log file
*server_hostname = cupsGetOption("server-hostname", (cups_len_t)num_options, options),
// Server hostname
*listen_hostname = cupsGetOption("listen-hostname", (cups_len_t)num_options, options),
// Hostname for listening
*value, // Other option
*valptr; // Pointer into option
pappl_loglevel_t loglevel = PAPPL_LOGLEVEL_WARN;
Expand Down Expand Up @@ -1779,10 +1781,12 @@ default_system_cb(
if (server_hostname)
papplSystemSetHostName(system, server_hostname);

papplSystemSetRegHostName(system, listen_hostname);

if (!cupsGetOption("private-server", (cups_len_t)num_options, options))
{
// Listen for TCP/IP connections...
papplSystemAddListeners(system, cupsGetOption("listen-hostname", (cups_len_t)num_options, options));
papplSystemAddListeners(system, listen_hostname);
}

return (system);
Expand Down
77 changes: 77 additions & 0 deletions pappl/system-accessors.c
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,35 @@ papplSystemGetPort(
}


//
// 'papplSystemGetRegHostName()' - Get hostname under which the services are
// registered.
//
// This function copies hostname used for service registration into the specified buffer.
//

char * // O - Hostname for service registration
papplSystemGetRegHostName(
pappl_system_t *system, // I - System
char *buffer, // I - String buffer
size_t bufsize) // I - Size of string buffer
{
if (system && buffer && bufsize > 0)
{
_papplRWLockRead(system);

if (system->reghost)
papplCopyString(buffer, system->reghost, bufsize);

_papplRWUnlock(system);
}
else if (buffer)
buffer[0] = '\0';

return (buffer);
}


//
// 'papplSystemGetServerHeader()' - Get the Server: header for HTTP responses.
//
Expand Down Expand Up @@ -1874,6 +1903,15 @@ _papplSystemSetHostNameNoLock(
free(system->hostname);
system->hostname = strdup(value);

// Update registration hostname as well if it is not localhost
if (!system->reghost || strcasecmp(system->reghost, "localhost"))
{
if (system->reghost)
free(system->reghost);

system->reghost = strdup(value);
}

// Set the system TLS credentials...
cupsSetServerCredentials(NULL, system->hostname, 1);
}
Expand Down Expand Up @@ -2401,6 +2439,45 @@ papplSystemSetPrinterDrivers(
}


//
// 'papplSystemSetRegHostName()' - Set hostname under which the services will be
// registered.
//
// This function sets the hostname under which services will be registered - it can
// be localhost or the current hostname, so it denies setting of different hostname
// to prevent masquerading itself as a different machine.
//

void
papplSystemSetRegHostName(
pappl_system_t *system, // I - System
const char *name) // I - Hostname
{
const char *value = NULL; // New value

if (!system)
return;

_papplRWLockWrite(system);

if (system->hostname)
{
if (name && (!strcasecmp(system->hostname, name) || !strcasecmp(name, "localhost")))
value = name;

if (!value)
value = system->hostname;

if (system->reghost)
free(system->reghost);

system->reghost = strdup(value);
}

_papplRWUnlock(system);
}


//
// 'papplSystemSetSaveCallback()' - Set the save callback.
//
Expand Down
1 change: 1 addition & 0 deletions pappl/system-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ struct _pappl_system_s // System data
size_t max_image_size; // Maximum image file size (uncompressed)
int max_image_width, // Maximum image file width
max_image_height; // Maximum image file height
char *reghost; // Hostname for registering services
};

typedef struct _pappl_timer_s // Timer callback data
Expand Down
2 changes: 1 addition & 1 deletion pappl/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ papplSystemCreate(
if (!system->name || !system->dns_sd_name || (spooldir && !system->directory) || (logfile && !system->log_file) || (subtypes && !system->subtypes) || (auth_service && !system->auth_service))
goto fatal;

// Make sure the system name and UUID are initialized...
// Make sure the system name, registration name and UUID are initialized...
papplSystemSetHostName(system, NULL);
papplSystemSetUUID(system, NULL);

Expand Down
2 changes: 2 additions & 0 deletions pappl/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ extern char *papplSystemGetOrganization(pappl_system_t *system, char *buffer, s
extern char *papplSystemGetOrganizationalUnit(pappl_system_t *system, char *buffer, size_t bufsize) _PAPPL_PUBLIC;
extern char *papplSystemGetPassword(pappl_system_t *system, char *buffer, size_t bufsize) _PAPPL_PUBLIC;
extern int papplSystemGetPort(pappl_system_t *system) _PAPPL_DEPRECATED("Use papplSystemGetHostPort instead.");
extern char *papplSystemGetRegHostName(pappl_system_t *system, char *buffer, size_t bufsize) _PAPPL_PUBLIC;
extern const char *papplSystemGetServerHeader(pappl_system_t *system) _PAPPL_PUBLIC;
extern char *papplSystemGetSessionKey(pappl_system_t *system, char *buffer, size_t bufsize) _PAPPL_PUBLIC;
extern bool papplSystemGetTLSOnly(pappl_system_t *system) _PAPPL_PUBLIC;
Expand Down Expand Up @@ -224,6 +225,7 @@ extern void papplSystemSetOrganization(pappl_system_t *system, const char *valu
extern void papplSystemSetOrganizationalUnit(pappl_system_t *system, const char *value) _PAPPL_PUBLIC;
extern void papplSystemSetPassword(pappl_system_t *system, const char *hash) _PAPPL_PUBLIC;
extern void papplSystemSetPrinterDrivers(pappl_system_t *system, int num_drivers, pappl_pr_driver_t *drivers, pappl_pr_autoadd_cb_t autoadd_cb, pappl_pr_create_cb_t create_cb, pappl_pr_driver_cb_t driver_cb, void *data) _PAPPL_PUBLIC;
extern void papplSystemSetRegHostName(pappl_system_t *system, const char *name) _PAPPL_PUBLIC;
extern void papplSystemSetSaveCallback(pappl_system_t *system, pappl_save_cb_t cb, void *data) _PAPPL_PUBLIC;
extern void papplSystemSetUUID(pappl_system_t *system, const char *value) _PAPPL_PUBLIC;
extern void papplSystemSetVersions(pappl_system_t *system, int num_versions, pappl_version_t *versions) _PAPPL_PUBLIC;
Expand Down

0 comments on commit a893937

Please sign in to comment.