Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 22171cb27d |
@@ -6,28 +6,4 @@ configure
|
||||
cups-config
|
||||
cups.list
|
||||
cups.sh
|
||||
make.log
|
||||
printpro.common
|
||||
printpro.version
|
||||
Makedefs
|
||||
aix-4.3-powerpc
|
||||
darwin-5.2-powerpc
|
||||
darwin-5.3-powerpc
|
||||
darwin-6.0-powerpc
|
||||
freebsd-4.5-intel
|
||||
hpux-10.20-hppa
|
||||
hpux-11.00-hppa
|
||||
irix-5.3-mips
|
||||
irix-6.5-mips
|
||||
linux-2.0-intel
|
||||
linux-2.2-intel
|
||||
linux-2.4-intel
|
||||
solaris-2.5-intel
|
||||
solaris-2.5-sparc
|
||||
solaris-2.7-intel
|
||||
solaris-2.7-sparc
|
||||
solaris-2.8-intel
|
||||
solaris-2.8-sparc
|
||||
solaris-2.9-intel
|
||||
solaris-2.9-sparc
|
||||
tru64-4.0-alpha
|
||||
|
||||
+4
-573
@@ -1,576 +1,6 @@
|
||||
CHANGES.txt - 12/18/2002
|
||||
CHANGES.txt - 01/31/2002
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS V1.1.18
|
||||
|
||||
- Fixed a bug in the Set-Job-Attributes code in the
|
||||
scheduler that would cause it to crash or continuously
|
||||
write a job control file.
|
||||
- SECURITY FIX: The scheduler now provides a FileDevice
|
||||
directive to control whether new printers can be added
|
||||
using device URIs of the form "file:/filename". The
|
||||
default is to not allow printers with these device
|
||||
URIs.
|
||||
- The scheduler did not compute the cost of filters
|
||||
properly, nor did it choose a multi-filter solution
|
||||
with a lower cost than a single filter solution.
|
||||
- Now install CUPS PPD file test utility (cupstestppd)
|
||||
to support basic conformance testing of PPD files.
|
||||
- The scheduler now logs an error message when it sees a
|
||||
non-conforming PPD file.
|
||||
- Upgraded pdftops filter to Xpdf 2.01 with fixes for
|
||||
TrueType fonts.
|
||||
- Added a MaxClientsPerHost configuration directive to
|
||||
provide limited protection against Denial of Service
|
||||
attacks.
|
||||
- SECURITY FIX: Potential underflow/overflow bug in web
|
||||
interface.
|
||||
- SECURITY FIX: Race condition in certificate creation.
|
||||
- SECURITY FIX: Bad URIs in browse packets could be used
|
||||
to exploint the web interface underflow/overflow bug.
|
||||
- SECURITY FIX: Some types of Denial of Service attacks
|
||||
were not handled properly, so once the attack was over
|
||||
the scheduler did not close the connections
|
||||
immediately on all platforms.
|
||||
- SECURITY FIXES: Added integer overflow/underflow
|
||||
checks for all image formats.
|
||||
- The pstops filter didn't reset the showpage operator
|
||||
back to its original at the end of a job; this
|
||||
prevented the concatenation of documents (used
|
||||
primarily for CUPS 1.2...)
|
||||
- The cupsGetPPD() function didn't always set the
|
||||
cupsLastError() value when an error occurred.
|
||||
- The IPP media, output-bin, and sides attributes took
|
||||
precedence over the corresponding PPD options, which
|
||||
caused inconsistent behavior under MacOS X with some
|
||||
PPD files.
|
||||
- The cupsaddsmb utility specified the wrong number of
|
||||
arguments to the adddriver command when adding the
|
||||
Win9x PostScript drivers.
|
||||
- The web interface did not always report the correct
|
||||
error message.
|
||||
- The scheduler did not clear the POSIX signal action
|
||||
structure when waiting for the child to send it a
|
||||
SIGUSR1 signal; this could cause the signal handler
|
||||
not to be called properly, preventing the parent
|
||||
process from returning.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.17
|
||||
|
||||
- The "manual_copies" option did not work when the LPD
|
||||
backend had to retry a print job.
|
||||
- The image filters did not convert GIF images properly.
|
||||
- The RunAsUser option was incompatible with the new
|
||||
daemon-mode code in 1.1.16.
|
||||
- Fixed a problem with the Set-Job-Attributes and
|
||||
PostScript job ticket code in the scheduler - the
|
||||
"last" attribute pointer was never updated, which
|
||||
could cause the scheduler to crash when applying job
|
||||
ticket data.
|
||||
- Fixed a problem in the scheduler that caused it to
|
||||
continue processing HTTP requests on a connection
|
||||
after it was shutdown.
|
||||
- The scheduler now allows accounts authenticated via
|
||||
PAM to not have a corresponding UNIX account, but
|
||||
group membership still requires the account name to be
|
||||
listed in the UNIX group file(s)...
|
||||
- The scheduler used a fixed-size (16k) buffer for
|
||||
encoding job options for filters; it now dynamically
|
||||
allocates and expands the buffer as needed depending
|
||||
on the options that are sent in a job.
|
||||
- The pdftops filter didn't support all of the MacOS
|
||||
characters for MacRoman encoded fonts.
|
||||
- The cupsEncodeOptions() and cupsParseOptions()
|
||||
functions now conform to the grammer defined by the
|
||||
current draft of the PAPI specification. The main
|
||||
difference is that option=yes and option=no are no
|
||||
longer treated as boolean options.
|
||||
- The IPP backend didn't honor the encryption settings
|
||||
in /etc/cups/client.conf.
|
||||
- Fixed a potential bug in the HTTP code which was
|
||||
caused by servers sending the status line and
|
||||
newline(s) in separate packets.
|
||||
- User-defined classification strings are now printed
|
||||
verbatim - previously the classification box would be
|
||||
empty.
|
||||
- Re-added Spanish to the list of PPD languages that
|
||||
CUPS supports.
|
||||
- CUPS API library user and temp file updates for
|
||||
Windows.
|
||||
- The image filters did not properly handle grayscale
|
||||
printing of Sun Raster images.
|
||||
- The scheduler never reset the NumJobs variable before
|
||||
loading the job list (previously this only happened on
|
||||
a full start, so the problem was never apparent...)
|
||||
- The HTTP and IPP read/write code didn't handle EINTR
|
||||
(interrupted system call) errors.
|
||||
- When under high load, the scheduler could abort due to
|
||||
the wrong errno value after a select() call. This was
|
||||
caused by the child signal handler.
|
||||
- Added new load tests to the test target to verify that
|
||||
cupsd can handle hundreds of simultaneous jobs without
|
||||
error.
|
||||
- The Solaris USB backend now supports the new device
|
||||
URI syntax.
|
||||
- The ppdOpen*() functions now reset the numeric locale
|
||||
settings while loading a PPD file.
|
||||
- Fixed the libtool build rules.
|
||||
- The manpage make rules didn't use $(MAKE) and
|
||||
$(MFLAGS) for the language subdirectories.
|
||||
- Now set the LC_TIME locale category to get the
|
||||
properly localized time string.
|
||||
- Fixed a problem in the scheduler that would cause the
|
||||
web interface problems when adding, modifying, or
|
||||
configuring a printer or class.
|
||||
- The backends now ignore SIGPIPE so that failed job
|
||||
filters will not stop a print queue.
|
||||
- The lpstat command did not allow for destination lists
|
||||
("lpstat -v printer1,printer2")
|
||||
- Fixed parsing of long filter status messages in the
|
||||
scheduler.
|
||||
- Added some startup performance enhancements to the
|
||||
scheduler so that the printer object information is
|
||||
regenerated fewer times and the MIME type database is
|
||||
not filled with lots of empty filters for raw/direct
|
||||
queues.
|
||||
- The LPD backend now sends the job title as the print
|
||||
filename.
|
||||
- Added support for variable sizes in the EPSON dot
|
||||
matrix printer drivers. This allows for pages as
|
||||
short as 1/2" (1 row of labels) and does not do an
|
||||
automatic form feed.
|
||||
- French translation updates.
|
||||
- The filters did not quote the page label string when
|
||||
embedding it in PostScript output.
|
||||
- The serial backend now enumerates serial ports under
|
||||
MacOS X.
|
||||
- The pdftops filter contained font rasterizer code that
|
||||
wasn't being used and that depended on X11. This code
|
||||
has been removed.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.16
|
||||
|
||||
- The cancel and lprm commands now both display an error
|
||||
message and return a non-zero exit status if an
|
||||
attempt is made to cancel a job on a non-existent
|
||||
printer.
|
||||
- The lpoptions command incorrectly complained if a
|
||||
request to delete a non-existent printer was made.
|
||||
- If the client.conf file defines an alternate server
|
||||
name, the "configure printer" action in the web
|
||||
interface might not work.
|
||||
- The lpstat command now supports a "-W" option so that
|
||||
you can display completed jobs as well as
|
||||
not-completed (pending) jobs.
|
||||
- The lp and lpr commands did not return an error when
|
||||
one or more files in a set of files for printing could
|
||||
not be printed.
|
||||
- The lp, lpadmin, and lpstat commands now consistently
|
||||
return with a non-zero exit status when an error
|
||||
occurs.
|
||||
- The scheduler would not accept print jobs sent to a
|
||||
stopped remote printer.
|
||||
- The texttops filter incorrectly converted the page
|
||||
numbers in the prettyprint header to double-byte
|
||||
characters when printing a non-Unicode text file. This
|
||||
caused an extra space to appear between each digit in
|
||||
the page number.
|
||||
- The scheduler did not use a case-insensitive
|
||||
comparison when adding filters for a printer.
|
||||
- Upgraded the pdftops filter to Xpdf 1.01.
|
||||
- The scheduler no longer passes the page-border and
|
||||
number-up-layout attributes to filters when printing
|
||||
banner pages.
|
||||
- The LPD backend now uses a 30-second timeout when
|
||||
sending commands and control files, and a 30-second
|
||||
timeout when retrieving responses from an LPD server.
|
||||
If a timeout occurs, it retries indefinitely. This
|
||||
helps to make LPD printing over VPNs work more
|
||||
reliably.
|
||||
- The USB backend now supports device URIs based on the
|
||||
printer serial number and/or model number under Linux.
|
||||
This avoids the "wrong device filename" problem when
|
||||
using more than one USB printer.
|
||||
- Now just shutdown the receiving end of a client
|
||||
connection when sending an error that requires the
|
||||
server to disconnect from the client afterwards. This
|
||||
fixes a problem when doing remote administration with
|
||||
encryption enabled.
|
||||
- The scheduler did not send a printer-state-message
|
||||
attribute if the string was empty; it now always sends
|
||||
this attribute. This caused the printer message to be
|
||||
displayed for other printers in the web interface.
|
||||
- The LPD backend now supports a "manual_copies" option,
|
||||
e.g.: "lpd://server/queue?manual_copies=no", in order
|
||||
to handle copies for raw jobs to printers that don't
|
||||
implement the LPD protocol properly...
|
||||
- The "mirror" option was not being handled by the
|
||||
PostScript or image filters.
|
||||
- Updated the cupsaddsmb command to support the new CUPS
|
||||
driver for Windows NT/2k/XP.
|
||||
- Filter status lines longer than 1023 characters could
|
||||
cause the scheduler to get into an infinite loop.
|
||||
- The scheduler didn't reset the job state to pending
|
||||
when modifying an active printer.
|
||||
- Now limit the maximum number of recursion steps when
|
||||
searching for a filter for a job, in case a user
|
||||
defines a circular filter rule.
|
||||
- The PostScript filter would embed an invalid
|
||||
requirements comment in some cases.
|
||||
- Added support for embedded job tickets in PostScript
|
||||
files.
|
||||
- The PostScript filter now detects EPS files and should
|
||||
better handle printing EPS files.
|
||||
- The cancel command now ignores a trailing destination
|
||||
name when cancelling a specific job ID (Solaris
|
||||
compatibility).
|
||||
- The scheduler now rejects jobs with copies outside the
|
||||
range of 1 to MaxCopies, inclusive.
|
||||
- Added new MaxCopies directive to set the maximum
|
||||
number of copies that a user can request.
|
||||
- The scheduler didn't block signals while it processed
|
||||
others and when it forked processes.
|
||||
- The scheduler checked for new jobs to print when
|
||||
stopping a job. This caused jobs to restart before a
|
||||
shutdown.
|
||||
- Updated the CUPS startup script to better support
|
||||
different timezones and to support the RedHat/Mandrake
|
||||
init script functions, if available.
|
||||
- The scheduler did not properly handle backslashes in
|
||||
banner files; it incorrectly assumed that "\c" should
|
||||
always be replaced by "c", instead of only looking for
|
||||
"\{" and replacing it by "{".
|
||||
- The texttops filter didn't handle prettyprint=no.
|
||||
- The text and HP-GL/2 filters didn't check for other
|
||||
common duplex option names like cupsMarkOptions() did.
|
||||
- "lpoptions -x printer" no longer clears the "default
|
||||
printer" status of the printer.
|
||||
- cupsTempFd() now stops trying to create a temporary
|
||||
file after 1000 tries, and aborts on any error other
|
||||
than EEXIST. This should prevent lp/lpr hangs due to
|
||||
a bad or missing temporary directory.
|
||||
- The lpadmin command did not send the right URI to the
|
||||
scheduler when setting options on classes. This
|
||||
caused a client-error-bad-request error.
|
||||
- The CUPS API convenience functions would attempt to
|
||||
connect to the remote server name in a
|
||||
"printer@server" printer name instead of dealing with
|
||||
the default (usually local) server. Aside from
|
||||
causing user confusion, the remote server name might
|
||||
not be resolved properly, causing further problems.
|
||||
- "lp -q" would cause the "lp" command to segfault, as
|
||||
the program would try to print the option letter that
|
||||
caused the error using the wrong index into the
|
||||
command-line; bugfix from Debian.
|
||||
- Fixed a minor inconsistancy in the encoding of boolean
|
||||
attributes from printer options in
|
||||
cupsEncodeOptions().
|
||||
- Added a FilterNice directive which sets the priority
|
||||
of job filter processes that are run by the scheduler.
|
||||
- Added Solaris x86 USB printer support.
|
||||
- The USB backend now reports both the ulpt and unlpt
|
||||
devices under *BSD.
|
||||
- The "lpstat -o" command would truncate the
|
||||
"printer-jobid" string if it was longer than 21
|
||||
characters.
|
||||
- The PJL-based MIME type rules now look in the first
|
||||
1024 bytes instead of just the first 512 bytes to find
|
||||
the language mode.
|
||||
- The image file types are now listed explicitly in the
|
||||
mime.convs file so that additional image file formats
|
||||
do not use the standard CUPS image filters by default.
|
||||
- Updated the Software Programmers Manual to include
|
||||
all of the CUPS API functions.
|
||||
- ppdOpen*() no longer sorts choices for an option.
|
||||
- The web interface now enforces constraints in PPD
|
||||
files when configuring a printer.
|
||||
- When stopping a printer, the scheduler didn't set the
|
||||
printer state before stopping the current job.
|
||||
- The cupsaddsmb utility now lists all data files for
|
||||
Win9x and WinMe clients when installing that Windows
|
||||
driver.
|
||||
- Jobs submitted to a class now bounce immediately to
|
||||
the next available printer rather than waiting until
|
||||
that printer is available.
|
||||
- Filters and backends now also get the CLASS
|
||||
environment variable set when a job is printed to a
|
||||
printer class instead of a normal printer.
|
||||
- Added French translations of the web interface, CUPS
|
||||
Overview, Software Administrators Manual, and Software
|
||||
Users Manual contributed by Marian REYT-LLABRES.
|
||||
- Added several "hint" messages for common configuration
|
||||
problems that are stored in the error_log file.
|
||||
- httpSeparate() now unquotes %xx characters in the
|
||||
username:password field of a URI.
|
||||
- When starting the scheduler in daemon mode, the parent
|
||||
process now waits for the child to signal it is ready
|
||||
to accept connections.
|
||||
- Added -F option to cupsd to run cupsd in the
|
||||
foreground but detach from the controlling terminal
|
||||
and current directory.
|
||||
- The scheduler did not reload jobs when receiving a HUP
|
||||
signal; this would cause problems since the pointers
|
||||
into the file type database would no longer be valid
|
||||
for existing jobs.
|
||||
- The scheduler did not save the network interface list
|
||||
update time, thus no caching of the network data was
|
||||
actually provided.
|
||||
- Updated the SuSE PAM configuration file.
|
||||
- The LPD backend now supports a "reserve" option and no
|
||||
longer reserves a priviledged port by default.
|
||||
- The cupsaddsmb command now continues past printers
|
||||
that do not have a PPD file to export.
|
||||
- The lpstat command didn't treat printer names as
|
||||
case-insensitive.
|
||||
- The lpstat command now reports the printer location
|
||||
attribute with "lpstat -l -p".
|
||||
- Fixed a bug in the vsnprintf() emulation function,
|
||||
which was used on old versions of HP-UX, IRIX, and
|
||||
Solaris.
|
||||
- The number-up option was incorrectly being used when
|
||||
printing banner pages.
|
||||
- Added support for Greek and Slovak PPD files.
|
||||
- CUPS now supports printer names containing any
|
||||
printable character, e.g. "123-abc", "foo-bar", etc.
|
||||
- The null filter was not supported in mime.convs due to
|
||||
a bug in the filter validation code.
|
||||
- Changes in the default printer and printer attributes
|
||||
were not always reflected in the generated printcap
|
||||
file.
|
||||
- Implicit classes did not inherit the location or
|
||||
description from member printers.
|
||||
- The httpGetHostByName() function did not handle
|
||||
hostnames that started with a number.
|
||||
- Updated the filters to use the %cupsRotation comment
|
||||
instead of %%Orientation to auto-rotate pages, since
|
||||
the use of %%Orientation is inconsistent.
|
||||
- Added the RootCertDuration directive to control how
|
||||
often the root authentication certificate is updated.
|
||||
- Increased the size of the IPP write buffer to 32k to
|
||||
allow for larger attribute values and to provide more
|
||||
efficient output of large numbers of attributes.
|
||||
- The polling daemon now retries the initial connection
|
||||
to the remote server; this fixes a problem when the
|
||||
remote server is unavailable when the scheduler starts
|
||||
up...
|
||||
- The scheduler didn't validate Digest users against the
|
||||
system group(s), so Digest and BasicDigest
|
||||
authentication didn't work for administration
|
||||
operations.
|
||||
- The scheduler now passes the SHLIB_PATH environment
|
||||
variable to child processes (HP-UX shared libraries)
|
||||
- The scheduler now maps accesses from the loopback
|
||||
interface to "localhost".
|
||||
- The cups-lpd mini-daemon sent a status code byte in
|
||||
response to queue state commands, but those commands
|
||||
only return textual data.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.15-1
|
||||
|
||||
- The lpc and lprm sources didn't include the CUPS
|
||||
string function header, which is required on systems
|
||||
that don't have their own snprintf() function.
|
||||
- The French manpage Makefile tried to install the
|
||||
language subdirectories when it (obviously) didn't
|
||||
have to.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.15
|
||||
|
||||
- Updated the CUPS license agreement for the new MacOS
|
||||
and OpenSSL license exceptions.
|
||||
- The printer-info attribute now defaults to the printer
|
||||
name if no value has been set.
|
||||
- ppdOpen() and friends now add an "Auto" InputSlot
|
||||
option if none is provided to automatically select the
|
||||
correct tray.
|
||||
- Updated the ppdEmit() and ppdEmitFd() functions to
|
||||
(re)mark the correct PageSize or PageRegion option
|
||||
depending on the selected ManualFeed or InputSlot
|
||||
options.
|
||||
- ppdEmitFd() didn't handle custom page sizes.
|
||||
- Darwin uses <pam/pam_appl.h> instead of
|
||||
<security/pam_appl.h>.
|
||||
- The jobs.cgi web interface now handles all job
|
||||
operations, allowing the administrator to allow "job
|
||||
administrators" or operators to manage jobs (but not
|
||||
queues) on the server.
|
||||
- The cupsDoFileRequest() function now checks if the
|
||||
filename passed into the function is a directory, and
|
||||
returns the IPP_NOT_POSSIBLE error if so.
|
||||
- New SCSI printer backend.
|
||||
- Cleaned up handling of locales with trailing character
|
||||
set definitions.
|
||||
- Fixed handling of invalid PPD attributes inside
|
||||
OpenUI/CloseUI.
|
||||
- Fixed a problem with SSL and the job, printer, and
|
||||
admin CGIs on ports other than 443.
|
||||
- The scheduler didn't handle AuthClass properly.
|
||||
- Added French translation of man pages.
|
||||
- Updated the text filter to support the const_cast,
|
||||
dynamic_cast, and static_cast keywords in ISO C++.
|
||||
- Now use strlcat() and strlcpy() (or emulation
|
||||
functions) for easier string/buffer protection.
|
||||
- The auto-generated printcap/printers.conf files now
|
||||
have a small comment header explaining where the file
|
||||
comes from...
|
||||
- The PostScript filter now supports 6, 9, and 16-up
|
||||
output, as well as new page-border and
|
||||
number-up-layout options.
|
||||
- The lpoptions command didn't set options properly when
|
||||
using the default printer.
|
||||
- Added ConfigFilePerm and LogFilePerm directives.
|
||||
- Increased maximum size of MIME types to IPP_MAX_NAME
|
||||
to allow for longer printer names.
|
||||
- No longer create remote printers when loading job
|
||||
history data.
|
||||
- The printer-make-and-model attribute wasn't set when
|
||||
the PPD file didn't contain a NickName attribute.
|
||||
- Now handle PPD files with translation strings longer
|
||||
than 80 bytes - they are truncated if they go over...
|
||||
- The scheduler didn't handle signals until after it
|
||||
loaded the configuration files the first time; this
|
||||
caused problems on some installations that would
|
||||
restart the scheduler as the system booted into run
|
||||
level 3.
|
||||
- Now throttle broadcasts like we do for polling.
|
||||
- Fixed a bug in the reading of PPD files using CR's
|
||||
instead of CR LF's or LF's.
|
||||
- The scheduler would crash if cupsd.conf contained a
|
||||
BrowseProtocols line with no protocols listed.
|
||||
- The HTML job operation templates now link back to the
|
||||
destination printer or class.
|
||||
- The serial backend now detects USB serial devices.
|
||||
- The LPD mini-daemon (cups-lpd) now passes the
|
||||
job-originating-host-name attribute to the scheduler
|
||||
(cupsd).
|
||||
- Updated the IPP backend to reconnect after downgrading
|
||||
from IPP/1.1 to 1.0, and when sending requests to HP
|
||||
JetDirect interfaces that don't support HTTP
|
||||
Keep-Alive like they should.
|
||||
- Now pass NLSPATH and DYLD_LIBRARY_PATH environment
|
||||
variables, if defined, to CGI and job processes.
|
||||
- Removed the pstoraster filter (based on GNU
|
||||
Ghostscript 5.50) and now provide the raster "driver"
|
||||
and patch file necessary to use the current GNU
|
||||
Ghostscript 7.05 release.
|
||||
- Removed unnecessary fonts and updated the Courier and
|
||||
Symbol fonts to the latest versions to better support
|
||||
non-ISOLatin1 text.
|
||||
- The text filter now always embeds the Courier and
|
||||
Symbol fonts to ensure that they contain the full set
|
||||
of glyphs.
|
||||
- The lp and lpr commands now only override the SIGINT
|
||||
handler if it is not being ignored (patch from Robert
|
||||
Ambrose for some interactive software that catches
|
||||
SIGINT and will gracefully cancel the print...)
|
||||
- The PostScript image filter (imagetops) now supports
|
||||
printing CMYK images using the CMYK colorspace.
|
||||
- The image filters now support CMYK JPEG files, and
|
||||
correctly handles the inverted files from Photoshop
|
||||
(which seems to save RGBW data, not CMYK...)
|
||||
- Added a "check" target to the top-level makefile to
|
||||
conform with GNU standards (same as "test").
|
||||
- The IPP code didn't always map the POSIX locale "C" to
|
||||
the proper IPP language code.
|
||||
- The cupsaddsmb program was updated to use the
|
||||
setdriver command instead of addprinter.
|
||||
- Banner pages were not handled properly for implicit
|
||||
classes.
|
||||
- When tunneling to a remote system using SSH, the
|
||||
printer URIs for local printers on the remote system
|
||||
did not reflect the correct port number.
|
||||
- The Allow, Deny, BrowseAllow, BrowseDeny, and
|
||||
BrowseAddress directives now support the network
|
||||
interface names "@LOCAL" and "@IF(name)" for access
|
||||
control and browsing based on the current interface
|
||||
addresses instead of fixed names or IP addresses.
|
||||
- The texttops filter did not properly recognize the
|
||||
"nowrap" (wrap=false) option.
|
||||
- The InstallableOptions group name in a PPD file is now
|
||||
translated separately (CUPS_MSG_OPTIONS_INSTALLED) so
|
||||
that UIs can accurately detect the presence of this
|
||||
group.
|
||||
- The scheduler no longer keeps job history data for
|
||||
remote printers on the client (just on the server.)
|
||||
- The parallel and USB backends now retry if the backend
|
||||
detects that the printer is not connected to the
|
||||
system (rather than stopping the queue...)
|
||||
- The network backends now retry if the backend detects
|
||||
that the printer is not connected to the network or is
|
||||
unreachable (rather than stopping the queue...)
|
||||
- The cupsGetDests() function no longer lists options
|
||||
and instances for printers that no longer exist.
|
||||
- The scheduler now converts the document language to
|
||||
the correct LANG string.
|
||||
- The cupsaddsmb program now supports alternative CUPS
|
||||
and SAMBA server names.
|
||||
- The PostScript filter now supports the Orientation
|
||||
comment and rotates the page as needed automatically.
|
||||
- Revamped the makefiles slightly to use automatically
|
||||
generated dependencies.
|
||||
- Build fixes for OS X.
|
||||
- The TIFF reading code depended on the newest version
|
||||
of libtiff; now conditionally compile that portion of
|
||||
the loader.
|
||||
- The PPD code now decodes all JCL options in the
|
||||
JCLSetup group, not just those options that start with
|
||||
the prefix "JCL".
|
||||
- The backends now read print data using the read()
|
||||
system call to ensure that the current page is printed
|
||||
while the next page is being processed.
|
||||
- The pdftops filter did not support shading type 3
|
||||
(radial fill) for the "sh" operator.
|
||||
- The cups-polld program now throttles the local
|
||||
broadcasts of polled printers and classes so that the
|
||||
local system is not overwhelmed with hundreds of
|
||||
printers and classes all at once.
|
||||
- Updated the serial backend to support 230,400 baud for
|
||||
the Linux PPC port.
|
||||
- The cupsGetJobs() function wouldn't report completed
|
||||
jobs that did not have a document-format attribute
|
||||
value.
|
||||
- The cupsEncodeOptions() function now maintains a table
|
||||
of known boolean and numeric options, and encodes all
|
||||
other options as strings.
|
||||
- Now add a newline before the end-of-page code in the
|
||||
PostScript filter; this fixes a problem with files
|
||||
that don't end with a newline.
|
||||
- The image filters looked for the "orientation" option
|
||||
instead of the correctly named "orientation-requested"
|
||||
option.
|
||||
- The cupsEncodeOptions() function now handles mixed
|
||||
integers and ranges.
|
||||
- New translation guide for developers to provide native
|
||||
language support for CUPS.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.14
|
||||
|
||||
- The ippRead() function did not verify that the
|
||||
attribute name length or string with language value
|
||||
was not larger than the read buffer.
|
||||
- The scheduler set the signal handlers before loading
|
||||
the configuration files the first time; this prevented
|
||||
the RunAsUser directive from blocking server reloads.
|
||||
- Added Swedish message catalog.
|
||||
- The parallel backend now recognizes the /dev/printers
|
||||
device directory under Linux 2.4.x.
|
||||
- MacOS X fixes.
|
||||
- The cupsaddsmb utility sent the server name after the
|
||||
user information when executing the rpcclient program.
|
||||
This caused problems with some versions of SAMBA
|
||||
2.2.x.
|
||||
- The IPP backend did not pass the requesting user name
|
||||
when checking on the print job status. This prevented
|
||||
it from waiting for the job to complete when
|
||||
communicating with some IPP implementations that
|
||||
require it.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.13
|
||||
|
||||
- The lpstat command did not report jobs submitted to
|
||||
@@ -1169,8 +599,9 @@ CHANGES IN CUPS V1.1.7
|
||||
test CUPS prior to installation.
|
||||
- All scheduler configuration files are now case
|
||||
insensitive to match Apache.
|
||||
- Added support for Apache ListenBackLog, Require,
|
||||
Satisfy, <Limit>, <LimitExcept>, and LimitRequestSize
|
||||
- Added support for Apache ListenBackLog, LogFormat,
|
||||
Require, UseCanonicalName, Satisfy, <Limit>,
|
||||
<LimitExcept>, LimitRequestSize, and Options
|
||||
directives.
|
||||
- Added support for all Apache log levels...
|
||||
- Added support for "double" HostNameLookups.
|
||||
|
||||
+3
-8
@@ -1,4 +1,4 @@
|
||||
CREDITS.txt - 12/12/2002
|
||||
CREDITS.txt - 01/27/2000
|
||||
------------------------
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
@@ -8,24 +8,19 @@ like to thank the following individuals for their contributions:
|
||||
N. Becker - setsid().
|
||||
Jean-Eric Cuendet - GhostScript filters for CUPS.
|
||||
Van Dang - HTTP and IPP policeman.
|
||||
L. Peter Deutsch - MD5 code.
|
||||
Dr. ZP Han - setgid()/setuid().
|
||||
Guy Harris - *BSD shared libraries and lots of other fixes.
|
||||
Wang Jian - CUPS RPM corrections.
|
||||
Roderick Johnstone - Beta tester of the millenium.
|
||||
Till Kamppeter - Bug fixes, beta testing, evangelism.
|
||||
Kiko - Bug fixes.
|
||||
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
|
||||
Mark Lawrence - Microsoft interoperability testing.
|
||||
Jeff Licquia - Bug fixes, beta testing, evangelism.
|
||||
Jason McMullan - Original CUPS RPM distributions.
|
||||
Wes Morgan - *BSD fixes.
|
||||
Ulrich Oldendorf - German locale.
|
||||
Giulio Orsero - Bug fixes and testing.
|
||||
Kurt Pfeifle - Bug fixes, beta testing, evangelism.
|
||||
Petter Reinholdtsen - HP-UX compiler stuff.
|
||||
Stuart Stevens - HP JetDirect IPP information.
|
||||
Andrea Suatoni - IRIX desktop integration and testing.
|
||||
Kiko - Bug fixes.
|
||||
L. Peter Deutsch - MD5 code.
|
||||
|
||||
If I've missed someone, please let me know by sending an email to
|
||||
"mike@easysw.com".
|
||||
|
||||
+3
-23
@@ -1,4 +1,4 @@
|
||||
INSTALL - CUPS v1.1.17 - 12/02/2002
|
||||
INSTALL - CUPS v1.1.13 - 01/31/2002
|
||||
-----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source
|
||||
@@ -6,10 +6,6 @@ code. For more information on CUPS see the file called
|
||||
"README.txt". A complete change log can be found in
|
||||
"CHANGES.txt".
|
||||
|
||||
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
|
||||
**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION ****
|
||||
**** OF THE STANDARD GHOSTSCRIPT RELEASES. ****
|
||||
|
||||
|
||||
BEFORE YOU BEGIN
|
||||
|
||||
@@ -33,22 +29,6 @@ Besides these tools you'll want the following libraries:
|
||||
CUPS will compile and run without these, however you'll miss out on
|
||||
many of the features provided by CUPS.
|
||||
|
||||
Also, please note that CUPS no longer includes the Ghostscript-
|
||||
based pstoraster filter. You *must* download Ghostscript
|
||||
separately and patch it using the files in the pstoraster
|
||||
subdirectory, or download the ESP Ghostscript distribution from
|
||||
the CUPS web site. For more information see the README file in
|
||||
the pstoraster subdirectory.
|
||||
|
||||
|
||||
COMPILING FROM CVS
|
||||
|
||||
The CUPS CVS repository doesn't hold a copy of the pre-built
|
||||
configure script. You'll need to run the GNU autoconf software
|
||||
(2.52 or higher) before compiling the software from CVS:
|
||||
|
||||
autoconf ENTER
|
||||
|
||||
|
||||
CONFIGURATION
|
||||
|
||||
@@ -138,9 +118,9 @@ You can find the RPM software at:
|
||||
|
||||
http://www.rpm.org
|
||||
|
||||
The EPM software is at:
|
||||
The RPM software is at:
|
||||
|
||||
http://www.easysw.com/epm/
|
||||
http://www.easysw.com/epm
|
||||
|
||||
|
||||
CREATING BINARY DISTRIBUTIONS WITH EPM
|
||||
|
||||
+63
-125
@@ -7,7 +7,7 @@
|
||||
|
||||
<H2 ALIGN="CENTER">Common UNIX Printing System License Agreement</H2>
|
||||
|
||||
<P ALIGN="CENTER">Copyright 1997-2003 by Easy Software Products<BR>
|
||||
<P ALIGN="CENTER">Copyright 1997-2002 by Easy Software Products<BR>
|
||||
44141 AIRPORT VIEW DR STE 204<BR>
|
||||
HOLLYWOOD, MARYLAND 20636-3111 USA<BR>
|
||||
<BR>
|
||||
@@ -17,146 +17,84 @@ WWW: <A HREF="http://www.cups.org">http://www.cups.org</A>
|
||||
|
||||
<H3>Introduction</H3>
|
||||
|
||||
<P>The Common UNIX Printing System<SUP>TM</SUP>,
|
||||
("CUPS<SUP>TM</SUP>"), is provided under the GNU General Public
|
||||
License ("GPL") and GNU Library General Public License ("LGPL"),
|
||||
Version 2, with exceptions for Apple operating systems and the
|
||||
OpenSSL toolkit. A copy of the exceptions and licenses follow
|
||||
this introduction.
|
||||
<P>The Common UNIX Printing System<SUP>TM</SUP>, ("CUPS<SUP>TM</SUP>"),
|
||||
is provided under the GNU General Public License ("GPL") and GNU
|
||||
Library General Public License ("LGPL"), Version 2. A copy of these
|
||||
licenses follow this introduction.
|
||||
|
||||
<P>The GNU LGPL applies to the CUPS API library, located in the
|
||||
"cups" subdirectory of the CUPS source distribution and in the
|
||||
"cups" include directory and library files in the binary
|
||||
distributions. The GNU GPL applies to the remainder of the CUPS
|
||||
distribution, including the "pdftops" filter which is based upon
|
||||
Xpdf and the CUPS imaging library.
|
||||
<P>The GNU LGPL applies to the CUPS API library, located in the "cups"
|
||||
subdirectory of the CUPS source distribution and in the
|
||||
"/usr/include/cups" directory and "libcups.a", "libcups_s.a",
|
||||
"libcups.sl", or "libcups.so" files in the binary distributions.
|
||||
|
||||
<P>The GNU GPL applies to the remainder of the CUPS distribution,
|
||||
including the "pstoraster" filter which is based upon GNU Ghostscript
|
||||
5.50 and the "pdftops" filter which is based upon Xpdf 0.93a.
|
||||
|
||||
<P>For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>Use the CUPS software at no charge.</LI>
|
||||
<LI>Use the CUPS software at no charge.
|
||||
|
||||
<LI>Distribute verbatim copies of the software in source
|
||||
or binary form.</LI>
|
||||
<LI>Distribute verbatim copies of the software in source or
|
||||
binary form.
|
||||
|
||||
<LI>Sell verbatim copies of the software for a media
|
||||
fee, or sell support for the software.</LI>
|
||||
<LI>Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
|
||||
<LI>Distribute or sell printer drivers and filters that
|
||||
use CUPS so long as source code is made available under
|
||||
the GPL.</LI>
|
||||
<LI>Distribute or sell printer drivers and filters that use
|
||||
CUPS so long as source code is made available under the GPL.
|
||||
|
||||
</UL>
|
||||
|
||||
<P>What this license <B>does not</B> allow you to do is make
|
||||
changes or add features to CUPS and then sell a binary
|
||||
distribution without source code. You must provide source for
|
||||
any new drivers, changes, or additions to the software, and all
|
||||
code must be provided under the GPL or LGPL as appropriate. The
|
||||
only exceptions to this are the portions of the CUPS software
|
||||
covered by the Apple operating system license exceptions
|
||||
outlined later in this license agreement.
|
||||
<P>What this license <B>does not</B> allow you to do is make changes or
|
||||
add features to CUPS and then sell a binary distribution without source
|
||||
code. You must provide source for any new drivers, changes, or
|
||||
additions to the software, and all code must be provided under the GPL
|
||||
or LGPL as appropriate.
|
||||
|
||||
<P>The GNU LGPL relaxes the "link-to" restriction, allowing you
|
||||
to develop applications that use the CUPS API library under
|
||||
other licenses and/or conditions as appropriate for your
|
||||
application.
|
||||
|
||||
<H3>License Exceptions</H3>
|
||||
|
||||
<P>In addition, as the copyright holder of CUPS, Easy Software
|
||||
Products grants the following special exceptions:
|
||||
|
||||
<OL>
|
||||
|
||||
<LI><B>Apple Operating System Development License
|
||||
Exception</B>;
|
||||
|
||||
<OL TYPE="a">
|
||||
|
||||
<LI>Software that is developed by any person or
|
||||
entity for an Apple Operating System ("Apple
|
||||
OS-Developed Software"), including but not
|
||||
limited to Apple and third party printer
|
||||
drivers, filters, and backends for an Apple
|
||||
Operating System, that is linked to the CUPS
|
||||
imaging library or based on any sample filters
|
||||
or backends provided with CUPS shall not be
|
||||
considered to be a derivative work or collective
|
||||
work based on the CUPS program and is exempt
|
||||
from the mandatory source code release clauses
|
||||
of the GNU GPL. You may therefore distribute
|
||||
linked combinations of the CUPS imaging library
|
||||
with Apple OS-Developed Software without
|
||||
releasing the source code of the Apple
|
||||
OS-Developed Software. You may also use sample
|
||||
filters and backends provided with CUPS to
|
||||
develop Apple OS-Developed Software without
|
||||
releasing the source code of the Apple
|
||||
OS-Developed Software.</LI>
|
||||
|
||||
<LI>An Apple Operating System means any
|
||||
operating system software developed and/or
|
||||
marketed by Apple Computer, Inc., including but
|
||||
not limited to all existing releases and
|
||||
versions of Apple's Darwin, Mac OS X, and Mac OS
|
||||
X Server products and all follow-on releases and
|
||||
future versions thereof.</LI>
|
||||
|
||||
<LI>This exception is only available for Apple
|
||||
OS-Developed Software and does not apply to
|
||||
software that is distributed for use on other
|
||||
operating systems.</LI>
|
||||
|
||||
<LI>All CUPS software that falls under this
|
||||
license exception have the following text at the
|
||||
top of each source file:
|
||||
|
||||
<BLOCKQUOTE>This file is subject to the Apple
|
||||
OS-Developed Software
|
||||
exception.</BLOCKQUOTE></LI>
|
||||
|
||||
</OL>
|
||||
|
||||
<LI><B>OpenSSL Toolkit License Exception</B>;
|
||||
|
||||
<OL TYPE="a">
|
||||
|
||||
<LI>Easy Software Products explicitly allows the
|
||||
compilation and distribution of the CUPS
|
||||
software with the OpenSSL Toolkit.</LI>
|
||||
|
||||
</OL>
|
||||
|
||||
</OL>
|
||||
|
||||
<P>No developer is required to provide these exceptions in a
|
||||
derived work.
|
||||
<P>The GNU LGPL relaxes the "link-to" restriction, allowing you to
|
||||
develop applications that use the CUPS API library under other licenses
|
||||
and/or conditions as appropriate for your application.
|
||||
|
||||
<H3>Trademarks</H3>
|
||||
|
||||
<P>Easy Software Products has trademarked the Common UNIX
|
||||
Printing System, CUPS, and CUPS logo. These names and logos may
|
||||
be used freely in any direct port or binary distribution of
|
||||
CUPS. Please contract Easy Software Products for written
|
||||
permission to use them in derivative products. Our intention is
|
||||
to protect the value of these trademarks and ensure that any
|
||||
derivative product meets the same high-quality standards as the
|
||||
original.
|
||||
<P>Easy Software Products has trademarked the Common UNIX Printing
|
||||
System, CUPS, and CUPS logo. These names and logos may be used freely
|
||||
in any direct port or binary distribution of CUPS. To use them in
|
||||
derivative products, please contract Easy Software Products for written
|
||||
permission. Our intention is to protect the value of these trademarks and
|
||||
ensure that any derivative product meets the same high-quality
|
||||
standards as the original.
|
||||
|
||||
<H3>Binary Distribution Rights</H3>
|
||||
|
||||
<P>Easy Software Products also sells rights to the CUPS source
|
||||
code under a binary distribution license for vendors that are
|
||||
unable to release source code for their drivers, additions, and
|
||||
modifications to CUPS under the GNU GPL and LGPL. For
|
||||
information please contact us at the address shown above.
|
||||
<P>Easy Software Products also sells rights to the CUPS source code
|
||||
under a binary distribution license for vendors that are unable to
|
||||
release source code for their drivers, additions, and modifications to
|
||||
CUPS under the GNU GPL and LGPL. For information please contact us at
|
||||
the address shown above.
|
||||
|
||||
<P>The Common UNIX Printing System provides a "pdftops" filter
|
||||
that is based on the Xpdf software. For binary distribution
|
||||
licensing of this software, please contact:
|
||||
<P>The Common UNIX Printing System provides a "pstoraster" filter that
|
||||
utilizes the GNU GhostScript 5.50 core to convert PostScript files into
|
||||
a stream of raster images. For binary distribution licensing of this
|
||||
software, please contact:
|
||||
|
||||
<BLOCKQUOTE>
|
||||
Miles Jones<BR>
|
||||
Director of Marketing<BR>
|
||||
Artifex Software Inc.<BR>
|
||||
454 Las Gallinas Ave., Suite 108<BR>
|
||||
San Rafael, CA 94903 USA<BR>
|
||||
Voice: +1.415.492.9861<BR>
|
||||
Fax: +1.415.492.9862<BR>
|
||||
EMail: <A HREF="mailto:info@arsoft.com">info@arsoft.com</A>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<P>The "pdftops" filter is based on the Xpdf 0.93a software. For binary
|
||||
distribution licensing of this software, please contact:
|
||||
|
||||
<BLOCKQUOTE>
|
||||
Derek B. Noonburg<BR>
|
||||
@@ -166,12 +104,12 @@ WWW: <A HREF="http://www.foolabs.com/xpdf/">http://www.foolabs.com/xpdf/</A>
|
||||
|
||||
<H3>Support</H3>
|
||||
|
||||
<P>Easy Software Products sells software support for CUPS as
|
||||
well as a commercial printing product based on CUPS called ESP
|
||||
Print Pro. You can find out more at our web site:
|
||||
<P>Easy Software Products sells software support for CUPS as well as a
|
||||
commercial printing product based on CUPS called ESP Print Pro. You can
|
||||
find out more at our web site:
|
||||
|
||||
<UL><PRE>
|
||||
<A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
|
||||
<A HREF="http://www.easysw.com">http://www.easysw.com</A>
|
||||
</PRE></UL>
|
||||
|
||||
<!-- NEW PAGE -->
|
||||
@@ -185,7 +123,7 @@ Copyright 1989, 1991 Free Software Foundation, Inc.
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim
|
||||
copies of this license document, but changing it is not allowed.
|
||||
</PRE>
|
||||
<PRE>
|
||||
|
||||
<H4>Preamble</H4>
|
||||
|
||||
|
||||
+56
-105
@@ -1,6 +1,6 @@
|
||||
Common UNIX Printing System License Agreement
|
||||
|
||||
Copyright 1997-2003 by Easy Software Products
|
||||
Copyright 1997-2002 by Easy Software Products
|
||||
44141 AIRPORT VIEW DR STE 204
|
||||
HOLLYWOOD, MARYLAND 20636-3111 USA
|
||||
|
||||
@@ -11,121 +11,72 @@
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
The Common UNIX Printing System(tm), ("CUPS(tm)"), is provided
|
||||
under the GNU General Public License ("GPL") and GNU Library
|
||||
General Public License ("LGPL"), Version 2, with exceptions for
|
||||
Apple operating systems and the OpenSSL toolkit. A copy of the
|
||||
exceptions and licenses follow this introduction.
|
||||
The Common UNIX Printing SystemTM, ("CUPSTM"), is provided under the GNU
|
||||
General Public License ("GPL") and GNU Library General Public License
|
||||
("LGPL"), Version 2. A copy of these licenses follow this introduction.
|
||||
|
||||
The GNU LGPL applies to the CUPS API library, located in the
|
||||
"cups" subdirectory of the CUPS source distribution and in the
|
||||
"cups" include directory and library files in the binary
|
||||
distributions. The GNU GPL applies to the remainder of the CUPS
|
||||
distribution, including the "pdftops" filter which is based upon
|
||||
Xpdf and the CUPS imaging library.
|
||||
The GNU LGPL applies to the CUPS API library, located in the "cups"
|
||||
subdirectory of the CUPS source distribution and in the "/usr/include/cups"
|
||||
directory and "libcups.a", "libcups_s.a", "libcups.sl", or "libcups.so"
|
||||
files in the binary distributions.
|
||||
|
||||
For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:
|
||||
The GNU GPL applies to the remainder of the CUPS distribution, including the
|
||||
"pstoraster" filter which is based upon GNU Ghostscript 5.50 and the
|
||||
"pdftops" filter which is based upon Xpdf 0.93a.
|
||||
|
||||
For those not familiar with the GNU GPL, the license basically allows you
|
||||
to:
|
||||
|
||||
- Use the CUPS software at no charge.
|
||||
- Distribute verbatim copies of the software in source or
|
||||
binary form.
|
||||
- Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
- Distribute or sell printer drivers and filters that use
|
||||
CUPS so long as source code is made available under the
|
||||
GPL.
|
||||
- Distribute verbatim copies of the software in source or binary form.
|
||||
- Sell verbatim copies of the software for a media fee, or sell support
|
||||
for the software.
|
||||
- Distribute or sell printer drivers and filters that use CUPS so long as
|
||||
source code is made available under the GPL.
|
||||
|
||||
What this license *does not* allow you to do is make changes or
|
||||
add features to CUPS and then sell a binary distribution without
|
||||
source code. You must provide source for any new drivers,
|
||||
changes, or additions to the software, and all code must be
|
||||
provided under the GPL or LGPL as appropriate. The only
|
||||
exceptions to this are the portions of the CUPS software covered
|
||||
by the Apple operating system license exceptions outlined later
|
||||
in this license agreement.
|
||||
What this license does not allow you to do is make changes or add features
|
||||
to CUPS and then sell a binary distribution without source code. You must
|
||||
provide source for any new drivers, changes, or additions to the software,
|
||||
and all code must be provided under the GPL or LGPL as appropriate.
|
||||
|
||||
The GNU LGPL relaxes the "link-to" restriction, allowing you to
|
||||
develop applications that use the CUPS API library under other
|
||||
licenses and/or conditions as appropriate for your application.
|
||||
|
||||
|
||||
LICENSE EXCEPTIONS
|
||||
|
||||
In addition, as the copyright holder of CUPS, Easy Software
|
||||
Products grants the following special exceptions:
|
||||
|
||||
1. Apple Operating System Development License Exception;
|
||||
|
||||
a. Software that is developed by any person or entity
|
||||
for an Apple Operating System ("Apple OS-Developed
|
||||
Software"), including but not limited to Apple and
|
||||
third party printer drivers, filters, and backends
|
||||
for an Apple Operating System, that is linked to the
|
||||
CUPS imaging library or based on any sample filters
|
||||
or backends provided with CUPS shall not be
|
||||
considered to be a derivative work or collective work
|
||||
based on the CUPS program and is exempt from the
|
||||
mandatory source code release clauses of the GNU GPL.
|
||||
You may therefore distribute linked combinations of
|
||||
the CUPS imaging library with Apple OS-Developed
|
||||
Software without releasing the source code of the
|
||||
Apple OS-Developed Software. You may also use sample
|
||||
filters and backends provided with CUPS to develop
|
||||
Apple OS-Developed Software without releasing the
|
||||
source code of the Apple OS-Developed Software.
|
||||
|
||||
b. An Apple Operating System means any operating system
|
||||
software developed and/or marketed by Apple Computer,
|
||||
Inc., including but not limited to all existing
|
||||
releases and versions of Apple's Darwin, Mac OS X,
|
||||
and Mac OS X Server products and all follow-on
|
||||
releases and future versions thereof.
|
||||
|
||||
c. This exception is only available for Apple
|
||||
OS-Developed Software and does not apply to software
|
||||
that is distributed for use on other operating
|
||||
systems.
|
||||
|
||||
d. All CUPS software that falls under this license
|
||||
exception have the following text at the top of each
|
||||
source file:
|
||||
|
||||
This file is subject to the Apple OS-Developed
|
||||
Software exception.
|
||||
|
||||
2. OpenSSL Toolkit License Exception;
|
||||
|
||||
a. Easy Software Products explicitly allows the
|
||||
compilation and distribution of the CUPS software
|
||||
with the OpenSSL Toolkit.
|
||||
|
||||
No developer is required to provide these exceptions in a
|
||||
derived work.
|
||||
The GNU LGPL relaxes the "link-to" restriction, allowing you to develop
|
||||
applications that use the CUPS API library under other licenses and/or
|
||||
conditions as appropriate for your application.
|
||||
|
||||
|
||||
TRADEMARKS
|
||||
|
||||
Easy Software Products has trademarked the Common UNIX Printing
|
||||
System, CUPS, and CUPS logo. These names and logos may be used
|
||||
freely in any direct port or binary distribution of CUPS. Please
|
||||
contract Easy Software Products for written permission to use
|
||||
them in derivative products. Our intention is to protect the
|
||||
value of these trademarks and ensure that any derivative product
|
||||
meets the same high-quality standards as the original.
|
||||
Easy Software Products has trademarked the Common UNIX Printing System,
|
||||
CUPS, and CUPS logo. These names and logos may be used freely in any direct
|
||||
port or binary distribution of CUPS. To use them in derivative products,
|
||||
please contract Easy Software Products for written permission. Our intention
|
||||
is to protect the value of these trademarks and ensure that any derivative
|
||||
product meets the same high-quality standards as the original.
|
||||
|
||||
|
||||
BINARY DISTRIBUTION RIGHTS
|
||||
|
||||
Easy Software Products also sells rights to the CUPS source code
|
||||
under a binary distribution license for vendors that are unable
|
||||
to release source code for their drivers, additions, and
|
||||
modifications to CUPS under the GNU GPL and LGPL. For
|
||||
information please contact us at the address shown above.
|
||||
Easy Software Products also sells rights to the CUPS source code under a
|
||||
binary distribution license for vendors that are unable to release source
|
||||
code for their drivers, additions, and modifications to CUPS under the GNU
|
||||
GPL and LGPL. For information please contact us at the address shown above.
|
||||
|
||||
The Common UNIX Printing System provides a "pdftops" filter that
|
||||
is based on the Xpdf software. For binary distribution licensing
|
||||
of this software, please contact:
|
||||
The Common UNIX Printing System provides a "pstoraster" filter that utilizes
|
||||
the GNU GhostScript 5.50 core to convert PostScript files into a stream of
|
||||
raster images. For binary distribution licensing of this software, please
|
||||
contact:
|
||||
|
||||
Miles Jones
|
||||
Director of Marketing
|
||||
Artifex Software Inc.
|
||||
454 Las Gallinas Ave., Suite 108
|
||||
San Rafael, CA 94903 USA
|
||||
Voice: +1.415.492.9861
|
||||
Fax: +1.415.492.9862
|
||||
EMail: info@arsoft.com
|
||||
|
||||
The "pdftops" filter is based on the Xpdf 0.93a software. For binary
|
||||
distribution licensing of this software, please contact:
|
||||
|
||||
Derek B. Noonburg
|
||||
Email: derekn@foolabs.com
|
||||
@@ -134,11 +85,11 @@ of this software, please contact:
|
||||
|
||||
SUPPORT
|
||||
|
||||
Easy Software Products sells software support for CUPS as well
|
||||
as a commercial printing product based on CUPS called ESP Print
|
||||
Pro. You can find out more at our web site:
|
||||
Easy Software Products sells software support for CUPS as well as a
|
||||
commercial printing product based on CUPS called ESP Print Pro. You can find
|
||||
out more at our web site:
|
||||
|
||||
http://www.easysw.com/
|
||||
http://www.easysw.com
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
+6
-11
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Common makefile definitions for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -41,7 +41,6 @@ RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
STRIP = @STRIP@
|
||||
|
||||
#
|
||||
# Installation programs...
|
||||
@@ -83,14 +82,12 @@ LIBZ = @LIBZ@
|
||||
#
|
||||
|
||||
ARFLAGS = @ARFLAGS@
|
||||
BACKLIBS = @BACKLIBS@
|
||||
CFLAGS = $(RC_CFLAGS) @CFLAGS@ -I.. $(OPTIONS)
|
||||
CXXFLAGS = $(RC_CFLAGS) @CXXFLAGS@ -I.. $(OPTIONS)
|
||||
CXXLIBS = @CXXLIBS@
|
||||
CFLAGS = @CFLAGS@ -I.. $(OPTIONS)
|
||||
CXXFLAGS = @CXXFLAGS@ -I.. $(OPTIONS)
|
||||
DSOFLAGS = @DSOFLAGS@
|
||||
DSOLIBS = @DSOLIBS@
|
||||
IMGLIBS = @IMGLIBS@ -lm
|
||||
LDFLAGS = -L../cups -L../filter $(RC_CFLAGS) @LDFLAGS@ $(OPTIM)
|
||||
LDFLAGS = @LDFLAGS@ $(OPTIM)
|
||||
LINKCUPS = @LINKCUPS@
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(NETLIBS) @LIBS@
|
||||
@@ -129,8 +126,6 @@ srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
|
||||
BUILDROOT = $(DSTROOT)
|
||||
|
||||
AMANDIR = $(BUILDROOT)@AMANDIR@
|
||||
BINDIR = $(BUILDROOT)@bindir@
|
||||
DATADIR = $(BUILDROOT)@CUPS_DATADIR@
|
||||
@@ -171,11 +166,11 @@ MAN8DIR = @MAN8DIR@
|
||||
.man.0 .man.1 .man.1m .man.3 .man.5 .man.8:
|
||||
echo Formatting $<...
|
||||
$(RM) $@
|
||||
-$(NROFF) -man $< >$@
|
||||
$(NROFF) -man $< >$@
|
||||
.man.z:
|
||||
echo Formatting $<...
|
||||
$(RM) $@ t.z
|
||||
-$(NROFF) -man $< >t
|
||||
$(NROFF) -man $< >t
|
||||
pack -f t
|
||||
$(MV) t.z $@
|
||||
|
||||
|
||||
+6
-28
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Top-level Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -28,7 +28,7 @@ include Makedefs
|
||||
# Directories to make...
|
||||
#
|
||||
|
||||
DIRS = cups backend berkeley cgi-bin filter man pdftops \
|
||||
DIRS = cups backend berkeley cgi-bin filter man pdftops pstoraster \
|
||||
scheduler systemv
|
||||
|
||||
#
|
||||
@@ -52,22 +52,11 @@ clean:
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\
|
||||
done
|
||||
|
||||
#
|
||||
# Make dependencies
|
||||
#
|
||||
|
||||
depend:
|
||||
for dir in $(DIRS); do\
|
||||
echo Making dependencies in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\
|
||||
done
|
||||
|
||||
|
||||
#
|
||||
# Install object and target files...
|
||||
#
|
||||
|
||||
install: installhdrs
|
||||
install:
|
||||
for dir in $(DIRS); do\
|
||||
echo Installing in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\
|
||||
@@ -104,8 +93,8 @@ install: installhdrs
|
||||
fi
|
||||
if test "x$(INITDIR)" = "x" -a "x$(INITDDIR)" != "x"; then \
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \
|
||||
if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \
|
||||
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/PrintingServices; \
|
||||
if test "$(INITDDIR)" = "/System/Library/StartupItems/CUPS"; then \
|
||||
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/CUPS; \
|
||||
$(INSTALL_DATA) cups.plist $(BUILDROOT)$(INITDDIR)/StartupParameters.plist; \
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj; \
|
||||
$(INSTALL_DATA) cups.strings $(BUILDROOT)$(INITDDIR)/Resources/English.lproj/Localizable.strings; \
|
||||
@@ -114,23 +103,12 @@ install: installhdrs
|
||||
fi \
|
||||
fi
|
||||
|
||||
#
|
||||
# Install source and header files...
|
||||
#
|
||||
|
||||
installsrc:
|
||||
gnutar --dereference --exclude=CVS -cf - . | gnutar -C $(SRCROOT) -xf -
|
||||
|
||||
installhdrs:
|
||||
(cd cups ; $(MAKE) $(MFLAGS) installhdrs) || exit 1;\
|
||||
(cd filter ; $(MAKE) $(MFLAGS) installhdrs) || exit 1;
|
||||
|
||||
|
||||
#
|
||||
# Run the test suite...
|
||||
#
|
||||
|
||||
check test: all
|
||||
test: all
|
||||
echo Running CUPS test suite...
|
||||
cd test; ./run-stp-tests.sh
|
||||
|
||||
|
||||
+8
-13
@@ -1,13 +1,9 @@
|
||||
README - CUPS v1.1.17 - 12/02/2002
|
||||
README - CUPS v1.1.13 - 01/31/2002
|
||||
----------------------------------
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt"
|
||||
instead...
|
||||
|
||||
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
|
||||
**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION ****
|
||||
**** OF THE STANDARD GHOSTSCRIPT RELEASES. ****
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
@@ -25,12 +21,11 @@ functionality. CUPS adds network printer browsing and
|
||||
PostScript Printer Description ("PPD") based printing options to
|
||||
support real-world printing under UNIX.
|
||||
|
||||
CUPS includes an image file RIP that supports printing of image
|
||||
files to non-PostScript printers. A customized version of GNU
|
||||
Ghostscript 7.05 for CUPS called ESP Ghostscript is available
|
||||
separately to support printing of PostScript files within the
|
||||
CUPS driver framework. Sample drivers for Dymo, EPSON, HP, and
|
||||
OKIDATA printers are included that use these filters.
|
||||
CUPS also includes a customized version of GNU Ghostscript
|
||||
(currently based off GNU Ghostscript 5.50) and an image file RIP
|
||||
that are used to support non-PostScript printers. Sample
|
||||
drivers for HP and EPSON printers are included that use these
|
||||
filters.
|
||||
|
||||
Drivers for thousands of printers are provided with our ESP
|
||||
Print Pro software, available at:
|
||||
@@ -248,7 +243,7 @@ file.
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
CUPS is Copyright 1993-2003 by Easy Software Products. CUPS,
|
||||
CUPS is Copyright 1993-2002 by Easy Software Products. CUPS,
|
||||
the CUPS logo, and the Common UNIX Printing System are the
|
||||
trademark property of Easy Software Products.
|
||||
|
||||
@@ -258,7 +253,7 @@ The PostScript RIP software (pstoraster) is based on the GNU
|
||||
Ghostscript 5.50 core, Copyright 1986-1998 by Aladdin
|
||||
Enterprises.
|
||||
|
||||
The PDF filter (pdftops) is based on the Xpdf 1.01 software,
|
||||
The PDF filter (pdftops) is based on the Xpdf 0.92 software,
|
||||
Copyright 1996-2002 by Derek B. Noonburg.
|
||||
|
||||
This software is based in part on the work of the Independent
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
# DO NOT DELETE
|
||||
|
||||
betest.o: ../cups/string.h ../config.h
|
||||
ipp.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
ipp.o: ../cups/ppd.h ../cups/language.h ../cups/string.h ../config.h
|
||||
lpd.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
lpd.o: ../cups/ppd.h ../cups/string.h ../config.h
|
||||
parallel.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
parallel.o: ../cups/ppd.h ../cups/string.h ../config.h
|
||||
serial.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
serial.o: ../cups/ppd.h ../cups/string.h ../config.h
|
||||
socket.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
socket.o: ../cups/ppd.h ../cups/string.h ../config.h
|
||||
usb.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
usb.o: ../cups/ppd.h ../cups/string.h ../config.h
|
||||
+18
-32
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Backend makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -21,14 +21,12 @@
|
||||
# EMail: cups-info@cups.org
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
# This file is subject to the Apple OS-Developed Software exception.
|
||||
#
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
BACKENDS = ipp lpd parallel scsi serial socket usb
|
||||
BACKENDS = ipp lpd parallel serial socket usb
|
||||
TARGETS = betest $(BACKENDS)
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o scsi.o serial.o socket.o usb.o
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o serial.o socket.o usb.o
|
||||
|
||||
|
||||
#
|
||||
@@ -46,19 +44,11 @@ clean:
|
||||
$(RM) $(OBJS) $(TARGETS) http
|
||||
|
||||
|
||||
#
|
||||
# Update dependencies (without system header dependencies...)
|
||||
#
|
||||
|
||||
depend:
|
||||
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
|
||||
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install: all
|
||||
install:
|
||||
$(INSTALL_DIR) $(SERVERBIN)/backend
|
||||
for file in $(BACKENDS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
|
||||
@@ -75,6 +65,8 @@ betest: betest.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o betest betest.o $(LIBS)
|
||||
|
||||
betest.o: ../cups/string.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# ipp
|
||||
@@ -86,6 +78,8 @@ ipp: ipp.o ../cups/$(LIBCUPS)
|
||||
$(RM) http
|
||||
$(LN) ipp http
|
||||
|
||||
ipp.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpd
|
||||
@@ -95,6 +89,8 @@ lpd: lpd.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpd lpd.o $(LIBS)
|
||||
|
||||
lpd.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# parallel
|
||||
@@ -104,16 +100,7 @@ parallel: parallel.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
# scsi
|
||||
#
|
||||
|
||||
scsi: scsi.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o scsi scsi.o $(LIBS)
|
||||
|
||||
scsi.o: scsi.c scsi-irix.c scsi-linux.c
|
||||
parallel.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
@@ -122,7 +109,9 @@ scsi.o: scsi.c scsi-irix.c scsi-linux.c
|
||||
|
||||
serial: serial.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS)
|
||||
$(CC) $(LDFLAGS) -o serial serial.o $(LIBS)
|
||||
|
||||
serial.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
@@ -133,6 +122,8 @@ socket: socket.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o socket socket.o $(LIBS)
|
||||
|
||||
socket.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# usb
|
||||
@@ -140,14 +131,9 @@ socket: socket.o ../cups/$(LIBCUPS)
|
||||
|
||||
usb: usb.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o usb usb.o $(BACKLIBS) $(LIBS)
|
||||
$(CC) $(LDFLAGS) -o usb usb.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
usb.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Backend test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Run the named backend.
|
||||
|
||||
+10
-123
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
@@ -94,10 +92,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ipp_attribute_t *copies_sup; /* copies-supported attribute */
|
||||
ipp_attribute_t *charset_sup; /* charset-supported attribute */
|
||||
ipp_attribute_t *format_sup; /* document-format-supported attribute */
|
||||
ipp_attribute_t *printer_state;
|
||||
/* printer-state attribute */
|
||||
ipp_attribute_t *printer_accepting;
|
||||
/* printer-is-accepting-jobs attribute */
|
||||
const char *charset; /* Character set to use */
|
||||
cups_lang_t *language; /* Default language */
|
||||
int copies; /* Number of copies remaining */
|
||||
@@ -115,20 +109,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -187,7 +167,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
strlcpy(filename, argv[6], sizeof(filename));
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -215,36 +198,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
do
|
||||
{
|
||||
fprintf(stderr, "INFO: Connecting to %s on port %d...\n", hostname, port);
|
||||
fprintf(stderr, "INFO: Connecting to %s...\n", hostname);
|
||||
|
||||
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
|
||||
if ((http = httpConnect(hostname, port)) == NULL)
|
||||
{
|
||||
if (getenv("CLASS") != NULL)
|
||||
{
|
||||
/*
|
||||
* If the CLASS environment variable is set, the job was submitted
|
||||
* to a class and not to a specific queue. In this case, we want
|
||||
* to abort immediately so that the job can be requeued on the next
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fprintf(stderr, "INFO: Unable to queue job on %s, queuing on next printer in class...\n",
|
||||
hostname);
|
||||
|
||||
if (argc == 6)
|
||||
unlink(filename);
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
*/
|
||||
|
||||
sleep(5);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (errno == ECONNREFUSED || errno == EHOSTDOWN ||
|
||||
errno == EHOSTUNREACH)
|
||||
if (errno == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...",
|
||||
hostname);
|
||||
@@ -259,8 +217,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
while (http == NULL);
|
||||
|
||||
fprintf(stderr, "INFO: Connected to %s...\n", hostname);
|
||||
|
||||
/*
|
||||
* Build a URI for the printer and fill the standard IPP attributes for
|
||||
* an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it
|
||||
@@ -307,8 +263,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
fputs("DEBUG: Getting supported attributes...\n", stderr);
|
||||
|
||||
if ((supported = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
@@ -332,7 +286,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
fputs("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n", stderr);
|
||||
version = 0;
|
||||
httpReconnect(http);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Unable to get printer status (%s)!\n",
|
||||
@@ -373,49 +326,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
while (ipp_status > IPP_OK_CONFLICT);
|
||||
|
||||
/*
|
||||
* See if the printer is accepting jobs and is not stopped; if either
|
||||
* condition is true and we are printing to a class, requeue the job...
|
||||
*/
|
||||
|
||||
if (getenv("CLASS") != NULL)
|
||||
{
|
||||
printer_state = ippFindAttribute(supported, "printer-state",
|
||||
IPP_TAG_ENUM);
|
||||
printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs",
|
||||
IPP_TAG_BOOLEAN);
|
||||
|
||||
if (printer_state == NULL ||
|
||||
printer_state->values[0].integer > IPP_PRINTER_PROCESSING ||
|
||||
printer_accepting == NULL ||
|
||||
!printer_accepting->values[0].boolean)
|
||||
{
|
||||
/*
|
||||
* If the CLASS environment variable is set, the job was submitted
|
||||
* to a class and not to a specific queue. In this case, we want
|
||||
* to abort immediately so that the job can be requeued on the next
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fprintf(stderr, "INFO: Unable to queue job on %s, queuing on next printer in class...\n",
|
||||
hostname);
|
||||
|
||||
ippDelete(supported);
|
||||
httpClose(http);
|
||||
|
||||
if (argc == 6)
|
||||
unlink(filename);
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
*/
|
||||
|
||||
sleep(5);
|
||||
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
@@ -566,16 +476,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
cupsFreeOptions(num_options, options);
|
||||
|
||||
/*
|
||||
* If copies aren't supported, then we are likely dealing with an HP
|
||||
* JetDirect. The HP IPP implementation seems to close the connection
|
||||
* after every request (that is, it does *not* implement HTTP Keep-
|
||||
* Alive, which is REQUIRED by HTTP/1.1...
|
||||
*/
|
||||
|
||||
if (!copies_sup)
|
||||
httpReconnect(http);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
@@ -656,10 +556,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
|
||||
job_id);
|
||||
|
||||
if (argv[2][0])
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "job-state");
|
||||
|
||||
@@ -667,9 +563,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if (!copies_sup)
|
||||
httpReconnect(http);
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
@@ -717,6 +610,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
|
||||
/*
|
||||
* Now check on the printer state...
|
||||
*/
|
||||
@@ -736,20 +630,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
if (argv[2][0])
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "printer-state-reasons");
|
||||
"requested-attributes", NULL, "job-state-reasons");
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if (!copies_sup)
|
||||
httpReconnect(http);
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) != NULL)
|
||||
{
|
||||
reasons = report_printer_state(response);
|
||||
|
||||
+233
-396
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Line Printer Daemon backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,14 +21,11 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
* lpd_command() - Send an LPR command sequence and wait for a reply.
|
||||
* lpd_queue() - Queue a file using the Line Printer Daemon protocol.
|
||||
* lpd_timeout() - Handle timeout alarms...
|
||||
* lpd_write() - Write a buffer of data to an LPD server.
|
||||
*/
|
||||
|
||||
@@ -79,9 +76,7 @@ extern int rresvport(int *port);
|
||||
static int lpd_command(int lpd_fd, char *format, ...);
|
||||
static int lpd_queue(char *hostname, char *printer, char *filename,
|
||||
int fromstdin, char *user, char *title, int copies,
|
||||
int banner, int format, int order, int reserve,
|
||||
int manual_copies);
|
||||
static void lpd_timeout(int sig);
|
||||
int banner, int format, int order);
|
||||
static int lpd_write(int lpd_fd, char *buffer, int length);
|
||||
|
||||
|
||||
@@ -112,13 +107,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
int banner; /* Print banner page? */
|
||||
int format; /* Print format */
|
||||
int order; /* Order of control/data files */
|
||||
int reserve; /* Reserve priviledged port? */
|
||||
int manual_copies, /* Do manual copies? */
|
||||
copies; /* Number of copies */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action;
|
||||
/* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
/*
|
||||
@@ -127,20 +115,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -192,7 +166,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
strlcpy(filename, argv[6], sizeof(filename));
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -204,11 +181,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* See if there are any options...
|
||||
*/
|
||||
|
||||
banner = 0;
|
||||
format = 'l';
|
||||
order = ORDER_CONTROL_DATA;
|
||||
reserve = 0;
|
||||
manual_copies = 1;
|
||||
banner = 0;
|
||||
format = 'l';
|
||||
order = ORDER_CONTROL_DATA;
|
||||
|
||||
if ((options = strchr(resource, '?')) != NULL)
|
||||
{
|
||||
@@ -290,28 +265,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
else
|
||||
fprintf(stderr, "ERROR: Unknown file order \"%s\"\n", value);
|
||||
}
|
||||
else if (strcasecmp(name, "reserve") == 0)
|
||||
{
|
||||
/*
|
||||
* Set port reservation mode...
|
||||
*/
|
||||
|
||||
reserve = !value[0] ||
|
||||
strcasecmp(value, "on") == 0 ||
|
||||
strcasecmp(value, "yes") == 0 ||
|
||||
strcasecmp(value, "true") == 0;
|
||||
}
|
||||
else if (strcasecmp(name, "manual_copies") == 0)
|
||||
{
|
||||
/*
|
||||
* Set port reservation mode...
|
||||
*/
|
||||
|
||||
manual_copies = !value[0] ||
|
||||
strcasecmp(value, "on") == 0 ||
|
||||
strcasecmp(value, "yes") == 0 ||
|
||||
strcasecmp(value, "true") == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,7 +272,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Sanitize the document title...
|
||||
*/
|
||||
|
||||
strlcpy(title, argv[3], sizeof(title));
|
||||
strncpy(title, argv[3], sizeof(title) - 1);
|
||||
title[sizeof(title) - 1] = '\0';
|
||||
|
||||
for (ptr = title; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && !isspace(*ptr))
|
||||
@@ -331,28 +285,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc > 6)
|
||||
{
|
||||
if (manual_copies)
|
||||
{
|
||||
manual_copies = atoi(argv[4]);
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
manual_copies = 1;
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
status = lpd_queue(hostname, resource + 1, filename, 0,
|
||||
argv[2] /* user */, title, copies,
|
||||
banner, format, order, reserve, manual_copies);
|
||||
argv[2] /* user */, title, atoi(argv[4]) /* copies */,
|
||||
banner, format, order);
|
||||
|
||||
if (!status)
|
||||
fprintf(stderr, "PAGE: 1 %d\n", atoi(argv[4]));
|
||||
}
|
||||
else
|
||||
status = lpd_queue(hostname, resource + 1, filename, 1,
|
||||
argv[2] /* user */, title, 1,
|
||||
banner, format, order, reserve, 1);
|
||||
argv[2] /* user */, title, 1, banner, format, order);
|
||||
|
||||
/*
|
||||
* Remove the temporary file if necessary...
|
||||
@@ -400,8 +342,6 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
|
||||
|
||||
fprintf(stderr, "DEBUG: Sending command string (%d bytes)...\n", bytes);
|
||||
|
||||
alarm(30);
|
||||
|
||||
if (lpd_write(fd, buf, bytes) < bytes)
|
||||
return (-1);
|
||||
|
||||
@@ -411,12 +351,8 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
|
||||
|
||||
fprintf(stderr, "DEBUG: Reading command status...\n");
|
||||
|
||||
alarm(30);
|
||||
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
status = errno;
|
||||
|
||||
alarm(0);
|
||||
return (-1);
|
||||
|
||||
fprintf(stderr, "DEBUG: lpd_command returning %d\n", status);
|
||||
|
||||
@@ -438,9 +374,7 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
int copies, /* I - Number of copies */
|
||||
int banner, /* I - Print LPD banner? */
|
||||
int format, /* I - Format specifier */
|
||||
int order, /* I - Order of data/control files */
|
||||
int reserve, /* I - Reserve ports? */
|
||||
int manual_copies) /* I - Do copies by hand... */
|
||||
int order) /* I - Order of data/control files */
|
||||
{
|
||||
FILE *fp; /* Job file */
|
||||
char localhost[255]; /* Local host name */
|
||||
@@ -453,7 +387,6 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
char status; /* Status byte from command */
|
||||
struct sockaddr_in addr; /* Socket address */
|
||||
struct hostent *hostaddr; /* Host address */
|
||||
int copy; /* Copies written */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total bytes written */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
@@ -463,346 +396,250 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
|
||||
|
||||
/*
|
||||
* Setup an alarm handler for timeouts...
|
||||
* First try to reserve a port for this connection...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGALRM, lpd_timeout);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = lpd_timeout;
|
||||
sigaction(SIGALRM, &action, NULL);
|
||||
#else
|
||||
signal(SIGALRM, lpd_timeout);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Loop forever trying to print the file...
|
||||
*/
|
||||
|
||||
for (;;) /* FOREVER */
|
||||
if ((hostaddr = httpGetHostByName(hostname)) == NULL)
|
||||
{
|
||||
/*
|
||||
* First try to reserve a port for this connection...
|
||||
*/
|
||||
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s",
|
||||
hostname, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
if ((hostaddr = httpGetHostByName(hostname)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s\n",
|
||||
hostname, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
fprintf(stderr, "INFO: Attempting to connect to host %s for printer %s\n",
|
||||
hostname, printer);
|
||||
|
||||
fprintf(stderr, "INFO: Attempting to connect to host %s for printer %s\n",
|
||||
hostname, printer);
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memcpy(&(addr.sin_addr), hostaddr->h_addr, hostaddr->h_length);
|
||||
addr.sin_family = hostaddr->h_addrtype;
|
||||
addr.sin_port = htons(515); /* LPD/printer service */
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memcpy(&(addr.sin_addr), hostaddr->h_addr, hostaddr->h_length);
|
||||
addr.sin_family = hostaddr->h_addrtype;
|
||||
addr.sin_port = htons(515); /* LPD/printer service */
|
||||
|
||||
for (port = 732;;)
|
||||
{
|
||||
if (getuid() || !reserve)
|
||||
{
|
||||
/*
|
||||
* Just create a regular socket...
|
||||
*/
|
||||
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to create socket");
|
||||
return (1);
|
||||
}
|
||||
|
||||
port = 515;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* We're running as root and want to comply with RFC 1179. Reserve a
|
||||
* priviledged port between 721 and 732...
|
||||
*/
|
||||
|
||||
if ((fd = rresvport(&port)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to reserve port");
|
||||
sleep(30);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
error = errno;
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (error == ECONNREFUSED || error == EHOSTDOWN ||
|
||||
error == EHOSTUNREACH)
|
||||
{
|
||||
fprintf(stderr, "WARNING: Network host \'%s\' is busy, down, or unreachable; will retry in 30 seconds...\n",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else if (error == EADDRINUSE)
|
||||
{
|
||||
port --;
|
||||
if (port < 721)
|
||||
port = 732;
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "INFO: Connected from port %d...\n", port);
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
if (fromstdin)
|
||||
{
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
/*
|
||||
* Next, open the print file and figure out its size...
|
||||
*/
|
||||
|
||||
if (stat(filename, &filestats))
|
||||
{
|
||||
perror("ERROR: unable to stat print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
filestats.st_size *= manual_copies;
|
||||
|
||||
if ((fp = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file for reading");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a job header to the printer, specifying no banner page and
|
||||
* literal output...
|
||||
*/
|
||||
|
||||
lpd_command(fd, "\002%s\n", printer); /* Receive print job(s) */
|
||||
|
||||
gethostname(localhost, sizeof(localhost));
|
||||
localhost[31] = '\0'; /* RFC 1179, Section 7.2 - host name < 32 chars */
|
||||
|
||||
snprintf(control, sizeof(control), "H%s\nP%s\nJ%s\n", localhost, user, title);
|
||||
cptr = control + strlen(control);
|
||||
|
||||
if (banner)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "L%s\n", user);
|
||||
cptr += strlen(cptr);
|
||||
}
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%s\n", format,
|
||||
getpid() % 1000, localhost);
|
||||
cptr += strlen(cptr);
|
||||
copies --;
|
||||
}
|
||||
|
||||
snprintf(cptr, sizeof(control) - (cptr - control),
|
||||
"UdfA%03d%s\nN%s\n",
|
||||
getpid() % 1000, localhost, title);
|
||||
|
||||
fprintf(stderr, "DEBUG: Control file is:\n%s", control);
|
||||
|
||||
if (order == ORDER_CONTROL_DATA)
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%lu bytes)\n",
|
||||
(unsigned long)strlen(control));
|
||||
|
||||
alarm(30);
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
}
|
||||
else
|
||||
{
|
||||
alarm(30);
|
||||
|
||||
if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
alarm(0);
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
}
|
||||
else
|
||||
status = 0;
|
||||
|
||||
if (status == 0)
|
||||
for (port = 732;;)
|
||||
{
|
||||
if (getuid())
|
||||
{
|
||||
/*
|
||||
* Send the print file...
|
||||
* We're running as a normal user, so just create a regular socket...
|
||||
*/
|
||||
|
||||
lpd_command(fd, "\003%u dfA%03.3d%s\n", (unsigned)filestats.st_size,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending data file (%u bytes)\n",
|
||||
(unsigned)filestats.st_size);
|
||||
|
||||
tbytes = 0;
|
||||
for (copy = 0; copy < manual_copies; copy ++)
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
rewind(fp);
|
||||
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
fprintf(stderr, "INFO: Spooling LPR job, %u%% complete...\n",
|
||||
(unsigned)(100.0f * tbytes / filestats.st_size));
|
||||
|
||||
if (lpd_write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
}
|
||||
perror("ERROR: Unable to create socket");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (tbytes < filestats.st_size)
|
||||
status = errno;
|
||||
else if (lpd_write(fd, "", 1) < 1)
|
||||
status = errno;
|
||||
else
|
||||
{
|
||||
alarm(30);
|
||||
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
status = errno;
|
||||
|
||||
alarm(0);
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept data file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Data file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
if (status == 0 && order == ORDER_DATA_CONTROL)
|
||||
else
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
/*
|
||||
* We're running as root, so comply with RFC 1179 and reserve a
|
||||
* priviledged port between 721 and 732...
|
||||
*/
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%lu bytes)\n",
|
||||
(unsigned long)strlen(control));
|
||||
|
||||
alarm(30);
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
if ((fd = rresvport(&port)) < 0)
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
perror("ERROR: Unable to reserve port");
|
||||
sleep(30);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
alarm(30);
|
||||
|
||||
if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
alarm(0);
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection and input file...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
fclose(fp);
|
||||
|
||||
if (status == 0)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Restore the SIGTERM handler if we are waiting for a retry...
|
||||
*/
|
||||
|
||||
if (fromstdin)
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_DFL);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
error = errno;
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_DFL;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_DFL);
|
||||
#endif /* HAVE_SIGSET */
|
||||
if (error == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else if (error == EADDRINUSE)
|
||||
{
|
||||
port --;
|
||||
if (port < 721)
|
||||
port = 732;
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
|
||||
sleep(30);
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "INFO: Connected from port %d...\n", port);
|
||||
|
||||
/*
|
||||
* 'lpd_timeout()' - Handle timeout alarms...
|
||||
*/
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
static void
|
||||
lpd_timeout(int sig) /* I - Signal number */
|
||||
{
|
||||
(void)sig;
|
||||
if (fromstdin)
|
||||
{
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION)
|
||||
signal(SIGALRM, lpd_timeout);
|
||||
#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
/*
|
||||
* Next, open the print file and figure out its size...
|
||||
*/
|
||||
|
||||
if (stat(filename, &filestats))
|
||||
{
|
||||
perror("ERROR: unable to stat print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if ((fp = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file for reading");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a job header to the printer, specifying no banner page and
|
||||
* literal output...
|
||||
*/
|
||||
|
||||
lpd_command(fd, "\002%s\n", printer); /* Receive print job(s) */
|
||||
|
||||
gethostname(localhost, sizeof(localhost));
|
||||
localhost[31] = '\0'; /* RFC 1179, Section 7.2 - host name < 32 chars */
|
||||
|
||||
snprintf(control, sizeof(control), "H%s\nP%s\nJ%s\n", localhost, user, title);
|
||||
cptr = control + strlen(control);
|
||||
|
||||
if (banner)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "L%s\n", user);
|
||||
cptr += strlen(cptr);
|
||||
}
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%s\n", format,
|
||||
getpid() % 1000, localhost);
|
||||
cptr += strlen(cptr);
|
||||
copies --;
|
||||
}
|
||||
|
||||
snprintf(cptr, sizeof(control) - (cptr - control),
|
||||
"UdfA%03d%s\nNdfA%03d%s\n",
|
||||
getpid() % 1000, localhost,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
fprintf(stderr, "DEBUG: Control file is:\n%s", control);
|
||||
|
||||
if (order == ORDER_CONTROL_DATA)
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
}
|
||||
else if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
}
|
||||
else
|
||||
status = 0;
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
/*
|
||||
* Send the print file...
|
||||
*/
|
||||
|
||||
lpd_command(fd, "\003%u dfA%03.3d%s\n", (unsigned)filestats.st_size,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending data file (%u bytes)\n",
|
||||
(unsigned)filestats.st_size);
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
fprintf(stderr, "INFO: Spooling LPR job, %u%% complete...\n",
|
||||
(unsigned)(100.0f * tbytes / filestats.st_size));
|
||||
|
||||
if (lpd_write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
}
|
||||
|
||||
if (tbytes < filestats.st_size)
|
||||
status = errno;
|
||||
else if (lpd_write(fd, "", 1) < 1)
|
||||
status = errno;
|
||||
else if (recv(fd, &status, 1, 0) < 1)
|
||||
status = errno;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept data file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Data file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
if (status == 0 && order == ORDER_DATA_CONTROL)
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
}
|
||||
else if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection and input file and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
fclose(fp);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+13
-46
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Parallel port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified parallel port.
|
||||
@@ -85,7 +83,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
resource[1024], /* Resource info (device and options) */
|
||||
*options; /* Pointer to options */
|
||||
int port; /* Port number (not used) */
|
||||
int fp; /* Print file */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -105,20 +103,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -141,7 +125,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = 0;
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -150,7 +134,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -192,11 +176,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
|
||||
{
|
||||
fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to open parallel port device file \"%s\": %s\n",
|
||||
@@ -249,14 +228,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != 0)
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -282,8 +261,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,10 +270,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -354,16 +330,7 @@ list_devices(void)
|
||||
strcpy(basedevice, "/dev/par");
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(device, "/dev/printers/%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
strcpy(basedevice, "/dev/printers/");
|
||||
}
|
||||
else
|
||||
strcpy(basedevice, "/dev/unknown-parallel");
|
||||
}
|
||||
strcpy(basedevice, "/dev/unknown-parallel");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,10 +376,10 @@ list_devices(void)
|
||||
|
||||
if (strncmp(line, "MODEL:", 6) == 0 &&
|
||||
strncmp(line, "MODEL:Unknown", 13) != 0)
|
||||
strlcpy(model, line + 6, sizeof(model));
|
||||
strncpy(model, line + 6, sizeof(model) - 1);
|
||||
else if (strncmp(line, "MANUFACTURER:", 13) == 0 &&
|
||||
strncmp(line, "MANUFACTURER:Unknown", 20) != 0)
|
||||
strlcpy(make, line + 13, sizeof(make));
|
||||
strncpy(make, line + 13, sizeof(make) - 1);
|
||||
}
|
||||
|
||||
fclose(probe);
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* IRIX SCSI printer support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the
|
||||
* following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the
|
||||
* following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the
|
||||
* above copyright notice, this list of conditions and
|
||||
* the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use
|
||||
* of this software must display the following
|
||||
* acknowledgement:
|
||||
*
|
||||
* This product includes software developed by Easy
|
||||
* Software Products.
|
||||
*
|
||||
* 4. The name of Easy Software Products may not be used to
|
||||
* endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* list_devices() - List the available SCSI printer devices.
|
||||
* print_device() - Print a file to a SCSI device.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <bstring.h> /* memcpy() and friends */
|
||||
#include <sys/dsreq.h> /* SCSI interface stuff */
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List the available SCSI printer devices.
|
||||
*/
|
||||
|
||||
void
|
||||
list_devices(void)
|
||||
{
|
||||
puts("direct scsi \"Unknown\" \"SCSI Printer\"");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'print_device()' - Print a file to a SCSI device.
|
||||
*/
|
||||
|
||||
int /* O - Print status */
|
||||
print_device(const char *resource, /* I - SCSI device */
|
||||
int fd, /* I - File to print */
|
||||
int copies) /* I - Number of copies to print */
|
||||
{
|
||||
int scsi_fd; /* SCSI file descriptor */
|
||||
char buffer[8192]; /* Data buffer */
|
||||
int bytes; /* Number of bytes */
|
||||
int try; /* Current try */
|
||||
dsreq_t scsi_req; /* SCSI request */
|
||||
char scsi_cmd[6], /* SCSI command data */
|
||||
scsi_sense[32]; /* SCSI sense data */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
/*
|
||||
* Make sure we have a valid resource name...
|
||||
*/
|
||||
|
||||
if (strncmp(resource, "/dev/scsi/", 10) != 0)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Bad SCSI device file \"%s\"!\n", resource);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the SCSI device file...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
if ((scsi_fd = open(resource, O_RDWR | O_EXCL)) == -1)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EBUSY)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to open SCSI device \"%s\" - %s\n",
|
||||
resource, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "INFO: SCSI device \"%s\" busy; retrying...\n",
|
||||
resource);
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (scsi_fd == -1);
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
if (fd != 0)
|
||||
{
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the print file to the device...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
if (fd != 0)
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
memset(&scsi_req, 0, sizeof(scsi_req));
|
||||
|
||||
scsi_req.ds_flags = DSRQ_WRITE;
|
||||
scsi_req.ds_time = 60 * 1000;
|
||||
scsi_req.ds_cmdbuf = scsi_cmd;
|
||||
scsi_req.ds_cmdlen = 6;
|
||||
scsi_req.ds_databuf = buffer;
|
||||
scsi_req.ds_datalen = bytes;
|
||||
|
||||
scsi_cmd[0] = 0x0a; /* Group 0 print command */
|
||||
scsi_cmd[1] = 0x00;
|
||||
scsi_cmd[2] = bytes / 65536;
|
||||
scsi_cmd[3] = bytes / 256;
|
||||
scsi_cmd[4] = bytes;
|
||||
scsi_cmd[5] = 0x00;
|
||||
|
||||
for (try = 0; try < 10; try ++)
|
||||
if (ioctl(scsi_fd, DS_ENTER, &scsi_req) < 0 ||
|
||||
scsi_req.ds_status != 0)
|
||||
{
|
||||
fprintf(stderr, "WARNING: SCSI command timed out (%d); retrying...\n",
|
||||
scsi_req.ds_status);
|
||||
sleep(try + 1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
if (try >= 10)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to send print data (%d)\n",
|
||||
scsi_req.ds_status);
|
||||
close(scsi_fd);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
copies --;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the device and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -1,228 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Linux SCSI printer support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the
|
||||
* following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the
|
||||
* following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the
|
||||
* above copyright notice, this list of conditions and
|
||||
* the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use
|
||||
* of this software must display the following
|
||||
* acknowledgement:
|
||||
*
|
||||
* This product includes software developed by Easy
|
||||
* Software Products.
|
||||
*
|
||||
* 4. The name of Easy Software Products may not be used to
|
||||
* endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* list_devices() - List the available SCSI printer devices.
|
||||
* print_device() - Print a file to a SCSI device.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <scsi/sg.h>
|
||||
|
||||
|
||||
/*
|
||||
* We currently only support the Linux 2.4 generic SCSI interface.
|
||||
*/
|
||||
|
||||
#ifndef SG_DXFER_TO_DEV
|
||||
/*
|
||||
* Dummy functions that do nothing on unsupported platforms...
|
||||
*/
|
||||
void list_devices(void) {}
|
||||
int print_device(const char *resource, int fd, int copies) { return (1); }
|
||||
#else
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List the available SCSI printer devices.
|
||||
*/
|
||||
|
||||
void
|
||||
list_devices(void)
|
||||
{
|
||||
puts("direct scsi \"Unknown\" \"SCSI Printer\"");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'print_device()' - Print a file to a SCSI device.
|
||||
*/
|
||||
|
||||
int /* O - Print status */
|
||||
print_device(const char *resource, /* I - SCSI device */
|
||||
int fd, /* I - File to print */
|
||||
int copies) /* I - Number of copies to print */
|
||||
{
|
||||
int scsi_fd; /* SCSI file descriptor */
|
||||
char buffer[8192]; /* Data buffer */
|
||||
int bytes; /* Number of bytes */
|
||||
int try; /* Current try */
|
||||
sg_io_hdr_t scsi_req; /* SCSI request */
|
||||
char scsi_cmd[6], /* SCSI command data */
|
||||
scsi_sense[32]; /* SCSI sense data */
|
||||
# if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
# endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
/*
|
||||
* Make sure we have a valid resource name...
|
||||
*/
|
||||
|
||||
if (strncmp(resource, "/dev/sg", 7) != 0)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Bad SCSI device file \"%s\"!\n", resource);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the SCSI device file...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
if ((scsi_fd = open(resource, O_RDWR | O_EXCL)) == -1)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EBUSY)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to open SCSI device \"%s\" - %s\n",
|
||||
resource, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "INFO: SCSI device \"%s\" busy; retrying...\n",
|
||||
resource);
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (scsi_fd == -1);
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
if (fd != 0)
|
||||
{
|
||||
# ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_IGN);
|
||||
# elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
# else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
# endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the print file to the device...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
if (fd != 0)
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
memset(&scsi_req, 0, sizeof(scsi_req));
|
||||
|
||||
scsi_req.interface_id = 'S';
|
||||
scsi_req.dxfer_direction = SG_DXFER_TO_DEV;
|
||||
scsi_req.cmd_len = 6;
|
||||
scsi_req.mx_sb_len = sizeof(scsi_sense);
|
||||
scsi_req.iovec_count = 0;
|
||||
scsi_req.dxfer_len = bytes;
|
||||
scsi_req.dxferp = buffer;
|
||||
scsi_req.cmdp = scsi_cmd;
|
||||
scsi_req.sbp = scsi_sense;
|
||||
scsi_req.timeout = 60 * 1000;
|
||||
|
||||
scsi_cmd[0] = 0x0a; /* Group 0 print command */
|
||||
scsi_cmd[1] = 0x00;
|
||||
scsi_cmd[2] = bytes / 65536;
|
||||
scsi_cmd[3] = bytes / 256;
|
||||
scsi_cmd[4] = bytes;
|
||||
scsi_cmd[5] = 0x00;
|
||||
|
||||
for (try = 0; try < 10; try ++)
|
||||
if (ioctl(scsi_fd, SG_IO, &scsi_req) < 0 ||
|
||||
scsi_req.status != 0)
|
||||
{
|
||||
fprintf(stderr, "WARNING: SCSI command timed out (%d); retrying...\n",
|
||||
scsi_req.status);
|
||||
sleep(try + 1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
if (try >= 10)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to send print data (%d)\n",
|
||||
scsi_req.status);
|
||||
close(scsi_fd);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
copies --;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the device and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif /* !SG_DXFER_TO_DEV */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -1,223 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* SCSI printer backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the
|
||||
* following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the
|
||||
* following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the
|
||||
* above copyright notice, this list of conditions and
|
||||
* the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use
|
||||
* of this software must display the following
|
||||
* acknowledgement:
|
||||
*
|
||||
* This product includes software developed by Easy
|
||||
* Software Products.
|
||||
*
|
||||
* 4. The name of Easy Software Products may not be used to
|
||||
* endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified SCSI printer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef WIN32
|
||||
# include <io.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# ifdef HAVE_SYS_IOCTL_H
|
||||
# include <sys/ioctl.h>
|
||||
# endif /* HAVE_SYS_IOCTL_H */
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void list_devices(void);
|
||||
int print_device(const char *resource, int fd, int copies);
|
||||
|
||||
|
||||
#ifdef __linux__
|
||||
# include "scsi-linux.c"
|
||||
#elif defined(__sgi)
|
||||
# include "scsi-irix.c"
|
||||
#else
|
||||
/*
|
||||
* Dummy functions that do nothing on unsupported platforms...
|
||||
*/
|
||||
void list_devices(void) {}
|
||||
int print_device(const char *resource, int fd, int copies) { return (1); }
|
||||
#endif /* __linux */
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the specified SCSI printer.
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* printer-uri job-id user title copies options [file]
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
char method[255], /* Method in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (device and options) */
|
||||
*options; /* Pointer to options */
|
||||
int port; /* Port number (not used) */
|
||||
int fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int status; /* Exit status */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
/*
|
||||
* Make sure status messages are not buffered...
|
||||
*/
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
list_devices();
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fputs("Usage: scsi:/dev/file job-id user title copies options [file]\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have 7 arguments, print the file named on the command-line.
|
||||
* Otherwise, send stdin instead...
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = 0;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the device name and options from the URI...
|
||||
*/
|
||||
|
||||
httpSeparate(argv[0], method, username, hostname, &port, resource);
|
||||
|
||||
/*
|
||||
* See if there are any options...
|
||||
*/
|
||||
|
||||
if ((options = strchr(resource, '?')) != NULL)
|
||||
{
|
||||
/*
|
||||
* Yup, terminate the device name string and move to the first
|
||||
* character of the options...
|
||||
*/
|
||||
|
||||
*options++ = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
status = print_device(resource, fp, copies);
|
||||
|
||||
/*
|
||||
* Close input file and return...
|
||||
*/
|
||||
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
if (!status)
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+15
-139
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Serial port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
@@ -74,13 +72,6 @@
|
||||
# endif /* CNEW_RTSCTS */
|
||||
#endif /* !CRTSCTS */
|
||||
|
||||
#if defined(__APPLE__)
|
||||
# include <CoreFoundation/CoreFoundation.h>
|
||||
# include <IOKit/IOKitLib.h>
|
||||
# include <IOKit/serial/IOSerialKeys.h>
|
||||
# include <IOKit/IOBSD.h>
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
@@ -110,7 +101,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
int port; /* Port number (not used) */
|
||||
int fp; /* Print file */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -133,20 +124,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -169,7 +146,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = 0;
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -178,7 +155,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -314,24 +291,18 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
cfsetispeed(&opts, B38400);
|
||||
cfsetospeed(&opts, B38400);
|
||||
break;
|
||||
# ifdef B57600
|
||||
#ifdef B57600
|
||||
case 57600 :
|
||||
cfsetispeed(&opts, B57600);
|
||||
cfsetospeed(&opts, B57600);
|
||||
break;
|
||||
# endif /* B57600 */
|
||||
# ifdef B115200
|
||||
#endif /* B57600 */
|
||||
#ifdef B115200
|
||||
case 115200 :
|
||||
cfsetispeed(&opts, B115200);
|
||||
cfsetospeed(&opts, B115200);
|
||||
break;
|
||||
# endif /* B115200 */
|
||||
# ifdef B230400
|
||||
case 230400 :
|
||||
cfsetispeed(&opts, B230400);
|
||||
cfsetospeed(&opts, B230400);
|
||||
break;
|
||||
# endif /* B230400 */
|
||||
#endif /* B115200 */
|
||||
default :
|
||||
fprintf(stderr, "WARNING: Unsupported baud rate %s!\n", value);
|
||||
break;
|
||||
@@ -446,10 +417,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != 0)
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
if (dtrdsr)
|
||||
@@ -483,7 +454,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = read(fp, buffer, bufsize)) > 0)
|
||||
while ((nbytes = fread(buffer, 1, bufsize, fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -509,8 +480,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -521,10 +491,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
tcsetattr(fd, TCSADRAIN, &origopts);
|
||||
|
||||
close(fd);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -542,7 +510,7 @@ list_devices(void)
|
||||
/* Funky hex numbering used for some devices */
|
||||
#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
|
||||
|
||||
#if defined(__linux) || defined(linux) || defined(__linux__)
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
@@ -554,24 +522,8 @@ list_devices(void)
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
# if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc)
|
||||
printf("serial serial:%s?baud=230400 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
# else
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
# endif /* _ARCH_PPC || powerpc || __powerpc */
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/usb/ttyUSB%d", i);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=230400 \"Unknown\" \"USB Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__sgi)
|
||||
@@ -905,83 +857,7 @@ list_devices(void)
|
||||
device, i, j + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__APPLE__)
|
||||
/*
|
||||
* Standard serial ports on MacOS X...
|
||||
*/
|
||||
|
||||
kern_return_t kernResult;
|
||||
mach_port_t masterPort;
|
||||
io_iterator_t serialPortIterator;
|
||||
CFMutableDictionaryRef classesToMatch;
|
||||
io_object_t serialService;
|
||||
|
||||
printf("serial serial \"Unknown\" \"Serial Printer (serial)\"\n");
|
||||
|
||||
kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
|
||||
if (KERN_SUCCESS != kernResult)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Serial devices are instances of class IOSerialBSDClient.
|
||||
*/
|
||||
|
||||
classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
|
||||
if (classesToMatch != NULL)
|
||||
{
|
||||
CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey),
|
||||
CFSTR(kIOSerialBSDRS232Type));
|
||||
|
||||
kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch,
|
||||
&serialPortIterator);
|
||||
if (kernResult == KERN_SUCCESS)
|
||||
{
|
||||
while ((serialService = IOIteratorNext(serialPortIterator)))
|
||||
{
|
||||
CFTypeRef serialNameAsCFString;
|
||||
CFTypeRef bsdPathAsCFString;
|
||||
char serialName[128];
|
||||
char bsdPath[1024];
|
||||
Boolean result;
|
||||
|
||||
|
||||
serialNameAsCFString =
|
||||
IORegistryEntryCreateCFProperty(serialService,
|
||||
CFSTR(kIOTTYDeviceKey),
|
||||
kCFAllocatorDefault, 0);
|
||||
if (serialNameAsCFString)
|
||||
{
|
||||
result = CFStringGetCString(serialNameAsCFString, serialName,
|
||||
sizeof(serialName),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(serialNameAsCFString);
|
||||
|
||||
if (result)
|
||||
{
|
||||
bsdPathAsCFString =
|
||||
IORegistryEntryCreateCFProperty(serialService,
|
||||
CFSTR(kIOCalloutDeviceKey),
|
||||
kCFAllocatorDefault, 0);
|
||||
if (bsdPathAsCFString)
|
||||
{
|
||||
result = CFStringGetCString(bsdPathAsCFString, bsdPath,
|
||||
sizeof(bsdPath),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(bsdPathAsCFString);
|
||||
|
||||
if (result)
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", bsdPath,
|
||||
serialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IOObjectRelease(serialService);
|
||||
}
|
||||
|
||||
IOObjectRelease(serialPortIterator); /* Release the iterator. */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
+15
-35
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* AppSocket backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
@@ -45,8 +43,6 @@
|
||||
#ifdef WIN32
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
@@ -70,7 +66,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024]; /* Resource info (not used) */
|
||||
int fp; /* Print file */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int port; /* Port number */
|
||||
int delay; /* Delay for retries... */
|
||||
@@ -96,20 +92,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -133,7 +115,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = 0;
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -142,7 +124,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -195,8 +177,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (error == ECONNREFUSED || error == EHOSTDOWN ||
|
||||
error == EHOSTUNREACH)
|
||||
if (error == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
|
||||
hostname, delay);
|
||||
@@ -243,16 +224,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
copies --;
|
||||
|
||||
if (fp != 0)
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
fputs("INFO: Connected to host, sending print job...\n", stderr);
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -293,12 +274,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
if ((nbytes = recv(fd, buffer, sizeof(buffer), 0)) > 0)
|
||||
fprintf(stderr, "INFO: Received %lu bytes of back-channel data!\n",
|
||||
(unsigned long)nbytes);
|
||||
fprintf(stderr, "INFO: Received %u bytes of back-channel data!\n",
|
||||
nbytes);
|
||||
}
|
||||
else if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -333,8 +313,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
if ((nbytes = recv(fd, buffer, sizeof(buffer), 0)) > 0)
|
||||
fprintf(stderr, "INFO: Received %lu bytes of back-channel data!\n",
|
||||
(unsigned long)nbytes);
|
||||
fprintf(stderr, "INFO: Received %u bytes of back-channel data!\n",
|
||||
nbytes);
|
||||
else
|
||||
break;
|
||||
}
|
||||
@@ -353,8 +333,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Close the input file and return...
|
||||
*/
|
||||
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
|
||||
+171
-506
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* USB port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified USB port.
|
||||
@@ -48,31 +46,12 @@
|
||||
# include <termios.h>
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef __linux
|
||||
# include <sys/ioctl.h>
|
||||
# include <linux/lp.h>
|
||||
# define IOCNR_GET_DEVICE_ID 1
|
||||
|
||||
/*
|
||||
* Get device_id string
|
||||
*/
|
||||
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
|
||||
#endif /* __linux */
|
||||
|
||||
#ifdef __sun
|
||||
# include <sys/ecppio.h>
|
||||
#endif /* __sun */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void decode_device_id(int port, const char *device_id,
|
||||
char *make_model, int mmsize,
|
||||
char *uri, int urisize);
|
||||
void list_devices(void);
|
||||
int open_device(const char *uri);
|
||||
|
||||
|
||||
/*
|
||||
@@ -87,7 +66,13 @@ int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int fp; /* Print file */
|
||||
char method[255], /* Method in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (device and options) */
|
||||
*options; /* Pointer to options */
|
||||
int port; /* Port number (not used) */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -99,9 +84,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
#ifdef __linux
|
||||
unsigned char status; /* Port status (off-line, out-of-paper, etc.) */
|
||||
#endif /* __linux */
|
||||
|
||||
|
||||
/*
|
||||
@@ -110,20 +92,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -146,7 +114,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = 0;
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -155,7 +123,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -164,28 +132,43 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the device name and options from the URI...
|
||||
*/
|
||||
|
||||
httpSeparate(argv[0], method, username, hostname, &port, resource);
|
||||
|
||||
/*
|
||||
* See if there are any options...
|
||||
*/
|
||||
|
||||
if ((options = strchr(resource, '?')) != NULL)
|
||||
{
|
||||
/*
|
||||
* Yup, terminate the device name string and move to the first
|
||||
* character of the options...
|
||||
*/
|
||||
|
||||
*options++ = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the USB port device...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
if ((fd = open_device(argv[0])) == -1)
|
||||
if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
|
||||
{
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
|
||||
{
|
||||
fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to open USB device \"%s\": %s\n",
|
||||
argv[0], strerror(errno));
|
||||
fprintf(stderr, "ERROR: Unable to open USB port device file \"%s\": %s\n",
|
||||
resource, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -226,27 +209,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
#ifdef __linux
|
||||
/*
|
||||
* Show the printer status before we send the file; normally, we'd
|
||||
* do this while we write data to the printer, however at least some
|
||||
* Linux kernels have buggy USB drivers which don't like to be
|
||||
* queried while sending data to the printer...
|
||||
*/
|
||||
|
||||
if (ioctl(fd, LPGETSTATUS, &status) == 0)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status);
|
||||
|
||||
if (status & LP_NOPA)
|
||||
fputs("WARNING: Media tray empty!\n", stderr);
|
||||
else if (status & LP_ERR)
|
||||
fputs("WARNING: Printer fault!\n", stderr);
|
||||
else if (status & LP_OFFL)
|
||||
fputs("WARNING: Printer off-line.\n", stderr);
|
||||
}
|
||||
#endif /* __linux */
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
@@ -255,14 +217,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != 0)
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -273,7 +235,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
|
||||
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
|
||||
if (errno == ENOTTY)
|
||||
wbytes = write(fd, bufptr, nbytes);
|
||||
@@ -289,8 +250,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,157 +259,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'decode_device_id()' - Decode the IEEE-1284 device ID string.
|
||||
*/
|
||||
|
||||
void
|
||||
decode_device_id(int port, /* I - Port number */
|
||||
const char *device_id, /* I - 1284 device ID string */
|
||||
char *make_model, /* O - Make/model */
|
||||
int mmsize, /* I - Size of buffer */
|
||||
char *uri, /* O - Device URI */
|
||||
int urisize) /* I - Size of buffer */
|
||||
{
|
||||
char *attr, /* 1284 attribute */
|
||||
*delim, /* 1284 delimiter */
|
||||
*uriptr, /* Pointer into URI */
|
||||
line[1024]; /* Line from devices file */
|
||||
FILE *fp; /* /proc/bus/usb/devices file */
|
||||
int current; /* Current printer port */
|
||||
char serial_number[1024], /* Serial number string */
|
||||
temp[1024]; /* Temporary string */
|
||||
|
||||
|
||||
/*
|
||||
* Look for the description field...
|
||||
*/
|
||||
|
||||
if ((attr = strstr(device_id, "DES:")) != NULL)
|
||||
attr += 4;
|
||||
else if ((attr = strstr(device_id, "DESCRIPTION:")) != NULL)
|
||||
attr += 12;
|
||||
|
||||
if (attr)
|
||||
{
|
||||
if (strncasecmp(attr, "Hewlett-Packard ", 16) == 0)
|
||||
{
|
||||
strlcpy(make_model, "HP ", mmsize);
|
||||
strlcpy(make_model + 3, attr + 16, mmsize - 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
strlcpy(make_model, attr, mmsize);
|
||||
}
|
||||
|
||||
if ((delim = strchr(make_model, ';')) != NULL)
|
||||
*delim = '\0';
|
||||
}
|
||||
else
|
||||
strlcpy(make_model, "Unknown", mmsize);
|
||||
|
||||
/*
|
||||
* Look for the serial number field...
|
||||
*/
|
||||
|
||||
if ((attr = strstr(device_id, "SERN:")) != NULL)
|
||||
attr += 5;
|
||||
else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
|
||||
attr += 13;
|
||||
|
||||
if (attr)
|
||||
{
|
||||
strlcpy(serial_number, attr, sizeof(serial_number));
|
||||
|
||||
if ((delim = strchr(serial_number, ';')) != NULL)
|
||||
*delim = '\0';
|
||||
}
|
||||
else if ((fp = fopen("/proc/bus/usb/devices", "r")) != NULL)
|
||||
{
|
||||
serial_number[0] = '\0';
|
||||
|
||||
for (current = 0; fgets(line, sizeof(line), fp) != NULL;)
|
||||
{
|
||||
if (line[0] == 'S' && (attr = strstr(line, "SerialNumber=")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Copy serial number from line...
|
||||
*/
|
||||
|
||||
strlcpy(temp, attr + 13, sizeof(temp));
|
||||
if ((delim = strchr(temp, '\n')) != NULL)
|
||||
*delim = '\0';
|
||||
}
|
||||
else if (line[0] == 'I' && strstr(line, "Driver=usblp") != NULL &&
|
||||
strstr(line, "Prot=02") != NULL)
|
||||
{
|
||||
/*
|
||||
* Found printer device; if current == port, then use it!
|
||||
*/
|
||||
|
||||
if (current == port)
|
||||
{
|
||||
strlcpy(serial_number, temp, sizeof(serial_number));
|
||||
break;
|
||||
}
|
||||
|
||||
current ++;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate the device URI from the make_model and serial number strings.
|
||||
*/
|
||||
|
||||
strlcpy(uri, "usb://", urisize);
|
||||
for (uriptr = uri + 6, delim = make_model;
|
||||
*delim && uriptr < (uri + urisize - 1);
|
||||
delim ++)
|
||||
if (*delim == ' ')
|
||||
{
|
||||
delim ++;
|
||||
*uriptr++ = '/';
|
||||
break;
|
||||
}
|
||||
else
|
||||
*uriptr++ = *delim;
|
||||
|
||||
for (; *delim && uriptr < (uri + urisize - 3); delim ++)
|
||||
if (*delim == ' ')
|
||||
{
|
||||
*uriptr++ = '%';
|
||||
*uriptr++ = '2';
|
||||
*uriptr++ = '0';
|
||||
}
|
||||
else
|
||||
*uriptr++ = *delim;
|
||||
|
||||
*uriptr = '\0';
|
||||
|
||||
if (serial_number[0])
|
||||
{
|
||||
/*
|
||||
* Add the serial number to the URI...
|
||||
*/
|
||||
|
||||
strlcat(uri, "?serial=", urisize);
|
||||
strlcat(uri, serial_number, urisize);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List all USB devices.
|
||||
*/
|
||||
@@ -459,331 +275,180 @@ list_devices(void)
|
||||
{
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
int length; /* Length of device ID info */
|
||||
int fd; /* File descriptor */
|
||||
char format[255], /* Format for device filename */
|
||||
device[255], /* Device filename */
|
||||
device_id[1024], /* Device ID string */
|
||||
device_uri[1024], /* Device URI string */
|
||||
make_model[1024]; /* Make and model */
|
||||
char device[255]; /* Device filename */
|
||||
FILE *probe; /* /proc/bus/usb/devices file */
|
||||
char line[1024], /* Line from file */
|
||||
*delim, /* Delimiter in file */
|
||||
make[IPP_MAX_NAME], /* Make from file */
|
||||
model[IPP_MAX_NAME]; /* Model from file */
|
||||
|
||||
|
||||
/*
|
||||
* First figure out which USB printer filename to use...
|
||||
* First try opening one of the USB devices to load the driver
|
||||
* module as needed...
|
||||
*/
|
||||
|
||||
if (access("/dev/usb/lp0", 0) == 0)
|
||||
strcpy(format, "/dev/usb/lp%d");
|
||||
else if (access("/dev/usb/usblp0", 0) == 0)
|
||||
strcpy(format, "/dev/usb/usblp%d");
|
||||
else
|
||||
strcpy(format, "/dev/usblp%d");
|
||||
if ((fd = open("/dev/usb/lp0", O_WRONLY)) >= 0)
|
||||
close(fd); /* 2.3.x and 2.4.x */
|
||||
else if ((fd = open("/dev/usb/usblp0", O_WRONLY)) >= 0)
|
||||
close(fd); /* Mandrake 7.x */
|
||||
else if ((fd = open("/dev/usblp0", O_WRONLY)) >= 0)
|
||||
close(fd); /* 2.2.x */
|
||||
|
||||
/*
|
||||
* Then open each USB device...
|
||||
* Then look at the device list for the USB bus...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
if ((probe = fopen("/proc/bus/usb/devices", "r")) != NULL)
|
||||
{
|
||||
sprintf(device, format, i);
|
||||
/*
|
||||
* Scan the device list...
|
||||
*/
|
||||
|
||||
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
|
||||
i = 0;
|
||||
|
||||
memset(make, 0, sizeof(make));
|
||||
memset(model, 0, sizeof(model));
|
||||
|
||||
while (fgets(line, sizeof(line), probe) != NULL)
|
||||
{
|
||||
if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(device_id)), device_id) == 0)
|
||||
{
|
||||
length = (((unsigned)device_id[0] & 255) << 8) +
|
||||
((unsigned)device_id[1] & 255);
|
||||
/*
|
||||
* Strip trailing newline.
|
||||
*/
|
||||
|
||||
if ((delim = strrchr(line, '\n')) != NULL)
|
||||
*delim = '\0';
|
||||
|
||||
/*
|
||||
* See if it is a printer device ("P: ...")
|
||||
*/
|
||||
|
||||
if (strncmp(line, "S:", 2) == 0)
|
||||
{
|
||||
/*
|
||||
* Check to see if the length is larger than our buffer; first
|
||||
* assume that the vendor incorrectly implemented the 1284 spec,
|
||||
* and then limit the length to the size of our buffer...
|
||||
* String attribute...
|
||||
*/
|
||||
|
||||
if (length > (sizeof(device_id) - 2))
|
||||
length = (((unsigned)device_id[1] & 255) << 8) +
|
||||
((unsigned)device_id[0] & 255);
|
||||
|
||||
if (length > (sizeof(device_id) - 2))
|
||||
length = sizeof(device_id) - 2;
|
||||
|
||||
memcpy(device_id, device_id + 2, length);
|
||||
device_id[length] = '\0';
|
||||
if (strncmp(line, "S: Manufacturer=", 17) == 0)
|
||||
{
|
||||
strncpy(make, line + 17, sizeof(make) - 1);
|
||||
if (strcmp(make, "Hewlett-Packard") == 0)
|
||||
strcpy(make, "HP");
|
||||
}
|
||||
else if (strncmp(line, "S: Product=", 12) == 0)
|
||||
strncpy(model, line + 12, sizeof(model) - 1);
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
else if (strncmp(line, "I:", 2) == 0 &&
|
||||
(strstr(line, "Driver=printer") != NULL ||
|
||||
strstr(line, "Driver=usblp") != NULL) &&
|
||||
make[0] && model[0])
|
||||
{
|
||||
/*
|
||||
* We were processing a printer device; send the info out...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
sprintf(device, "/dev/usb/lp%d", i);
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usb/usblp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
sprintf(device, "/dev/usblp%d", i);
|
||||
}
|
||||
|
||||
printf("direct usb:%s \"%s %s\" \"USB Printer #%d\"\n",
|
||||
device, make, model, i + 1);
|
||||
|
||||
i ++;
|
||||
|
||||
memset(make, 0, sizeof(make));
|
||||
memset(model, 0, sizeof(model));
|
||||
}
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
if (device_id[0])
|
||||
fclose(probe);
|
||||
|
||||
/*
|
||||
* Write empty device listings for unused USB devices...
|
||||
*/
|
||||
|
||||
for (; i < 16; i ++)
|
||||
{
|
||||
decode_device_id(i, device_id, make_model, sizeof(make_model),
|
||||
device_uri, sizeof(device_uri));
|
||||
sprintf(device, "/dev/usb/lp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usb/usblp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usblp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
printf("direct %s \"%s\" \"USB Printer #%d\"\n", device_uri,
|
||||
make_model, i + 1);
|
||||
}
|
||||
else
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Just check manually for USB devices...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/usb/lp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usb/usblp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usblp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__sgi)
|
||||
#elif defined(__sun)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255], /* Device filename */
|
||||
device_id[1024], /* Device ID string */
|
||||
device_uri[1024], /* Device URI string */
|
||||
make_model[1024]; /* Make and model */
|
||||
# ifdef ECPPIOC_GETDEVID
|
||||
struct ecpp_device_id did; /* Device ID buffer */
|
||||
# endif /* ECPPIOC_GETDEVID */
|
||||
|
||||
|
||||
/*
|
||||
* Open each USB device...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/usb/printer%d", i);
|
||||
|
||||
# ifndef ECPPIOC_GETDEVID
|
||||
if (!access(device, 0))
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
# else
|
||||
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
|
||||
{
|
||||
did.mode = ECPP_CENTRONICS;
|
||||
did.len = sizeof(device_id);
|
||||
did.rlen = 0;
|
||||
did.addr = device_id;
|
||||
|
||||
if (ioctl(fd, ECPPIOC_GETDEVID, &did) == 0)
|
||||
{
|
||||
if (did.rlen < (sizeof(device_id) - 1))
|
||||
device_id[did.rlen] = '\0';
|
||||
else
|
||||
device_id[sizeof(device_id) - 1] = '\0';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
if (device_id[0])
|
||||
{
|
||||
decode_device_id(i, device_id, make_model, sizeof(make_model),
|
||||
device_uri, sizeof(device_uri));
|
||||
|
||||
printf("direct %s \"%s\" \"USB Printer #%d\"\n", device_uri,
|
||||
make_model, i + 1);
|
||||
}
|
||||
else
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
# endif /* !ECPPIOC_GETDEVID */
|
||||
}
|
||||
#elif defined(__hpux)
|
||||
#elif defined(__osf)
|
||||
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
#elif defined(__FreeBSD__)
|
||||
int i; /* Looping var */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/unlpt%d", i);
|
||||
if (!access(device, 0))
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
}
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
int i; /* Looping var */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ulpt%d", i);
|
||||
if (!access(device, 0))
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
|
||||
sprintf(device, "/dev/unlpt%d", i);
|
||||
if (!access(device, 0))
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'open_device()' - Open a USB device...
|
||||
*/
|
||||
|
||||
int /* O - File descriptor or -1 on error */
|
||||
open_device(const char *uri) /* I - Device URI */
|
||||
{
|
||||
/*
|
||||
* The generic implementation just treats the URI as a device filename...
|
||||
* Specific operating systems may also support using the device serial
|
||||
* number and/or make/model.
|
||||
*/
|
||||
|
||||
if (strncmp(uri, "usb:/dev/", 9) == 0)
|
||||
return (open(uri + 4, O_RDWR | O_EXCL));
|
||||
#ifdef __linux
|
||||
else if (strncmp(uri, "usb://", 6) == 0)
|
||||
{
|
||||
/*
|
||||
* For Linux, try looking up the device serial number or model...
|
||||
*/
|
||||
|
||||
int i; /* Looping var */
|
||||
int length; /* Length of device ID info */
|
||||
int fd; /* File descriptor */
|
||||
char format[255], /* Format for device filename */
|
||||
device[255], /* Device filename */
|
||||
device_id[1024], /* Device ID string */
|
||||
make_model[1024], /* Make and model */
|
||||
device_uri[1024]; /* Device URI string */
|
||||
|
||||
|
||||
/*
|
||||
* First figure out which USB printer filename to use...
|
||||
*/
|
||||
|
||||
if (access("/dev/usb/lp0", 0) == 0)
|
||||
strcpy(format, "/dev/usb/lp%d");
|
||||
else if (access("/dev/usb/usblp0", 0) == 0)
|
||||
strcpy(format, "/dev/usb/usblp%d");
|
||||
else
|
||||
strcpy(format, "/dev/usblp%d");
|
||||
|
||||
/*
|
||||
* Then find the correct USB device...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
{
|
||||
sprintf(device, format, i);
|
||||
|
||||
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
|
||||
{
|
||||
if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(device_id)), device_id) == 0)
|
||||
{
|
||||
length = (((unsigned)device_id[0] & 255) << 8) +
|
||||
((unsigned)device_id[1] & 255);
|
||||
memcpy(device_id, device_id + 2, length);
|
||||
device_id[length] = '\0';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
if (device_id[0])
|
||||
{
|
||||
/*
|
||||
* Got the device ID - is this the one?
|
||||
*/
|
||||
|
||||
decode_device_id(i, device_id, make_model, sizeof(make_model),
|
||||
device_uri, sizeof(device_uri));
|
||||
|
||||
if (strcmp(uri, device_uri) == 0)
|
||||
return (fd); /* Yes, return this file descriptor... */
|
||||
}
|
||||
|
||||
/*
|
||||
* This wasn't the one...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Couldn't find the printer, return "no such device or address"...
|
||||
*/
|
||||
|
||||
errno = ENODEV;
|
||||
|
||||
return (-1);
|
||||
}
|
||||
#elif defined(__sun) && defined(ECPPIOC_GETDEVID)
|
||||
else if (strncmp(uri, "usb://", 6) == 0)
|
||||
{
|
||||
/*
|
||||
* For Solaris, try looking up the device serial number or model...
|
||||
*/
|
||||
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255], /* Device filename */
|
||||
device_id[1024], /* Device ID string */
|
||||
make_model[1024], /* Make and model */
|
||||
device_uri[1024]; /* Device URI string */
|
||||
struct ecpp_device_id did; /* Device ID buffer */
|
||||
|
||||
|
||||
/*
|
||||
* Find the correct USB device...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/usb/printer%d", i);
|
||||
|
||||
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
|
||||
{
|
||||
did.mode = ECPP_CENTRONICS;
|
||||
did.len = sizeof(device_id);
|
||||
did.rlen = 0;
|
||||
did.addr = device_id;
|
||||
|
||||
if (ioctl(fd, ECPPIOC_GETDEVID, &did) == 0)
|
||||
{
|
||||
if (did.rlen < (sizeof(device_id) - 1))
|
||||
device_id[did.rlen] = '\0';
|
||||
else
|
||||
device_id[sizeof(device_id) - 1] = '\0';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
if (device_id[0])
|
||||
{
|
||||
/*
|
||||
* Got the device ID - is this the one?
|
||||
*/
|
||||
|
||||
decode_device_id(i, device_id, make_model, sizeof(make_model),
|
||||
device_uri, sizeof(device_uri));
|
||||
|
||||
if (strcmp(uri, device_uri) == 0)
|
||||
return (fd); /* Yes, return this file descriptor... */
|
||||
}
|
||||
|
||||
/*
|
||||
* This wasn't the one...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Couldn't find the printer, return "no such device or address"...
|
||||
*/
|
||||
|
||||
errno = ENODEV;
|
||||
|
||||
return (-1);
|
||||
}
|
||||
#endif /* __linux */
|
||||
else
|
||||
{
|
||||
errno = ENODEV;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
# DO NOT DELETE
|
||||
|
||||
lpc.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
lpc.o: ../cups/ppd.h ../cups/language.h ../cups/debug.h
|
||||
lpq.o: ../cups/string.h ../config.h ../cups/cups.h ../cups/ipp.h
|
||||
lpq.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/language.h
|
||||
lpq.o: ../cups/debug.h
|
||||
lpr.o: ../config.h ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
lpr.o: ../cups/ppd.h
|
||||
lprm.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
lprm.o: ../cups/ppd.h ../cups/language.h
|
||||
+9
-16
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Berkeley commands makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -43,19 +43,11 @@ clean:
|
||||
$(RM) $(OBJS) $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Update dependencies (without system header dependencies...)
|
||||
#
|
||||
|
||||
depend:
|
||||
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
|
||||
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install: all
|
||||
install:
|
||||
$(INSTALL_DIR) $(BINDIR)
|
||||
$(INSTALL_BIN) lpq $(BINDIR)
|
||||
$(INSTALL_BIN) lpr $(BINDIR)
|
||||
@@ -72,6 +64,8 @@ lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpc lpc.o $(LIBS)
|
||||
|
||||
lpc.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpq
|
||||
@@ -81,6 +75,8 @@ lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpq lpq.o $(LIBS)
|
||||
|
||||
lpq.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpr
|
||||
@@ -90,6 +86,8 @@ lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
|
||||
|
||||
lpr.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lprm
|
||||
@@ -99,12 +97,7 @@ lprm: lprm.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
lprm.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
|
||||
+1
-2
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpc" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -40,7 +40,6 @@
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
#include <cups/string.h>
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+8
-15
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpq" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -38,7 +38,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <cups/string.h>
|
||||
#include <ctype.h>
|
||||
#include <config.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
@@ -132,18 +133,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
if ((instance = strchr(dest, '/')) != NULL)
|
||||
*instance++ = '\0';
|
||||
|
||||
if (cupsGetDest(dest, instance, num_dests, dests) == NULL)
|
||||
{
|
||||
if (instance)
|
||||
fprintf(stderr, "lpq: Unknown destination \"%s/%s\"!\n",
|
||||
dest, instance);
|
||||
else
|
||||
fprintf(stderr, "lpq: Unknown destination \"%s\"!\n", dest);
|
||||
|
||||
return (1);
|
||||
}
|
||||
*instance = '\0';
|
||||
break;
|
||||
|
||||
case 'a' : /* All printers */
|
||||
@@ -425,7 +415,10 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies,
|
||||
jobname);
|
||||
else
|
||||
strlcpy(namestr, jobname, sizeof(namestr));
|
||||
{
|
||||
strncpy(namestr, jobname, sizeof(namestr) - 1);
|
||||
namestr[sizeof(namestr) - 1] = '\0';
|
||||
}
|
||||
|
||||
printf("%s: %-34.34s[job %d localhost]\n", jobuser, rankstr, jobid);
|
||||
printf(" %-40.40s%d bytes\n", namestr, jobsize);
|
||||
|
||||
+11
-19
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpr" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -33,14 +33,12 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <cups/string.h>
|
||||
#include <config.h>
|
||||
#include <cups/cups.h>
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
# include <unistd.h>
|
||||
# include <signal.h>
|
||||
|
||||
|
||||
@@ -86,7 +84,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
int temp; /* Temporary file descriptor */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Signal action */
|
||||
struct sigaction oldaction; /* Old signal action */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
@@ -230,6 +227,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
num_copies = atoi(argv[i]);
|
||||
}
|
||||
|
||||
if (num_copies < 1 || num_copies > 100)
|
||||
{
|
||||
fputs("lpr: Number copies must be between 1 and 100.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
sprintf(buffer, "%d", num_copies);
|
||||
num_options = cupsAddOption("copies", buffer, num_options, &options);
|
||||
break;
|
||||
@@ -278,13 +281,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Print a file...
|
||||
*/
|
||||
|
||||
if (access(argv[i], R_OK) != 0)
|
||||
{
|
||||
fprintf(stderr, "lpr: Unable to access \"%s\" - %s\n", argv[i],
|
||||
strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
files[num_files] = argv[i];
|
||||
num_files ++;
|
||||
|
||||
@@ -348,22 +344,18 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
#ifndef WIN32
|
||||
# if defined(HAVE_SIGSET)
|
||||
sigset(SIGHUP, sighandler);
|
||||
if (sigset(SIGINT, sighandler) == SIG_IGN)
|
||||
sigset(SIGINT, SIG_IGN);
|
||||
sigset(SIGINT, sighandler);
|
||||
sigset(SIGTERM, sighandler);
|
||||
# elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = sighandler;
|
||||
|
||||
sigaction(SIGHUP, &action, NULL);
|
||||
sigaction(SIGINT, NULL, &oldaction);
|
||||
if (oldaction.sa_handler != SIG_IGN)
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
# else
|
||||
signal(SIGHUP, sighandler);
|
||||
if (signal(SIGINT, sighandler) == SIG_IGN)
|
||||
signal(SIGINT, SIG_IGN);
|
||||
signal(SIGINT, sighandler);
|
||||
signal(SIGTERM, sighandler);
|
||||
# endif
|
||||
#endif /* !WIN32 */
|
||||
|
||||
+3
-11
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lprm" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -32,10 +32,10 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/string.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -119,14 +119,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if ((instance = strchr(dest, '/')) != NULL)
|
||||
*instance = '\0';
|
||||
|
||||
if (cupsGetDest(dest, NULL, num_dests, dests) == NULL)
|
||||
{
|
||||
fprintf(stderr, "lprm: Unknown destination \"%s\"!\n", dest);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
return(1);
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
@@ -141,7 +133,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Cancel a job or printer...
|
||||
*/
|
||||
|
||||
if (isdigit(argv[i][0]) && cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
|
||||
if (isdigit(argv[i][0]))
|
||||
{
|
||||
dest = NULL;
|
||||
op = IPP_CANCEL_JOB;
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
# DO NOT DELETE
|
||||
|
||||
html.o: cgi.h ../cups/string.h ../config.h
|
||||
ipp-var.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
|
||||
ipp-var.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
|
||||
ipp-var.o: ../cups/string.h ../config.h cgi.h
|
||||
template.o: cgi.h ../cups/string.h ../config.h
|
||||
var.o: cgi.h ../cups/string.h ../config.h
|
||||
admin.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
admin.o: ../cups/ppd.h ../cups/debug.h ../cups/language.h ../cups/string.h
|
||||
admin.o: ../config.h cgi.h
|
||||
classes.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
|
||||
classes.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
|
||||
classes.o: ../cups/string.h ../config.h cgi.h
|
||||
jobs.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
jobs.o: ../cups/ppd.h ../cups/debug.h ../cups/language.h ../cups/string.h
|
||||
jobs.o: ../config.h cgi.h
|
||||
printers.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
|
||||
printers.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
|
||||
printers.o: ../cups/string.h ../config.h cgi.h
|
||||
+13
-15
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# CGI makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products.
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -45,19 +45,11 @@ clean:
|
||||
$(RM) $(OBJS) $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Update dependencies (without system header dependencies...)
|
||||
#
|
||||
|
||||
depend:
|
||||
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
|
||||
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install: all
|
||||
install:
|
||||
$(INSTALL_DIR) $(SERVERBIN)/cgi-bin
|
||||
for file in $(CGIS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \
|
||||
@@ -74,6 +66,9 @@ libcgi.a: $(LIBOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
$(LIBOBJS): cgi.h
|
||||
ipp-var.o: ipp-var.h
|
||||
|
||||
|
||||
#
|
||||
# admin.cgi
|
||||
@@ -83,6 +78,8 @@ admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ admin.o libcgi.a $(LIBS)
|
||||
|
||||
admin.o: cgi.h ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
|
||||
#
|
||||
# classes.cgi
|
||||
@@ -92,6 +89,8 @@ classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ classes.o libcgi.a $(LIBS)
|
||||
|
||||
classes.o: cgi.h ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
|
||||
#
|
||||
# jobs.cgi
|
||||
@@ -101,6 +100,8 @@ jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ jobs.o libcgi.a $(LIBS)
|
||||
|
||||
jobs.o: cgi.h ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
|
||||
#
|
||||
# printers.cgi
|
||||
@@ -110,12 +111,9 @@ printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ printers.o libcgi.a $(LIBS)
|
||||
|
||||
printers.o: cgi.h ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
$(OBJS): ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
|
||||
+148
-100
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Administration CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -29,6 +29,7 @@
|
||||
* do_config_printer() - Configure the default options for a printer.
|
||||
* do_delete_class() - Delete a class...
|
||||
* do_delete_printer() - Delete a printer...
|
||||
* do_job_op() - Do a job operation.
|
||||
* do_printer_op() - Do a printer operation.
|
||||
* get_line() - Get a line that is terminated by a LF, CR, or CR LF.
|
||||
*/
|
||||
@@ -51,6 +52,7 @@ static void do_am_printer(http_t *http, cups_lang_t *language, int modify);
|
||||
static void do_config_printer(http_t *http, cups_lang_t *language);
|
||||
static void do_delete_class(http_t *http, cups_lang_t *language);
|
||||
static void do_delete_printer(http_t *http, cups_lang_t *language);
|
||||
static void do_job_op(http_t *http, cups_lang_t *language, ipp_op_t op);
|
||||
static void do_printer_op(http_t *http, cups_lang_t *language, ipp_op_t op);
|
||||
static char *get_line(char *buf, int length, FILE *fp);
|
||||
|
||||
@@ -109,7 +111,15 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Do the operation...
|
||||
*/
|
||||
|
||||
if (strcmp(op, "start-printer") == 0)
|
||||
if (strcmp(op, "cancel-job") == 0)
|
||||
do_job_op(http, language, IPP_CANCEL_JOB);
|
||||
else if (strcmp(op, "hold-job") == 0)
|
||||
do_job_op(http, language, IPP_HOLD_JOB);
|
||||
else if (strcmp(op, "release-job") == 0)
|
||||
do_job_op(http, language, IPP_RELEASE_JOB);
|
||||
else if (strcmp(op, "restart-job") == 0)
|
||||
do_job_op(http, language, IPP_RESTART_JOB);
|
||||
else if (strcmp(op, "start-printer") == 0)
|
||||
do_printer_op(http, language, IPP_RESUME_PRINTER);
|
||||
else if (strcmp(op, "stop-printer") == 0)
|
||||
do_printer_op(http, language, IPP_PAUSE_PRINTER);
|
||||
@@ -117,8 +127,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
do_printer_op(http, language, CUPS_ACCEPT_JOBS);
|
||||
else if (strcmp(op, "reject-jobs") == 0)
|
||||
do_printer_op(http, language, CUPS_REJECT_JOBS);
|
||||
else if (strcmp(op, "purge-jobs") == 0)
|
||||
do_printer_op(http, language, IPP_PURGE_JOBS);
|
||||
else if (strcmp(op, "add-class") == 0)
|
||||
do_am_class(http, language, 0);
|
||||
else if (strcmp(op, "add-printer") == 0)
|
||||
@@ -256,14 +264,17 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
name = cgiGetVariable("PRINTER_NAME");
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/')
|
||||
break;
|
||||
if (isdigit(*name))
|
||||
ptr = name;
|
||||
else
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && *ptr != '_')
|
||||
break;
|
||||
|
||||
if (*ptr || ptr == name || strlen(name) > 127)
|
||||
if (*ptr || ptr == name)
|
||||
{
|
||||
cgiSetVariable("ERROR", "The class name may only contain up to 127 printable "
|
||||
"characters.");
|
||||
cgiSetVariable("ERROR", "The class name may only contain letters, "
|
||||
"numbers, and the underscore.");
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
@@ -447,7 +458,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -567,14 +578,17 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
return;
|
||||
}
|
||||
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/')
|
||||
break;
|
||||
if (isdigit(*name))
|
||||
ptr = name;
|
||||
else
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && *ptr != '_')
|
||||
break;
|
||||
|
||||
if (*ptr || ptr == name || strlen(name) > 127)
|
||||
if (*ptr || ptr == name)
|
||||
{
|
||||
cgiSetVariable("ERROR", "The printer name may only contain up to 127 printable "
|
||||
"characters.");
|
||||
cgiSetVariable("ERROR", "The printer name may only contain letters, "
|
||||
"numbers, and the underscore.");
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
@@ -621,7 +635,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
if (oldinfo &&
|
||||
(attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
strlcpy(uri, attr->values[0].string.text, sizeof(uri));
|
||||
strncpy(uri, attr->values[0].string.text, sizeof(uri) - 1);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
if ((uriptr = strchr(uri, ':')) != NULL && strncmp(uriptr, "://", 3) == 0)
|
||||
*uriptr = '\0';
|
||||
|
||||
@@ -774,7 +789,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
* Let the user choose a model...
|
||||
*/
|
||||
|
||||
strlcpy(make, var, sizeof(make));
|
||||
strncpy(make, var, sizeof(make) - 1);
|
||||
make[sizeof(make) - 1] = '\0';
|
||||
|
||||
ippSetCGIVars(response, "ppd-make", make);
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "choose-model.tmpl",
|
||||
@@ -836,7 +852,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name",
|
||||
NULL, cgiGetVariable("PPD_NAME"));
|
||||
|
||||
strlcpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri));
|
||||
strncpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri) - 1);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
if (strncmp(uri, "serial:", 7) == 0)
|
||||
{
|
||||
/*
|
||||
@@ -870,7 +887,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -935,28 +952,10 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
* Get the PPD file...
|
||||
*/
|
||||
|
||||
cupsSetServer("localhost");
|
||||
|
||||
if ((filename = cupsGetPPD(printer)) == NULL)
|
||||
{
|
||||
if (cupsLastError() == IPP_NOT_FOUND)
|
||||
{
|
||||
/*
|
||||
* No PPD file for this printer, so we can't configure it!
|
||||
*/
|
||||
|
||||
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_POSSIBLE));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Unable to access the PPD file for some reason...
|
||||
*/
|
||||
|
||||
cgiSetVariable("ERROR", ippErrorString(cupsLastError()));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -968,34 +967,19 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
else
|
||||
have_options = 0;
|
||||
|
||||
ppdMarkDefaults(ppd);
|
||||
|
||||
DEBUG_printf(("<P>ppd->num_groups = %d\n"
|
||||
"<UL>\n", ppd->num_groups));
|
||||
|
||||
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
|
||||
{
|
||||
DEBUG_printf(("<LI>%s<UL>\n", group->text));
|
||||
|
||||
for (j = group->num_options, option = group->options; j > 0; j --, option ++)
|
||||
for (i = ppd->num_groups, group = ppd->groups;
|
||||
i > 0 && !have_options;
|
||||
i --, group ++)
|
||||
for (j = group->num_options, option = group->options;
|
||||
j > 0;
|
||||
j --, option ++)
|
||||
if ((var = cgiGetVariable(option->keyword)) != NULL)
|
||||
{
|
||||
DEBUG_printf(("<LI>%s = \"%s\"</LI>\n", option->keyword, var));
|
||||
have_options = 1;
|
||||
ppdMarkOption(ppd, option->keyword, var);
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else
|
||||
printf("<LI>%s not defined!</LI>\n", option->keyword);
|
||||
#endif /* DEBUG */
|
||||
|
||||
DEBUG_puts("</UL></LI>");
|
||||
}
|
||||
|
||||
DEBUG_printf(("</UL>\n"
|
||||
"<P>ppdConflicts(ppd) = %d\n", ppdConflicts(ppd)));
|
||||
|
||||
if (!have_options || ppdConflicts(ppd))
|
||||
if (!have_options)
|
||||
{
|
||||
/*
|
||||
* Show the options to the user...
|
||||
@@ -1004,31 +988,11 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "config-printer.tmpl",
|
||||
getenv("LANG"));
|
||||
|
||||
if (ppdConflicts(ppd))
|
||||
{
|
||||
for (i = ppd->num_groups, k = 0, group = ppd->groups; i > 0; i --, group ++)
|
||||
for (j = group->num_options, option = group->options; j > 0; j --, option ++)
|
||||
if (option->conflicted)
|
||||
{
|
||||
cgiSetArray("ckeyword", k, option->keyword);
|
||||
cgiSetArray("ckeytext", k, option->text);
|
||||
k ++;
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-conflict.tmpl",
|
||||
getenv("LANG"));
|
||||
}
|
||||
|
||||
for (i = ppd->num_groups, group = ppd->groups;
|
||||
i > 0;
|
||||
i --, group ++)
|
||||
{
|
||||
if (strcmp(group->text, "InstallableOptions") == 0)
|
||||
cgiSetVariable("GROUP",
|
||||
cupsLangString(language, CUPS_MSG_OPTIONS_INSTALLED));
|
||||
else
|
||||
cgiSetVariable("GROUP", group->text);
|
||||
|
||||
cgiSetVariable("GROUP", group->text);
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-header.tmpl",
|
||||
getenv("LANG"));
|
||||
|
||||
@@ -1041,11 +1005,7 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
|
||||
cgiSetVariable("KEYWORD", option->keyword);
|
||||
cgiSetVariable("KEYTEXT", option->text);
|
||||
|
||||
if (option->conflicted)
|
||||
cgiSetVariable("CONFLICTED", "1");
|
||||
else
|
||||
cgiSetVariable("CONFLICTED", "0");
|
||||
cgiSetVariable("DEFCHOICE", option->defchoice);
|
||||
|
||||
cgiSetSize("CHOICES", option->num_choices);
|
||||
cgiSetSize("TEXT", option->num_choices);
|
||||
@@ -1053,9 +1013,6 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
{
|
||||
cgiSetArray("CHOICES", k, option->choices[k].choice);
|
||||
cgiSetArray("TEXT", k, option->choices[k].text);
|
||||
|
||||
if (option->choices[k].marked)
|
||||
cgiSetVariable("DEFCHOICE", option->choices[k].choice);
|
||||
}
|
||||
|
||||
switch (option->ui)
|
||||
@@ -1184,7 +1141,8 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
* Get default option name...
|
||||
*/
|
||||
|
||||
strlcpy(keyword, line + 8, sizeof(keyword));
|
||||
strncpy(keyword, line + 8, sizeof(keyword) - 1);
|
||||
keyword[sizeof(keyword) - 1] = '\0';
|
||||
|
||||
for (keyptr = keyword; *keyptr; keyptr ++)
|
||||
if (*keyptr == ':' || isspace(*keyptr))
|
||||
@@ -1250,7 +1208,7 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1331,7 +1289,7 @@ do_delete_class(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_GONE;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1407,7 +1365,7 @@ do_delete_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_GONE;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1419,6 +1377,98 @@ do_delete_printer(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'do_job_op()' - Do a job operation.
|
||||
*/
|
||||
|
||||
static void
|
||||
do_job_op(http_t *http, /* I - HTTP connection */
|
||||
cups_lang_t *language, /* I - Client's language */
|
||||
ipp_op_t op) /* I - Operation to perform */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
char uri[HTTP_MAX_URI]; /* Job URI */
|
||||
const char *job; /* Job ID */
|
||||
const char *printer; /* Printer name (purge-jobs) */
|
||||
ipp_status_t status; /* Operation status... */
|
||||
|
||||
|
||||
if ((job = cgiGetVariable("JOB_ID")) != NULL)
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%s", job);
|
||||
else if ((printer = cgiGetVariable("PRINTER_NAME")) != NULL)
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", printer);
|
||||
else
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build a job request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri or printer-uri (purge-jobs)
|
||||
* requesting-user-name
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = op;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
if (job)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
|
||||
NULL, uri);
|
||||
else
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
if (getenv("REMOTE_USER") != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, getenv("REMOTE_USER"));
|
||||
else
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, "root");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(status));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
else if (op == IPP_CANCEL_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-cancel.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_HOLD_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-hold.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_RELEASE_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-release.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_RESTART_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-restart.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'do_printer_op()' - Do a printer operation.
|
||||
*/
|
||||
@@ -1478,7 +1528,7 @@ do_printer_op(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_GONE;
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1493,8 +1543,6 @@ do_printer_op(http_t *http, /* I - HTTP connection */
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "printer-accept.tmpl", getenv("LANG"));
|
||||
else if (op == CUPS_REJECT_JOBS)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "printer-reject.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_PURGE_JOBS)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "printer-purge.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+13
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI support library definitions.
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* 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
|
||||
@@ -25,10 +25,10 @@
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <ctype.h>
|
||||
# include <time.h>
|
||||
|
||||
# include <cups/string.h>
|
||||
|
||||
# ifdef WIN32
|
||||
# include <direct.h>
|
||||
# include <io.h>
|
||||
@@ -38,6 +38,16 @@
|
||||
# endif /* WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Stuff for WIN32 and OS/2...
|
||||
*/
|
||||
|
||||
# if defined(WIN32) || defined(__EMX__)
|
||||
# define strcasecmp stricmp
|
||||
# define strncasecmp strnicmp
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Class status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -325,7 +325,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_GONE;
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", pclass);
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI HTML functions.
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* 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
|
||||
|
||||
+27
-32
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP variable routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -72,10 +72,6 @@ ippSetServerVersion(void)
|
||||
cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME"));
|
||||
cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER"));
|
||||
cgiSetVariable("CUPS_VERSION", CUPS_SVERSION);
|
||||
|
||||
#ifdef LC_TIME
|
||||
setlocale(LC_TIME, "");
|
||||
#endif /* LC_TIME */
|
||||
}
|
||||
|
||||
|
||||
@@ -181,13 +177,14 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
* Copy values...
|
||||
*/
|
||||
|
||||
value[0] = '\0'; /* Initially an empty string */
|
||||
valptr = value; /* Start at the beginning */
|
||||
value[0] = '\0'; /* Initially an empty string */
|
||||
value[sizeof(value) - 1] = '\0'; /* In case string gets full */
|
||||
valptr = value; /* Start at the beginning */
|
||||
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
if (i)
|
||||
strlcat(valptr, ",", sizeof(value) - (valptr - value));
|
||||
strncat(valptr, ",", sizeof(value) - (valptr - value) - 1);
|
||||
|
||||
valptr += strlen(valptr);
|
||||
|
||||
@@ -212,7 +209,7 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
break;
|
||||
|
||||
case IPP_TAG_NOVALUE :
|
||||
strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
|
||||
strncat(valptr, "novalue", sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
@@ -242,31 +239,29 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
* Map localhost access to localhost and local port...
|
||||
*/
|
||||
|
||||
if (strcasecmp(hostname, server) == 0)
|
||||
if (strcasecmp(hostname, server) == 0 &&
|
||||
(strcmp(getenv("REMOTE_HOST"), "127.0.0.1") == 0 ||
|
||||
strcmp(getenv("REMOTE_HOST"), "localhost") == 0 ||
|
||||
strcmp(getenv("REMOTE_HOST"), server) == 0))
|
||||
{
|
||||
/*
|
||||
* Make URI relative to the current server...
|
||||
*/
|
||||
|
||||
strlcpy(uri, resource, sizeof(uri));
|
||||
strcpy(hostname, "localhost");
|
||||
port = atoi(getenv("SERVER_PORT"));
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Rewrite URI with HTTP address...
|
||||
*/
|
||||
|
||||
if (username[0])
|
||||
snprintf(uri, sizeof(uri), "%s://%s@%s:%d%s",
|
||||
ishttps ? "https" : "http",
|
||||
username, hostname, port, resource);
|
||||
else
|
||||
snprintf(uri, sizeof(uri), "%s://%s:%d%s",
|
||||
ishttps ? "https" : "http",
|
||||
hostname, port, resource);
|
||||
}
|
||||
/*
|
||||
* Rewrite URI with HTTP address...
|
||||
*/
|
||||
|
||||
strlcat(valptr, uri, sizeof(value) - (valptr - value));
|
||||
if (username[0])
|
||||
snprintf(uri, sizeof(uri), "%s://%s@%s:%d%s",
|
||||
ishttps ? "https" : "http",
|
||||
username, hostname, port, resource);
|
||||
else
|
||||
snprintf(uri, sizeof(uri), "%s://%s:%d%s",
|
||||
ishttps ? "https" : "http",
|
||||
hostname, port, resource);
|
||||
|
||||
strncat(valptr, uri, sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -277,8 +272,8 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
case IPP_TAG_KEYWORD :
|
||||
case IPP_TAG_CHARSET :
|
||||
case IPP_TAG_LANGUAGE :
|
||||
strlcat(valptr, attr->values[i].string.text,
|
||||
sizeof(value) - (valptr - value));
|
||||
strncat(valptr, attr->values[i].string.text,
|
||||
sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
|
||||
default :
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP variable definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
|
||||
+38
-158
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Job status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,7 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* do_job_op() - Do a job operation.
|
||||
* main() - Main entry for CGI.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -34,13 +33,6 @@
|
||||
#include "ipp-var.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void do_job_op(http_t *http, cups_lang_t *language, ipp_op_t op);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Main entry for CGI.
|
||||
*/
|
||||
@@ -54,8 +46,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
const char *which_jobs; /* Which jobs to show */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
const char *op; /* Operation name */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Get any form variables...
|
||||
@@ -87,69 +78,43 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
|
||||
|
||||
if ((op = cgiGetVariable("OP")) != NULL)
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
|
||||
"ipp://localhost/jobs");
|
||||
|
||||
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
|
||||
NULL, which_jobs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Do the operation...
|
||||
*/
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
|
||||
if (strcmp(op, "cancel-job") == 0)
|
||||
do_job_op(http, language, IPP_CANCEL_JOB);
|
||||
else if (strcmp(op, "hold-job") == 0)
|
||||
do_job_op(http, language, IPP_HOLD_JOB);
|
||||
else if (strcmp(op, "release-job") == 0)
|
||||
do_job_op(http, language, IPP_RELEASE_JOB);
|
||||
else if (strcmp(op, "restart-job") == 0)
|
||||
do_job_op(http, language, IPP_RESTART_JOB);
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Bad operation code... Display an error...
|
||||
*/
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-op.tmpl", getenv("LANG"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
|
||||
"ipp://localhost/jobs");
|
||||
|
||||
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
|
||||
NULL, which_jobs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
|
||||
@@ -169,91 +134,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'do_job_op()' - Do a job operation.
|
||||
*/
|
||||
|
||||
static void
|
||||
do_job_op(http_t *http, /* I - HTTP connection */
|
||||
cups_lang_t *language, /* I - Client's language */
|
||||
ipp_op_t op) /* I - Operation to perform */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
char uri[HTTP_MAX_URI]; /* Job URI */
|
||||
const char *job; /* Job ID */
|
||||
ipp_status_t status; /* Operation status... */
|
||||
|
||||
|
||||
if ((job = cgiGetVariable("JOB_ID")) != NULL)
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%s", job);
|
||||
else
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build a job request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri or printer-uri (purge-jobs)
|
||||
* requesting-user-name
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = op;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
|
||||
NULL, uri);
|
||||
|
||||
if (getenv("REMOTE_USER") != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, getenv("REMOTE_USER"));
|
||||
else
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, "unknown");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(status));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
else if (op == IPP_CANCEL_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-cancel.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_HOLD_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-hold.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_RELEASE_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-release.tmpl", getenv("LANG"));
|
||||
else if (op == IPP_RESTART_JOB)
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "job-restart.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Printer status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -87,7 +87,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
ippSetServerVersion();
|
||||
|
||||
printer = argv[0];
|
||||
if (strcmp(printer, "/") == 0 || strstr(printer, "printers.cgi") != NULL)
|
||||
if (strcmp(printer, "/") == 0 || strcmp(printer, "printers.cgi") == 0)
|
||||
{
|
||||
printer = NULL;
|
||||
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_PRINTER));
|
||||
@@ -325,7 +325,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = cupsLastError();
|
||||
status = IPP_GONE;
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", printer);
|
||||
|
||||
|
||||
+13
-4
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI template function.
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* 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
|
||||
@@ -373,19 +373,28 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else if (innername[0] == '?')
|
||||
{
|
||||
if ((innerval = cgiGetArray(innername + 1, element)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else if ((innerval = cgiGetArray(innername, element)) == NULL)
|
||||
snprintf(s, sizeof(s), "{%s}", innername);
|
||||
else
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
|
||||
s += strlen(s);
|
||||
}
|
||||
|
||||
+4
-4
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI form variable and array functions.
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* 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
|
||||
@@ -242,7 +242,7 @@ cgiSetArray(const char *name, /* I - Name of variable */
|
||||
var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
if (name == NULL || value == NULL || element < 0 || element > 100000)
|
||||
if (name == NULL || value == NULL || element < 0)
|
||||
return;
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
@@ -286,7 +286,7 @@ cgiSetSize(const char *name, /* I - Name of variable */
|
||||
var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
if (name == NULL || size < 0 || size > 100000)
|
||||
if (name == NULL || size < 0)
|
||||
return;
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
@@ -361,7 +361,7 @@ cgi_add_variable(const char *name, /* I - Variable name */
|
||||
var_t *var; /* New variable */
|
||||
|
||||
|
||||
if (name == NULL || value == NULL || element < 0 || element > 100000)
|
||||
if (name == NULL || value == NULL)
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
+1
-5
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Configuration file makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1993-2003 by Easy Software Products.
|
||||
# Copyright 1993-2002 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -65,10 +65,6 @@ install:
|
||||
fi ; \
|
||||
$(INSTALL_DATA) $$file $(SERVERROOT) ; \
|
||||
done
|
||||
-if test x$(PAMDIR) != x$(BUILDROOT); then \
|
||||
$(INSTALL_DIR) $(PAMDIR); \
|
||||
$(INSTALL_DATA) pam.conf $(PAMDIR)/cups; \
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: classes.conf 2010 2002-01-02 17:59:21Z mike $"
|
||||
#
|
||||
# Sample class configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -85,5 +85,5 @@
|
||||
#</Class>
|
||||
|
||||
#
|
||||
# End of "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: classes.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
#
|
||||
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: client.conf 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: client.conf 2010 2002-01-02 17:59:21Z mike $"
|
||||
#
|
||||
# Sample client configuration file for the Common UNIX Printing System
|
||||
# (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -61,5 +61,5 @@
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id: client.conf 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: client.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
#
|
||||
|
||||
+11
-75
@@ -4,7 +4,7 @@
|
||||
# Sample configuration file for the Common UNIX Printing System (CUPS)
|
||||
# scheduler.
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -134,16 +134,6 @@
|
||||
|
||||
#ErrorLog @CUPS_LOGDIR@/error_log
|
||||
|
||||
#
|
||||
# FileDevice: determines whether the scheduler will allow new printers
|
||||
# to be added using device URIs of the form "file:/foo/bar". The default
|
||||
# is not to allow file devices due to the potential security vulnerability
|
||||
# and due to the fact that file devices do not support raw printing.
|
||||
#
|
||||
|
||||
#FileDevice No
|
||||
|
||||
|
||||
#
|
||||
# FontPath: the path to locate all font files (currently only for pstoraster)
|
||||
# By default "@CUPS_FONTPATH@".
|
||||
@@ -204,13 +194,6 @@ LogLevel info
|
||||
|
||||
#AutoPurgeJobs No
|
||||
|
||||
#
|
||||
# MaxCopies: maximum number of copies that a user can request. Default is
|
||||
# 100.
|
||||
#
|
||||
|
||||
#MaxCopies 100
|
||||
|
||||
#
|
||||
# MaxJobs: maximum number of jobs to keep in memory (active and completed.)
|
||||
# Default is 500; the value 0 is used for no limit.
|
||||
@@ -299,16 +282,16 @@ LogLevel info
|
||||
|
||||
#
|
||||
# User/Group: the user and group the server runs under. Normally this
|
||||
# must be @CUPS_USER@ and @CUPS_GROUP@, however you can configure things for another
|
||||
# user or group as needed.
|
||||
# must be lp and sys, however you can configure things for another user
|
||||
# or group as needed.
|
||||
#
|
||||
# Note: the server must be run initially as root to support the
|
||||
# default IPP port of 631. It changes users whenever an external
|
||||
# program is run, or if the RunAsUser directive is specified...
|
||||
# program is run...
|
||||
#
|
||||
|
||||
#User @CUPS_USER@
|
||||
#Group @CUPS_GROUP@
|
||||
#User lp
|
||||
#Group sys
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
@@ -394,15 +377,6 @@ Port 631
|
||||
|
||||
#MaxClients 100
|
||||
|
||||
#
|
||||
# MaxClientsPerHost: controls the maximum number of simultaneous clients that
|
||||
# will be handled from a specific host. Defaults to 10 or 1/10th of the
|
||||
# MaxClients setting, whichever is larger. A value of 0 specifies the
|
||||
# automatic (10 or 1/10th) setting.
|
||||
#
|
||||
|
||||
#MaxClientsPerHost 0
|
||||
|
||||
#
|
||||
# MaxRequestSize: controls the maximum size of HTTP requests and print files.
|
||||
# Set to 0 to disable this feature (defaults to 0.)
|
||||
@@ -459,21 +433,11 @@ Port 631
|
||||
# If you have a LAN as well as the dial-up link, use the LAN's
|
||||
# broadcast address.
|
||||
#
|
||||
# The @LOCAL address broadcasts to all non point-to-point interfaces.
|
||||
# For example, if you have a LAN and a dial-up link, @LOCAL would
|
||||
# send printer updates to the LAN but not to the dial-up link.
|
||||
# Similarly, the @IF(name) address sends to the named network
|
||||
# interface, e.g. @IF(eth0) under Linux. Interfaces are refreshed
|
||||
# automatically (no more than once every 60 seconds), so they can
|
||||
# be used on dynamically-configured interfaces, e.g. PPP, 802.11, etc.
|
||||
#
|
||||
|
||||
#BrowseAddress x.y.z.255
|
||||
#BrowseAddress x.y.255.255
|
||||
#BrowseAddress x.255.255.255
|
||||
#BrowseAddress 255.255.255.255
|
||||
#BrowseAddress @LOCAL
|
||||
#BrowseAddress @IF(name)
|
||||
|
||||
#
|
||||
# BrowseShortNames: whether or not to use "short" names for remote printers
|
||||
@@ -504,8 +468,6 @@ Port 631
|
||||
# nnn.nnn.nnn.nnn
|
||||
# nnn.nnn.nnn.nnn/mm
|
||||
# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
# @LOCAL
|
||||
# @IF(name)
|
||||
#
|
||||
# The hostname/domainname restrictions only work if you have turned hostname
|
||||
# lookups on!
|
||||
@@ -553,7 +515,6 @@ Port 631
|
||||
#
|
||||
|
||||
#BrowseRelay source-address destination-address
|
||||
#BrowseRelay @IF(src) @IF(dst)
|
||||
|
||||
#
|
||||
# BrowseTimeout: the timeout for network printers - if we don't
|
||||
@@ -625,14 +586,7 @@ Port 631
|
||||
# will be "sys", "system", or "root" (checked for in that order.)
|
||||
#
|
||||
|
||||
#SystemGroup @CUPS_GROUP@
|
||||
|
||||
#
|
||||
# RootCertDuration: How frequently the root certificate is regenerated.
|
||||
# Defaults to 300 seconds.
|
||||
#
|
||||
|
||||
#RootCertDuration 300
|
||||
#SystemGroup sys
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
@@ -656,11 +610,11 @@ Port 631
|
||||
#
|
||||
# Order: the order of Allow/Deny processing.
|
||||
#
|
||||
# Allow: allows access from the specified hostname, domain, IP address,
|
||||
# network, or interface.
|
||||
# Allow: allows access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
# Deny: denies access from the specified hostname, domain, IP address,
|
||||
# network, or interface.
|
||||
# Deny: denies access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
# Both "Allow" and "Deny" accept the following notations for addresses:
|
||||
#
|
||||
@@ -675,21 +629,10 @@ Port 631
|
||||
# nnn.nnn.nnn.nnn
|
||||
# nnn.nnn.nnn.nnn/mm
|
||||
# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
# @LOCAL
|
||||
# @IF(name)
|
||||
#
|
||||
# The host and domain address require that you enable hostname lookups
|
||||
# with "HostNameLookups On" above.
|
||||
#
|
||||
# The @LOCAL address allows or denies from all non point-to-point
|
||||
# interfaces. For example, if you have a LAN and a dial-up link,
|
||||
# @LOCAL could allow connections from the LAN but not from the dial-up
|
||||
# link. Similarly, the @IF(name) address allows or denies from the
|
||||
# named network interface, e.g. @IF(eth0) under Linux. Interfaces are
|
||||
# refreshed automatically (no more than once every 60 seconds), so
|
||||
# they can be used on dynamically-configured interfaces, e.g. PPP,
|
||||
# 802.11, etc.
|
||||
#
|
||||
# Encryption: whether or not to use encryption; this depends on having
|
||||
# the OpenSSL library linked into the CUPS library and scheduler.
|
||||
#
|
||||
@@ -723,13 +666,6 @@ Allow From 127.0.0.1
|
||||
#
|
||||
#</Location>
|
||||
|
||||
#<Location /jobs>
|
||||
#
|
||||
# You may wish to limit access to job operations, either with Allow
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
#</Location>
|
||||
|
||||
#<Location /printers>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, either with Allow
|
||||
|
||||
+6
-35
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.convs 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: mime.convs 2062 2002-01-23 22:30:42Z mike $"
|
||||
#
|
||||
# MIME converts file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products.
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -46,26 +46,12 @@
|
||||
application/pdf application/postscript 33 pdftops
|
||||
application/postscript application/vnd.cups-postscript 66 pstops
|
||||
application/vnd.hp-HPGL application/postscript 66 hpgltops
|
||||
image/* application/vnd.cups-postscript 66 imagetops
|
||||
application/x-cshell application/postscript 33 texttops
|
||||
application/x-perl application/postscript 33 texttops
|
||||
application/x-shell application/postscript 33 texttops
|
||||
text/plain application/postscript 33 texttops
|
||||
text/html application/postscript 33 texttops
|
||||
image/gif application/vnd.cups-postscript 66 imagetops
|
||||
image/png application/vnd.cups-postscript 66 imagetops
|
||||
image/jpeg application/vnd.cups-postscript 66 imagetops
|
||||
image/tiff application/vnd.cups-postscript 66 imagetops
|
||||
image/x-photocd application/vnd.cups-postscript 66 imagetops
|
||||
image/x-portable-anymap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-portable-bitmap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-portable-graymap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-portable-pixmap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-sgi-rgb application/vnd.cups-postscript 66 imagetops
|
||||
image/x-xbitmap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-xpixmap application/vnd.cups-postscript 66 imagetops
|
||||
image/x-xwindowdump application/vnd.cups-postscript 66 imagetops
|
||||
image/x-sun-raster application/vnd.cups-postscript 66 imagetops
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -82,23 +68,8 @@ image/x-sun-raster application/vnd.cups-postscript 66 imagetops
|
||||
# Raster filters...
|
||||
#
|
||||
|
||||
image/gif application/vnd.cups-raster 100 imagetoraster
|
||||
image/png application/vnd.cups-raster 100 imagetoraster
|
||||
image/jpeg application/vnd.cups-raster 100 imagetoraster
|
||||
image/tiff application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-photocd application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-portable-anymap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-portable-bitmap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-portable-graymap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-portable-pixmap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-sgi-rgb application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-xbitmap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-xpixmap application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-xwindowdump application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-sun-raster application/vnd.cups-raster 100 imagetoraster
|
||||
|
||||
# pstoraster is now part of ESP Ghostscript...
|
||||
#application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
image/* application/vnd.cups-raster 100 imagetoraster
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -112,5 +83,5 @@ image/x-sun-raster application/vnd.cups-raster 100 imagetoraster
|
||||
#application/octet-stream application/vnd.cups-raw 0 -
|
||||
|
||||
#
|
||||
# End of "$Id: mime.convs 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: mime.convs 2062 2002-01-23 22:30:42Z mike $".
|
||||
#
|
||||
|
||||
+12
-14
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.types 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: mime.types 2010 2002-01-02 17:59:21Z mike $"
|
||||
#
|
||||
# MIME types file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products.
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -72,13 +72,12 @@ application/msword doc string(0,<D0CF11E0A1B11AE1>)
|
||||
application/pdf pdf string(0,%PDF)
|
||||
application/postscript ai eps ps string(0,%!) string(0,<04>%!)
|
||||
application/vnd.hp-HPGL hpgl string(0,<1B>&)\
|
||||
string(0,<1B>E<1B>%0B) \
|
||||
string(0,<1B>%-1B) string(0,<201B>)\
|
||||
string(0,<1B>E<1B>%0B) string(0,<201B>)\
|
||||
string(0,BP;) string(0,IN;) string(0,DF;) \
|
||||
string(0,BPINPS;) \
|
||||
(contains(0,128,<1B>%-12345X) + \
|
||||
(contains(0,1024,"LANGUAGE=HPGL") \
|
||||
contains(0,1024,"LANGUAGE = HPGL")))
|
||||
(contains(9,512,"LANGUAGE=HPGL") \
|
||||
contains(9,512,"LANGUAGE = HPGL")))
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -101,7 +100,7 @@ image/x-portable-pixmap ppm string(0,P3) string(0,P6)
|
||||
image/x-sgi-rgb rgb sgi bw icon short(0,474)
|
||||
image/x-xbitmap xbm
|
||||
image/x-xpixmap xpm ascii(0,1024) + string(3,"XPM")
|
||||
image/x-xwindowdump xwd string(4,<00000007>)
|
||||
image/x-xwindowdump xwd
|
||||
image/x-sun-raster ras string(0,<59a66a95>)
|
||||
|
||||
#image/fpx fpx
|
||||
@@ -129,18 +128,17 @@ text/plain txt printable(0,1024)
|
||||
# CUPS-specific types...
|
||||
#
|
||||
|
||||
application/vnd.cups-command string(0,'#CUPS-COMMAND')
|
||||
application/vnd.cups-form string(0,"<CUPSFORM>")
|
||||
application/vnd.cups-postscript contains(0,128,<1B>%-12345X) + \
|
||||
(contains(0,1024,"LANGUAGE=POSTSCRIPT") \
|
||||
contains(0,1024,"LANGUAGE = Postscript") \
|
||||
contains(0,1024,"LANGUAGE = POSTSCRIPT"))
|
||||
(contains(9,512,"LANGUAGE=POSTSCRIPT") \
|
||||
contains(9,512,"LANGUAGE = Postscript") \
|
||||
contains(9,512,"LANGUAGE = POSTSCRIPT"))
|
||||
application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR")
|
||||
application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
|
||||
string(0,<1B>@) \
|
||||
(contains(0,128,<1B>%-12345X) + \
|
||||
(contains(0,1024,"LANGUAGE=PCL") \
|
||||
contains(0,1024,"LANGUAGE = PCL")))
|
||||
(contains(9,512,"LANGUAGE=PCL") \
|
||||
contains(9,512,"LANGUAGE = PCL")))
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -154,5 +152,5 @@ application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
|
||||
#application/octet-stream
|
||||
|
||||
#
|
||||
# End of "$Id: mime.types 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: mime.types 2010 2002-01-02 17:59:21Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
auth required @PAMMOD@ nullok shadow
|
||||
account required @PAMMOD@
|
||||
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: printers.conf 2010 2002-01-02 17:59:21Z mike $"
|
||||
#
|
||||
# Sample printer configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -92,5 +92,5 @@
|
||||
#</Printer>
|
||||
|
||||
#
|
||||
# End of "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: printers.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-common.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -22,8 +22,8 @@ dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
dnl We need at least autoconf 2.50...
|
||||
AC_PREREQ(2.50)
|
||||
dnl We need at least autoconf 2.13...
|
||||
AC_PREREQ(2.13)
|
||||
|
||||
dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
@@ -59,7 +59,6 @@ if test "$NROFF" = ""; then
|
||||
fi
|
||||
AC_PATH_PROG(RM,rm)
|
||||
AC_PATH_PROG(SED,sed)
|
||||
AC_PATH_PROG(STRIP,strip)
|
||||
|
||||
dnl Architecture checks...
|
||||
AC_C_BIGENDIAN
|
||||
@@ -69,19 +68,14 @@ AC_SEARCH_LIBS(crypt, crypt)
|
||||
AC_SEARCH_LIBS(getspent, sec gen)
|
||||
|
||||
LIBMALLOC=""
|
||||
AC_ARG_ENABLE(mallinfo, [ --enable-mallinfo turn on malloc debug information, default=no])
|
||||
|
||||
if test x$enable_mallinfo = xyes; then
|
||||
AC_CHECK_LIB(c,mallinfo,LIBS="$LIBS"; AC_DEFINE(HAVE_MALLINFO),LIBS="$LIBS")
|
||||
if test "$ac_cv_lib_c_mallinfo" = "no"; then
|
||||
AC_CHECK_LIB(malloc,mallinfo,
|
||||
LIBS="$LIBS"
|
||||
LIBMALLOC="-lmalloc"
|
||||
AC_DEFINE(HAVE_MALLINFO),
|
||||
LIBS="$LIBS")
|
||||
fi
|
||||
AC_CHECK_LIB(c,mallinfo,LIBS="$LIBS"; AC_DEFINE(HAVE_MALLINFO),LIBS="$LIBS")
|
||||
if test "$ac_cv_lib_c_mallinfo" = "no"; then
|
||||
AC_CHECK_LIB(malloc,mallinfo,
|
||||
LIBS="$LIBS"
|
||||
LIBMALLOC="-lmalloc"
|
||||
AC_DEFINE(HAVE_MALLINFO),
|
||||
LIBS="$LIBS")
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBMALLOC)
|
||||
|
||||
dnl Checks for header files.
|
||||
@@ -92,12 +86,11 @@ AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H))
|
||||
AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H))
|
||||
AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H))
|
||||
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
|
||||
AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
|
||||
AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
|
||||
AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
|
||||
|
||||
dnl Checks for string functions.
|
||||
AC_CHECK_FUNCS(strdup strcasecmp strncasecmp strlcat strlcpy)
|
||||
AC_CHECK_FUNCS(strdup strcasecmp strncasecmp)
|
||||
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
|
||||
echo Forcing snprintf emulation for HP-UX.
|
||||
else
|
||||
@@ -157,18 +150,6 @@ esac
|
||||
|
||||
AC_SUBST(ARFLAGS)
|
||||
|
||||
dnl Libraries for the backends...
|
||||
case $uname in
|
||||
Darwin*)
|
||||
BACKLIBS="-framework CoreFoundation -framework IOKit"
|
||||
;;
|
||||
*)
|
||||
BACKLIBS=""
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(BACKLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-common.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-compiler.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-compiler.m4 2075 2002-01-26 21:35:09Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -27,17 +27,14 @@ dnl for them...
|
||||
OPTIM=""
|
||||
AC_SUBST(OPTIM)
|
||||
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no],
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],
|
||||
[if test x$enable_debug = xyes; then
|
||||
OPTIM="-g"
|
||||
fi])
|
||||
|
||||
AC_ARG_WITH(optim, [ --with-optim="flags" set optimization flags ])
|
||||
AC_ARG_WITH(optim, [ --with-optim=\"flags\" set optimization flags ])
|
||||
|
||||
dnl Update compiler options...
|
||||
CXXLIBS=""
|
||||
AC_SUBST(CXXLIBS)
|
||||
|
||||
if test -n "$GCC"; then
|
||||
# Starting with GCC 3.0, you must link C++ programs against either
|
||||
# libstdc++ (shared by default), or libsupc++ (always static). If
|
||||
@@ -55,17 +52,13 @@ if test -n "$GCC"; then
|
||||
AC_MSG_CHECKING(if libsupc++ is required)
|
||||
|
||||
SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
|
||||
case "$SUPC" in
|
||||
libsupc++.a*)
|
||||
# Library not found, so this is and older GCC...
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*)
|
||||
# This is gcc 3.x, and it knows of libsupc++, so we need it
|
||||
CXXLIBS="-lsupc++"
|
||||
AC_MSG_RESULT(yes)
|
||||
;;
|
||||
esac
|
||||
if test -n "$SUPC" -a "$SUPC" != "libsupc++.a"; then
|
||||
# This is gcc 3.x, and it knows of libsupc++, so we need it
|
||||
LIBS="$LIBS -lsupc++"
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
CXX="$CC"
|
||||
|
||||
@@ -180,6 +173,15 @@ else
|
||||
esac
|
||||
fi
|
||||
|
||||
case $uname in
|
||||
Darwin* | *BSD)
|
||||
ARFLAGS="-rcv"
|
||||
;;
|
||||
*)
|
||||
ARFLAGS="crvs"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-compiler.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-compiler.m4 2075 2002-01-26 21:35:09Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-directories.m4 2064 2002-01-24 18:51:13Z mike $"
|
||||
dnl
|
||||
dnl Directory stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -81,10 +81,6 @@ if test "$sysconfdir" = "\${prefix}/etc"; then
|
||||
fi
|
||||
|
||||
dnl Fix "libdir" variable for IRIX 6.x...
|
||||
if test "$libdir" = "\${exec_prefix}/lib"; then
|
||||
libdir="$exec_prefix/lib"
|
||||
fi
|
||||
|
||||
if test "$uname" = "IRIX" -a $uversion -ge 62; then
|
||||
libdir="$exec_prefix/lib32"
|
||||
fi
|
||||
@@ -110,9 +106,9 @@ if test x$rcdir = x; then
|
||||
;;
|
||||
|
||||
Darwin*)
|
||||
# Darwin and MacOS X...
|
||||
# Darwin and MacOS X - this is just strange...
|
||||
INITDIR=""
|
||||
INITDDIR="/System/Library/StartupItems/PrintingServices"
|
||||
INITDDIR="/System/Library/StartupItems/CUPS"
|
||||
;;
|
||||
|
||||
Linux*)
|
||||
@@ -184,8 +180,8 @@ case "$uname" in
|
||||
*)
|
||||
# All others
|
||||
INSTALL_SYSV="install-sysv"
|
||||
CUPS_SERVERBIN="$libdir/cups"
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$libdir/cups")
|
||||
CUPS_SERVERBIN="$exec_prefix/lib/cups"
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$exec_prefix/lib/cups")
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -238,5 +234,5 @@ AC_SUBST(CUPS_FONTPATH)
|
||||
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$fontpath")
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-directories.m4 2064 2002-01-24 18:51:13Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-image.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
dnl Image library stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -65,18 +65,8 @@ AC_CHECK_HEADER(tiff.h,
|
||||
dnl Restore original LIBS settings...
|
||||
LIBS="$SAVELIBS"
|
||||
|
||||
EXPORT_LIBJPEG="$LIBJPEG"
|
||||
EXPORT_LIBPNG="$LIBPNG"
|
||||
EXPORT_LIBTIFF="$LIBTIFF"
|
||||
EXPORT_LIBZ="$LIBZ"
|
||||
|
||||
AC_SUBST(EXPORT_LIBJPEG)
|
||||
AC_SUBST(EXPORT_LIBPNG)
|
||||
AC_SUBST(EXPORT_LIBTIFF)
|
||||
AC_SUBST(EXPORT_LIBZ)
|
||||
|
||||
AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H))
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-image.m4 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-libtool.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
dnl Libtool stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -23,7 +23,7 @@ dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported=LIBTOOL_PATH
|
||||
turn on building with libtool (UNSUPPORTED!), default=no],
|
||||
turn on building with libtool (UNSUPPORTED!) [default=no]],
|
||||
[if test x$enable_libtool_unsupported != xno; then
|
||||
LIBTOOL="$enable_libtool_unsupported"
|
||||
enable_shared=no
|
||||
@@ -45,5 +45,5 @@ if test x$LIBTOOL != x; then
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-libtool.m4 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-manpages.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
dnl Manpage stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -100,5 +100,5 @@ AC_SUBST(MAN8EXT)
|
||||
AC_SUBST(MAN8DIR)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-manpages.m4 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-network.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-network.m4 2081 2002-01-27 21:16:14Z mike $"
|
||||
dnl
|
||||
dnl Networking stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -29,13 +29,10 @@ if test "$uname" != "IRIX"; then
|
||||
AC_CHECK_LIB(nsl,gethostbyaddr,NETLIBS="$NETLIBS -lnsl")
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(rresvport getifaddrs)
|
||||
|
||||
AC_CHECK_MEMBER(struct sockaddr.sa_len,,,[#include <sys/socket.h>])
|
||||
AC_CHECK_HEADER(sys/sockio.h,AC_DEFINE(HAVE_SYS_SOCKIO_H))
|
||||
AC_CHECK_FUNCS(rresvport)
|
||||
|
||||
AC_SUBST(NETLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-network.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-network.m4 2081 2002-01-27 21:16:14Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-openslp.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl
|
||||
dnl OpenSLP configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -22,14 +22,13 @@ dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(slp, [ --enable-slp turn on SLP support, default=yes])
|
||||
AC_ARG_ENABLE(slp, [ --enable-slp turn on SLP support [default=yes]])
|
||||
AC_ARG_WITH(openslp-libs, [ --with-openslp-libs set directory for OpenSLP library],
|
||||
LDFLAGS="-L$withval $LDFLAGS"
|
||||
DSOFLAGS="-L$withval $DSOFLAGS",)
|
||||
AC_ARG_WITH(openslp-includes, [ --with-openslp-includes set directory for OpenSLP includes],
|
||||
CFLAGS="-I$withval $CFLAGS"
|
||||
CXXFLAGS="-I$withval $CXXFLAGS"
|
||||
CPPFLAGS="-I$withval $CPPFLAGS",)
|
||||
CXXFLAGS="-I$withval $CXXFLAGS",)
|
||||
|
||||
LIBSLP=""
|
||||
|
||||
@@ -44,5 +43,5 @@ AC_SUBST(LIBSLP)
|
||||
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-openslp.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openssl.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-openssl.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl
|
||||
dnl OpenSSL stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -22,14 +22,13 @@ dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(ssl, [ --enable-ssl turn on SSL/TLS support, default=yes])
|
||||
AC_ARG_ENABLE(ssl, [ --enable-ssl turn on SSL/TLS support [default=yes]])
|
||||
AC_ARG_WITH(openssl-libs, [ --with-openssl-libs set directory for OpenSSL library],
|
||||
LDFLAGS="-L$withval $LDFLAGS"
|
||||
DSOFLAGS="-L$withval $DSOFLAGS",)
|
||||
AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenSSL includes],
|
||||
CFLAGS="-I$withval $CFLAGS"
|
||||
CXXFLAGS="-I$withval $CXXFLAGS"
|
||||
CPPFLAGS="-I$withval $CPPFLAGS",)
|
||||
CXXFLAGS="-I$withval $CXXFLAGS",)
|
||||
|
||||
SSLLIBS=""
|
||||
|
||||
@@ -65,10 +64,6 @@ fi
|
||||
|
||||
AC_SUBST(SSLLIBS)
|
||||
|
||||
EXPORT_SSLLIBS="$SSLLIBS"
|
||||
AC_SUBST(EXPORT_SSLLIBS)
|
||||
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openssl.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-openssl.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-opsys.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-opsys.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
dnl Operating system stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -56,7 +56,7 @@ AC_ARG_WITH(cups-group, [ --with-cups-group set default group for CUPS],
|
||||
CUPS_GROUP="$withval",
|
||||
AC_MSG_CHECKING(for default print group)
|
||||
if test x$uname = xDarwin; then
|
||||
CUPS_GROUP="admin"
|
||||
CUPS_GROUP="${GROUP:=admin}"
|
||||
AC_MSG_RESULT(Darwin, using "$CUPS_GROUP")
|
||||
else
|
||||
if test -f /etc/group; then
|
||||
@@ -86,5 +86,5 @@ AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USER, "$CUPS_USER")
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GROUP, "$CUPS_GROUP")
|
||||
|
||||
dnl
|
||||
dnl "$Id: cups-opsys.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-opsys.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-pam.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl
|
||||
dnl PAM stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -22,7 +22,7 @@ dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(pam, [ --enable-pam turn on PAM support, default=yes])
|
||||
AC_ARG_ENABLE(pam, [ --enable-pam turn on PAM support [default=yes]])
|
||||
|
||||
dnl Don't use PAM with AIX...
|
||||
if test $uname = AIX; then
|
||||
@@ -31,14 +31,11 @@ fi
|
||||
|
||||
PAMDIR=""
|
||||
PAMLIBS=""
|
||||
PAMMOD="pam_unknown.so"
|
||||
|
||||
if test x$enable_pam != xno; then
|
||||
SAVELIBS="$LIBS"
|
||||
|
||||
AC_CHECK_LIB(dl,dlopen)
|
||||
AC_CHECK_LIB(pam,pam_start)
|
||||
AC_CHECK_HEADER(pam/pam_appl.h,AC_DEFINE(HAVE_PAM_PAM_APPL_H))
|
||||
|
||||
if test x$ac_cv_lib_pam_pam_start != xno; then
|
||||
if test x$ac_cv_lib_dl_dlopen != xno; then
|
||||
@@ -52,20 +49,11 @@ if test x$enable_pam != xno; then
|
||||
fi
|
||||
|
||||
LIBS="$SAVELIBS"
|
||||
|
||||
# This test might need to be updated as Linux distributors move
|
||||
# things around...
|
||||
for mod in pam_unix2.so pam_unix.so pam_pwdb.so; do
|
||||
if test -f /lib/security/$mod; then
|
||||
PAMMOD="$mod"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
AC_SUBST(PAMDIR)
|
||||
AC_SUBST(PAMLIBS)
|
||||
AC_SUBST(PAMMOD)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-pam.m4 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-sharedlibs.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl "$Id: cups-sharedlibs.m4 2064 2002-01-24 18:51:13Z mike $"
|
||||
dnl
|
||||
dnl Shared library support for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -25,7 +25,7 @@ dnl
|
||||
PICFLAG=1
|
||||
DSOFLAGS="${DSOFLAGS:=}"
|
||||
|
||||
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries, default=yes])
|
||||
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries [default=yes]])
|
||||
|
||||
if test x$enable_shared != xno; then
|
||||
case "$uname" in
|
||||
@@ -47,17 +47,17 @@ if test x$enable_shared != xno; then
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi2.4,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
OSF1* | Linux* | *BSD*)
|
||||
OSF1* | Linux* | NetBSD* | OpenBSD*)
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
Darwin*)
|
||||
Darwin* | FreeBSD*)
|
||||
LIBCUPS="libcups.2.dylib"
|
||||
LIBCUPSIMAGE="libcupsimage.2.dylib"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc"
|
||||
DSO="ld"
|
||||
DSOFLAGS="$DSOFLAGS -dylib /usr/lib/dylib1.o -lc"
|
||||
;;
|
||||
AIX*)
|
||||
LIBCUPS="libcups_s.a"
|
||||
@@ -87,15 +87,16 @@ AC_SUBST(LIBCUPS)
|
||||
AC_SUBST(LIBCUPSIMAGE)
|
||||
|
||||
if test x$enable_shared = xno; then
|
||||
LINKCUPS="-lcups \$(SSLLIBS)"
|
||||
LINKCUPSIMAGE="-lcupsimage"
|
||||
LINKCUPS="-L../cups -lcups"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage"
|
||||
LINKCUPS="$LINKCUPS \$(SSLLIBS)"
|
||||
else
|
||||
if test $uname = AIX; then
|
||||
LINKCUPS="-lcups_s"
|
||||
LINKCUPSIMAGE="-lcupsimage_s"
|
||||
LINKCUPS="-L../cups -lcups_s"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage_s"
|
||||
else
|
||||
LINKCUPS="-lcups"
|
||||
LINKCUPSIMAGE="-lcupsimage"
|
||||
LINKCUPS="-L../cups -lcups"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -117,15 +118,15 @@ if test "$DSO" != ":"; then
|
||||
case $uname in
|
||||
HP-UX*)
|
||||
# HP-UX
|
||||
DSOFLAGS="+s +b $libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
|
||||
DSOFLAGS="+b $libdir +fb $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,+b,$libdir,+fb"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
DSOFLAGS="-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -R$libdir"
|
||||
;;
|
||||
*BSD*)
|
||||
*BSD* | Darwin*)
|
||||
# *BSD
|
||||
DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,-R$libdir"
|
||||
@@ -145,5 +146,5 @@ AC_SUBST(DSOLIBS)
|
||||
AC_SUBST(IMGLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-sharedlibs.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl End of "$Id: cups-sharedlibs.m4 2064 2002-01-24 18:51:13Z mike $".
|
||||
dnl
|
||||
|
||||
+3
-29
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* @configure_input@
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -28,7 +28,7 @@
|
||||
* Version of software...
|
||||
*/
|
||||
|
||||
#define CUPS_SVERSION "CUPS v1.1.18"
|
||||
#define CUPS_SVERSION "CUPS v1.1.13"
|
||||
|
||||
|
||||
/*
|
||||
@@ -95,8 +95,6 @@
|
||||
#define HAVE_LIBPAM 0
|
||||
#endif /* !HAVE_LIBPAM */
|
||||
|
||||
#undef HAVE_PAM_PAM_APPL_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <shadow.h>?
|
||||
@@ -113,12 +111,11 @@
|
||||
|
||||
|
||||
/*
|
||||
* Use <string.h>, <strings.h>, and/or <bstring.h>?
|
||||
* Use <string.h>, <strings.h>, or both?
|
||||
*/
|
||||
|
||||
#undef HAVE_STRING_H
|
||||
#undef HAVE_STRINGS_H
|
||||
#undef HAVE_BSTRING_H
|
||||
|
||||
|
||||
/*
|
||||
@@ -128,8 +125,6 @@
|
||||
#undef HAVE_STRDUP
|
||||
#undef HAVE_STRCASECMP
|
||||
#undef HAVE_STRNCASECMP
|
||||
#undef HAVE_STRLCAT
|
||||
#undef HAVE_STRLCPY
|
||||
|
||||
|
||||
/*
|
||||
@@ -214,27 +209,6 @@
|
||||
#undef HAVE_RRESVPORT
|
||||
|
||||
|
||||
/*
|
||||
* Do we have getifaddrs()?
|
||||
*/
|
||||
|
||||
#undef HAVE_GETIFADDRS
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the <sys/sockio.h> header file?
|
||||
*/
|
||||
|
||||
#undef HAVE_SYS_SOCKIO_H
|
||||
|
||||
|
||||
/*
|
||||
* Does the sockaddr structure contain an sa_len parameter?
|
||||
*/
|
||||
|
||||
#undef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@ dnl "$Id$"
|
||||
dnl
|
||||
dnl Configuration script for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Easy Software Products and are protected by Federal
|
||||
@@ -39,7 +39,7 @@ sinclude(config-scripts/cups-openslp.m4)
|
||||
sinclude(config-scripts/cups-openssl.m4)
|
||||
sinclude(config-scripts/cups-pam.m4)
|
||||
|
||||
AC_OUTPUT(Makedefs cups.list cups.sh cups-config conf/cupsd.conf conf/pam.conf)
|
||||
AC_OUTPUT(Makedefs cups.list cups.sh cups-config conf/cupsd.conf)
|
||||
|
||||
chmod +x cups-config
|
||||
|
||||
|
||||
+8
-9
@@ -1,10 +1,10 @@
|
||||
#!/bin/sh
|
||||
#! /bin/sh
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# CUPS configuration utility.
|
||||
#
|
||||
# Copyright 2001-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 2001 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -23,7 +23,7 @@
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
|
||||
VERSION="1.1.18"
|
||||
VERSION="1.1.13"
|
||||
APIVERSION="1.1"
|
||||
|
||||
prefix=@prefix@
|
||||
@@ -38,10 +38,9 @@ cups_serverbin=@CUPS_SERVERBIN@
|
||||
cups_serverroot=@CUPS_SERVERROOT@
|
||||
|
||||
# flags for C++ compiler:
|
||||
CFLAGS=""
|
||||
LDFLAGS=""
|
||||
LIBS="@EXPORT_SSLLIBS@ @NETLIBS@"
|
||||
IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@ @EXPORT_LIBZ@"
|
||||
CFLAGS="@CFLAGS@"
|
||||
LDFLAGS="@LDFLAGS@"
|
||||
LIBS="@SSLLIBS@ @NETLIBS@ @LIBS@"
|
||||
|
||||
if test $includedir != /usr/include; then
|
||||
CFLAGS="$CFLAGS -I$includedir"
|
||||
@@ -99,13 +98,13 @@ while test $# -gt 0; do
|
||||
if test $image = no; then
|
||||
echo -lcups $LIBS
|
||||
else
|
||||
echo -lcupsimage $IMGLIBS -lcups $LIBS
|
||||
echo -lcupsimage -lcups $LIBS
|
||||
fi
|
||||
else
|
||||
if test $image = no; then
|
||||
echo $libdir/libcups.a $LIBS
|
||||
else
|
||||
echo $libdir/libcupsimage.a $IMGLIBS $libdir/libcups.a $LIBS
|
||||
echo $libdir/libcupsimage.a $libdir/libcups.a $LIBS
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
-99
@@ -15,105 +15,6 @@ Package=<4>
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "enumports"=.\visualc\enumports.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "fltk"="..\fltk-1.1\visualc\fltk.lib.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "fltkimages"="..\fltk-1.1\visualc\fltkimages.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "gui"=.\gui\gui.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "printers"=.\gui\printers.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name fltk
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name gui
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name fltkimages
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name zlib
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "restartspooler"=.\visualc\restartspooler.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "zlib"="..\htmldoc-1.8\visualc\zlib.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
|
||||
+32
-104
@@ -4,7 +4,7 @@
|
||||
# ESP Package Manager (EPM) file list for the Common UNIX Printing
|
||||
# System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -25,14 +25,16 @@
|
||||
|
||||
# Product information
|
||||
%product Common UNIX Printing System
|
||||
%copyright 1993-2003 by Easy Software Products, All Rights Reserved.
|
||||
%copyright 1993-2002 by Easy Software Products, All Rights Reserved.
|
||||
%vendor Easy Software Products
|
||||
%license LICENSE.txt
|
||||
%readme README.txt
|
||||
%version 1.1.18
|
||||
%version 1.1.13
|
||||
%provides cups
|
||||
%provides cupsys
|
||||
%provides cups-devel
|
||||
%provides cupsys-devel
|
||||
%provides cups-pstoraster
|
||||
%provides libcups1
|
||||
%provides libcups.so.2
|
||||
|
||||
@@ -80,7 +82,6 @@ $SERVERBIN=@CUPS_SERVERBIN@
|
||||
$SERVERROOT=@CUPS_SERVERROOT@
|
||||
|
||||
$CUPS_USER=@CUPS_USER@
|
||||
$CUPS_GROUP=@CUPS_GROUP@
|
||||
|
||||
$CAT1EXT=@CAT1EXT@
|
||||
$CAT3EXT=@CAT3EXT@
|
||||
@@ -110,7 +111,6 @@ f 0555 root sys $SERVERBIN/backend/ipp backend/ipp
|
||||
l 0555 root sys $SERVERBIN/backend/http ipp
|
||||
f 0555 root sys $SERVERBIN/backend/lpd backend/lpd
|
||||
f 0555 root sys $SERVERBIN/backend/parallel backend/parallel
|
||||
f 0555 root sys $SERVERBIN/backend/scsi backend/scsi
|
||||
f 0555 root sys $SERVERBIN/backend/serial backend/serial
|
||||
f 0555 root sys $SERVERBIN/backend/socket backend/socket
|
||||
f 0555 root sys $SERVERBIN/backend/usb backend/usb
|
||||
@@ -123,6 +123,7 @@ d 0555 root sys $SERVERBIN/daemon -
|
||||
f 0555 root sys $SERVERBIN/daemon/cups-lpd scheduler/cups-lpd
|
||||
f 0555 root sys $SERVERBIN/daemon/cups-polld scheduler/cups-polld
|
||||
d 0555 root sys $SERVERBIN/filter -
|
||||
f 0555 root sys $SERVERBIN/filter/pstoraster pstoraster/pstoraster
|
||||
f 0555 root sys $SERVERBIN/filter/pdftops pdftops/pdftops
|
||||
f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops
|
||||
f 0555 root sys $SERVERBIN/filter/pstops filter/pstops
|
||||
@@ -176,12 +177,7 @@ l 0555 root sys $LIBDIR/libcupsimage.sl libcupsimage.sl.2
|
||||
%system aix
|
||||
f 0555 root sys $LIBDIR/libcups_s.a cups/libcups_s.a
|
||||
f 0555 root sys $LIBDIR/libcupsimage_s.a filter/libcupsimage_s.a
|
||||
%system darwin
|
||||
f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib
|
||||
l 0555 root sys $LIBDIR/libcups.dylib libcups.2.dylib
|
||||
f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib
|
||||
l 0555 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib
|
||||
%system !hpux !aix !darwin
|
||||
%system !hpux !aix
|
||||
f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2
|
||||
l 0555 root sys $LIBDIR/libcups.so libcups.so.2
|
||||
f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2
|
||||
@@ -204,7 +200,6 @@ f 0444 root sys $LOCALEDIR/fr/cups_fr locale/fr/cups_fr
|
||||
f 0444 root sys $LOCALEDIR/it/cups_it locale/it/cups_it
|
||||
f 0444 root sys $LOCALEDIR/ru_RU.cp1251/cups_ru_RU.cp1251 locale/ru_RU.cp1251/cups_ru_RU.cp1251
|
||||
f 0444 root sys $LOCALEDIR/ru_RU.koi8r/cups_ru_RU.koi8r locale/ru_RU.koi8r/cups_ru_RU.koi8r
|
||||
f 0444 root sys $LOCALEDIR/sv/cups_sv locale/sv/cups_sv
|
||||
f 0444 root sys $LOCALEDIR/uk/cups_uk locale/uk/cups_uk
|
||||
f 0444 root sys $LOCALEDIR/uk_UA.cp1251/cups_uk_UA.cp1251 locale/uk_UA.cp1251/cups_uk_UA.cp1251
|
||||
f 0444 root sys $LOCALEDIR/zh_CN/cups_zh_CN locale/zh_CN/cups_zh_CN
|
||||
@@ -251,8 +246,21 @@ f 0444 root sys $DATADIR/data/psglyphs data/psglyphs
|
||||
f 0444 root sys $DATADIR/data/testprint.ps data/testprint.ps
|
||||
|
||||
d 0555 root sys $DATADIR/fonts -
|
||||
f 0444 root sys $DATADIR/fonts fonts/AvantGarde*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Bookman*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Charter*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Courier*
|
||||
f 0444 root sys $DATADIR/fonts/Symbol fonts/Symbol
|
||||
f 0444 root sys $DATADIR/fonts fonts/Helvetica*
|
||||
f 0444 root sys $DATADIR/fonts fonts/NewCentury*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Palatino*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Symbol
|
||||
f 0444 root sys $DATADIR/fonts fonts/Times*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Utopia*
|
||||
f 0444 root sys $DATADIR/fonts fonts/Zapf*
|
||||
|
||||
d 0555 root sys $DATADIR/pstoraster -
|
||||
f 0444 root sys $DATADIR/pstoraster/Fontmap pstoraster/Fontmap
|
||||
f 0444 root sys $DATADIR/pstoraster pstoraster/gs*.ps
|
||||
|
||||
d 0555 root sys $DATADIR/model -
|
||||
f 0444 root sys $DATADIR/model ppd/*.ppd
|
||||
@@ -260,9 +268,6 @@ f 0444 root sys $DATADIR/model ppd/*.ppd
|
||||
d 0555 root sys $DATADIR/templates -
|
||||
c 0444 root sys $DATADIR/templates templates/*.tmpl
|
||||
|
||||
d 0555 root sys $DATADIR/templates/fr -
|
||||
c 0444 root sys $DATADIR/templates/fr templates/fr/*.tmpl
|
||||
|
||||
# Config files
|
||||
d 0555 root sys $SERVERROOT -
|
||||
d 0711 $CUPS_USER $CUPS_GROUP $SERVERROOT/certs -
|
||||
@@ -274,13 +279,17 @@ c 0600 root sys $SERVERROOT/mime.types conf/mime.types
|
||||
|
||||
%system linux
|
||||
d 0555 root sys $PAMDIR -
|
||||
c 0644 root sys $PAMDIR/cups conf/pam.conf
|
||||
c 0644 root sys $PAMDIR/cups data/cups.pam
|
||||
c 0644 root sys $PAMDIR/cups.suse data/cups.suse
|
||||
%install if test -f /lib/security/pam_unix.so; then
|
||||
%install mv $PAMDIR/cups.suse $PAMDIR/cups
|
||||
%install fi
|
||||
|
||||
# IRIX doesn't normally support PAM, but the freeware project
|
||||
# includes a version of PAM that can be used...
|
||||
%system irix
|
||||
d 0555 root sys $PAMDIR -
|
||||
c 0644 root sys $PAMDIR/cups conf/pam.irix
|
||||
c 0644 root sys $PAMDIR/cups data/cups.irix
|
||||
|
||||
%system all
|
||||
|
||||
@@ -303,10 +312,6 @@ d 0555 root sys $DOCDIR -
|
||||
f 0444 root sys $DOCDIR doc/*.css
|
||||
f 0444 root sys $DOCDIR doc/*.html
|
||||
f 0444 root sys $DOCDIR doc/*.pdf
|
||||
d 0555 root sys $DOCDIR/fr -
|
||||
f 0444 root sys $DOCDIR/fr doc/fr/*.css
|
||||
f 0444 root sys $DOCDIR/fr doc/fr/*.html
|
||||
f 0444 root sys $DOCDIR/fr doc/fr/*.pdf
|
||||
d 0555 root sys $DOCDIR/images -
|
||||
f 0444 root sys $DOCDIR/images doc/images/*.gif
|
||||
|
||||
@@ -316,12 +321,11 @@ d 0555 root sys $AMANDIR/cat$MAN8DIR -
|
||||
d 0555 root sys $AMANDIR/man$MAN8DIR -
|
||||
d 0555 root sys $MANDIR -
|
||||
d 0555 root sys $MANDIR/cat1 -
|
||||
d 0555 root sys $PMANDIR/cat3 -
|
||||
d 0555 root sys $MANDIR/cat5 -
|
||||
d 0555 root sys $MANDIR/man1 -
|
||||
d 0555 root sys $MANDIR/man5 -
|
||||
d 0555 root sys $PMANDIR -
|
||||
d 0555 root sys $PMANDIR/cat3 -
|
||||
d 0555 root sys $PMANDIR/man3 -
|
||||
d 0555 root sys $MANDIR/man5 -
|
||||
|
||||
f 0444 root sys $MANDIR/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
|
||||
@@ -364,7 +368,7 @@ f 0444 root sys $MANDIR/man1/lprm.$MAN1EXT man/lprm.man
|
||||
f 0444 root sys $MANDIR/man1/lpr.$MAN1EXT man/lpr.man
|
||||
f 0444 root sys $MANDIR/man1/lpstat.$MAN1EXT man/lpstat.man
|
||||
f 0444 root sys $MANDIR/man1/lp.$MAN1EXT man/lp.man
|
||||
l 0444 root sys $MANDIR/man1/cancel.$MAN1EXT lp.$MAN1EXT
|
||||
l 0444 root sys $MANDIR/man1/cancel.$MAN1EXT lp.man
|
||||
|
||||
f 0444 root sys $PMANDIR/man3/cups-config.$MAN3EXT man/cups-config.man
|
||||
|
||||
@@ -375,94 +379,18 @@ f 0444 root sys $MANDIR/man5/mime.types.$MAN5EXT man/mime.types.man
|
||||
f 0444 root sys $MANDIR/man5/printers.conf.$MAN5EXT man/printers.conf.man
|
||||
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/accept.$MAN8EXT man/accept.man
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/reject.$MAN8EXT accept.$MAN8EXT
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/reject.$MAN8EXT accept.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/cupsaddsmb.$MAN8EXT man/cupsaddsmb.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/cups-polld.$MAN8EXT man/cups-polld.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/cupsd.$MAN8EXT man/cupsd.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/enable.$MAN8EXT man/enable.man
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/disable.$MAN8EXT enable.$MAN8EXT
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/disable.$MAN8EXT enable.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/lpadmin.$MAN8EXT man/lpadmin.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/lpc.$MAN8EXT man/lpc.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/lpinfo.$MAN8EXT man/lpinfo.man
|
||||
f 0444 root sys $AMANDIR/man$MAN8DIR/lpmove.$MAN8EXT man/lpmove.man
|
||||
|
||||
d 0555 root sys $AMANDIR/fr -
|
||||
d 0555 root sys $AMANDIR/fr/cat$MAN8DIR -
|
||||
d 0555 root sys $AMANDIR/fr/man$MAN8DIR -
|
||||
d 0555 root sys $MANDIR/fr -
|
||||
d 0555 root sys $MANDIR/fr/cat1 -
|
||||
d 0555 root sys $MANDIR/fr/cat5 -
|
||||
d 0555 root sys $MANDIR/fr/man1 -
|
||||
d 0555 root sys $MANDIR/fr/man5 -
|
||||
d 0555 root sys $PMANDIR/fr -
|
||||
d 0555 root sys $PMANDIR/fr/cat3 -
|
||||
d 0555 root sys $PMANDIR/fr/man3 -
|
||||
|
||||
f 0444 root sys $MANDIR/fr/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lpoptions.$CAT1EXT man/lpoptions.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lppasswd.$CAT1EXT man/lppasswd.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lpq.$CAT1EXT man/lpq.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lprm.$CAT1EXT man/lprm.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lpr.$CAT1EXT man/lpr.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lpstat.$CAT1EXT man/lpstat.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/fr/cat1/lp.$CAT1EXT man/lp.$CAT1EXT
|
||||
l 0444 root sys $MANDIR/fr/cat1/cancel.$CAT1EXT lp.$CAT1EXT
|
||||
|
||||
f 0444 root sys $PMANDIR/fr/cat3/cups-config.$CAT3EXT man/cups-config.$CAT3EXT
|
||||
|
||||
f 0444 root sys $MANDIR/fr/cat5/classes.conf.$CAT5EXT man/classes.conf.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/fr/cat5/cupsd.conf.$CAT5EXT man/cupsd.conf.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/fr/cat5/mime.convs.$CAT5EXT man/mime.convs.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/fr/cat5/mime.types.$CAT5EXT man/mime.types.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/fr/cat5/printers.conf.$CAT5EXT man/printers.conf.$CAT5EXT
|
||||
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/accept.$CAT8EXT man/accept.$CAT8EXT
|
||||
l 0444 root sys $AMANDIR/fr/cat$MAN8DIR/reject.$CAT8EXT accept.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cupsaddsmb.$CAT8EXT man/cupsaddsmb.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cups-lpd.$CAT8EXT man/cups-lpd.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cups-polld.$CAT8EXT man/cups-polld.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cupsd.$CAT8EXT man/cupsd.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/enable.$CAT8EXT man/enable.$CAT8EXT
|
||||
l 0444 root sys $AMANDIR/fr/cat$MAN8DIR/disable.$CAT8EXT enable.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpadmin.$CAT8EXT man/lpadmin.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpc.$CAT8EXT man/lpc.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpinfo.$CAT8EXT man/lpinfo.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpmove.$CAT8EXT man/lpmove.$CAT8EXT
|
||||
|
||||
f 0444 root sys $MANDIR/fr/man1/backend.$MAN1EXT man/backend.man
|
||||
f 0444 root sys $MANDIR/fr/man1/filter.$MAN1EXT man/filter.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lpoptions.$MAN1EXT man/lpoptions.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lppasswd.$MAN1EXT man/lppasswd.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lpq.$MAN1EXT man/lpq.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lprm.$MAN1EXT man/lprm.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lpr.$MAN1EXT man/lpr.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lpstat.$MAN1EXT man/lpstat.man
|
||||
f 0444 root sys $MANDIR/fr/man1/lp.$MAN1EXT man/lp.man
|
||||
l 0444 root sys $MANDIR/fr/man1/cancel.$MAN1EXT lp.$MAN1EXT
|
||||
|
||||
f 0444 root sys $PMANDIR/fr/man3/cups-config.$MAN3EXT man/cups-config.man
|
||||
|
||||
f 0444 root sys $MANDIR/fr/man5/classes.conf.$MAN5EXT man/classes.conf.man
|
||||
f 0444 root sys $MANDIR/fr/man5/cupsd.conf.$MAN5EXT man/cupsd.conf.man
|
||||
f 0444 root sys $MANDIR/fr/man5/mime.convs.$MAN5EXT man/mime.convs.man
|
||||
f 0444 root sys $MANDIR/fr/man5/mime.types.$MAN5EXT man/mime.types.man
|
||||
f 0444 root sys $MANDIR/fr/man5/printers.conf.$MAN5EXT man/printers.conf.man
|
||||
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/accept.$MAN8EXT man/accept.man
|
||||
l 0444 root sys $AMANDIR/fr/man$MAN8DIR/reject.$MAN8EXT accept.$MAN8EXT
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cupsaddsmb.$MAN8EXT man/cupsaddsmb.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cups-polld.$MAN8EXT man/cups-polld.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cupsd.$MAN8EXT man/cupsd.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/enable.$MAN8EXT man/enable.man
|
||||
l 0444 root sys $AMANDIR/fr/man$MAN8DIR/disable.$MAN8EXT enable.$MAN8EXT
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpadmin.$MAN8EXT man/lpadmin.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpc.$MAN8EXT man/lpc.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpinfo.$MAN8EXT man/lpinfo.man
|
||||
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpmove.$MAN8EXT man/lpmove.man
|
||||
|
||||
# Startup script
|
||||
%system all
|
||||
i 0555 root sys cups cups.sh
|
||||
|
||||
+8
-4
@@ -1,7 +1,11 @@
|
||||
{
|
||||
Description = "Printing Services";
|
||||
Provides = ("Printing");
|
||||
Description = "CUPS Printing";
|
||||
Provides = ("CUPS");
|
||||
Requires = ("Resolver");
|
||||
Uses = ("Network Time");
|
||||
OrderPreference = "Late";
|
||||
OrderPreference = "None";
|
||||
Messages =
|
||||
{
|
||||
start = "Starting CUPS";
|
||||
stop = "Stopping CUPS";
|
||||
};
|
||||
}
|
||||
|
||||
+29
-60
@@ -4,7 +4,7 @@
|
||||
#
|
||||
# Startup/shutdown script for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -47,21 +47,10 @@
|
||||
case "`uname`" in
|
||||
IRIX*)
|
||||
IS_ON=/sbin/chkconfig
|
||||
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
fi
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
|
||||
*BSD*)
|
||||
NetBSD*)
|
||||
IS_ON=:
|
||||
ECHO=echo
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
|
||||
Darwin*)
|
||||
@@ -72,59 +61,44 @@ case "`uname`" in
|
||||
fi
|
||||
|
||||
IS_ON=:
|
||||
ECHO=ConsoleMessage
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
|
||||
Linux*)
|
||||
# Set the timezone, if possible...
|
||||
if test -f /etc/TIMEZONE; then
|
||||
. /etc/TIMEZONE
|
||||
else
|
||||
if test -f /etc/sysconfig/clock; then
|
||||
. /etc/sysconfig/clock
|
||||
TZ="$ZONE"
|
||||
export TZ
|
||||
fi
|
||||
fi
|
||||
|
||||
IS_ON=/bin/true
|
||||
if test -f /etc/init.d/functions; then
|
||||
. /etc/init.d/functions
|
||||
ECHO=echo
|
||||
ECHO_OK="echo_success"
|
||||
ECHO_ERROR="echo_failure"
|
||||
else
|
||||
ECHO=echo
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
IS_ON=/bin/true
|
||||
ECHO=echo
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
esac
|
||||
|
||||
#### OS-Independent Stuff
|
||||
|
||||
#
|
||||
# Set the timezone, if possible... This allows the
|
||||
# scheduler and all child processes to know the local
|
||||
# timezone when reporting dates and times to the user.
|
||||
# If no timezone information is found, then Greenwich
|
||||
# Mean Time (GMT) will probably be used.
|
||||
# The verbose flag controls the printing of the names of
|
||||
# daemons as they are started. Currently always echos for
|
||||
# all but IRIX, which can configure verbose bootup messages.
|
||||
#
|
||||
|
||||
for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do
|
||||
if test -f $file; then
|
||||
. $file
|
||||
if test "`uname`" = "Darwin"; then
|
||||
ECHO=ConsoleMessage
|
||||
else
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
fi
|
||||
done
|
||||
|
||||
if test "x$ZONE" != x; then
|
||||
TZ="$ZONE"
|
||||
fi
|
||||
|
||||
if test "x$TIMEZONE" != x; then
|
||||
TZ="$TIMEZONE"
|
||||
fi
|
||||
|
||||
if test "x$TZ" != x; then
|
||||
export TZ
|
||||
fi
|
||||
|
||||
#
|
||||
@@ -166,30 +140,25 @@ case $1 in
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
@sbindir@/cupsd
|
||||
if test $? != 0; then
|
||||
$ECHO_FAIL
|
||||
$ECHO "cups: unable to $1 scheduler."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
$ECHO_OK
|
||||
$ECHO "cups: ${1}ed scheduler."
|
||||
$ECHO "cups: scheduler ${1}ed."
|
||||
else
|
||||
$ECHO "cups: scheduler stopped."
|
||||
fi
|
||||
;;
|
||||
|
||||
stop)
|
||||
if test "$pid" != ""; then
|
||||
kill $pid
|
||||
$ECHO_OK
|
||||
$ECHO "cups: stopped scheduler."
|
||||
$ECHO "cups: scheduler stopped."
|
||||
fi
|
||||
;;
|
||||
|
||||
status)
|
||||
if test "$pid" != ""; then
|
||||
echo "cups: scheduler is running."
|
||||
echo "cups: Scheduler is running."
|
||||
else
|
||||
echo "cups: scheduler is not running."
|
||||
echo "cups: Scheduler is not running."
|
||||
fi
|
||||
;;
|
||||
|
||||
|
||||
+50
-29
@@ -1,11 +1,11 @@
|
||||
#
|
||||
# "$Id: cups.spec 3041 2002-12-17 19:00:27Z swdev $"
|
||||
# "$Id: cups.spec 2010 2002-01-02 17:59:21Z mike $"
|
||||
#
|
||||
# RPM "spec" file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Original version by Jason McMullan <jmcc@ontv.com>.
|
||||
#
|
||||
# Copyright 1999-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1999-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -26,13 +26,13 @@
|
||||
|
||||
Summary: Common Unix Printing System
|
||||
Name: cups
|
||||
Version: 1.1.18
|
||||
Release: 1
|
||||
Version: 1.1.13
|
||||
Release: 0
|
||||
Copyright: GPL
|
||||
Group: System Environment/Daemons
|
||||
Source: ftp://ftp.easysw.com/pub/cups/%{version}/cups-%{version}-source.tar.gz
|
||||
Url: http://www.cups.org
|
||||
Packager: Anonymous <anonymous@foo.com>
|
||||
Packager: Michael Sweet <mike@easysw.com>
|
||||
Vendor: Easy Software Products
|
||||
|
||||
# Use buildroot so as not to disturb the version already installed
|
||||
@@ -42,12 +42,18 @@ BuildRoot: /var/tmp/%{name}-root
|
||||
Conflicts: lpr, LPRng
|
||||
Provides: libcups.so.2
|
||||
Provides: libcupsimage.so.2
|
||||
Provides: cups
|
||||
|
||||
%package devel
|
||||
Summary: Common Unix Printing System - development environment
|
||||
Group: Development/Libraries
|
||||
Provides: libcups1
|
||||
|
||||
%package pstoraster
|
||||
Summary: Common Unix Printing System - PostScript RIP
|
||||
Group: System Environment/Daemons
|
||||
Provides: pstoraster
|
||||
|
||||
%description
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. It has been developed by Easy Software Products
|
||||
@@ -59,6 +65,11 @@ The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This is the development package for creating
|
||||
additional printer drivers and other CUPS services.
|
||||
|
||||
%description pstoraster
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This is the PostScript RIP package for
|
||||
supporting non-PostScript printer drivers.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
|
||||
@@ -148,15 +159,37 @@ rm -rf $RPM_BUILD_ROOT
|
||||
/usr/bin/lp*
|
||||
/usr/lib/*.so*
|
||||
%dir /usr/lib/cups
|
||||
/usr/lib/cups/*
|
||||
%dir /usr/lib/cups/backend
|
||||
/usr/lib/cups/backend/*
|
||||
%dir /usr/lib/cups/cgi-bin
|
||||
/usr/lib/cups/cgi-bin/*
|
||||
%dir /usr/lib/cups/daemon
|
||||
/usr/lib/cups/daemon/*
|
||||
%dir /usr/lib/cups/filter
|
||||
/usr/lib/cups/filter/hpgltops
|
||||
/usr/lib/cups/filter/imagetops
|
||||
/usr/lib/cups/filter/imagetoraster
|
||||
/usr/lib/cups/filter/pdftops
|
||||
/usr/lib/cups/filter/pstops
|
||||
/usr/lib/cups/filter/rastertoepson
|
||||
/usr/lib/cups/filter/rastertohp
|
||||
/usr/lib/cups/filter/texttops
|
||||
/usr/sbin/*
|
||||
%dir /usr/share/cups
|
||||
/usr/share/cups/*
|
||||
%dir /usr/share/cups/banners
|
||||
/usr/share/cups/banners/*
|
||||
%dir /usr/share/cups/charsets
|
||||
/usr/share/cups/charsets/*
|
||||
%dir /usr/share/cups/data
|
||||
/usr/share/cups/data/*
|
||||
%dir /usr/share/cups/model
|
||||
/usr/share/cups/model/*
|
||||
%dir /usr/share/cups/templates
|
||||
/usr/share/cups/templates/*
|
||||
%dir /usr/share/doc/cups
|
||||
/usr/share/doc/cups/*
|
||||
%dir /usr/share/locale
|
||||
/usr/share/locale/*
|
||||
|
||||
%dir /usr/share/man/cat1
|
||||
/usr/share/man/cat1/*
|
||||
%dir /usr/share/man/cat5
|
||||
@@ -170,38 +203,26 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%dir /usr/share/man/man8
|
||||
/usr/share/man/man8/*
|
||||
|
||||
%dir /usr/share/man/fr/cat1
|
||||
/usr/share/man/fr/cat1/*
|
||||
%dir /usr/share/man/fr/cat5
|
||||
/usr/share/man/fr/cat5/*
|
||||
%dir /usr/share/man/fr/cat8
|
||||
/usr/share/man/fr/cat8/*
|
||||
%dir /usr/share/man/fr/man1
|
||||
/usr/share/man/fr/man1/*
|
||||
%dir /usr/share/man/fr/man5
|
||||
/usr/share/man/fr/man5/*
|
||||
%dir /usr/share/man/fr/man8
|
||||
/usr/share/man/fr/man8/*
|
||||
|
||||
%attr(0700,lp,root) %dir /var/spool/cups
|
||||
%attr(1700,lp,root) %dir /var/spool/cups/tmp
|
||||
|
||||
%files devel
|
||||
/usr/bin/cups-config
|
||||
%dir /usr/include/cups
|
||||
/usr/include/cups/*
|
||||
/usr/lib/*.a
|
||||
|
||||
%dir /usr/share/man/cat3
|
||||
/usr/share/man/cat3/*
|
||||
%dir /usr/share/man/man3
|
||||
/usr/share/man/man3/*
|
||||
/usr/share/man/man1/*
|
||||
|
||||
%dir /usr/share/man/fr/cat3
|
||||
/usr/share/man/fr/cat3/*
|
||||
%dir /usr/share/man/fr/man3
|
||||
/usr/share/man/fr/man3/*
|
||||
%files pstoraster
|
||||
%dir /usr/lib/cups/filter
|
||||
/usr/lib/cups/filter/pstoraster
|
||||
%dir /usr/share/cups/fonts
|
||||
/usr/share/cups/fonts/*
|
||||
%dir /usr/share/cups/pstoraster
|
||||
/usr/share/cups/pstoraster/*
|
||||
|
||||
#
|
||||
# End of "$Id: cups.spec 3041 2002-12-17 19:00:27Z swdev $".
|
||||
# End of "$Id: cups.spec 2010 2002-01-02 17:59:21Z mike $".
|
||||
#
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>Starting printing services</key>
|
||||
<string>Starting printing services</string>
|
||||
<key>Starting CUPS</key>
|
||||
<string>Starting CUPS</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
|
||||
@@ -1,11 +1,4 @@
|
||||
libcups.a
|
||||
libcups.la
|
||||
libcups.sl
|
||||
libcups.sl.2
|
||||
libcups.so
|
||||
libcups.so.2
|
||||
libcups_s.a
|
||||
libcups.2.dylib
|
||||
libcups.dylib
|
||||
testhttp
|
||||
testppd
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
# DO NOT DELETE
|
||||
|
||||
dest.o: cups.h ipp.h http.h md5.h ppd.h language.h string.h ../config.h
|
||||
emit.o: ppd.h string.h ../config.h
|
||||
encode.o: cups.h ipp.h http.h md5.h ppd.h string.h ../config.h debug.h
|
||||
http.o: string.h ../config.h http.h md5.h debug.h
|
||||
http-addr.o: string.h ../config.h http.h md5.h
|
||||
http-support.o: string.h ../config.h http.h md5.h ipp.h
|
||||
ipp.o: string.h ../config.h language.h ipp.h http.h md5.h debug.h
|
||||
ipp-support.o: string.h ../config.h language.h ipp.h http.h md5.h debug.h
|
||||
language.o: string.h ../config.h language.h cups_C.h
|
||||
mark.o: ppd.h string.h ../config.h debug.h
|
||||
md5.o: md5.h string.h ../config.h
|
||||
md5passwd.o: http.h md5.h string.h ../config.h
|
||||
options.o: cups.h ipp.h http.h md5.h ppd.h string.h ../config.h debug.h
|
||||
page.o: ppd.h string.h ../config.h
|
||||
ppd.o: ppd.h string.h ../config.h language.h debug.h
|
||||
snprintf.o: string.h ../config.h
|
||||
string.o: string.h ../config.h
|
||||
tempfile.o: cups.h ipp.h http.h md5.h ppd.h string.h ../config.h debug.h
|
||||
usersys.o: cups.h ipp.h http.h md5.h ppd.h string.h ../config.h
|
||||
util.o: cups.h ipp.h http.h md5.h ppd.h language.h string.h ../config.h
|
||||
util.o: debug.h
|
||||
testhttp.o: http.h md5.h
|
||||
testlang.o: language.h
|
||||
testppd.o: cups.h ipp.h http.h md5.h ppd.h string.h ../config.h
|
||||
+52
-46
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Support library Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
# EMail: cups-info@cups.org
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
# This file is subject to the Apple OS-Developed Software exception.
|
||||
#
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
@@ -30,11 +28,10 @@ include ../Makedefs
|
||||
# Object files...
|
||||
#
|
||||
|
||||
LIBOBJS = dest.o emit.o encode.o http.o http-addr.o http-support.o \
|
||||
ipp.o ipp-support.o language.o mark.o md5.o md5passwd.o \
|
||||
options.o page.o ppd.o snprintf.o string.o tempfile.o \
|
||||
usersys.o util.o
|
||||
OBJS = $(LIBOBJS) testhttp.o testlang.o
|
||||
LIBOBJS = dest.o emit.o encode.o http.o ipp.o language.o mark.o md5.o \
|
||||
md5passwd.o options.o page.o ppd.o snprintf.o string.o \
|
||||
tempfile.o usersys.o util.o
|
||||
OBJS = $(LIBOBJS) testhttp.o testppd.o ppd-debug.o
|
||||
|
||||
|
||||
#
|
||||
@@ -63,43 +60,33 @@ all: $(TARGETS)
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS) `basename $(LIBCUPS) .2` libcups.dylib
|
||||
|
||||
|
||||
#
|
||||
# Update dependencies (without system header dependencies...)
|
||||
#
|
||||
|
||||
depend:
|
||||
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
|
||||
$(RM) $(OBJS) $(TARGETS) `basename $(LIBCUPS) .2`
|
||||
|
||||
|
||||
#
|
||||
# Install object and target files...
|
||||
#
|
||||
|
||||
install: all installhdrs
|
||||
$(INSTALL_DIR) $(LIBDIR)
|
||||
$(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
|
||||
if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
|
||||
$(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
fi
|
||||
if test $(LIBCUPS) = "libcups.2.dylib"; then \
|
||||
$(STRIP) -x $(LIBDIR)/$(LIBCUPS); \
|
||||
$(RM) $(LIBDIR)/libcups.dylib; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \
|
||||
fi
|
||||
if test $(LIBCUPS) != "libcups.a"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
fi
|
||||
$(RANLIB) $(LIBDIR)/libcups.a
|
||||
|
||||
installhdrs:
|
||||
install: all
|
||||
$(INSTALL_DIR) $(INCLUDEDIR)/cups
|
||||
for file in $(HEADERS); do \
|
||||
$(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \
|
||||
done
|
||||
$(INSTALL_DIR) $(LIBDIR)
|
||||
$(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
|
||||
if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
$(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
fi
|
||||
if test $(LIBCUPS) = "libcups.2.dylib"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
$(RM) $(LIBDIR)/libcups.dylib; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \
|
||||
fi
|
||||
if test $(LIBCUPS) = "libcups_s.a"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
@@ -120,9 +107,9 @@ libcups.so.2 libcups.sl.2: $(LIBOBJS) ../Makedefs
|
||||
libcups.2.dylib: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ \
|
||||
-install_name $(libdir)/$@ \
|
||||
-current_version 2.0.4 \
|
||||
-compatibility_version 2.0.0 \
|
||||
-dylib_install_name $(LIBDIR)/libcups.dylib \
|
||||
-dylib_current_version 2.0.4 \
|
||||
-dylib_compatibility_version 2.0.0 \
|
||||
$(LIBOBJS) $(SSLLIBS)
|
||||
$(RM) libcups.dylib
|
||||
$(LN) $@ libcups.dylib
|
||||
@@ -171,6 +158,23 @@ cups_C.h: ../locale/C/cups_C
|
||||
$(RM) cups_C.h
|
||||
$(AWK) '{print "\"" $$0 "\","}' < ../locale/C/cups_C > cups_C.h
|
||||
|
||||
dest.o: cups.h http.h ipp.h language.h string.h
|
||||
emit.o: ppd.h
|
||||
encode.o: cups.h ipp.h string.h
|
||||
http.o: http.h ipp.h md5.h string.h
|
||||
ipp.o: http.h ipp.h string.h language.h
|
||||
language.o: cups_C.h language.h string.h
|
||||
mark.o: ppd.h
|
||||
md5.o: md5.h
|
||||
options.o: cups.h
|
||||
page.o: ppd.h
|
||||
ppd.o: language.h ppd.h
|
||||
snprintf.o: string.h
|
||||
string.o: string.h
|
||||
tempfile.o: cups.h string.h
|
||||
usersys.o: cups.h
|
||||
util.o: cups.h http.h ipp.h
|
||||
|
||||
|
||||
#
|
||||
# testhttp (dependency on static CUPS library is intentional)
|
||||
@@ -180,21 +184,23 @@ testhttp: testhttp.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS) $(SSLLIBS)
|
||||
|
||||
testhttp.o: http.h
|
||||
|
||||
|
||||
#
|
||||
# testlang (dependency on static CUPS library is intentional)
|
||||
# testppd
|
||||
#
|
||||
|
||||
testlang: testlang.o libcups.a
|
||||
testppd: testppd.o ppd-debug.o language.o mark.o page.o
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testlang.o libcups.a $(NETLIBS) $(SSLLIBS)
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o ppd-debug.o language.o mark.o page.o
|
||||
|
||||
testppd.o: ppd.h
|
||||
ppd-debug.o: ppd.c language.h ppd.h
|
||||
echo Compiling $< with debugging...
|
||||
$(CC) $(OPTIM) $(CFLAGS) -DDEBUG -c -o $@ $<
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
$(OBJS): ../Makedefs ../config.h
|
||||
|
||||
|
||||
#
|
||||
|
||||
+2
-30
@@ -41,7 +41,7 @@ RSC=rc.exe
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "../visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
@@ -64,7 +64,7 @@ LIB32=link.exe -lib
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../visualc" /I ".." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\visualc" /I ".." /I "../visualc" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
@@ -93,26 +93,10 @@ SOURCE=.\emit.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\encode.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\http-addr.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\http-support.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\http.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\ipp-support.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ipp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -121,10 +105,6 @@ SOURCE=.\language.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\oemlicense\license.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mark.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -157,10 +137,6 @@ SOURCE=.\string.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\tempfile.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\usersys.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -197,10 +173,6 @@ SOURCE=.\language.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\oemlicense\license.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\md5.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
+2
-7
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* API definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -20,8 +20,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_CUPS_H_
|
||||
@@ -48,10 +46,7 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0118
|
||||
# define CUPS_VERSION_MAJOR 1
|
||||
# define CUPS_VERSION_MINOR 1
|
||||
# define CUPS_VERSION_PATCH 18
|
||||
# define CUPS_VERSION 1.0113
|
||||
# define CUPS_DATE_ANY -1
|
||||
|
||||
|
||||
|
||||
+1
-3
@@ -18,7 +18,7 @@
|
||||
"Cyan",
|
||||
"Magenta",
|
||||
"Yellow",
|
||||
"Copyright 1993-2003 by Easy Software Products, All Rights Reserved.",
|
||||
"Copyright 1993-2002 by Easy Software Products, All Rights Reserved.",
|
||||
"General",
|
||||
"Printer",
|
||||
"Image",
|
||||
@@ -108,8 +108,6 @@
|
||||
"Top",
|
||||
"Filename(s)",
|
||||
"Print",
|
||||
"Options Installed",
|
||||
"Auto",
|
||||
"400 Your browser sent a request that this server could not understand.",
|
||||
"This server could not verify that you are authorized to access the resource.",
|
||||
"You must pay to access this server.",
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Debugging macros for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -20,8 +20,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_DEBUG_H_
|
||||
|
||||
+3
-12
@@ -4,7 +4,7 @@
|
||||
* User-defined destination (and option) support for the Common UNIX
|
||||
* Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -22,8 +22,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsAddDest() - Add a destination to the list of destinations.
|
||||
@@ -265,7 +263,8 @@ cupsGetDests(cups_dest_t **dests) /* O - Destinations */
|
||||
* Grab printer and instance name...
|
||||
*/
|
||||
|
||||
strlcpy(name, defprinter, sizeof(name));
|
||||
strncpy(name, defprinter, sizeof(name) - 1);
|
||||
name[sizeof(name) - 1] = '\0';
|
||||
|
||||
if ((instance = strchr(name, '/')) != NULL)
|
||||
*instance++ = '\0';
|
||||
@@ -597,14 +596,6 @@ cups_get_dests(const char *filename, /* I - File to read from */
|
||||
|
||||
*lineptr++ = '\0';
|
||||
|
||||
/*
|
||||
* See if the primary instance of the destination exists; if not,
|
||||
* ignore this entry and move on...
|
||||
*/
|
||||
|
||||
if (cupsGetDest(name, NULL, num_dests, *dests) == NULL)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Add the destination...
|
||||
*/
|
||||
|
||||
+14
-137
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD code emission routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,17 +23,13 @@
|
||||
*
|
||||
* PostScript is a trademark of Adobe Systems, Inc.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ppdCollect() - Collect all marked options that reside in the
|
||||
* specified section.
|
||||
* ppdEmit() - Emit code for marked options to a file.
|
||||
* ppdEmitFd() - Emit code for marked options to a file.
|
||||
* ppdEmitJCL() - Emit code for JCL options to a file.
|
||||
* ppd_handle_media() - Handle media selection...
|
||||
* ppd_sort() - Sort options by ordering numbers...
|
||||
* ppdCollect() - Collect all marked options that reside in the specified
|
||||
* ppdEmit() - Emit code for marked options to a file.
|
||||
* ppdEmitFd() - Emit code for marked options to a file.
|
||||
* ppdEmitJCL() - Emit code for JCL options to a file.
|
||||
* ppd_sort() - Sort options by ordering numbers...
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -55,19 +51,9 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void ppd_handle_media(ppd_file_t *ppd);
|
||||
static int ppd_sort(ppd_choice_t **c1, ppd_choice_t **c2);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static const char *ppd_custom_code =
|
||||
"pop pop pop\n"
|
||||
"<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n";
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdCollect()' - Collect all marked options that reside in the specified
|
||||
* section.
|
||||
@@ -165,16 +151,6 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
ppd_size_t *size; /* Custom page size */
|
||||
|
||||
|
||||
/*
|
||||
* Use PageSize or PageRegion as required...
|
||||
*/
|
||||
|
||||
ppd_handle_media(ppd);
|
||||
|
||||
/*
|
||||
* Collect the options we need to emit and emit them!
|
||||
*/
|
||||
|
||||
if ((count = ppdCollect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
@@ -196,7 +172,7 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
if (fprintf(fp, "%%%%BeginFeature: *%s %s\n",
|
||||
if (fprintf(fp, "%%%%BeginFeature: %s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice) < 0)
|
||||
{
|
||||
@@ -204,8 +180,7 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if ((strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 ||
|
||||
strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageRegion") == 0) &&
|
||||
if (strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
|
||||
strcasecmp(choices[i]->choice, "Custom") == 0)
|
||||
{
|
||||
/*
|
||||
@@ -225,7 +200,8 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Level 2 command sequence...
|
||||
*/
|
||||
|
||||
fputs(ppd_custom_code, fp);
|
||||
fputs("pop pop pop\n", fp);
|
||||
fputs("<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,20 +252,9 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
ppd_choice_t **choices; /* Choices */
|
||||
ppd_size_t *size; /* Custom page size */
|
||||
char buf[1024]; /* Output buffer for feature */
|
||||
|
||||
|
||||
/*
|
||||
* Use PageSize or PageRegion as required...
|
||||
*/
|
||||
|
||||
ppd_handle_media(ppd);
|
||||
|
||||
/*
|
||||
* Collect the options we need to emit and emit them!
|
||||
*/
|
||||
|
||||
if ((count = ppdCollect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
@@ -311,7 +276,7 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
snprintf(buf, sizeof(buf), "%%%%BeginFeature: *%s %s\n",
|
||||
snprintf(buf, sizeof(buf), "%%%%BeginFeature: %s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice);
|
||||
|
||||
@@ -321,49 +286,10 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if ((strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 ||
|
||||
strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageRegion") == 0) &&
|
||||
strcasecmp(choices[i]->choice, "Custom") == 0)
|
||||
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
/*
|
||||
* Variable size; write out standard size options (this should
|
||||
* eventually be changed to use the parameter positions defined
|
||||
* in the PPD file...)
|
||||
*/
|
||||
|
||||
size = ppdPageSize(ppd, "Custom");
|
||||
snprintf(buf, sizeof(buf), "%.0f %.0f 0 0 0\n", size->width,
|
||||
size->length);
|
||||
|
||||
if (write(fd, buf, strlen(buf)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (choices[i]->code == NULL)
|
||||
{
|
||||
/*
|
||||
* This can happen with certain buggy PPD files that don't include
|
||||
* a CustomPageSize command sequence... We just use a generic
|
||||
* Level 2 command sequence...
|
||||
*/
|
||||
|
||||
if (write(fd, ppd_custom_code, strlen(ppd_custom_code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
|
||||
{
|
||||
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, "%%EndFeature\n", 13) < 1)
|
||||
@@ -477,55 +403,6 @@ ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_handle_media()' - Handle media selection...
|
||||
*/
|
||||
|
||||
static void
|
||||
ppd_handle_media(ppd_file_t *ppd)
|
||||
{
|
||||
ppd_choice_t *manual_feed, /* ManualFeed choice, if any */
|
||||
*input_slot; /* InputSlot choice, if any */
|
||||
ppd_size_t *size; /* Current media size */
|
||||
|
||||
|
||||
/*
|
||||
* This function determines if the user has selected a media source
|
||||
* via the InputSlot or ManualFeed options; if so, it marks the
|
||||
* PageRegion option corresponding to the current media size.
|
||||
* Otherwise it marks the PageSize option.
|
||||
*/
|
||||
|
||||
if ((size = ppdPageSize(ppd, NULL)) == NULL)
|
||||
return;
|
||||
|
||||
manual_feed = ppdFindMarkedChoice(ppd, "ManualFeed");
|
||||
input_slot = ppdFindMarkedChoice(ppd, "InputSlot");
|
||||
|
||||
if (strcasecmp(size->name, "Custom") == 0 ||
|
||||
(manual_feed == NULL && input_slot == NULL) ||
|
||||
(manual_feed != NULL && strcasecmp(manual_feed->choice, "False") == 0) ||
|
||||
(input_slot != NULL && (input_slot->code == NULL || !input_slot->code[0])))
|
||||
{
|
||||
/*
|
||||
* Manual feed was not selected and/or the input slot selection does
|
||||
* not contain any PostScript code. Use the PageSize option...
|
||||
*/
|
||||
|
||||
ppdMarkOption(ppd, "PageSize", size->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Manual feed was selected and/or the input slot selection contains
|
||||
* PostScript code. Use the PageRegion option...
|
||||
*/
|
||||
|
||||
ppdMarkOption(ppd, "PageRegion", size->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_sort()' - Sort options by ordering numbers...
|
||||
*/
|
||||
|
||||
+139
-209
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option encoding routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsEncodeOptions() - Encode printer options into IPP attributes.
|
||||
@@ -39,48 +37,6 @@
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local list of option names and the value tags they should use...
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
ipp_tag_t value_tag;
|
||||
} ipp_option_t;
|
||||
|
||||
static ipp_option_t ipp_options[] =
|
||||
{
|
||||
{ "blackplot", IPP_TAG_BOOLEAN },
|
||||
{ "brightness", IPP_TAG_INTEGER },
|
||||
{ "columns", IPP_TAG_INTEGER },
|
||||
{ "copies", IPP_TAG_INTEGER },
|
||||
{ "finishings", IPP_TAG_ENUM },
|
||||
{ "fitplot", IPP_TAG_BOOLEAN },
|
||||
{ "gamma", IPP_TAG_INTEGER },
|
||||
{ "hue", IPP_TAG_INTEGER },
|
||||
{ "job-priority", IPP_TAG_INTEGER },
|
||||
{ "landscape", IPP_TAG_BOOLEAN },
|
||||
{ "mirror", IPP_TAG_BOOLEAN },
|
||||
{ "natural-scaling", IPP_TAG_INTEGER },
|
||||
{ "number-up", IPP_TAG_INTEGER },
|
||||
{ "orientation-requested", IPP_TAG_ENUM },
|
||||
{ "page-bottom", IPP_TAG_INTEGER },
|
||||
{ "page-left", IPP_TAG_INTEGER },
|
||||
{ "page-ranges", IPP_TAG_RANGE },
|
||||
{ "page-right", IPP_TAG_INTEGER },
|
||||
{ "page-top", IPP_TAG_INTEGER },
|
||||
{ "penwidth", IPP_TAG_INTEGER },
|
||||
{ "ppi", IPP_TAG_INTEGER },
|
||||
{ "prettyprint", IPP_TAG_BOOLEAN },
|
||||
{ "printer-resolution", IPP_TAG_RESOLUTION },
|
||||
{ "print-quality", IPP_TAG_ENUM },
|
||||
{ "saturation", IPP_TAG_INTEGER },
|
||||
{ "scaling", IPP_TAG_INTEGER },
|
||||
{ "wrap", IPP_TAG_BOOLEAN }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
|
||||
*/
|
||||
@@ -90,13 +46,14 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t *options) /* I - Options */
|
||||
{
|
||||
int i, j; /* Looping vars */
|
||||
int count; /* Number of values */
|
||||
char *s, /* Pointer into option value */
|
||||
*val, /* Pointer to option value */
|
||||
*copy, /* Copy of option value */
|
||||
*sep; /* Option separator */
|
||||
ipp_attribute_t *attr; /* IPP job-id attribute */
|
||||
int i, j; /* Looping vars */
|
||||
int count; /* Number of values */
|
||||
int n; /* Attribute value */
|
||||
char *s, /* Pointer into option value */
|
||||
*val, /* Pointer to option value */
|
||||
*copy, /* Copy of option value */
|
||||
*sep; /* Option separator */
|
||||
ipp_attribute_t *attr; /* IPP job-id attribute */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)\n", ipp, num_options, options));
|
||||
@@ -137,49 +94,13 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
* Count the number of values...
|
||||
*/
|
||||
|
||||
for (count = 1, sep = options[i].value; *sep; sep ++)
|
||||
{
|
||||
if (*sep == '\'')
|
||||
{
|
||||
/*
|
||||
* Skip quoted option value...
|
||||
*/
|
||||
|
||||
sep ++;
|
||||
|
||||
while (*sep && *sep != '\'')
|
||||
sep ++;
|
||||
|
||||
if (!*sep)
|
||||
sep --;
|
||||
}
|
||||
else if (*sep == '\"')
|
||||
{
|
||||
/*
|
||||
* Skip quoted option value...
|
||||
*/
|
||||
|
||||
sep ++;
|
||||
|
||||
while (*sep && *sep != '\"')
|
||||
sep ++;
|
||||
|
||||
if (!*sep)
|
||||
sep --;
|
||||
}
|
||||
else if (*sep == ',')
|
||||
count ++;
|
||||
else if (*sep == '\\' && sep[1])
|
||||
sep ++;
|
||||
}
|
||||
for (count = 1, sep = options[i].value;
|
||||
(sep = strchr(sep + 1, ',')) != NULL;
|
||||
count ++);
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: option = \'%s\', count = %d\n",
|
||||
options[i].name, count));
|
||||
|
||||
/*
|
||||
* Allocate memory for the attribute values...
|
||||
*/
|
||||
|
||||
if ((attr = _ipp_add_attr(ipp, count)) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -190,29 +111,8 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now figure out what type of value we have...
|
||||
*/
|
||||
|
||||
attr->group_tag = IPP_TAG_JOB;
|
||||
|
||||
if (strcasecmp(options[i].value, "true") == 0 ||
|
||||
strcasecmp(options[i].value, "false") == 0)
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
else
|
||||
attr->value_tag = IPP_TAG_NAME;
|
||||
|
||||
for (j = 0; j < (int)(sizeof(ipp_options) / sizeof(ipp_options[0])); j ++)
|
||||
if (strcasecmp(options[i].name, ipp_options[j].name) == 0)
|
||||
{
|
||||
attr->value_tag = ipp_options[j].value_tag;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the name over...
|
||||
*/
|
||||
|
||||
if ((attr->name = strdup(options[i].name)) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -252,111 +152,92 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan the value string for values...
|
||||
* See what the option value is; for compatibility with older interface
|
||||
* scripts, we have to support single-argument options as well as
|
||||
* option=value, option=low-high, option=MxN, and option=val1,val2,...,valN.
|
||||
*/
|
||||
|
||||
for (j = 0; *val != '\0' || j == 0; val = sep, j ++)
|
||||
if (*val == '\0')
|
||||
{
|
||||
/*
|
||||
* Find the end of this value and mark it if needed...
|
||||
* Old-style System V boolean value...
|
||||
*/
|
||||
|
||||
if ((sep = strchr(val, ',')) != NULL)
|
||||
*sep++ = '\0';
|
||||
else
|
||||
sep = val + strlen(val);
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
|
||||
/*
|
||||
* Copy the option value(s) over as needed by the type...
|
||||
*/
|
||||
|
||||
switch (attr->value_tag)
|
||||
if (strncasecmp(attr->name, "no", 2) == 0)
|
||||
{
|
||||
case IPP_TAG_INTEGER :
|
||||
case IPP_TAG_ENUM :
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
|
||||
strcpy(attr->name, attr->name + 2);
|
||||
attr->values[0].boolean = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
attr->values[0].boolean = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Scan the value string for values...
|
||||
*/
|
||||
|
||||
for (j = 0; *val != '\0'; val = sep, j ++)
|
||||
{
|
||||
/*
|
||||
* Find the end of this value and mark it if needed...
|
||||
*/
|
||||
|
||||
if ((sep = strchr(val, ',')) != NULL)
|
||||
*sep++ = '\0';
|
||||
else
|
||||
sep = val + strlen(val);
|
||||
|
||||
/*
|
||||
* See what kind of value it is...
|
||||
*/
|
||||
|
||||
if (strcasecmp(val, "true") == 0 ||
|
||||
strcasecmp(val, "on") == 0 ||
|
||||
strcasecmp(val, "yes") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - true...
|
||||
*/
|
||||
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
attr->values[j].boolean = 1;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
}
|
||||
else if (strcasecmp(val, "false") == 0 ||
|
||||
strcasecmp(val, "off") == 0 ||
|
||||
strcasecmp(val, "no") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - false...
|
||||
*/
|
||||
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
attr->values[j].boolean = 0;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Number, range, resolution, or string...
|
||||
*/
|
||||
|
||||
n = strtol(val, &s, 0);
|
||||
|
||||
if (*s != '\0' && *s != '-' && (*s != 'x' || s == val))
|
||||
{
|
||||
/*
|
||||
* Integer/enumeration value...
|
||||
* String value(s)...
|
||||
*/
|
||||
|
||||
attr->values[j].integer = strtol(val, &s, 0);
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Adding integer option value %d...\n",
|
||||
attr->values[j].integer));
|
||||
break;
|
||||
|
||||
case IPP_TAG_BOOLEAN :
|
||||
if (strcasecmp(val, "true") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - true...
|
||||
*/
|
||||
|
||||
attr->values[j].boolean = 1;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Boolean value - false...
|
||||
*/
|
||||
|
||||
attr->values[j].boolean = 0;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
|
||||
}
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
/*
|
||||
* Range...
|
||||
*/
|
||||
|
||||
if (*val == '-')
|
||||
{
|
||||
attr->values[j].range.lower = 1;
|
||||
s = val;
|
||||
}
|
||||
else
|
||||
attr->values[j].range.lower = strtol(val, &s, 0);
|
||||
|
||||
if (*s == '-')
|
||||
{
|
||||
if (s[1])
|
||||
attr->values[j].range.upper = strtol(s + 1, NULL, 0);
|
||||
else
|
||||
attr->values[j].range.upper = 2147483647;
|
||||
}
|
||||
else
|
||||
attr->values[j].range.upper = attr->values[j].range.lower;
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Added range option value %d-%d...\n",
|
||||
attr->values[j].range.lower,
|
||||
attr->values[j].range.upper));
|
||||
break;
|
||||
|
||||
case IPP_TAG_RESOLUTION :
|
||||
/*
|
||||
* Resolution...
|
||||
*/
|
||||
|
||||
attr->values[j].resolution.xres = strtol(val, &s, 0);
|
||||
|
||||
if (*s == 'x')
|
||||
attr->values[j].resolution.yres = strtol(s + 1, &s, 0);
|
||||
else
|
||||
attr->values[j].resolution.yres = attr->values[j].resolution.xres;
|
||||
|
||||
if (strcasecmp(s, "dpc") == 0)
|
||||
attr->values[j].resolution.units = IPP_RES_PER_CM;
|
||||
else
|
||||
attr->values[j].resolution.units = IPP_RES_PER_INCH;
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Adding resolution option value %s...\n",
|
||||
val));
|
||||
break;
|
||||
|
||||
default :
|
||||
if ((attr->values[j].string.text = strdup(val)) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -367,9 +248,58 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Added string value \'%s\'...\n",
|
||||
val));
|
||||
break;
|
||||
attr->value_tag = IPP_TAG_NAME;
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Added string value \'%s\'...\n", val));
|
||||
}
|
||||
else if (*s == '-')
|
||||
{
|
||||
attr->value_tag = IPP_TAG_RANGE;
|
||||
attr->values[j].range.lower = n;
|
||||
attr->values[j].range.upper = strtol(s + 1, NULL, 0);
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Added range option value %d-%d...\n",
|
||||
n, attr->values[j].range.upper));
|
||||
}
|
||||
else if (*s == 'x')
|
||||
{
|
||||
attr->value_tag = IPP_TAG_RESOLUTION;
|
||||
attr->values[j].resolution.xres = n;
|
||||
attr->values[j].resolution.yres = strtol(s + 1, &s, 0);
|
||||
|
||||
if (strcasecmp(s, "dpc") == 0)
|
||||
attr->values[j].resolution.units = IPP_RES_PER_CM;
|
||||
else if (strcasecmp(s, "dpi") == 0)
|
||||
attr->values[j].resolution.units = IPP_RES_PER_INCH;
|
||||
else
|
||||
{
|
||||
if ((attr->values[j].string.text = strdup(val)) == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Ran out of memory for string!");
|
||||
return;
|
||||
}
|
||||
|
||||
attr->value_tag = IPP_TAG_NAME;
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Added string value \'%s\'...\n", val));
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Adding resolution option value %s...\n",
|
||||
val));
|
||||
}
|
||||
else
|
||||
{
|
||||
attr->value_tag = IPP_TAG_INTEGER;
|
||||
attr->values[j].integer = n;
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: Adding integer option value %d...\n", n));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* HTTP host/address routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* httpGetHostByName() - Lookup a hostname or IP address, and return
|
||||
* address records for the specified name.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
|
||||
#include "http.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetHostByName()' - Lookup a hostname or IP address, and return
|
||||
* address records for the specified name.
|
||||
*/
|
||||
|
||||
struct hostent * /* O - Host entry */
|
||||
httpGetHostByName(const char *name) /* I - Hostname or IP address */
|
||||
{
|
||||
const char *nameptr; /* Pointer into name */
|
||||
unsigned ip[4]; /* IP address components */
|
||||
static unsigned packed_ip; /* Packed IPv4 address */
|
||||
static char *packed_ptr[2]; /* Pointer to packed address */
|
||||
static struct hostent host_ip; /* Host entry for IP address */
|
||||
|
||||
#if defined(__APPLE__)
|
||||
/* OS X hack to avoid it's ocassional long delay in lookupd */
|
||||
static char sLoopback[] = "127.0.0.1";
|
||||
if (strcmp(name, "localhost") == 0)
|
||||
name = sLoopback;
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
* This function is needed because some operating systems have a
|
||||
* buggy implementation of httpGetHostByName() that does not support
|
||||
* IP addresses. If the first character of the name string is a
|
||||
* number, then sscanf() is used to extract the IP components.
|
||||
* We then pack the components into an IPv4 address manually,
|
||||
* since the inet_aton() function is deprecated. We use the
|
||||
* htonl() macro to get the right byte order for the address.
|
||||
*/
|
||||
|
||||
for (nameptr = name; isdigit(*nameptr) || *nameptr == '.'; nameptr ++);
|
||||
|
||||
if (!*nameptr)
|
||||
{
|
||||
/*
|
||||
* We have an IP address; break it up and provide the host entry
|
||||
* to the caller. Currently only supports IPv4 addresses, although
|
||||
* it should be trivial to support IPv6 in CUPS 1.2.
|
||||
*/
|
||||
|
||||
if (sscanf(name, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) != 4)
|
||||
return (NULL); /* Must have 4 numbers */
|
||||
|
||||
packed_ip = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) | ip[3]));
|
||||
|
||||
/*
|
||||
* Fill in the host entry and return it...
|
||||
*/
|
||||
|
||||
host_ip.h_name = (char *)name;
|
||||
host_ip.h_aliases = NULL;
|
||||
host_ip.h_addrtype = AF_INET;
|
||||
host_ip.h_length = 4;
|
||||
host_ip.h_addr_list = packed_ptr;
|
||||
packed_ptr[0] = (char *)(&packed_ip);
|
||||
packed_ptr[1] = NULL;
|
||||
|
||||
return (&host_ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Use the gethostbyname() function to get the IP address for
|
||||
* the name...
|
||||
*/
|
||||
|
||||
return (gethostbyname(name));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -1,317 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* HTTP support routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* httpSeparate() - Separate a Universal Resource Identifier into its
|
||||
* components.
|
||||
* httpStatus() - Return a short string describing a HTTP status code.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
|
||||
#include "http.h"
|
||||
#include "ipp.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'httpSeparate()' - Separate a Universal Resource Identifier into its
|
||||
* components.
|
||||
*/
|
||||
|
||||
void
|
||||
httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
char *method, /* O - Method [32] (http, https, etc.) */
|
||||
char *username, /* O - Username [32] */
|
||||
char *host, /* O - Hostname [32] */
|
||||
int *port, /* O - Port number to use */
|
||||
char *resource) /* O - Resource/filename [1024] */
|
||||
{
|
||||
char *ptr; /* Pointer into string... */
|
||||
const char *atsign, /* @ sign */
|
||||
*slash; /* Separator */
|
||||
char safeuri[HTTP_MAX_URI]; /* "Safe" local copy of URI */
|
||||
char quoted; /* Quoted character */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (uri == NULL || method == NULL || username == NULL || host == NULL ||
|
||||
port == NULL || resource == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Copy the URL to a local string to make sure we don't have a URL
|
||||
* longer than HTTP_MAX_URI characters long...
|
||||
*/
|
||||
|
||||
strlcpy(safeuri, uri, sizeof(safeuri));
|
||||
|
||||
uri = safeuri;
|
||||
|
||||
/*
|
||||
* Grab the method portion of the URI...
|
||||
*/
|
||||
|
||||
if (strncmp(uri, "//", 2) == 0)
|
||||
{
|
||||
/*
|
||||
* Workaround for HP IPP client bug...
|
||||
*/
|
||||
|
||||
strcpy(method, "ipp");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Standard URI with method...
|
||||
*/
|
||||
|
||||
for (ptr = host; *uri != ':' && *uri != '\0'; uri ++)
|
||||
if (ptr < (host + HTTP_MAX_URI - 1))
|
||||
*ptr++ = *uri;
|
||||
|
||||
*ptr = '\0';
|
||||
if (*uri == ':')
|
||||
uri ++;
|
||||
|
||||
/*
|
||||
* If the method contains a period or slash, then it's probably
|
||||
* hostname/filename...
|
||||
*/
|
||||
|
||||
if (strchr(host, '.') != NULL || strchr(host, '/') != NULL || *uri == '\0')
|
||||
{
|
||||
if ((ptr = strchr(host, '/')) != NULL)
|
||||
{
|
||||
strlcpy(resource, ptr, HTTP_MAX_URI);
|
||||
*ptr = '\0';
|
||||
}
|
||||
else
|
||||
resource[0] = '\0';
|
||||
|
||||
if (isdigit(*uri))
|
||||
{
|
||||
/*
|
||||
* OK, we have "hostname:port[/resource]"...
|
||||
*/
|
||||
|
||||
*port = strtol(uri, (char **)&uri, 10);
|
||||
|
||||
if (*uri == '/')
|
||||
strlcpy(resource, uri, HTTP_MAX_URI);
|
||||
}
|
||||
else
|
||||
*port = 631;
|
||||
|
||||
strcpy(method, "http");
|
||||
username[0] = '\0';
|
||||
return;
|
||||
}
|
||||
else
|
||||
strlcpy(method, host, 32);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the method starts with less than 2 slashes then it is a local resource...
|
||||
*/
|
||||
|
||||
if (strncmp(uri, "//", 2) != 0)
|
||||
{
|
||||
strlcpy(resource, uri, HTTP_MAX_URI);
|
||||
|
||||
username[0] = '\0';
|
||||
host[0] = '\0';
|
||||
*port = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Grab the username, if any...
|
||||
*/
|
||||
|
||||
while (*uri == '/')
|
||||
uri ++;
|
||||
|
||||
if ((slash = strchr(uri, '/')) == NULL)
|
||||
slash = uri + strlen(uri);
|
||||
|
||||
if ((atsign = strchr(uri, '@')) != NULL && atsign < slash)
|
||||
{
|
||||
/*
|
||||
* Got a username:password combo...
|
||||
*/
|
||||
|
||||
for (ptr = username; uri < atsign; uri ++)
|
||||
if (ptr < (username + HTTP_MAX_URI - 1))
|
||||
{
|
||||
if (*uri == '%' && isxdigit(uri[1]) && isxdigit(uri[2]))
|
||||
{
|
||||
/*
|
||||
* Grab a hex-encoded username and password...
|
||||
*/
|
||||
|
||||
uri ++;
|
||||
if (isalpha(*uri))
|
||||
quoted = (tolower(*uri) - 'a' + 10) << 4;
|
||||
else
|
||||
quoted = (*uri - '0') << 4;
|
||||
|
||||
uri ++;
|
||||
if (isalpha(*uri))
|
||||
quoted |= tolower(*uri) - 'a' + 10;
|
||||
else
|
||||
quoted |= *uri - '0';
|
||||
|
||||
*ptr++ = quoted;
|
||||
}
|
||||
else
|
||||
*ptr++ = *uri;
|
||||
}
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
uri = atsign + 1;
|
||||
}
|
||||
else
|
||||
username[0] = '\0';
|
||||
|
||||
/*
|
||||
* Grab the hostname...
|
||||
*/
|
||||
|
||||
for (ptr = host; *uri != ':' && *uri != '/' && *uri != '\0'; uri ++)
|
||||
if (ptr < (host + HTTP_MAX_URI - 1))
|
||||
*ptr++ = *uri;
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (*uri != ':')
|
||||
{
|
||||
if (strcasecmp(method, "http") == 0)
|
||||
*port = 80;
|
||||
else if (strcasecmp(method, "https") == 0)
|
||||
*port = 443;
|
||||
else if (strcasecmp(method, "ipp") == 0)
|
||||
*port = ippPort();
|
||||
else if (strcasecmp(method, "socket") == 0) /* Not registered yet... */
|
||||
*port = 9100;
|
||||
else
|
||||
*port = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Parse port number...
|
||||
*/
|
||||
|
||||
*port = 0;
|
||||
uri ++;
|
||||
while (isdigit(*uri))
|
||||
{
|
||||
*port = (*port * 10) + *uri - '0';
|
||||
uri ++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*uri == '\0')
|
||||
{
|
||||
/*
|
||||
* Hostname but no port or path...
|
||||
*/
|
||||
|
||||
resource[0] = '/';
|
||||
resource[1] = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The remaining portion is the resource string...
|
||||
*/
|
||||
|
||||
strlcpy(resource, uri, HTTP_MAX_URI);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpStatus()' - Return a short string describing a HTTP status code.
|
||||
*/
|
||||
|
||||
const char * /* O - String or NULL */
|
||||
httpStatus(http_status_t status) /* I - HTTP status code */
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case HTTP_CONTINUE :
|
||||
return ("Continue");
|
||||
case HTTP_SWITCHING_PROTOCOLS :
|
||||
return ("Switching Protocols");
|
||||
case HTTP_OK :
|
||||
return ("OK");
|
||||
case HTTP_CREATED :
|
||||
return ("Created");
|
||||
case HTTP_ACCEPTED :
|
||||
return ("Accepted");
|
||||
case HTTP_NO_CONTENT :
|
||||
return ("No Content");
|
||||
case HTTP_NOT_MODIFIED :
|
||||
return ("Not Modified");
|
||||
case HTTP_BAD_REQUEST :
|
||||
return ("Bad Request");
|
||||
case HTTP_UNAUTHORIZED :
|
||||
return ("Unauthorized");
|
||||
case HTTP_FORBIDDEN :
|
||||
return ("Forbidden");
|
||||
case HTTP_NOT_FOUND :
|
||||
return ("Not Found");
|
||||
case HTTP_REQUEST_TOO_LARGE :
|
||||
return ("Request Entity Too Large");
|
||||
case HTTP_URI_TOO_LONG :
|
||||
return ("URI Too Long");
|
||||
case HTTP_UPGRADE_REQUIRED :
|
||||
return ("Upgrade Required");
|
||||
case HTTP_NOT_IMPLEMENTED :
|
||||
return ("Not Implemented");
|
||||
case HTTP_NOT_SUPPORTED :
|
||||
return ("Not Supported");
|
||||
default :
|
||||
return ("Unknown");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+341
-138
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* HTTP routines for the Common UNIX Printing System (CUPS).
|
||||
* HTTP routines for the Common UNIX Printing System (CUPS) scheduler.
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* httpInitialize() - Initialize the HTTP interface library and set the
|
||||
@@ -34,6 +32,10 @@
|
||||
* httpConnectEncrypt() - Connect to a HTTP server using encryption.
|
||||
* httpEncryption() - Set the required encryption on the link.
|
||||
* httpReconnect() - Reconnect to a HTTP server...
|
||||
* httpGetHostByName() - Lookup a hostname or IP address, and return
|
||||
* address records for the specified name.
|
||||
* httpSeparate() - Separate a Universal Resource Identifier into its
|
||||
* components.
|
||||
* httpGetSubField() - Get a sub-field value.
|
||||
* httpSetField() - Set the value of an HTTP header.
|
||||
* httpDelete() - Send a DELETE request to the server.
|
||||
@@ -48,6 +50,7 @@
|
||||
* httpWrite() - Write data to a HTTP connection.
|
||||
* httpGets() - Get a line of text from a HTTP connection.
|
||||
* httpPrintf() - Print a formatted string to a HTTP connection.
|
||||
* httpStatus() - Return a short string describing a HTTP status code.
|
||||
* httpGetDateString() - Get a formatted date/time string from a time value.
|
||||
* httpGetDateTime() - Get a time value from a formatted date/time string.
|
||||
* httpUpdate() - Update the current HTTP state for incoming data.
|
||||
@@ -74,6 +77,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include "http.h"
|
||||
#include "ipp.h"
|
||||
#include "debug.h"
|
||||
|
||||
#ifndef WIN32
|
||||
@@ -179,9 +183,7 @@ void
|
||||
httpInitialize(void)
|
||||
{
|
||||
#ifdef HAVE_LIBSSL
|
||||
# ifndef WIN32
|
||||
struct timeval curtime; /* Current time in microseconds */
|
||||
# endif /* !WIN32 */
|
||||
int i; /* Looping var */
|
||||
unsigned char data[1024]; /* Seed data */
|
||||
#endif /* HAVE_LIBSSL */
|
||||
@@ -219,11 +221,8 @@ httpInitialize(void)
|
||||
* it is the best we can do (on others, this seed isn't even used...)
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#else
|
||||
gettimeofday(&curtime, NULL);
|
||||
srand(curtime.tv_sec + curtime.tv_usec);
|
||||
#endif /* WIN32 */
|
||||
|
||||
for (i = 0; i < sizeof(data); i ++)
|
||||
data[i] = rand(); /* Yes, this is a poor source of random data... */
|
||||
@@ -393,7 +392,7 @@ httpConnectEncrypt(const char *host, /* I - Host to connect to */
|
||||
* Copy the hostname and port and then "reconnect"...
|
||||
*/
|
||||
|
||||
strlcpy(http->hostname, host, sizeof(http->hostname));
|
||||
strncpy(http->hostname, host, sizeof(http->hostname) - 1);
|
||||
http->hostaddr.sin_family = hostaddr->h_addrtype;
|
||||
#ifdef WIN32
|
||||
http->hostaddr.sin_port = htons((u_short)port);
|
||||
@@ -414,7 +413,7 @@ httpConnectEncrypt(const char *host, /* I - Host to connect to */
|
||||
* Loop through the addresses we have until one of them connects...
|
||||
*/
|
||||
|
||||
strlcpy(http->hostname, host, sizeof(http->hostname));
|
||||
strncpy(http->hostname, host, sizeof(http->hostname) - 1);
|
||||
|
||||
for (i = 0; hostaddr->h_addr_list[i]; i ++)
|
||||
{
|
||||
@@ -617,6 +616,276 @@ httpReconnect(http_t *http) /* I - HTTP data */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetHostByName()' - Lookup a hostname or IP address, and return
|
||||
* address records for the specified name.
|
||||
*/
|
||||
|
||||
struct hostent * /* O - Host entry */
|
||||
httpGetHostByName(const char *name) /* I - Hostname or IP address */
|
||||
{
|
||||
unsigned ip[4]; /* IP address components */
|
||||
static unsigned packed_ip; /* Packed IPv4 address */
|
||||
static char *packed_ptr[2]; /* Pointer to packed address */
|
||||
static struct hostent host_ip; /* Host entry for IP address */
|
||||
|
||||
|
||||
/*
|
||||
* This function is needed because some operating systems have a
|
||||
* buggy implementation of httpGetHostByName() that does not support
|
||||
* IP addresses. If the first character of the name string is a
|
||||
* number, then sscanf() is used to extract the IP components.
|
||||
* We then pack the components into an IPv4 address manually,
|
||||
* since the inet_aton() function is deprecated. We use the
|
||||
* htonl() macro to get the right byte order for the address.
|
||||
*/
|
||||
|
||||
if (isdigit(name[0]))
|
||||
{
|
||||
/*
|
||||
* We have an IP address; break it up and provide the host entry
|
||||
* to the caller. Currently only supports IPv4 addresses, although
|
||||
* it should be trivial to support IPv6 in CUPS 1.2.
|
||||
*/
|
||||
|
||||
if (sscanf(name, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) != 4)
|
||||
return (NULL); /* Must have 4 numbers */
|
||||
|
||||
packed_ip = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) | ip[3]));
|
||||
|
||||
/*
|
||||
* Fill in the host entry and return it...
|
||||
*/
|
||||
|
||||
host_ip.h_name = (char *)name;
|
||||
host_ip.h_aliases = NULL;
|
||||
host_ip.h_addrtype = AF_INET;
|
||||
host_ip.h_length = 4;
|
||||
host_ip.h_addr_list = packed_ptr;
|
||||
packed_ptr[0] = (char *)(&packed_ip);
|
||||
packed_ptr[1] = NULL;
|
||||
|
||||
return (&host_ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Use the gethostbyname() function to get the IP address for
|
||||
* the name...
|
||||
*/
|
||||
|
||||
return (gethostbyname(name));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpSeparate()' - Separate a Universal Resource Identifier into its
|
||||
* components.
|
||||
*/
|
||||
|
||||
void
|
||||
httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
char *method, /* O - Method [32] (http, https, etc.) */
|
||||
char *username, /* O - Username [32] */
|
||||
char *host, /* O - Hostname [32] */
|
||||
int *port, /* O - Port number to use */
|
||||
char *resource) /* O - Resource/filename [1024] */
|
||||
{
|
||||
char *ptr; /* Pointer into string... */
|
||||
const char *atsign, /* @ sign */
|
||||
*slash; /* Separator */
|
||||
char safeuri[HTTP_MAX_URI]; /* "Safe" local copy of URI */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (uri == NULL || method == NULL || username == NULL || host == NULL ||
|
||||
port == NULL || resource == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Copy the URL to a local string to make sure we don't have a URL
|
||||
* longer than HTTP_MAX_URI characters long...
|
||||
*/
|
||||
|
||||
strncpy(safeuri, uri, sizeof(safeuri));
|
||||
safeuri[sizeof(safeuri) - 1] = '\0';
|
||||
|
||||
uri = safeuri;
|
||||
|
||||
/*
|
||||
* Grab the method portion of the URI...
|
||||
*/
|
||||
|
||||
if (strncmp(uri, "//", 2) == 0)
|
||||
{
|
||||
/*
|
||||
* Workaround for HP IPP client bug...
|
||||
*/
|
||||
|
||||
strcpy(method, "ipp");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Standard URI with method...
|
||||
*/
|
||||
|
||||
for (ptr = host; *uri != ':' && *uri != '\0'; uri ++)
|
||||
if (ptr < (host + HTTP_MAX_URI - 1))
|
||||
*ptr++ = *uri;
|
||||
|
||||
*ptr = '\0';
|
||||
if (*uri == ':')
|
||||
uri ++;
|
||||
|
||||
/*
|
||||
* If the method contains a period or slash, then it's probably
|
||||
* hostname/filename...
|
||||
*/
|
||||
|
||||
if (strchr(host, '.') != NULL || strchr(host, '/') != NULL || *uri == '\0')
|
||||
{
|
||||
if ((ptr = strchr(host, '/')) != NULL)
|
||||
{
|
||||
strncpy(resource, ptr, HTTP_MAX_URI);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
*ptr = '\0';
|
||||
}
|
||||
else
|
||||
resource[0] = '\0';
|
||||
|
||||
if (isdigit(*uri))
|
||||
{
|
||||
/*
|
||||
* OK, we have "hostname:port[/resource]"...
|
||||
*/
|
||||
|
||||
*port = strtol(uri, (char **)&uri, 10);
|
||||
|
||||
if (*uri == '/')
|
||||
{
|
||||
strncpy(resource, uri, HTTP_MAX_URI);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
*port = 631;
|
||||
|
||||
strcpy(method, "http");
|
||||
username[0] = '\0';
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(method, host, 31);
|
||||
method[31] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the method starts with less than 2 slashes then it is a local resource...
|
||||
*/
|
||||
|
||||
if (strncmp(uri, "//", 2) != 0)
|
||||
{
|
||||
strncpy(resource, uri, 1023);
|
||||
resource[1023] = '\0';
|
||||
|
||||
username[0] = '\0';
|
||||
host[0] = '\0';
|
||||
*port = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Grab the username, if any...
|
||||
*/
|
||||
|
||||
while (*uri == '/')
|
||||
uri ++;
|
||||
|
||||
if ((slash = strchr(uri, '/')) == NULL)
|
||||
slash = uri + strlen(uri);
|
||||
|
||||
if ((atsign = strchr(uri, '@')) != NULL && atsign < slash)
|
||||
{
|
||||
/*
|
||||
* Got a username:password combo...
|
||||
*/
|
||||
|
||||
for (ptr = username; uri < atsign; uri ++)
|
||||
if (ptr < (username + HTTP_MAX_URI - 1))
|
||||
*ptr++ = *uri;
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
uri = atsign + 1;
|
||||
}
|
||||
else
|
||||
username[0] = '\0';
|
||||
|
||||
/*
|
||||
* Grab the hostname...
|
||||
*/
|
||||
|
||||
for (ptr = host; *uri != ':' && *uri != '/' && *uri != '\0'; uri ++)
|
||||
if (ptr < (host + HTTP_MAX_URI - 1))
|
||||
*ptr++ = *uri;
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (*uri != ':')
|
||||
{
|
||||
if (strcasecmp(method, "http") == 0)
|
||||
*port = 80;
|
||||
else if (strcasecmp(method, "https") == 0)
|
||||
*port = 443;
|
||||
else if (strcasecmp(method, "ipp") == 0)
|
||||
*port = ippPort();
|
||||
else if (strcasecmp(method, "socket") == 0) /* Not registered yet... */
|
||||
*port = 9100;
|
||||
else
|
||||
*port = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Parse port number...
|
||||
*/
|
||||
|
||||
*port = 0;
|
||||
uri ++;
|
||||
while (isdigit(*uri))
|
||||
{
|
||||
*port = (*port * 10) + *uri - '0';
|
||||
uri ++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*uri == '\0')
|
||||
{
|
||||
/*
|
||||
* Hostname but no port or path...
|
||||
*/
|
||||
|
||||
resource[0] = '/';
|
||||
resource[1] = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The remaining portion is the resource string...
|
||||
*/
|
||||
|
||||
strncpy(resource, uri, HTTP_MAX_URI);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetSubField()' - Get a sub-field value.
|
||||
*/
|
||||
@@ -755,7 +1024,8 @@ httpSetField(http_t *http, /* I - HTTP data */
|
||||
value == NULL)
|
||||
return;
|
||||
|
||||
strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
|
||||
strncpy(http->fields[field], value, HTTP_MAX_VALUE - 1);
|
||||
http->fields[field][HTTP_MAX_VALUE - 1] = '\0';
|
||||
}
|
||||
|
||||
|
||||
@@ -874,7 +1144,7 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
char len[32]; /* Length string */
|
||||
|
||||
|
||||
DEBUG_printf(("httpRead(%p, %p, %d)\n", http, buffer, length));
|
||||
DEBUG_printf(("httpRead(%08x, %08x, %d)\n", http, buffer, length));
|
||||
|
||||
if (http == NULL || buffer == NULL)
|
||||
return (-1);
|
||||
@@ -896,16 +1166,11 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
}
|
||||
|
||||
http->data_remaining = strtol(len, NULL, 16);
|
||||
if (http->data_remaining < 0)
|
||||
{
|
||||
DEBUG_puts("httpRead: Negative chunk length!");
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_printf(("httpRead: data_remaining = %d\n", http->data_remaining));
|
||||
|
||||
if (http->data_remaining <= 0)
|
||||
if (http->data_remaining == 0)
|
||||
{
|
||||
/*
|
||||
* A zero-length chunk ends a transfer; unless we are reading POST
|
||||
@@ -957,14 +1222,10 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
{
|
||||
#ifdef WIN32
|
||||
http->error = WSAGetLastError();
|
||||
return (-1);
|
||||
#else
|
||||
if (errno != EINTR)
|
||||
{
|
||||
http->error = errno;
|
||||
return (-1);
|
||||
}
|
||||
http->error = errno;
|
||||
#endif /* WIN32 */
|
||||
return (-1);
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
@@ -983,7 +1244,7 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
http->used -= length;
|
||||
|
||||
if (http->used > 0)
|
||||
memmove(http->buffer, http->buffer + length, http->used);
|
||||
memcpy(http->buffer, http->buffer + length, http->used);
|
||||
}
|
||||
#ifdef HAVE_LIBSSL
|
||||
else if (http->tls)
|
||||
@@ -999,16 +1260,11 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
if (bytes > 0)
|
||||
http->data_remaining -= bytes;
|
||||
else if (bytes < 0)
|
||||
{
|
||||
#ifdef WIN32
|
||||
http->error = WSAGetLastError();
|
||||
#else
|
||||
if (errno == EINTR)
|
||||
bytes = 0;
|
||||
else
|
||||
http->error = errno;
|
||||
http->error = errno;
|
||||
#endif /* WIN32 */
|
||||
}
|
||||
|
||||
if (http->data_remaining == 0)
|
||||
{
|
||||
@@ -1024,38 +1280,6 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i, j, ch;
|
||||
printf("httpRead: Read %d bytes:\n", bytes);
|
||||
for (i = 0; i < bytes; i += 16)
|
||||
{
|
||||
printf(" ");
|
||||
|
||||
for (j = 0; j < 16 && (i + j) < bytes; j ++)
|
||||
printf(" %02X", buffer[i + j] & 255);
|
||||
|
||||
while (j < 16)
|
||||
{
|
||||
printf(" ");
|
||||
j ++;
|
||||
}
|
||||
|
||||
printf(" ");
|
||||
for (j = 0; j < 16 && (i + j) < bytes; j ++)
|
||||
{
|
||||
ch = buffer[i + j] & 255;
|
||||
|
||||
if (ch < ' ' || ch == 127)
|
||||
ch = '.';
|
||||
|
||||
putchar(ch);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
|
||||
@@ -1119,22 +1343,6 @@ httpWrite(http_t *http, /* I - HTTP data */
|
||||
|
||||
if (bytes < 0)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (WSAGetLastError() != http->error)
|
||||
{
|
||||
http->error = WSAGetLastError();
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else if (errno != http->error)
|
||||
{
|
||||
http->error = errno;
|
||||
continue;
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
DEBUG_puts("httpWrite: error writing data...\n");
|
||||
|
||||
return (-1);
|
||||
@@ -1165,37 +1373,8 @@ httpWrite(http_t *http, /* I - HTTP data */
|
||||
http->state = HTTP_WAITING;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i, j, ch;
|
||||
printf("httpWrite: wrote %d bytes: \n", tbytes);
|
||||
for (i = 0, buffer -= tbytes; i < tbytes; i += 16)
|
||||
{
|
||||
printf(" ");
|
||||
DEBUG_printf(("httpWrite: wrote %d bytes...\n", tbytes));
|
||||
|
||||
for (j = 0; j < 16 && (i + j) < tbytes; j ++)
|
||||
printf(" %02X", buffer[i + j] & 255);
|
||||
|
||||
while (j < 16)
|
||||
{
|
||||
printf(" ");
|
||||
j ++;
|
||||
}
|
||||
|
||||
printf(" ");
|
||||
for (j = 0; j < 16 && (i + j) < tbytes; j ++)
|
||||
{
|
||||
ch = buffer[i + j] & 255;
|
||||
|
||||
if (ch < ' ' || ch == 127)
|
||||
ch = '.';
|
||||
|
||||
putchar(ch);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
return (tbytes);
|
||||
}
|
||||
|
||||
@@ -1215,7 +1394,7 @@ httpGets(char *line, /* I - Line to read into */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
DEBUG_printf(("httpGets(%p, %d, %p)\n", line, length, http));
|
||||
DEBUG_printf(("httpGets(%08x, %d, %08x)\n", line, length, http));
|
||||
|
||||
if (http == NULL || line == NULL)
|
||||
return (NULL);
|
||||
@@ -1270,9 +1449,7 @@ httpGets(char *line, /* I - Line to read into */
|
||||
|
||||
DEBUG_printf(("httpGets(): recv() error %d!\n", WSAGetLastError()));
|
||||
#else
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else if (errno != http->error)
|
||||
if (errno != http->error)
|
||||
{
|
||||
http->error = errno;
|
||||
continue;
|
||||
@@ -1297,7 +1474,6 @@ httpGets(char *line, /* I - Line to read into */
|
||||
|
||||
http->used += bytes;
|
||||
bufend += bytes;
|
||||
bufptr = bufend;
|
||||
}
|
||||
}
|
||||
while (bufptr >= bufend && http->used < HTTP_MAX_BUFFER);
|
||||
@@ -1334,7 +1510,7 @@ httpGets(char *line, /* I - Line to read into */
|
||||
|
||||
http->used -= bytes;
|
||||
if (http->used > 0)
|
||||
memmove(http->buffer, bufptr, http->used);
|
||||
memcpy(http->buffer, bufptr, http->used);
|
||||
|
||||
DEBUG_printf(("httpGets(): Returning \"%s\"\n", line));
|
||||
return (line);
|
||||
@@ -1379,33 +1555,60 @@ httpPrintf(http_t *http, /* I - HTTP data */
|
||||
nbytes = send(http->fd, bufptr, bytes - tbytes, 0);
|
||||
|
||||
if (nbytes < 0)
|
||||
{
|
||||
nbytes = 0;
|
||||
|
||||
#ifdef WIN32
|
||||
if (WSAGetLastError() != http->error)
|
||||
{
|
||||
http->error = WSAGetLastError();
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else if (errno != http->error)
|
||||
{
|
||||
http->error = errno;
|
||||
continue;
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpStatus()' - Return a short string describing a HTTP status code.
|
||||
*/
|
||||
|
||||
const char * /* O - String or NULL */
|
||||
httpStatus(http_status_t status) /* I - HTTP status code */
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case HTTP_CONTINUE :
|
||||
return ("Continue");
|
||||
case HTTP_SWITCHING_PROTOCOLS :
|
||||
return ("Switching Protocols");
|
||||
case HTTP_OK :
|
||||
return ("OK");
|
||||
case HTTP_CREATED :
|
||||
return ("Created");
|
||||
case HTTP_ACCEPTED :
|
||||
return ("Accepted");
|
||||
case HTTP_NO_CONTENT :
|
||||
return ("No Content");
|
||||
case HTTP_NOT_MODIFIED :
|
||||
return ("Not Modified");
|
||||
case HTTP_BAD_REQUEST :
|
||||
return ("Bad Request");
|
||||
case HTTP_UNAUTHORIZED :
|
||||
return ("Unauthorized");
|
||||
case HTTP_FORBIDDEN :
|
||||
return ("Forbidden");
|
||||
case HTTP_NOT_FOUND :
|
||||
return ("Not Found");
|
||||
case HTTP_REQUEST_TOO_LARGE :
|
||||
return ("Request Entity Too Large");
|
||||
case HTTP_URI_TOO_LONG :
|
||||
return ("URI Too Long");
|
||||
case HTTP_UPGRADE_REQUIRED :
|
||||
return ("Upgrade Required");
|
||||
case HTTP_NOT_IMPLEMENTED :
|
||||
return ("Not Implemented");
|
||||
case HTTP_NOT_SUPPORTED :
|
||||
return ("Not Supported");
|
||||
default :
|
||||
return ("Unknown");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetDateString()' - Get a formatted date/time string from a time value.
|
||||
*/
|
||||
@@ -1480,7 +1683,7 @@ httpUpdate(http_t *http) /* I - HTTP data */
|
||||
#endif /* HAVE_LIBSSL */
|
||||
|
||||
|
||||
DEBUG_printf(("httpUpdate(%p)\n", http));
|
||||
DEBUG_printf(("httpUpdate(%08x)\n", http));
|
||||
|
||||
/*
|
||||
* If we haven't issued any commands, then there is nothing to "update"...
|
||||
@@ -1755,7 +1958,7 @@ httpEncode64(char *out, /* I - String to write to */
|
||||
int /* O - Content length */
|
||||
httpGetLength(http_t *http) /* I - HTTP data */
|
||||
{
|
||||
DEBUG_printf(("httpGetLength(%p)\n", http));
|
||||
DEBUG_printf(("httpGetLength(%08x)\n", http));
|
||||
|
||||
if (strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked") == 0)
|
||||
{
|
||||
|
||||
+3
-11
@@ -4,7 +4,7 @@
|
||||
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_HTTP_H_
|
||||
@@ -46,9 +44,7 @@
|
||||
# include <arpa/inet.h>
|
||||
# include <netinet/in_systm.h>
|
||||
# include <netinet/ip.h>
|
||||
# if !defined(__APPLE__) || !defined(TCP_NODELAY)
|
||||
# include <netinet/tcp.h>
|
||||
# endif /* !__APPLE__ || !TCP_NODELAY */
|
||||
# include <netinet/tcp.h>
|
||||
# endif /* WIN32 */
|
||||
|
||||
# include "md5.h"
|
||||
@@ -312,11 +308,7 @@ extern int httpHead(http_t *http, const char *uri);
|
||||
extern void httpInitialize(void);
|
||||
extern int httpOptions(http_t *http, const char *uri);
|
||||
extern int httpPost(http_t *http, const char *uri);
|
||||
extern int httpPrintf(http_t *http, const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern int httpPrintf(http_t *http, const char *format, ...);
|
||||
extern int httpPut(http_t *http, const char *uri);
|
||||
extern int httpRead(http_t *http, char *buffer, int length);
|
||||
extern int httpReconnect(http_t *http);
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Internet Printing Protocol support functions for the Common UNIX
|
||||
* Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ippErrorString() - Return a textual message for the given error
|
||||
* message.
|
||||
* ippPort() - Return the default IPP port number.
|
||||
* ippSetPort() - Set the default port number.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "string.h"
|
||||
#include "language.h"
|
||||
|
||||
#include "ipp.h"
|
||||
#include "debug.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static int ipp_port = 0;
|
||||
|
||||
|
||||
/*
|
||||
* 'ippErrorString()' - Return a textual message for the given error message.
|
||||
*/
|
||||
|
||||
const char * /* O - Text string */
|
||||
ippErrorString(ipp_status_t error) /* I - Error status */
|
||||
{
|
||||
static char unknown[255]; /* Unknown error statuses */
|
||||
static const char *status_oks[] = /* "OK" status codes */
|
||||
{
|
||||
"successful-ok",
|
||||
"successful-ok-ignored-or-substituted-attributes",
|
||||
"successful-ok-conflicting-attributes",
|
||||
"successful-ok-ignored-subscriptions",
|
||||
"successful-ok-ignored-notifications",
|
||||
"successful-ok-too-many-events",
|
||||
"successful-ok-but-cancel-subscription"
|
||||
},
|
||||
*status_400s[] = /* Client errors */
|
||||
{
|
||||
"client-error-bad-request",
|
||||
"client-error-forbidden",
|
||||
"client-error-not-authenticated",
|
||||
"client-error-not-authorized",
|
||||
"client-error-not-possible",
|
||||
"client-error-timeout",
|
||||
"client-error-not-found",
|
||||
"client-error-gone",
|
||||
"client-error-request-entity-too-large",
|
||||
"client-error-request-value-too-long",
|
||||
"client-error-document-format-not-supported",
|
||||
"client-error-attributes-or-values-not-supported",
|
||||
"client-error-uri-scheme-not-supported",
|
||||
"client-error-charset-not-supported",
|
||||
"client-error-conflicting-attributes",
|
||||
"client-error-compression-not-supported",
|
||||
"client-error-compression-error",
|
||||
"client-error-document-format-error",
|
||||
"client-error-document-access-error",
|
||||
"client-error-attributes-not-settable",
|
||||
"client-error-ignored-all-subscriptions",
|
||||
"client-error-too-many-subscriptions",
|
||||
"client-error-ignored-all-notifications",
|
||||
"client-error-print-support-file-not-found"
|
||||
},
|
||||
*status_500s[] = /* Server errors */
|
||||
{
|
||||
"server-error-internal-error",
|
||||
"server-error-operation-not-supported",
|
||||
"server-error-service-unavailable",
|
||||
"server-error-version-not-supported",
|
||||
"server-error-device-error",
|
||||
"server-error-temporary-error",
|
||||
"server-error-not-accepting-jobs",
|
||||
"server-error-busy",
|
||||
"server-error-job-canceled",
|
||||
"server-error-multiple-document-jobs-not-supported",
|
||||
"server-error-printer-is-deactivated"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* See if the error code is a known value...
|
||||
*/
|
||||
|
||||
if (error >= IPP_OK && error <= IPP_OK_BUT_CANCEL_SUBSCRIPTION)
|
||||
return (status_oks[error]);
|
||||
else if (error == IPP_REDIRECTION_OTHER_SITE)
|
||||
return ("redirection-other-site");
|
||||
else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND)
|
||||
return (status_400s[error - IPP_BAD_REQUEST]);
|
||||
else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED)
|
||||
return (status_500s[error - IPP_INTERNAL_ERROR]);
|
||||
|
||||
/*
|
||||
* No, build an "unknown-xxxx" error string...
|
||||
*/
|
||||
|
||||
sprintf(unknown, "unknown-%04x", error);
|
||||
|
||||
return (unknown);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippPort()' - Return the default IPP port number.
|
||||
*/
|
||||
|
||||
int /* O - Port number */
|
||||
ippPort(void)
|
||||
{
|
||||
const char *server_port; /* SERVER_PORT environment variable */
|
||||
struct servent *port; /* Port number info */
|
||||
|
||||
|
||||
if (ipp_port)
|
||||
return (ipp_port);
|
||||
else if ((server_port = getenv("IPP_PORT")) != NULL)
|
||||
return (ipp_port = atoi(server_port));
|
||||
else if ((port = getservbyname("ipp", NULL)) == NULL)
|
||||
return (ipp_port = IPP_PORT);
|
||||
else
|
||||
return (ipp_port = ntohs(port->s_port));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippSetPort()' - Set the default port number.
|
||||
*/
|
||||
|
||||
void
|
||||
ippSetPort(int p) /* I - Port number to use */
|
||||
{
|
||||
ipp_port = p;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+162
-201
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Internet Printing Protocol object functions for the Common UNIX
|
||||
* Internet Printing Protocol support functions for the Common UNIX
|
||||
* Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -22,8 +22,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ippAddBoolean() - Add a boolean attribute to an IPP request.
|
||||
@@ -41,11 +39,15 @@
|
||||
* ippDateToTime() - Convert from RFC 1903 Date/Time format to UNIX
|
||||
* time in seconds.
|
||||
* ippDelete() - Delete an IPP request.
|
||||
* ippErrorString() - Return a textual message for the given error
|
||||
* message.
|
||||
* ippFindAttribute() - Find a named attribute in a request...
|
||||
* ippFindNextAttribute() - Find the next named attribute in a request...
|
||||
* ippLength() - Compute the length of an IPP request.
|
||||
* ippNew() - Allocate a new IPP request.
|
||||
* ippPort() - Return the default IPP port number.
|
||||
* ippRead() - Read data for an IPP request.
|
||||
* ippSetPort() - Set the default port number.
|
||||
* ippTimeToDate() - Convert from UNIX time to RFC 1903 format.
|
||||
* ippWrite() - Write data for an IPP request.
|
||||
* _ipp_add_attr() - Add a new attribute to the request.
|
||||
@@ -67,6 +69,13 @@
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static int ipp_port = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
@@ -264,17 +273,6 @@ ippAddString(ipp_t *ipp, /* I - IPP request */
|
||||
if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Force value to be English for the POSIX locale...
|
||||
*/
|
||||
|
||||
if (type == IPP_TAG_LANGUAGE && strcasecmp(value, "C") == 0)
|
||||
value = "en";
|
||||
|
||||
/*
|
||||
* Initialize the attribute data...
|
||||
*/
|
||||
|
||||
attr->name = strdup(name);
|
||||
attr->group_tag = group;
|
||||
attr->value_tag = type;
|
||||
@@ -283,13 +281,13 @@ ippAddString(ipp_t *ipp, /* I - IPP request */
|
||||
attr->values[0].string.text = ((int)type & IPP_TAG_COPY) ? (char *)value :
|
||||
value ? strdup(value) : NULL;
|
||||
|
||||
/*
|
||||
* Convert language values to lowercase and change _ to - as needed...
|
||||
*/
|
||||
|
||||
if ((type == IPP_TAG_LANGUAGE || type == IPP_TAG_CHARSET) &&
|
||||
attr->values[0].string.text)
|
||||
{
|
||||
/*
|
||||
* Convert to lowercase and change _ to - as needed...
|
||||
*/
|
||||
|
||||
char *p;
|
||||
|
||||
|
||||
@@ -328,10 +326,6 @@ ippAddStrings(ipp_t *ipp, /* I - IPP request */
|
||||
if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Initialize the attribute data...
|
||||
*/
|
||||
|
||||
attr->name = strdup(name);
|
||||
attr->group_tag = group;
|
||||
attr->value_tag = type;
|
||||
@@ -347,18 +341,8 @@ ippAddStrings(ipp_t *ipp, /* I - IPP request */
|
||||
value->string.charset = attr->values[0].string.charset;
|
||||
|
||||
if (values != NULL)
|
||||
{
|
||||
/*
|
||||
* Force language to be English for the POSIX locale...
|
||||
*/
|
||||
|
||||
if (type == IPP_TAG_LANGUAGE && strcasecmp(values[i], "C") == 0)
|
||||
value->string.text = ((int)type & IPP_TAG_COPY) ? "en" :
|
||||
strdup("en");
|
||||
else
|
||||
value->string.text = ((int)type & IPP_TAG_COPY) ? (char *)values[i] :
|
||||
strdup(values[i]);
|
||||
}
|
||||
value->string.text = ((int)type & IPP_TAG_COPY) ? (char *)values[i] :
|
||||
strdup(values[i]);
|
||||
}
|
||||
|
||||
return (attr);
|
||||
@@ -609,6 +593,90 @@ ippDelete(ipp_t *ipp) /* I - IPP request */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippErrorString()' - Return a textual message for the given error message.
|
||||
*/
|
||||
|
||||
const char * /* O - Text string */
|
||||
ippErrorString(ipp_status_t error) /* I - Error status */
|
||||
{
|
||||
static char unknown[255]; /* Unknown error statuses */
|
||||
static const char *status_oks[] = /* "OK" status codes */
|
||||
{
|
||||
"successful-ok",
|
||||
"successful-ok-ignored-or-substituted-attributes",
|
||||
"successful-ok-conflicting-attributes",
|
||||
"successful-ok-ignored-subscriptions",
|
||||
"successful-ok-ignored-notifications",
|
||||
"successful-ok-too-many-events",
|
||||
"successful-ok-but-cancel-subscription"
|
||||
},
|
||||
*status_400s[] = /* Client errors */
|
||||
{
|
||||
"client-error-bad-request",
|
||||
"client-error-forbidden",
|
||||
"client-error-not-authenticated",
|
||||
"client-error-not-authorized",
|
||||
"client-error-not-possible",
|
||||
"client-error-timeout",
|
||||
"client-error-not-found",
|
||||
"client-error-gone",
|
||||
"client-error-request-entity-too-large",
|
||||
"client-error-request-value-too-long",
|
||||
"client-error-document-format-not-supported",
|
||||
"client-error-attributes-or-values-not-supported",
|
||||
"client-error-uri-scheme-not-supported",
|
||||
"client-error-charset-not-supported",
|
||||
"client-error-conflicting-attributes",
|
||||
"client-error-compression-not-supported",
|
||||
"client-error-compression-error",
|
||||
"client-error-document-format-error",
|
||||
"client-error-document-access-error",
|
||||
"client-error-attributes-not-settable",
|
||||
"client-error-ignored-all-subscriptions",
|
||||
"client-error-too-many-subscriptions",
|
||||
"client-error-ignored-all-notifications",
|
||||
"client-error-print-support-file-not-found"
|
||||
},
|
||||
*status_500s[] = /* Server errors */
|
||||
{
|
||||
"server-error-internal-error",
|
||||
"server-error-operation-not-supported",
|
||||
"server-error-service-unavailable",
|
||||
"server-error-version-not-supported",
|
||||
"server-error-device-error",
|
||||
"server-error-temporary-error",
|
||||
"server-error-not-accepting-jobs",
|
||||
"server-error-busy",
|
||||
"server-error-job-canceled",
|
||||
"server-error-multiple-document-jobs-not-supported",
|
||||
"server-error-printer-is-deactivated"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* See if the error code is a known value...
|
||||
*/
|
||||
|
||||
if (error >= IPP_OK && error <= IPP_OK_BUT_CANCEL_SUBSCRIPTION)
|
||||
return (status_oks[error]);
|
||||
else if (error == IPP_REDIRECTION_OTHER_SITE)
|
||||
return ("redirection-other-site");
|
||||
else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND)
|
||||
return (status_400s[error - IPP_BAD_REQUEST]);
|
||||
else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED)
|
||||
return (status_500s[error - IPP_INTERNAL_ERROR]);
|
||||
|
||||
/*
|
||||
* No, build an "unknown-xxxx" error string...
|
||||
*/
|
||||
|
||||
sprintf(unknown, "unknown-%04x", error);
|
||||
|
||||
return (unknown);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippFindAttribute()' - Find a named attribute in a request...
|
||||
*/
|
||||
@@ -755,8 +823,7 @@ ippLength(ipp_t *ipp) /* I - IPP request */
|
||||
for (i = 0, value = attr->values;
|
||||
i < attr->num_values;
|
||||
i ++, value ++)
|
||||
if (value->string.text != NULL)
|
||||
bytes += strlen(value->string.text);
|
||||
bytes += strlen(value->string.text);
|
||||
break;
|
||||
|
||||
case IPP_TAG_DATE :
|
||||
@@ -774,17 +841,11 @@ ippLength(ipp_t *ipp) /* I - IPP request */
|
||||
case IPP_TAG_TEXTLANG :
|
||||
case IPP_TAG_NAMELANG :
|
||||
bytes += 4 * attr->num_values;/* Charset + text length */
|
||||
|
||||
for (i = 0, value = attr->values;
|
||||
i < attr->num_values;
|
||||
i ++, value ++)
|
||||
{
|
||||
if (value->string.charset != NULL)
|
||||
bytes += strlen(value->string.charset);
|
||||
|
||||
if (value->string.text != NULL)
|
||||
bytes += strlen(value->string.text);
|
||||
}
|
||||
bytes += strlen(value->string.charset) +
|
||||
strlen(value->string.text);
|
||||
break;
|
||||
|
||||
default :
|
||||
@@ -841,7 +902,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
ipp_t *ipp) /* I - IPP data */
|
||||
{
|
||||
int n; /* Length of data */
|
||||
unsigned char buffer[32768], /* Data buffer */
|
||||
unsigned char buffer[8192], /* Data buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
ipp_tag_t tag; /* Current tag */
|
||||
@@ -954,12 +1015,6 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
|
||||
n = (buffer[0] << 8) | buffer[1];
|
||||
|
||||
if (n > (sizeof(buffer) - 1))
|
||||
{
|
||||
DEBUG_printf(("ippRead: bad name length %d!\n", n));
|
||||
return (IPP_ERROR);
|
||||
}
|
||||
|
||||
DEBUG_printf(("ippRead: name length = %d\n", n));
|
||||
|
||||
if (n == 0)
|
||||
@@ -1090,7 +1145,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
case IPP_TAG_MIMETYPE :
|
||||
value->string.text = calloc(n + 1, 1);
|
||||
|
||||
if (ipp_read(http, (unsigned char *)value->string.text, n) < n)
|
||||
if (ipp_read(http, value->string.text, n) < n)
|
||||
return (IPP_ERROR);
|
||||
|
||||
DEBUG_printf(("ippRead: value = \'%s\'\n",
|
||||
@@ -1126,12 +1181,6 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
break;
|
||||
case IPP_TAG_TEXTLANG :
|
||||
case IPP_TAG_NAMELANG :
|
||||
if (n > sizeof(buffer) || n < 4)
|
||||
{
|
||||
DEBUG_printf(("ippRead: bad value length %d!\n", n));
|
||||
return (IPP_ERROR);
|
||||
}
|
||||
|
||||
if (ipp_read(http, buffer, n) < n)
|
||||
return (IPP_ERROR);
|
||||
|
||||
@@ -1255,7 +1304,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int n; /* Length of data */
|
||||
unsigned char buffer[32768], /* Data buffer */
|
||||
unsigned char buffer[8192], /* Data buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
ipp_value_t *value; /* Current value */
|
||||
@@ -1271,12 +1320,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
|
||||
case IPP_HEADER :
|
||||
/*
|
||||
* Send the request header:
|
||||
*
|
||||
* Version = 2 bytes
|
||||
* Operation/Status Code = 2 bytes
|
||||
* Request ID = 4 bytes
|
||||
* Total = 8 bytes
|
||||
* Send the request header...
|
||||
*/
|
||||
|
||||
bufptr = buffer;
|
||||
@@ -1296,11 +1340,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
return (IPP_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the state engine to point to the first attribute
|
||||
* in the request/response, with no current group.
|
||||
*/
|
||||
|
||||
ipp->state = IPP_ATTRIBUTE;
|
||||
ipp->current = ipp->attrs;
|
||||
ipp->curtag = IPP_TAG_ZERO;
|
||||
@@ -1331,7 +1370,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
if (ipp->curtag != attr->group_tag)
|
||||
{
|
||||
/*
|
||||
* Send a group tag byte...
|
||||
* Send a group operation tag...
|
||||
*/
|
||||
|
||||
ipp->curtag = attr->group_tag;
|
||||
@@ -1343,36 +1382,18 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = attr->group_tag;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the length of the attribute name, and make sure it won't
|
||||
* overflow the buffer...
|
||||
*/
|
||||
|
||||
if ((n = strlen(attr->name)) > (sizeof(buffer) - 4))
|
||||
if ((n = strlen(attr->name)) > (sizeof(buffer) - 3))
|
||||
return (IPP_ERROR);
|
||||
|
||||
DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
|
||||
DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
|
||||
|
||||
/*
|
||||
* Write the attribute tag and name. The current implementation
|
||||
* does not support the extension value tags above 0x7f, so all
|
||||
* value tags are 1 byte.
|
||||
*
|
||||
* The attribute name length does not include the trailing nul
|
||||
* character in the source string.
|
||||
*/
|
||||
|
||||
*bufptr++ = attr->value_tag;
|
||||
*bufptr++ = n >> 8;
|
||||
*bufptr++ = n;
|
||||
memcpy(bufptr, attr->name, n);
|
||||
bufptr += n;
|
||||
|
||||
/*
|
||||
* Now write the attribute value(s)...
|
||||
*/
|
||||
|
||||
switch (attr->value_tag & ~IPP_TAG_COPY)
|
||||
{
|
||||
case IPP_TAG_INTEGER :
|
||||
@@ -1404,13 +1425,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Integers and enumerations are both 4-byte signed
|
||||
* (twos-complement) values.
|
||||
*
|
||||
* Put the 2-byte length and 4-byte value into the buffer...
|
||||
*/
|
||||
|
||||
*bufptr++ = 0;
|
||||
*bufptr++ = 4;
|
||||
*bufptr++ = value->integer >> 24;
|
||||
@@ -1448,12 +1462,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Boolean values are 1-byte; 0 = false, 1 = true.
|
||||
*
|
||||
* Put the 2-byte length and 1-byte value into the buffer...
|
||||
*/
|
||||
|
||||
*bufptr++ = 0;
|
||||
*bufptr++ = 1;
|
||||
*bufptr++ = value->boolean;
|
||||
@@ -1500,20 +1508,9 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* All simple strings consist of the 2-byte length and
|
||||
* character data without the trailing nul normally found
|
||||
* in C strings. Also, strings cannot be longer than 32767
|
||||
* bytes since the 2-byte length is a signed (twos-complement)
|
||||
* value.
|
||||
*/
|
||||
n = strlen(value->string.text);
|
||||
|
||||
if (value->string.text != NULL)
|
||||
n = strlen(value->string.text);
|
||||
else
|
||||
n = 0;
|
||||
|
||||
if (n > (sizeof(buffer) - 2))
|
||||
if (n > sizeof(buffer))
|
||||
return (IPP_ERROR);
|
||||
|
||||
DEBUG_printf(("ippWrite: writing string = %d, \'%s\'\n", n,
|
||||
@@ -1530,19 +1527,10 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
bufptr = buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Put the 2-byte length and string characters in the
|
||||
* buffer.
|
||||
*/
|
||||
|
||||
*bufptr++ = n >> 8;
|
||||
*bufptr++ = n;
|
||||
|
||||
if (n > 0)
|
||||
{
|
||||
memcpy(bufptr, value->string.text, n);
|
||||
bufptr += n;
|
||||
}
|
||||
memcpy(bufptr, value->string.text, n);
|
||||
bufptr += n;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1574,14 +1562,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Date values consist of a 2-byte length and an
|
||||
* 11-byte date/time structure defined by RFC 1903.
|
||||
*
|
||||
* Put the 2-byte length and 11-byte date/time
|
||||
* structure in the buffer.
|
||||
*/
|
||||
|
||||
*bufptr++ = 0;
|
||||
*bufptr++ = 11;
|
||||
memcpy(bufptr, value->date, 11);
|
||||
@@ -1617,15 +1597,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Resolution values consist of a 2-byte length,
|
||||
* 4-byte horizontal resolution value, 4-byte vertical
|
||||
* resolution value, and a 1-byte units value.
|
||||
*
|
||||
* Put the 2-byte length and resolution value data
|
||||
* into the buffer.
|
||||
*/
|
||||
|
||||
*bufptr++ = 0;
|
||||
*bufptr++ = 9;
|
||||
*bufptr++ = value->resolution.xres >> 24;
|
||||
@@ -1668,14 +1639,6 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Range values consist of a 2-byte length,
|
||||
* 4-byte lower value, and 4-byte upper value.
|
||||
*
|
||||
* Put the 2-byte length and range value data
|
||||
* into the buffer.
|
||||
*/
|
||||
|
||||
*bufptr++ = 0;
|
||||
*bufptr++ = 8;
|
||||
*bufptr++ = value->range.lower >> 24;
|
||||
@@ -1718,25 +1681,11 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* textWithLanguage and nameWithLanguage values consist
|
||||
* of a 2-byte length for both strings and their
|
||||
* individual lengths, a 2-byte length for the
|
||||
* character string, the character string without the
|
||||
* trailing nul, a 2-byte length for the character
|
||||
* set string, and the character set string without
|
||||
* the trailing nul.
|
||||
*/
|
||||
n = strlen(value->string.charset) +
|
||||
strlen(value->string.text) +
|
||||
4;
|
||||
|
||||
n = 4;
|
||||
|
||||
if (value->string.charset != NULL)
|
||||
n += strlen(value->string.charset);
|
||||
|
||||
if (value->string.text != NULL)
|
||||
n += strlen(value->string.text);
|
||||
|
||||
if (n > (sizeof(buffer) - 2))
|
||||
if (n > sizeof(buffer))
|
||||
return (IPP_ERROR);
|
||||
|
||||
if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2))
|
||||
@@ -1755,36 +1704,22 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = n;
|
||||
|
||||
/* Length of charset */
|
||||
if (value->string.charset != NULL)
|
||||
n = strlen(value->string.charset);
|
||||
else
|
||||
n = 0;
|
||||
|
||||
n = strlen(value->string.charset);
|
||||
*bufptr++ = n >> 8;
|
||||
*bufptr++ = n;
|
||||
|
||||
/* Charset */
|
||||
if (n > 0)
|
||||
{
|
||||
memcpy(bufptr, value->string.charset, n);
|
||||
bufptr += n;
|
||||
}
|
||||
memcpy(bufptr, value->string.charset, n);
|
||||
bufptr += n;
|
||||
|
||||
/* Length of text */
|
||||
if (value->string.text != NULL)
|
||||
n = strlen(value->string.text);
|
||||
else
|
||||
n = 0;
|
||||
|
||||
n = strlen(value->string.text);
|
||||
*bufptr++ = n >> 8;
|
||||
*bufptr++ = n;
|
||||
|
||||
/* Text */
|
||||
if (n > 0)
|
||||
{
|
||||
memcpy(bufptr, value->string.text, n);
|
||||
bufptr += n;
|
||||
}
|
||||
memcpy(bufptr, value->string.text, n);
|
||||
bufptr += n;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1816,16 +1751,9 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* An unknown value might just be a collection value,
|
||||
* or some new value that a vendor has come up with.
|
||||
* It consists of a 2-byte length and the bytes in
|
||||
* the unknown value buffer.
|
||||
*/
|
||||
|
||||
n = value->unknown.length;
|
||||
|
||||
if (n > (sizeof(buffer) - 2))
|
||||
if (n > sizeof(buffer))
|
||||
return (IPP_ERROR);
|
||||
|
||||
if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2))
|
||||
@@ -1901,6 +1829,39 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippPort()' - Return the default IPP port number.
|
||||
*/
|
||||
|
||||
int /* O - Port number */
|
||||
ippPort(void)
|
||||
{
|
||||
const char *server_port; /* SERVER_PORT environment variable */
|
||||
struct servent *port; /* Port number info */
|
||||
|
||||
|
||||
if (ipp_port)
|
||||
return (ipp_port);
|
||||
else if ((server_port = getenv("IPP_PORT")) != NULL)
|
||||
return (ipp_port = atoi(server_port));
|
||||
else if ((port = getservbyname("ipp", NULL)) == NULL)
|
||||
return (ipp_port = IPP_PORT);
|
||||
else
|
||||
return (ipp_port = ntohs(port->s_port));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippSetPort()' - Set the default port number.
|
||||
*/
|
||||
|
||||
void
|
||||
ippSetPort(int p) /* I - Port number to use */
|
||||
{
|
||||
ipp_port = p;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_ipp_add_attr()' - Add a new attribute to the request.
|
||||
*/
|
||||
@@ -2031,7 +1992,7 @@ ipp_read(http_t *http, /* I - Client connection */
|
||||
http->data_remaining -= bytes;
|
||||
|
||||
if (http->used > 0)
|
||||
memmove(http->buffer, http->buffer + bytes, http->used);
|
||||
memcpy(http->buffer, http->buffer + bytes, http->used);
|
||||
|
||||
if (http->data_remaining == 0)
|
||||
{
|
||||
@@ -2047,7 +2008,7 @@ ipp_read(http_t *http, /* I - Client connection */
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((bytes = httpRead(http, (char *)buffer, length - tbytes)) < 0)
|
||||
else if ((bytes = httpRead(http, (char *)buffer, length - tbytes)) <= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -4,7 +4,7 @@
|
||||
* Internet Printing Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_IPP_H_
|
||||
@@ -48,7 +46,7 @@ extern "C" {
|
||||
* IPP version string...
|
||||
*/
|
||||
|
||||
# define IPP_VERSION "\001\001"
|
||||
# define IPP_VERSION "\001\000"
|
||||
|
||||
/*
|
||||
* IPP registered port number... This is the default value - applications
|
||||
|
||||
+33
-30
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* I18N/language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsLangEncoding() - Return the character encoding (us-ascii, etc.)
|
||||
@@ -148,7 +146,6 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
{
|
||||
int i, count; /* Looping vars */
|
||||
char langname[32], /* Requested language name */
|
||||
*langptr, /* Pointer into language name */
|
||||
real[32], /* Real language name */
|
||||
*realptr, /* Pointer into real language name */
|
||||
filename[1024], /* Filename for language locale file */
|
||||
@@ -177,7 +174,8 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
* Copy the locale string over safely...
|
||||
*/
|
||||
|
||||
strlcpy(langname, language, sizeof(langname));
|
||||
strncpy(langname, language, sizeof(langname) - 1);
|
||||
langname[sizeof(langname) - 1] = '\0';
|
||||
}
|
||||
|
||||
if (strlen(langname) < 2)
|
||||
@@ -192,42 +190,43 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
|
||||
real[0] = tolower(langname[0]);
|
||||
real[1] = tolower(langname[1]);
|
||||
realptr = real + 2;
|
||||
langptr = langname + 2;
|
||||
|
||||
if (*langptr == '_' || *langptr == '-')
|
||||
count = 2;
|
||||
|
||||
if (langname[count] == '_' || langname[count] == '-')
|
||||
{
|
||||
/*
|
||||
* Add country code...
|
||||
*/
|
||||
|
||||
*realptr++ = '_';
|
||||
langptr ++;
|
||||
real[count] = '_';
|
||||
real[count + 1] = toupper(langname[count + 1]);
|
||||
real[count + 2] = toupper(langname[count + 2]);
|
||||
|
||||
*realptr++ = toupper(*langptr++);
|
||||
*realptr++ = toupper(*langptr++);
|
||||
count += 3;
|
||||
}
|
||||
|
||||
if (*langptr == '.')
|
||||
if (langname[count] == '.')
|
||||
{
|
||||
/*
|
||||
* Add charset...
|
||||
*/
|
||||
|
||||
*langptr++ = '\0';
|
||||
*realptr++ = '.';
|
||||
strncpy(real + count, langname + count, sizeof(real) - count - 1);
|
||||
langname[count] = '\0';
|
||||
count += strlen(langname + count);
|
||||
|
||||
while (*langptr)
|
||||
{
|
||||
if ((realptr - real) < (sizeof(real) - 1) &&
|
||||
*langptr != '-' && *langptr != '_')
|
||||
*realptr++ = tolower(*langptr++);
|
||||
else
|
||||
langptr ++;
|
||||
}
|
||||
/*
|
||||
* Make sure count stays within the bounds of langname and real
|
||||
* (both vars are the same size...)
|
||||
*/
|
||||
|
||||
if (count >= sizeof(real))
|
||||
count = sizeof(real) - 1;
|
||||
}
|
||||
|
||||
*realptr = '\0';
|
||||
langname[count] = '\0';
|
||||
real[count] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -253,7 +252,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
if ((localedir = getenv("LOCALEDIR")) == NULL)
|
||||
localedir = CUPS_LOCALEDIR;
|
||||
|
||||
for (fp = NULL; fp == NULL;)
|
||||
do
|
||||
{
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir,
|
||||
real, real);
|
||||
@@ -264,10 +263,9 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*realptr = '\0';
|
||||
else if ((realptr = strchr(real, '_')) != NULL)
|
||||
*realptr = '\0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (fp == NULL && strchr(real, '_') != NULL && strchr(real, '.') != NULL);
|
||||
|
||||
/*
|
||||
* OK, we have an open messages file; the first line will contain the
|
||||
@@ -288,7 +286,10 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
if (fp == NULL)
|
||||
strlcpy(line, lang_default[0], sizeof(line));
|
||||
{
|
||||
strncpy(line, lang_default[0], sizeof(line) - 1);
|
||||
line[sizeof(line) - 1] = '\0';
|
||||
}
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -345,7 +346,8 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
lang->used ++;
|
||||
strlcpy(lang->language, langname, sizeof(lang->language));
|
||||
strncpy(lang->language, langname, sizeof(lang->language) - 1);
|
||||
lang->language[sizeof(lang->language) - 1] = '\0';
|
||||
|
||||
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
|
||||
if (strcmp(lang_encodings[i], line) == 0)
|
||||
@@ -372,7 +374,8 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
if (lang_default[count] == NULL)
|
||||
break;
|
||||
|
||||
strlcpy(line, lang_default[count], sizeof(line));
|
||||
strncpy(line, lang_default[count], sizeof(line) - 1);
|
||||
/* Already set last byte to 0 above... */
|
||||
}
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
break;
|
||||
|
||||
+3
-7
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Multi-language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -20,8 +20,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_LANGUAGE_H_
|
||||
@@ -152,8 +150,6 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_TOP,
|
||||
CUPS_MSG_FILENAME,
|
||||
CUPS_MSG_PRINT,
|
||||
CUPS_MSG_OPTIONS_INSTALLED,
|
||||
CUPS_MSG_AUTO,
|
||||
CUPS_MSG_HTTP_BASE = 200,
|
||||
CUPS_MSG_HTTP_END = 505,
|
||||
CUPS_MSG_MAX
|
||||
@@ -205,11 +201,11 @@ typedef struct cups_lang_str /**** Language Cache Structure ****/
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
# if defined(WIN32) || defined(__EMX__) || defined(__APPLE__)
|
||||
# if defined(WIN32) || defined(__EMX__)
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_ALL, ""))
|
||||
# else
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_MESSAGES, ""))
|
||||
# endif /* WIN32 || __EMX__ || __APPLE__ */
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
extern char *cupsLangEncoding(cups_lang_t *lang);
|
||||
extern void cupsLangFlush(void);
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option marking routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,6 @@
|
||||
*
|
||||
* PostScript is a trademark of Adobe Systems, Inc.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ppdConflicts() - Check to see if there are any conflicts.
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MD5 password support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* httpMD5() - Compute the MD5 sum of the username:group:password.
|
||||
|
||||
+32
-56
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsAddOption() - Add an option to an option array.
|
||||
@@ -308,12 +306,11 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t *options) /* I - Options */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int conflict; /* Option conflicts */
|
||||
char *val, /* Pointer into value */
|
||||
*ptr, /* Pointer into string */
|
||||
s[255]; /* Temporary string */
|
||||
cups_option_t *optptr; /* Current option */
|
||||
int i; /* Looping var */
|
||||
int conflict; /* Option conflicts */
|
||||
char *val, /* Pointer into value */
|
||||
*ptr, /* Pointer into string */
|
||||
s[255]; /* Temporary string */
|
||||
|
||||
|
||||
/*
|
||||
@@ -329,15 +326,15 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
|
||||
conflict = 0;
|
||||
|
||||
for (i = num_options, optptr = options; i > 0; i --, optptr ++)
|
||||
if (strcasecmp(optptr->name, "media") == 0)
|
||||
for (i = num_options; i > 0; i --, options ++)
|
||||
if (strcasecmp(options->name, "media") == 0)
|
||||
{
|
||||
/*
|
||||
* Loop through the option string, separating it at commas and
|
||||
* marking each individual option.
|
||||
*/
|
||||
|
||||
for (val = optptr->value; *val;)
|
||||
for (val = options->value; *val;)
|
||||
{
|
||||
/*
|
||||
* Extract the sub-option from the string...
|
||||
@@ -354,42 +351,22 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
* Mark it...
|
||||
*/
|
||||
|
||||
if (cupsGetOption("PageSize", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "PageSize", s))
|
||||
conflict = 1;
|
||||
|
||||
if (cupsGetOption("InputSlot", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "InputSlot", s))
|
||||
conflict = 1;
|
||||
|
||||
if (cupsGetOption("MediaType", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "MediaType", s))
|
||||
conflict = 1;
|
||||
|
||||
if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "EFMediaQualityMode", s)) /* EFI */
|
||||
conflict = 1;
|
||||
|
||||
if (strcasecmp(s, "manual") == 0 &&
|
||||
cupsGetOption("ManualFeed", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "PageSize", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "InputSlot", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "MediaType", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "EFMediaQualityMode", s)) /* EFI */
|
||||
conflict = 1;
|
||||
if (strcasecmp(s, "manual") == 0)
|
||||
if (ppdMarkOption(ppd, "ManualFeed", "True"))
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(optptr->name, "sides") == 0)
|
||||
else if (strcasecmp(options->name, "sides") == 0)
|
||||
{
|
||||
if (cupsGetOption("Duplex", num_options, options) != NULL ||
|
||||
cupsGetOption("JCLDuplex", num_options, options) != NULL ||
|
||||
cupsGetOption("EFDuplex", num_options, options) != NULL ||
|
||||
cupsGetOption("KD03Duplex", num_options, options) != NULL)
|
||||
{
|
||||
/*
|
||||
* Don't override the PPD option with the IPP attribute...
|
||||
*/
|
||||
|
||||
continue;
|
||||
}
|
||||
else if (strcasecmp(optptr->value, "one-sided") == 0)
|
||||
if (strcasecmp(options->value, "one-sided") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "None"))
|
||||
conflict = 1;
|
||||
@@ -400,7 +377,7 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "None")) /* Kodak */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(optptr->value, "two-sided-long-edge") == 0)
|
||||
else if (strcasecmp(options->value, "two-sided-long-edge") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "DuplexNoTumble"))
|
||||
conflict = 1;
|
||||
@@ -411,7 +388,7 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexNoTumble")) /* Kodak */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(optptr->value, "two-sided-short-edge") == 0)
|
||||
else if (strcasecmp(options->value, "two-sided-short-edge") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "DuplexTumble"))
|
||||
conflict = 1;
|
||||
@@ -423,26 +400,25 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(optptr->name, "resolution") == 0 ||
|
||||
strcasecmp(optptr->name, "printer-resolution") == 0)
|
||||
else if (strcasecmp(options->name, "resolution") == 0 ||
|
||||
strcasecmp(options->name, "printer-resolution") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Resolution", optptr->value))
|
||||
if (ppdMarkOption(ppd, "Resolution", options->value))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "SetResolution", optptr->value))
|
||||
if (ppdMarkOption(ppd, "SetResolution", options->value))
|
||||
/* Calcomp, Linotype, QMS, Summagraphics, Tektronix, Varityper */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "JCLResolution", optptr->value)) /* HP */
|
||||
if (ppdMarkOption(ppd, "JCLResolution", options->value)) /* HP */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "CNRes_PGP", optptr->value)) /* Canon */
|
||||
if (ppdMarkOption(ppd, "CNRes_PGP", options->value)) /* Canon */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(optptr->name, "output-bin") == 0)
|
||||
else if (strcasecmp(options->name, "output-bin") == 0)
|
||||
{
|
||||
if (cupsGetOption("OutputBin", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "OutputBin", optptr->value))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "OutputBin", options->value))
|
||||
conflict = 1;
|
||||
}
|
||||
else if (ppdMarkOption(ppd, optptr->name, optptr->value))
|
||||
else if (ppdMarkOption(ppd, options->name, options->value))
|
||||
conflict = 1;
|
||||
|
||||
return (conflict);
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Page size functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,6 @@
|
||||
*
|
||||
* PostScript is a trademark of Adobe Systems, Inc.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ppdPageSize() - Get the page size record for the given size.
|
||||
|
||||
+83
-368
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD file routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -30,8 +30,6 @@
|
||||
* GhostScript (or its derivatives) is governed by the CUPS license
|
||||
* agreement.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ppdClose() - Free all memory used by the PPD file.
|
||||
@@ -45,6 +43,7 @@
|
||||
* compare_strings() - Compare two strings.
|
||||
* compare_groups() - Compare two groups.
|
||||
* compare_options() - Compare two options.
|
||||
* compare_choices() - Compare two choices.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -83,19 +82,14 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
#ifndef __APPLE__
|
||||
static int compare_strings(char *s, char *t);
|
||||
static int compare_groups(ppd_group_t *g0, ppd_group_t *g1);
|
||||
static int compare_options(ppd_option_t *o0, ppd_option_t *o1);
|
||||
#endif /* !__APPLE__ */
|
||||
static int compare_choices(ppd_choice_t *c0, ppd_choice_t *c1);
|
||||
static int ppd_read(FILE *fp, char *keyword, char *option,
|
||||
char *text, char **string);
|
||||
static void ppd_decode(char *string);
|
||||
#ifdef __APPLE__
|
||||
# define ppd_fix(s)
|
||||
#else
|
||||
static void ppd_fix(char *string);
|
||||
#endif /* __APPLE__ */
|
||||
static void ppd_free_group(ppd_group_t *group);
|
||||
static void ppd_free_option(ppd_option_t *option);
|
||||
static ppd_group_t *ppd_get_group(ppd_file_t *ppd, char *name);
|
||||
@@ -314,7 +308,7 @@ ppd_get_group(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd->num_groups ++;
|
||||
|
||||
memset(group, 0, sizeof(ppd_group_t));
|
||||
strlcpy(group->text, name, sizeof(group->text));
|
||||
strncpy(group->text, name, sizeof(group->text) - 1);
|
||||
}
|
||||
|
||||
return (group);
|
||||
@@ -353,7 +347,7 @@ ppd_get_option(ppd_group_t *group, /* I - Group */
|
||||
group->num_options ++;
|
||||
|
||||
memset(option, 0, sizeof(ppd_option_t));
|
||||
strlcpy(option->keyword, name, sizeof(option->keyword));
|
||||
strncpy(option->keyword, name, sizeof(option->keyword) - 1);
|
||||
}
|
||||
|
||||
return (option);
|
||||
@@ -385,7 +379,7 @@ ppd_add_choice(ppd_option_t *option, /* I - Option */
|
||||
option->num_choices ++;
|
||||
|
||||
memset(choice, 0, sizeof(ppd_choice_t));
|
||||
strlcpy(choice->choice, name, sizeof(choice->choice));
|
||||
strncpy(choice->choice, name, sizeof(choice->choice) - 1);
|
||||
|
||||
return (choice);
|
||||
}
|
||||
@@ -415,7 +409,7 @@ ppd_add_size(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd->num_sizes ++;
|
||||
|
||||
memset(size, 0, sizeof(ppd_size_t));
|
||||
strlcpy(size->name, name, sizeof(size->name));
|
||||
strncpy(size->name, name, sizeof(size->name) - 1);
|
||||
|
||||
return (size);
|
||||
}
|
||||
@@ -428,7 +422,6 @@ ppd_add_size(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd_file_t * /* O - PPD file record */
|
||||
ppdOpen(FILE *fp) /* I - File to read from */
|
||||
{
|
||||
char *oldlocale; /* Old locale settings */
|
||||
int i, j, k, m; /* Looping vars */
|
||||
int count; /* Temporary count */
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
@@ -443,7 +436,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
/* Keyword from file */
|
||||
name[PPD_MAX_NAME],
|
||||
/* Option from file */
|
||||
text[PPD_MAX_LINE],
|
||||
text[PPD_MAX_TEXT],
|
||||
/* Human-readable text from file */
|
||||
*string, /* Code/text from file */
|
||||
*sptr, /* Pointer into string */
|
||||
@@ -457,6 +450,12 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
cups_lang_t *language; /* Default language */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default language for the user...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -483,7 +482,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
DEBUG_printf(("ppdOpen: keyword = %s, string = %p\n", keyword, string));
|
||||
DEBUG_printf(("ppdOpen: keyword = %s, string = %08x\n", keyword, string));
|
||||
|
||||
safe_free(string);
|
||||
|
||||
@@ -497,19 +496,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd->language_level = 1;
|
||||
ppd->color_device = 0;
|
||||
ppd->colorspace = PPD_CS_GRAY;
|
||||
ppd->landscape = -90;
|
||||
|
||||
/*
|
||||
* Get the default language for the user...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
oldlocale = setlocale(LC_NUMERIC, "C");
|
||||
#else
|
||||
oldlocale = setlocale(LC_ALL, "C");
|
||||
#endif /* LC_NUMERIC */
|
||||
ppd->landscape = 90;
|
||||
|
||||
/*
|
||||
* Read lines from the PPD file and add them to the file record...
|
||||
@@ -534,7 +521,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (string != NULL)
|
||||
{
|
||||
if (strlen(string) > 40)
|
||||
printf(", string = %p", string);
|
||||
printf(", string = %08x", string);
|
||||
else
|
||||
printf(", string = \"%s\"", string);
|
||||
}
|
||||
@@ -554,15 +541,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -666,8 +644,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd->num_profiles ++;
|
||||
|
||||
memset(profile, 0, sizeof(ppd_profile_t));
|
||||
strlcpy(profile->resolution, name, sizeof(profile->resolution));
|
||||
strlcpy(profile->media_type, text, sizeof(profile->media_type));
|
||||
strncpy(profile->resolution, name, sizeof(profile->resolution) - 1);
|
||||
strncpy(profile->media_type, text, sizeof(profile->media_type) - 1);
|
||||
sscanf(string, "%f%f%f%f%f%f%f%f%f%f%f", &(profile->density),
|
||||
&(profile->gamma),
|
||||
profile->matrix[0] + 0, profile->matrix[0] + 1,
|
||||
@@ -686,17 +664,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (filter == NULL)
|
||||
{
|
||||
safe_free(filter);
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -728,17 +696,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (tempfonts == NULL)
|
||||
{
|
||||
safe_free(string);
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -772,34 +730,14 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((option = ppd_get_option(temp, "PageSize")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
@@ -807,22 +745,12 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strlcpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text));
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
option = NULL;
|
||||
}
|
||||
else if (strcmp(keyword, "MaxMediaWidth") == 0)
|
||||
@@ -869,38 +797,16 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to get general group!");
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((option = ppd_get_option(temp, "PageSize")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to get PageSize option!");
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
@@ -908,62 +814,29 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to add Custom choice!");
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strlcpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text));
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
option = NULL;
|
||||
}
|
||||
|
||||
if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to find PageSize option!");
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((choice = ppdFindChoice(option, "Custom")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to find Custom choice!");
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -975,7 +848,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
{
|
||||
if (strcmp(string, "Minus90") == 0)
|
||||
ppd->landscape = -90;
|
||||
else if (strcmp(string, "Plus90") == 0)
|
||||
else
|
||||
ppd->landscape = 90;
|
||||
}
|
||||
else if (strcmp(keyword, "Emulators") == 0)
|
||||
@@ -1040,18 +913,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
strlen(string) + 1);
|
||||
if (temp == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1097,18 +960,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (group == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1121,18 +974,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (option == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1149,28 +992,28 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (text[0])
|
||||
{
|
||||
strlcpy(option->text, text, sizeof(option->text));
|
||||
strncpy(option->text, text, sizeof(option->text) - 1);
|
||||
ppd_fix(option->text);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp(name, "PageSize") == 0)
|
||||
strlcpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SIZE),
|
||||
sizeof(option->text));
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SIZE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "MediaType") == 0)
|
||||
strlcpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_TYPE),
|
||||
sizeof(option->text));
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_TYPE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "InputSlot") == 0)
|
||||
strlcpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SOURCE),
|
||||
sizeof(option->text));
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SOURCE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "ColorModel") == 0)
|
||||
strlcpy(option->text, cupsLangString(language, CUPS_MSG_OUTPUT_MODE),
|
||||
sizeof(option->text));
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_OUTPUT_MODE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "Resolution") == 0)
|
||||
strlcpy(option->text, cupsLangString(language, CUPS_MSG_RESOLUTION),
|
||||
sizeof(option->text));
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_RESOLUTION),
|
||||
sizeof(option->text) - 1);
|
||||
else
|
||||
strlcpy(option->text, name, sizeof(option->text));
|
||||
strncpy(option->text, name, sizeof(option->text) - 1);
|
||||
}
|
||||
|
||||
option->section = PPD_ORDER_ANY;
|
||||
@@ -1186,17 +1029,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (group == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1212,17 +1045,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (option == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1237,7 +1060,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else
|
||||
option->ui = PPD_UI_PICKONE;
|
||||
|
||||
strlcpy(option->text, text, sizeof(option->text));
|
||||
strncpy(option->text, text, sizeof(option->text) - 1);
|
||||
|
||||
option->section = PPD_ORDER_JCL;
|
||||
group = NULL;
|
||||
@@ -1254,47 +1077,16 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (group != NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (strncasecmp(string, "InstallableOptions", 18) == 0)
|
||||
{
|
||||
/*
|
||||
* Handle the InstallableOptions group differently than other
|
||||
* groups; this is necessary so that UIs can correctly
|
||||
* isolate them from normal user options.
|
||||
*
|
||||
* In CUPS 1.2 we have separate text and keyword fields,
|
||||
* so this "hack" won't be needed...
|
||||
*/
|
||||
if (strchr(string, '/') != NULL) /* Just show human readable text */
|
||||
strcpy(string, strchr(string, '/') + 1);
|
||||
|
||||
group = ppd_get_group(ppd, "InstallableOptions");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* For all other groups, just use the human readable text...
|
||||
*/
|
||||
|
||||
if (strchr(string, '/') != NULL)
|
||||
strcpy(string, strchr(string, '/') + 1);
|
||||
|
||||
ppd_decode(string);
|
||||
ppd_fix(string);
|
||||
|
||||
group = ppd_get_group(ppd, string);
|
||||
}
|
||||
ppd_decode(string);
|
||||
ppd_fix(string);
|
||||
group = ppd_get_group(ppd, string);
|
||||
}
|
||||
else if (strcmp(keyword, "CloseGroup") == 0)
|
||||
group = NULL;
|
||||
@@ -1304,17 +1096,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (sscanf(string, "%f%40s%40s", &order, name, keyword) != 3)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1387,13 +1169,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
for (i = 0; i < temp->num_options; i ++)
|
||||
if (strcmp(keyword, temp->options[i].keyword) == 0)
|
||||
{
|
||||
strlcpy(temp->options[i].defchoice, string,
|
||||
sizeof(temp->options[i].defchoice));
|
||||
strncpy(temp->options[i].defchoice, string,
|
||||
sizeof(temp->options[i].defchoice) - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (strcmp(keyword + 7, option->keyword) == 0)
|
||||
strlcpy(option->defchoice, string, sizeof(option->defchoice));
|
||||
else
|
||||
strncpy(option->defchoice, string, sizeof(option->defchoice) - 1);
|
||||
}
|
||||
else if (strcmp(keyword, "UIConstraints") == 0 ||
|
||||
strcmp(keyword, "NonUIConstraints") == 0)
|
||||
@@ -1406,18 +1188,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (constraint == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1498,17 +1270,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1526,17 +1288,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
|
||||
safe_free(string);
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1545,8 +1297,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
}
|
||||
else if (option != NULL &&
|
||||
(mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) ==
|
||||
(PPD_KEYWORD | PPD_OPTION | PPD_STRING) &&
|
||||
strcmp(keyword, option->keyword) == 0)
|
||||
(PPD_KEYWORD | PPD_OPTION | PPD_STRING))
|
||||
{
|
||||
DEBUG_printf(("group = %p, subgroup = %p\n", group, subgroup));
|
||||
|
||||
@@ -1568,7 +1319,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (mask & PPD_TEXT)
|
||||
{
|
||||
strlcpy(choice->text, text, sizeof(choice->text));
|
||||
strncpy(choice->text, text, sizeof(choice->text) - 1);
|
||||
ppd_fix(choice->text);
|
||||
}
|
||||
else if (strcmp(name, "True") == 0)
|
||||
@@ -1576,9 +1327,9 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else if (strcmp(name, "False") == 0)
|
||||
strcpy(choice->text, "No");
|
||||
else
|
||||
strlcpy(choice->text, name, sizeof(choice->text));
|
||||
strncpy(choice->text, name, sizeof(choice->text) - 1);
|
||||
|
||||
if (option->section == PPD_ORDER_JCL)
|
||||
if (strncmp(keyword, "JCL", 3) == 0)
|
||||
ppd_decode(string); /* Decode quoted string */
|
||||
|
||||
choice->code = string;
|
||||
@@ -1590,98 +1341,57 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
#ifdef DEBUG
|
||||
if (!feof(fp))
|
||||
printf("Premature EOF at %lu...\n", (unsigned long)ftell(fp));
|
||||
printf("Premature EOF at %d...\n", ftell(fp));
|
||||
#endif /* DEBUG */
|
||||
|
||||
#ifndef __APPLE__
|
||||
/*
|
||||
* Make sure that all PPD files with an InputSlot option have an
|
||||
* "auto" choice that maps to no specific tray or media type.
|
||||
*/
|
||||
|
||||
if ((option = ppdFindOption(ppd, "InputSlot")) != NULL)
|
||||
{
|
||||
for (i = 0; i < option->num_choices; i ++)
|
||||
if (option->choices[i].code == NULL || !option->choices[i].code[0])
|
||||
break;
|
||||
|
||||
if (i >= option->num_choices)
|
||||
{
|
||||
/*
|
||||
* No "auto" input slot, add one...
|
||||
*/
|
||||
|
||||
choice = ppd_add_choice(option, "Auto");
|
||||
|
||||
strlcpy(choice->text, cupsLangString(language, CUPS_MSG_AUTO),
|
||||
sizeof(choice->text));
|
||||
choice->code = NULL;
|
||||
}
|
||||
}
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
/*
|
||||
* Set the option back-pointer for each choice...
|
||||
*/
|
||||
|
||||
#ifndef __APPLE__
|
||||
qsort(ppd->groups, ppd->num_groups, sizeof(ppd_group_t),
|
||||
(int (*)(const void *, const void *))compare_groups);
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
for (i = ppd->num_groups, group = ppd->groups;
|
||||
i > 0;
|
||||
i --, group ++)
|
||||
{
|
||||
#ifndef __APPLE__
|
||||
qsort(group->options, group->num_options, sizeof(ppd_option_t),
|
||||
(int (*)(const void *, const void *))compare_options);
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
for (j = group->num_options, option = group->options;
|
||||
j > 0;
|
||||
j --, option ++)
|
||||
{
|
||||
qsort(option->choices, option->num_choices, sizeof(ppd_choice_t),
|
||||
(int (*)(const void *, const void *))compare_choices);
|
||||
|
||||
for (k = 0; k < option->num_choices; k ++)
|
||||
option->choices[k].option = (void *)option;
|
||||
}
|
||||
|
||||
#ifndef __APPLE__
|
||||
qsort(group->subgroups, group->num_subgroups, sizeof(ppd_group_t),
|
||||
(int (*)(const void *, const void *))compare_groups);
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
for (j = group->num_subgroups, subgroup = group->subgroups;
|
||||
j > 0;
|
||||
j --, subgroup ++)
|
||||
{
|
||||
#ifndef __APPLE__
|
||||
qsort(subgroup->options, subgroup->num_options, sizeof(ppd_option_t),
|
||||
(int (*)(const void *, const void *))compare_options);
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
for (k = group->num_options, option = group->options;
|
||||
k > 0;
|
||||
k --, option ++)
|
||||
{
|
||||
qsort(option->choices, option->num_choices, sizeof(ppd_choice_t),
|
||||
(int (*)(const void *, const void *))compare_choices);
|
||||
|
||||
for (m = 0; m < option->num_choices; m ++)
|
||||
option->choices[m].option = (void *)option;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset language preferences...
|
||||
*/
|
||||
|
||||
cupsLangFree(language);
|
||||
|
||||
#ifdef LC_NUMERIC
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
#else
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#endif /* LC_NUMERIC */
|
||||
|
||||
return (ppd);
|
||||
}
|
||||
|
||||
@@ -1758,7 +1468,6 @@ ppdOpenFile(const char *filename) /* I - File to read from */
|
||||
}
|
||||
|
||||
|
||||
#ifndef __APPLE__
|
||||
/*
|
||||
* 'compare_strings()' - Compare two strings.
|
||||
*/
|
||||
@@ -1890,7 +1599,18 @@ compare_options(ppd_option_t *o0,/* I - First option */
|
||||
{
|
||||
return (compare_strings(o0->text, o1->text));
|
||||
}
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'compare_choices()' - Compare two choices.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
compare_choices(ppd_choice_t *c0,/* I - First choice */
|
||||
ppd_choice_t *c1)/* I - Second choice */
|
||||
{
|
||||
return (compare_strings(c0->text, c1->text));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@@ -1980,7 +1700,7 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
*lineptr++ = ch;
|
||||
|
||||
if (ch == ':' && strncmp(line, "*%", 2) != 0)
|
||||
if (ch == ':')
|
||||
colon = 1;
|
||||
|
||||
if (ch == '\"' && colon)
|
||||
@@ -2001,8 +1721,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
ch = getc(fp);
|
||||
if (ch != '\n')
|
||||
ungetc(ch, fp);
|
||||
|
||||
ch = '\n';
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2089,9 +1807,9 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
keyptr = keyword;
|
||||
|
||||
while (*lineptr != '\0' && *lineptr != ':' && !isspace(*lineptr))
|
||||
if ((keyptr - keyword) < (PPD_MAX_NAME - 1))
|
||||
*keyptr++ = *lineptr++;
|
||||
while (*lineptr != '\0' && *lineptr != ':' && !isspace(*lineptr) &&
|
||||
(keyptr - keyword) < (PPD_MAX_NAME - 1))
|
||||
*keyptr++ = *lineptr++;
|
||||
|
||||
*keyptr = '\0';
|
||||
|
||||
@@ -2114,9 +1832,8 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
optptr = option;
|
||||
|
||||
while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':' &&
|
||||
*lineptr != '/')
|
||||
if ((optptr - option) < (PPD_MAX_NAME - 1))
|
||||
*optptr++ = *lineptr++;
|
||||
*lineptr != '/' && (optptr - option) < 40)
|
||||
*optptr++ = *lineptr++;
|
||||
|
||||
*optptr = '\0';
|
||||
mask |= PPD_OPTION;
|
||||
@@ -2133,9 +1850,9 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
textptr = text;
|
||||
|
||||
while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':')
|
||||
if ((textptr - text) < (PPD_MAX_LINE - 1))
|
||||
*textptr++ = *lineptr++;
|
||||
while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':' &&
|
||||
(textptr - text) < (PPD_MAX_TEXT - 1))
|
||||
*textptr++ = *lineptr++;
|
||||
|
||||
*textptr = '\0';
|
||||
ppd_decode(text);
|
||||
@@ -2232,7 +1949,6 @@ ppd_decode(char *string) /* I - String to decode */
|
||||
}
|
||||
|
||||
|
||||
#ifndef __APPLE__
|
||||
/*
|
||||
* 'ppd_fix()' - Fix WinANSI characters in the range 0x80 to 0x9f to be
|
||||
* valid ISO-8859-1 characters...
|
||||
@@ -2283,7 +1999,6 @@ ppd_fix(char *string) /* IO - String to fix */
|
||||
if (*p >= 0x80 && *p < 0xa0)
|
||||
*p = lut[*p - 0x80];
|
||||
}
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+1
-3
@@ -4,7 +4,7 @@
|
||||
* PostScript Printer Description definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -30,8 +30,6 @@
|
||||
* (or any derivative of it) with software other than GNU
|
||||
* GhostScript (or its derivatives) is governed by the CUPS license
|
||||
* agreement.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_PPD_H_
|
||||
|
||||
+32
-51
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* snprintf functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,12 +21,10 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cups_vsnprintf() - Format a string into a fixed size buffer.
|
||||
* cups_snprintf() - Format a string into a fixed size buffer.
|
||||
* vsnprintf() - Format a string into a fixed size buffer.
|
||||
* snprintf() - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -40,27 +38,28 @@
|
||||
|
||||
#ifndef HAVE_VSNPRINTF
|
||||
/*
|
||||
* 'cups_vsnprintf()' - Format a string into a fixed size buffer.
|
||||
* 'vsnprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
cups_vsnprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
int /* O - Number of bytes formatted */
|
||||
vsnprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
char *bufptr, /* Pointer to position in buffer */
|
||||
*bufend, /* Pointer to end of buffer */
|
||||
sign, /* Sign of format width */
|
||||
size, /* Size character (h, l, L) */
|
||||
type; /* Format type character */
|
||||
const char *bufformat; /* Start of format */
|
||||
int width, /* Width of field */
|
||||
prec; /* Number of characters of precision */
|
||||
char tformat[100], /* Temporary format string for sprintf() */
|
||||
temp[1024]; /* Buffer for formatted numbers */
|
||||
char *s; /* Pointer to string */
|
||||
int slen; /* Length of string */
|
||||
char *bufptr, /* Pointer to position in buffer */
|
||||
*bufend, /* Pointer to end of buffer */
|
||||
sign, /* Sign of format width */
|
||||
size, /* Size character (h, l, L) */
|
||||
type; /* Format type character */
|
||||
const char *bufformat; /* Start of format */
|
||||
int width, /* Width of field */
|
||||
prec; /* Number of characters of precision */
|
||||
char tformat[100], /* Temporary format string for sprintf() */
|
||||
temp[1024]; /* Buffer for formatted numbers */
|
||||
int *chars; /* Pointer to integer for %p */
|
||||
char *s; /* Pointer to string */
|
||||
int slen; /* Length of string */
|
||||
|
||||
|
||||
/*
|
||||
@@ -175,26 +174,8 @@ cups_vsnprintf(char *buffer, /* O - Output buffer */
|
||||
break;
|
||||
|
||||
case 'p' : /* Pointer value */
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, void *));
|
||||
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
if ((chars = va_arg(ap, int *)) != NULL)
|
||||
*chars = bufptr - buffer;
|
||||
break;
|
||||
|
||||
case 'c' : /* Character or character array */
|
||||
@@ -278,17 +259,17 @@ cups_vsnprintf(char *buffer, /* O - Output buffer */
|
||||
|
||||
#ifndef HAVE_SNPRINTF
|
||||
/*
|
||||
* 'cups_snprintf()' - Format a string into a fixed size buffer.
|
||||
* 'snprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
cups_snprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
int /* O - Number of bytes formatted */
|
||||
snprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
int bytes; /* Number of bytes formatted */
|
||||
va_list ap; /* Pointer to additional arguments */
|
||||
int bytes; /* Number of bytes formatted */
|
||||
va_list ap; /* Pointer to additional arguments */
|
||||
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
+21
-106
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* String functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,15 +21,11 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cups_strdup() - Duplicate a string.
|
||||
* cups_strcasecmp() - Do a case-insensitive comparison.
|
||||
* cups_strncasecmp() - Do a case-insensitive comparison on up to N chars.
|
||||
* cups_strlcat() - Safely concatenate two strings.
|
||||
* cups_strlcpy() - Safely copy two strings.
|
||||
* strdup() - Duplicate a string.
|
||||
* strcasecmp() - Do a case-insensitive comparison.
|
||||
* strncasecmp() - Do a case-insensitive comparison on up to N chars.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -40,14 +36,14 @@
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_strdup()' - Duplicate a string.
|
||||
* 'strdup()' - Duplicate a string.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
char * /* O - New string pointer */
|
||||
cups_strdup(const char *s) /* I - String to duplicate */
|
||||
# ifndef HAVE_STRDUP
|
||||
char * /* O - New string pointer */
|
||||
strdup(const char *s) /* I - String to duplicate */
|
||||
{
|
||||
char *t; /* New string pointer */
|
||||
char *t; /* New string pointer */
|
||||
|
||||
|
||||
if (s == NULL)
|
||||
@@ -58,17 +54,17 @@ cups_strdup(const char *s) /* I - String to duplicate */
|
||||
|
||||
return (strcpy(t, s));
|
||||
}
|
||||
#endif /* !HAVE_STRDUP */
|
||||
# endif /* !HAVE_STRDUP */
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_strcasecmp()' - Do a case-insensitive comparison.
|
||||
* 'strcasecmp()' - Do a case-insensitive comparison.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRCASECMP
|
||||
# ifndef HAVE_STRCASECMP
|
||||
int /* O - Result of comparison (-1, 0, or 1) */
|
||||
cups_strcasecmp(const char *s, /* I - First string */
|
||||
const char *t) /* I - Second string */
|
||||
strcasecmp(const char *s, /* I - First string */
|
||||
const char *t) /* I - Second string */
|
||||
{
|
||||
while (*s != '\0' && *t != '\0')
|
||||
{
|
||||
@@ -88,17 +84,17 @@ cups_strcasecmp(const char *s, /* I - First string */
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
#endif /* !HAVE_STRCASECMP */
|
||||
# endif /* !HAVE_STRCASECMP */
|
||||
|
||||
/*
|
||||
* 'cups_strncasecmp()' - Do a case-insensitive comparison on up to N chars.
|
||||
* 'strncasecmp()' - Do a case-insensitive comparison on up to N chars.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRNCASECMP
|
||||
# ifndef HAVE_STRNCASECMP
|
||||
int /* O - Result of comparison (-1, 0, or 1) */
|
||||
cups_strncasecmp(const char *s, /* I - First string */
|
||||
const char *t, /* I - Second string */
|
||||
size_t n) /* I - Maximum number of characters to compare */
|
||||
strncasecmp(const char *s, /* I - First string */
|
||||
const char *t, /* I - Second string */
|
||||
size_t n) /* I - Maximum number of characters to compare */
|
||||
{
|
||||
while (*s != '\0' && *t != '\0' && n > 0)
|
||||
{
|
||||
@@ -121,88 +117,7 @@ cups_strncasecmp(const char *s, /* I - First string */
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
#endif /* !HAVE_STRNCASECMP */
|
||||
|
||||
|
||||
#ifndef HAVE_STRLCAT
|
||||
/*
|
||||
* 'cups_strlcat()' - Safely concatenate two strings.
|
||||
*/
|
||||
|
||||
size_t /* O - Length of string */
|
||||
cups_strlcat(char *dst, /* O - Destination string */
|
||||
const char *src, /* I - Source string */
|
||||
size_t size) /* I - Size of destination string buffer */
|
||||
{
|
||||
size_t srclen; /* Length of source string */
|
||||
size_t dstlen; /* Length of destination string */
|
||||
|
||||
|
||||
/*
|
||||
* Figure out how much room is left...
|
||||
*/
|
||||
|
||||
dstlen = strlen(dst);
|
||||
size -= dstlen + 1;
|
||||
|
||||
if (!size)
|
||||
return (dstlen); /* No room, return immediately... */
|
||||
|
||||
/*
|
||||
* Figure out how much room is needed...
|
||||
*/
|
||||
|
||||
srclen = strlen(src);
|
||||
|
||||
/*
|
||||
* Copy the appropriate amount...
|
||||
*/
|
||||
|
||||
if (srclen > size)
|
||||
srclen = size;
|
||||
|
||||
memcpy(dst + dstlen, src, srclen);
|
||||
dst[dstlen + srclen] = '\0';
|
||||
|
||||
return (dstlen + srclen);
|
||||
}
|
||||
#endif /* !HAVE_STRLCAT */
|
||||
|
||||
|
||||
#ifndef HAVE_STRLCPY
|
||||
/*
|
||||
* 'cups_strlcpy()' - Safely copy two strings.
|
||||
*/
|
||||
|
||||
size_t /* O - Length of string */
|
||||
cups_strlcpy(char *dst, /* O - Destination string */
|
||||
const char *src, /* I - Source string */
|
||||
size_t size) /* I - Size of destination string buffer */
|
||||
{
|
||||
size_t srclen; /* Length of source string */
|
||||
|
||||
|
||||
/*
|
||||
* Figure out how much room is needed...
|
||||
*/
|
||||
|
||||
size --;
|
||||
|
||||
srclen = strlen(src);
|
||||
|
||||
/*
|
||||
* Copy the appropriate amount...
|
||||
*/
|
||||
|
||||
if (srclen > size)
|
||||
srclen = size;
|
||||
|
||||
memcpy(dst, src, srclen);
|
||||
dst[srclen] = '\0';
|
||||
|
||||
return (srclen);
|
||||
}
|
||||
#endif /* !HAVE_STRLCPY */
|
||||
# endif /* !HAVE_STRNCASECMP */
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+6
-31
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* String definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -20,8 +20,6 @@
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_STRING_H_
|
||||
@@ -45,10 +43,6 @@
|
||||
# include <strings.h>
|
||||
# endif /* HAVE_STRINGS_H */
|
||||
|
||||
# ifdef HAVE_BSTRING_H
|
||||
# include <bstring.h>
|
||||
# endif /* HAVE_BSTRING_H */
|
||||
|
||||
|
||||
/*
|
||||
* Stuff for WIN32 and OS/2...
|
||||
@@ -74,42 +68,23 @@ extern "C" {
|
||||
*/
|
||||
|
||||
# ifndef HAVE_STRDUP
|
||||
extern char *cups_strdup(const char *);
|
||||
# define strdup cups_strdup
|
||||
extern char *strdup(const char *);
|
||||
# endif /* !HAVE_STRDUP */
|
||||
|
||||
# ifndef HAVE_STRCASECMP
|
||||
extern int cups_strcasecmp(const char *, const char *);
|
||||
# define strcasecmp cups_strcasecmp
|
||||
extern int strcasecmp(const char *, const char *);
|
||||
# endif /* !HAVE_STRCASECMP */
|
||||
|
||||
# ifndef HAVE_STRNCASECMP
|
||||
extern int cups_strncasecmp(const char *, const char *, size_t n);
|
||||
# define strncasecmp cups_strncasecmp
|
||||
extern int strncasecmp(const char *, const char *, size_t n);
|
||||
# endif /* !HAVE_STRNCASECMP */
|
||||
|
||||
# ifndef HAVE_STRLCAT
|
||||
extern size_t cups_strlcat(char *, const char *, size_t);
|
||||
# define strlcat cups_strlcat
|
||||
# endif /* !HAVE_STRLCAT */
|
||||
|
||||
# ifndef HAVE_STRLCPY
|
||||
extern size_t cups_strlcpy(char *, const char *, size_t);
|
||||
# define strlcpy cups_strlcpy
|
||||
# endif /* !HAVE_STRLCPY */
|
||||
|
||||
# ifndef HAVE_SNPRINTF
|
||||
extern int cups_snprintf(char *, size_t, const char *, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
# define snprintf cups_snprintf
|
||||
extern int snprintf(char *, size_t, const char *, ...);
|
||||
# endif /* !HAVE_SNPRINTF */
|
||||
|
||||
# ifndef HAVE_VSNPRINTF
|
||||
extern int cups_vsnprintf(char *, size_t, const char *, va_list);
|
||||
# define vsnprintf cups_vsnprintf
|
||||
extern int vsnprintf(char *, size_t, const char *, va_list);
|
||||
# endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
|
||||
|
||||
+7
-15
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Temp file utilities for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsTempFd() - Create a temporary file.
|
||||
@@ -57,7 +55,6 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
int len) /* I - Size of buffer */
|
||||
{
|
||||
int fd; /* File descriptor for temp file */
|
||||
int tries; /* Number of tries */
|
||||
#ifdef WIN32
|
||||
char tmpdir[1024]; /* Windows temporary directory */
|
||||
DWORD curtime; /* Current time */
|
||||
@@ -102,8 +99,6 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
* Make the temporary name using the specified directory...
|
||||
*/
|
||||
|
||||
tries = 0;
|
||||
|
||||
do
|
||||
{
|
||||
#ifdef WIN32
|
||||
@@ -111,14 +106,13 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
* Get the current time of day...
|
||||
*/
|
||||
|
||||
curtime = GetTickCount() + tries;
|
||||
curtime = GetTickCount();
|
||||
|
||||
/*
|
||||
* Format a string using the hex time values...
|
||||
*/
|
||||
|
||||
snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir,
|
||||
GetCurrentProcessId(), curtime);
|
||||
snprintf(filename, len - 1, "%s/%08lx", tmpdir, curtime);
|
||||
#else
|
||||
/*
|
||||
* Get the current time of day...
|
||||
@@ -131,7 +125,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
*/
|
||||
|
||||
snprintf(filename, len - 1, "%s/%08lx%05lx", tmpdir,
|
||||
(unsigned long)curtime.tv_sec, (unsigned long)curtime.tv_usec);
|
||||
curtime.tv_sec, curtime.tv_usec);
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*
|
||||
@@ -145,12 +139,10 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
#endif /* O_NOFOLLOW */
|
||||
|
||||
if (fd < 0 && errno != EEXIST)
|
||||
break;
|
||||
|
||||
tries ++;
|
||||
if (fd < 0 && (errno == EPERM || errno == ENOENT))
|
||||
break; /* Stop immediately if permission denied or the dir doesn't exist! */
|
||||
}
|
||||
while (fd < 0 && tries < 1000);
|
||||
while (fd < 0);
|
||||
|
||||
/*
|
||||
* Return the file descriptor...
|
||||
|
||||
+1
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* HTTP test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -21,8 +21,6 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry.
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* HTTP test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2003 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Load the specified language and show the strings for yes and no.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "language.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Load the specified language and show the strings for yes and no.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
cups_lang_t *language; /* Message catalog */
|
||||
static const char *charsets[] = /* Character sets */
|
||||
{
|
||||
"us-ascii",
|
||||
"iso-8859-1",
|
||||
"iso-8859-2",
|
||||
"iso-8859-3",
|
||||
"iso-8859-4",
|
||||
"iso-8859-5",
|
||||
"iso-8859-6",
|
||||
"iso-8859-7",
|
||||
"iso-8859-8",
|
||||
"iso-8859-9",
|
||||
"iso-8859-10",
|
||||
"utf-8",
|
||||
"iso8859-13",
|
||||
"iso8859-14",
|
||||
"iso8859-15",
|
||||
"windows-874",
|
||||
"windows-1250",
|
||||
"windows-1251",
|
||||
"windows-1252",
|
||||
"windows-1253",
|
||||
"windows-1254",
|
||||
"windows-1255",
|
||||
"windows-1256",
|
||||
"windows-1257",
|
||||
"windows-1258",
|
||||
"koi8-r",
|
||||
"koi8-u"
|
||||
};
|
||||
|
||||
|
||||
if (argc == 1)
|
||||
language = cupsLangDefault();
|
||||
else
|
||||
language = cupsLangGet(argv[1]);
|
||||
|
||||
printf("Language = \"%s\"\n", language->language);
|
||||
printf("Encoding = \"%s\"\n", charsets[language->encoding]);
|
||||
printf("No = \"%s\"\n", cupsLangString(language, CUPS_MSG_NO));
|
||||
printf("Yes = \"%s\"\n", cupsLangString(language, CUPS_MSG_YES));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -0,0 +1,195 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* PPD test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* PostScript is a trademark of Adobe Systems, Inc.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for test program.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include "string.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Main entry for test program.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i, j, k, m; /* Looping vars */
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
ppd_size_t *size; /* Size record */
|
||||
ppd_group_t *group; /* UI group */
|
||||
ppd_option_t *option; /* Standard UI option */
|
||||
ppd_choice_t *choice; /* Standard UI option choice */
|
||||
static char *uis[] = { "BOOLEAN", "PICKONE", "PICKMANY" };
|
||||
static char *sections[] = { "ANY", "DOCUMENT", "EXIT",
|
||||
"JCL", "PAGE", "PROLOG" };
|
||||
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
/*
|
||||
* Display PPD files for each file listed on the command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
fputs("Usage: ppdtest filename1.ppd [... filenameN.ppd]\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
{
|
||||
if ((ppd = ppdOpenFile(argv[i])) == NULL)
|
||||
{
|
||||
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", argv[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("FILE: %s\n", argv[i]);
|
||||
printf(" language_level = %d\n", ppd->language_level);
|
||||
printf(" color_device = %s\n", ppd->color_device ? "TRUE" : "FALSE");
|
||||
printf(" variable_sizes = %s\n", ppd->variable_sizes ? "TRUE" : "FALSE");
|
||||
printf(" landscape = %d\n", ppd->landscape);
|
||||
|
||||
switch (ppd->colorspace)
|
||||
{
|
||||
case PPD_CS_CMYK :
|
||||
puts(" colorspace = PPD_CS_CMYK");
|
||||
break;
|
||||
case PPD_CS_CMY :
|
||||
puts(" colorspace = PPD_CS_CMY");
|
||||
break;
|
||||
case PPD_CS_GRAY :
|
||||
puts(" colorspace = PPD_CS_GRAY");
|
||||
break;
|
||||
case PPD_CS_RGB :
|
||||
puts(" colorspace = PPD_CS_RGB");
|
||||
break;
|
||||
default :
|
||||
puts(" colorspace = <unknown>");
|
||||
break;
|
||||
}
|
||||
|
||||
printf(" num_emulations = %d\n", ppd->num_emulations);
|
||||
for (j = 0; j < ppd->num_emulations; j ++)
|
||||
printf(" emulations[%d] = %s\n", j, ppd->emulations[j].name);
|
||||
|
||||
printf(" lang_encoding = %s\n", ppd->lang_encoding);
|
||||
printf(" lang_version = %s\n", ppd->lang_version);
|
||||
printf(" modelname = %s\n", ppd->modelname);
|
||||
printf(" ttrasterizer = %s\n",
|
||||
ppd->ttrasterizer == NULL ? "None" : ppd->ttrasterizer);
|
||||
printf(" manufacturer = %s\n", ppd->manufacturer);
|
||||
printf(" product = %s\n", ppd->product);
|
||||
printf(" nickname = %s\n", ppd->nickname);
|
||||
printf(" shortnickname = %s\n", ppd->shortnickname);
|
||||
printf(" patches = %d bytes\n",
|
||||
ppd->patches == NULL ? 0 : (int)strlen(ppd->patches));
|
||||
|
||||
printf(" num_groups = %d\n", ppd->num_groups);
|
||||
for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++)
|
||||
{
|
||||
printf(" group[%d] = %s\n", j, group->text);
|
||||
|
||||
for (k = 0, option = group->options; k < group->num_options; k ++, option ++)
|
||||
{
|
||||
printf(" options[%d] = %s (%s) %s %s %.0f (%d choices)\n", k,
|
||||
option->keyword, option->text, uis[option->ui],
|
||||
sections[option->section], option->order,
|
||||
option->num_choices);
|
||||
|
||||
if (strcmp(option->keyword, "PageSize") == 0 ||
|
||||
strcmp(option->keyword, "PageRegion") == 0)
|
||||
{
|
||||
for (m = option->num_choices, choice = option->choices;
|
||||
m > 0;
|
||||
m --, choice ++)
|
||||
{
|
||||
size = ppdPageSize(ppd, choice->choice);
|
||||
|
||||
if (size == NULL)
|
||||
printf(" %s (%s) = ERROR", choice->choice, choice->text);
|
||||
else
|
||||
printf(" %s (%s) = %.2fx%.2fin (%.1f,%.1f,%.1f,%.1f)", choice->choice,
|
||||
choice->text, size->width / 72.0, size->length / 72.0,
|
||||
size->left / 72.0, size->bottom / 72.0,
|
||||
size->right / 72.0, size->top / 72.0);
|
||||
|
||||
if (strcmp(option->defchoice, choice->choice) == 0)
|
||||
puts(" *");
|
||||
else
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (m = option->num_choices, choice = option->choices;
|
||||
m > 0;
|
||||
m --, choice ++)
|
||||
{
|
||||
printf(" %s (%s)", choice->choice, choice->text);
|
||||
|
||||
if (strcmp(option->defchoice, choice->choice) == 0)
|
||||
puts(" *");
|
||||
else
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf(" num_profiles = %d\n", ppd->num_profiles);
|
||||
for (j = 0; j < ppd->num_profiles; j ++)
|
||||
printf(" profiles[%d] = %s/%s %.3f %.3f [ %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f ]\n",
|
||||
j, ppd->profiles[j].resolution, ppd->profiles[j].media_type,
|
||||
ppd->profiles[j].gamma, ppd->profiles[j].density,
|
||||
ppd->profiles[j].matrix[0][0], ppd->profiles[j].matrix[0][1],
|
||||
ppd->profiles[j].matrix[0][2], ppd->profiles[j].matrix[1][0],
|
||||
ppd->profiles[j].matrix[1][1], ppd->profiles[j].matrix[1][2],
|
||||
ppd->profiles[j].matrix[2][0], ppd->profiles[j].matrix[2][1],
|
||||
ppd->profiles[j].matrix[2][2]);
|
||||
|
||||
printf(" num_fonts = %d\n", ppd->num_fonts);
|
||||
for (j = 0; j < ppd->num_fonts; j ++)
|
||||
printf(" fonts[%d] = %s\n", j, ppd->fonts[j]);
|
||||
|
||||
ppdClose(ppd);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário