This commit is contained in:
1 parent
50497780c7
commit
843c6866a5
7 files changed
+252
-5
No files matched your search
@@ -0,0 +1,68 @@
|
||||
# Proposal
|
||||
|
||||
## Why
|
||||
|
||||
macOS adds the queue with *Use:* = **Generic PostScript Printer** instead of the
|
||||
driverless **AirPrint Printer**, so duplex, colour and tray 2 stay hidden — the
|
||||
generic PPD gates duplex behind `APOptionalDuplexer False`. The certificate is
|
||||
no longer the cause: `curl https://podp.local:631/` succeeds, CUPS serves the
|
||||
expected certificate, and every IPP query the Mac makes against the queue
|
||||
succeeds (7/7 `HTTP_STATUS_OK, ipp status 0`). iOS, which queries the printer
|
||||
live, already offers every option.
|
||||
|
||||
The remaining cause is a Bonjour sub-type. Disassembling
|
||||
`AddPrinter.app/Contents/Frameworks/PMBrowser.framework` (macOS 27.0.1) shows the
|
||||
gate for the AirPrint driver entry:
|
||||
|
||||
- `-[DNSSDPrinter isShared]` returns YES as soon as any of the printer's
|
||||
registration types ends in `,_cups`; the registration types are the `regType`
|
||||
strings the Bonjour browse callback reports.
|
||||
- `-[DNSSDPrinter airprintMatch]` returns nothing when `isShared` is YES, and
|
||||
only builds the AirPrint driver when `isAirPrint` is YES — that is, when the
|
||||
service was browsed under `_ipp._tcp,_universal` or `_ipps._tcp,_universal`.
|
||||
- `-[DNSSDBrowser startBrowsing]` browses `_ipp._tcp,_cups` **and**
|
||||
`_ipp._tcp,_universal` (and the `_ipps` equivalents), so a printer that
|
||||
carries both sub-types is classified as *shared* and never gets the AirPrint
|
||||
driver.
|
||||
|
||||
CUPS registers `DNSSDSubTypes`, whose default is `_cups,_print,_universal`
|
||||
(`scheduler/conf.c`), which is exactly that combination. The queue is therefore
|
||||
advertised as a shared CUPS printer and macOS falls back to its generic driver.
|
||||
The sub-types are configurable with the `BrowseDNSSDSubTypes` directive.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Set `BrowseDNSSDSubTypes _print,_universal` in `cupsd.conf`, so the queue is
|
||||
advertised with the AirPrint (`_universal`) sub-type and without the CUPS
|
||||
(`_cups`) one. `_print` is kept for clients that look for it.
|
||||
- Keep CUPS' own advertising otherwise (the unconditional `_printer._tcp`
|
||||
registration, the `printer-type` TXT key and the resulting `/cups` device
|
||||
URI), so CUPS clients keep resolving the queue exactly as before.
|
||||
- Correct the README: the "macOS adds the printer as a Generic PostScript
|
||||
printer" section blames the certificate alone and recommends adding the queue
|
||||
from the command line; it now documents the sub-type cause first and how to
|
||||
confirm what is advertised.
|
||||
|
||||
Non-goals: hand-written Avahi service files, and patching CUPS' TXT record.
|
||||
Neither is needed unless the sub-type alone turns out to be insufficient.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
<!-- None: this fixes the advertisement required by an existing capability. -->
|
||||
|
||||
### Modified Capabilities
|
||||
- `printserver/cups`: the "Printer is shared and discoverable" requirement gains
|
||||
a scenario that fixes which Bonjour sub-types are advertised, because the
|
||||
advertised sub-types decide whether macOS offers the driverless AirPrint
|
||||
driver.
|
||||
|
||||
## Impact
|
||||
|
||||
- `cupsd.conf`: one directive plus an explanatory comment.
|
||||
- `README.md`: troubleshooting section corrected.
|
||||
- `openspec/specs/printserver/cups/spec.md`: one scenario added.
|
||||
- Clients: macOS should offer *AirPrint Printer* under *Use:*; the `_ipp`/`_ipps`
|
||||
services, the `/cups` device URI and Linux/Windows clients are unaffected.
|
||||
macOS caches the old classification per printer entry, so an existing entry
|
||||
has to be removed and added again.
|
||||
Reference in new issue
Block a user