Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| d63b19a5da |
@@ -6,4 +6,28 @@ 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
|
||||
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
CGI - CUPS v1.1.19 - 05/27/2003
|
||||
-------------------------------
|
||||
|
||||
This file describes the experimental scripting/CGI support
|
||||
provided by CUPS starting with CUPS 1.1.19.
|
||||
|
||||
WARNING: CGI support is not complete; you may run into problems
|
||||
and limitations in the implementation of CGI in CUPS that are
|
||||
not present in full-featured web servers like Apache.
|
||||
|
||||
|
||||
OVERVIEW OF CGI SUPPORT IN CUPS
|
||||
|
||||
CUPS has traditionally provided a dynamic web interface through
|
||||
four CGI programs that are executed when users open special
|
||||
directories on the CUPS server. Each CGI performs
|
||||
administration, class, job, and printer functions as directed by
|
||||
the user, but the actual programs that are run and functions
|
||||
that are available are limited to those that were originally
|
||||
designed into the scheduler.
|
||||
|
||||
Starting with CUPS 1.1.19, support is now available for CGI
|
||||
programs and specific scripting languages, currently Java, Perl,
|
||||
PHP, and Python. The interpreters for these languages are
|
||||
currently configured at compile time. Future versions may
|
||||
expand the interface to allow for generic support of scripting
|
||||
languages similar to the Apache "AddHandler" directive, but with
|
||||
external programs instead of modules.
|
||||
|
||||
The following MIME types are reserved for the CGI support in
|
||||
CUPS (the names have been chosen to mirror those used by
|
||||
Apache):
|
||||
|
||||
application/x-http-cgi CGI script/program
|
||||
application/x-http-java Java program
|
||||
application/x-http-perl Perl script
|
||||
application/x-http-php PHP script
|
||||
application/x-http-python Python script
|
||||
|
||||
In order to enable the corresponding type, you must create a new
|
||||
/etc/cups/cgi.types file which maps the filename extensions to
|
||||
the appropriate MIME type, for example:
|
||||
|
||||
application/x-http-cgi cgi
|
||||
application/x-http-php php
|
||||
|
||||
CGI scripts/programs (application/x-http-cgi) also must have
|
||||
execution permissions to be treated as a CGI script or program.
|
||||
|
||||
|
||||
LIMITATIONS
|
||||
|
||||
CUPS implements most of the CGI/1.1 specification, with the
|
||||
following limitations:
|
||||
|
||||
- No Location: redirection support.
|
||||
- No PATH_INFO or PATH_TRANSLATED support.
|
||||
- Limited HTTP field support; only the Content-Length
|
||||
(CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent
|
||||
(HTTP_USER_AGENT) fields are placed in environment
|
||||
variables at this time.
|
||||
|
||||
|
||||
REPORTING PROBLEMS
|
||||
|
||||
If you have problems, READ THE DOCUMENTATION FIRST! If the
|
||||
documentation does not solve your problems please send an email
|
||||
to "cups-support@cups.org". Include your operating system and
|
||||
version, compiler and version, and any errors or problems you've
|
||||
run into. The "/var/log/cups/error_log" file should also be sent,
|
||||
as it often helps to determine the cause of your problem.
|
||||
|
||||
If you are running a version of Linux, be sure to provide the
|
||||
Linux distribution you have, too.
|
||||
|
||||
Please note that the "cups-support@cups.org" email address goes
|
||||
to the CUPS developers; they are busy people, so your email may
|
||||
go unanswered for days or weeks. In general, only general build
|
||||
or distribution problems will actually get answered - for
|
||||
end-user support see the "README.txt" for a summary of the
|
||||
resources available.
|
||||
+962
-4
@@ -1,6 +1,965 @@
|
||||
CHANGES.txt - 01/31/2002
|
||||
CHANGES.txt - 05/27/2003
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS V1.1.19
|
||||
|
||||
- The GNU TLS code incorrectly used
|
||||
gnutls_check_pending() instead of
|
||||
gnutls_record_check_pending() (STR #128)
|
||||
- The ppdEmit() functions output "PageSize Custom"
|
||||
instead of "CustomPageSize True" in the DSC comments.
|
||||
Also, the custom page size code did not use the
|
||||
ParamCustomPageSize attributes (STR #127)
|
||||
- The cupstestppd command did not list the conflicting
|
||||
options (STR #123)
|
||||
- The lpq command did not ensure that there was
|
||||
whitespace between the fields in the job listing (STR
|
||||
#117)
|
||||
- The German web templates had errors (STR #119)
|
||||
- The configure script didn't specify the static
|
||||
libraries properly when configuring with the
|
||||
--disable-shared option (STR #104)
|
||||
- The cups.list file used file dependencies for package
|
||||
formats other than portable, RPM, and Debian (STR #98)
|
||||
- cupsLangGet() didn't use its language cache (STR #97)
|
||||
- "lpq -P" would segfault instead of showing a usage
|
||||
message (STR #94)
|
||||
- Fixed compiler warnings in pdftops filter (STR #96)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.19rc5
|
||||
|
||||
- Jobs with banner pages that were printed to implicit
|
||||
classes would get double banner pages for each
|
||||
file/banner in the job (STR #68)
|
||||
- The mime.convs file was missing the filter definition
|
||||
for Windows BMP (image/x-bitmap) files (STR #85)
|
||||
- The scheduler allowed some READ-ONLY job attributes to
|
||||
be set, which could cause the scheduler to fail on the
|
||||
next restart (STR #82)
|
||||
- The lp and lpr commands did not report when the
|
||||
scheduler was not responding; instead, the user would
|
||||
incorrectly see a "no default destination" error (STR
|
||||
#70)
|
||||
- cupsLangGet() could fail on OSX due to a corrupt
|
||||
language preference (STR #78)
|
||||
- Added more checks for HTTP request timeouts.
|
||||
- The scheduler dropped the first non-alpha character
|
||||
after an open brace when doing attribute substitutions
|
||||
in banner pages (STR #77)
|
||||
- The scheduler child might send SIGUSR1 to the parent
|
||||
before the signal handler was installed; this didn't
|
||||
prevent the scheduler from starting but produced an
|
||||
annoying error message (STR #45)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.19rc4
|
||||
|
||||
- The lp command did not accept "-" for printing from
|
||||
the standard input as required by POSIX 1003.1 (STR
|
||||
#59)
|
||||
- Added the job-originating-host-name information for
|
||||
the page_log file documentation in the SAM (STR #31)
|
||||
- The German web interface templates did not use the
|
||||
right paths for job operations (STR #54)
|
||||
- The scheduler would consume all available CPU if
|
||||
started with a pending job in the queue (STR #35)
|
||||
- The polling daemon allocated an extra localization
|
||||
buffer but did not free it, causing cups-polld to
|
||||
eventually use all available memory (STR #40)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.19rc3
|
||||
|
||||
- The scheduler could get in an infinite loop cancelling
|
||||
jobs using "cancel -u user dest" (STR #48)
|
||||
- The "cancel -u user" command did nothing (it should
|
||||
cancel all jobs on all printers owned by the named
|
||||
user - STR #48)
|
||||
- The scheduler would write 0-length job control files
|
||||
(STR #46)
|
||||
- Updated the French man pages (translation provided by
|
||||
Gilles QUERRET)
|
||||
- The scheduler would delete all printers from
|
||||
printers.conf if a job was active when a HUP signal
|
||||
was handled (STR #47)
|
||||
- The cups-polld program would leak memory if it was
|
||||
unable to send browse packets to the loopback
|
||||
interface (STR #40)
|
||||
- The scheduler did not put the
|
||||
job-originating-host-name attribute in the job
|
||||
attributes group.
|
||||
- The text filter did not default to wrapping text as
|
||||
defined by the IPP implementation document.
|
||||
- Scan backends first, PPDs second (STR #37)
|
||||
- Updated the Netatalk documentation in the SAM (STR #38
|
||||
and #39)
|
||||
- The test suite sent text files to a non-PS print queue,
|
||||
which requires ESP Ghostscript (provided separately).
|
||||
Now send the JPEG test file (STR #33)
|
||||
- The test suite did not show the estimated disk space
|
||||
requirements (STR #33)
|
||||
- The test suite did not set the MaxLogSize directive to
|
||||
0 to prevent log file rotation (STR #33)
|
||||
- The test suite still setup the old CUPS Ghostscript
|
||||
symlinks (STR #33)
|
||||
- The pstops filter did not report the correct number of
|
||||
copies for the page_log file when printing collated
|
||||
copies to a printer that doesn't support them in
|
||||
hardware (STR #32)
|
||||
- cupsLangGet() needs to set the CTYPE locale to "C"
|
||||
(POSIX) to avoid erroneous tolower/toupper values (fix
|
||||
suggested by Bjoern Jacke)
|
||||
- Fixed a typo in the cups.list.in file.
|
||||
- Updated all of the Western European locales to default
|
||||
to ISO-8859-15 (for Euro support, suggested by Bjoern
|
||||
Jacke)
|
||||
- Updated the German message catalog (update provided by
|
||||
Bjoern Jacke)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.19rc2
|
||||
|
||||
- cupsLangGet() now sets the encoding field based on the
|
||||
trailing charset in the locale name, and doesn't look
|
||||
for a message catalog in a specific locale.charset
|
||||
directory. This fixes STR #26 and is more in line
|
||||
with the CUPS 1.2 implementation.
|
||||
- The configure script now aborts if the "ar" command or
|
||||
compilers cannot be found.
|
||||
- The static cupsimage library was not built by default.
|
||||
- The path for the "ln" command was hardcoded in
|
||||
Makedefs.in instead of being checked at configure time
|
||||
(STR #28).
|
||||
- Banner pages containing unescaped { characters would
|
||||
not work.
|
||||
- The printer-state-time collection attribute was
|
||||
encoded as an enumeration instead of an integer.
|
||||
- The printer-is-accepting-jobs collection attribute was
|
||||
was not added to the collection value.
|
||||
- The printer-state-sequence-number collection attribute
|
||||
was not added to the collection value.
|
||||
- Fixed typo and const mismatch in IPP backend.
|
||||
- Updated the man pages for the new configuration
|
||||
directives.
|
||||
- Updated the SAM for MacOS 10.2, the CUPS drivers for
|
||||
windows, the available LPD backend options, and the
|
||||
new configuration directives.
|
||||
- The imagetops filter didn't position images properly
|
||||
on the page (STR #18)
|
||||
- The configure script didn't add CPPFLAGS to the
|
||||
compiler options or LDFLAGS to the DSO options (STR
|
||||
#13)
|
||||
- The scheduler would try to write a debug log message
|
||||
when starting a job that contained a NULL string.
|
||||
Since not all versions of snprintf() support NULL
|
||||
string pointers this caused some problems (STR #20)
|
||||
- The testipp program now supports reading of IPP
|
||||
message files such as those used for the job history
|
||||
in /var/spool/cups.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.1.19rc1
|
||||
|
||||
- Added CUPS support files for Java, Perl, and PHP
|
||||
(located in the "scripting" subdirectory...)
|
||||
- The scheduler now supports fast-reloads of the
|
||||
cupsd.conf file when it is updated via HTTP.
|
||||
- The scheduler always changed the ownership of log
|
||||
files; it now only does so if they are not in the /dev
|
||||
directory (i.e. don't want to change the ownership and
|
||||
permissions of /dev/null...)
|
||||
- Added libpaper support (patch from Jeff Licquia)
|
||||
- Added a new istring() rule for MIME types files that
|
||||
does a case-insensitive comparison of strings.
|
||||
- The cups-lpd mini-daemon now sends jobs to the default
|
||||
queue when an empty queue name (or "lp" and there is
|
||||
no "lp" queue) is sent.
|
||||
- The scheduler now supports fax queues identified by a
|
||||
"*cupsFax: True" attribute in the PPD file. When a job
|
||||
can't be sent, it is held for 5 minutes by default
|
||||
while other jobs are attempted. The FaxRetryLimit and
|
||||
FaxRetryInterval directives control the number of
|
||||
retries and the time between retries.
|
||||
- The scheduler now preserves the default options of PPD
|
||||
files when modifying/upgrading an existing PPD file.
|
||||
When installing a new printer, the scheduler sets the
|
||||
default media size to Letter or A4 as appropriate for
|
||||
your locale.
|
||||
- The scheduler no longer limits the number of
|
||||
BrowseAddress, BrowsePoll, BrowseRelay, Listen, Port,
|
||||
SSLListen, and SSLPort directives to 10.
|
||||
- The scheduler now supports print files that have been
|
||||
compressed using gzip.
|
||||
- The scheduler used the stdio functions to read any job
|
||||
ticket information in a PostScript print job. Since
|
||||
some platforms limit the number of stdio files to 256,
|
||||
job ticket information was ignored when the server had
|
||||
a large number of clients connected to the system.
|
||||
- Filters and backends may now report the total number
|
||||
of pages ("PAGE: total NNN") to the scheduler.
|
||||
- The LPD backend now supports timeout and
|
||||
sanitize_title options (default to 300 and yes,
|
||||
respectively) and has some additional changes to
|
||||
reduce the chances of multiple copies being printed
|
||||
when only one copy was requested.
|
||||
- Fixed a polygon drawing bug in the HP-GL/2 filter.
|
||||
- Added a robots.txt file to the standard install to
|
||||
prevent search engines from indexing the CUPS server.
|
||||
- Added support for STATE: messages
|
||||
(printer-state-reasons), printer-state-history, and
|
||||
printer-state-time to the scheduler.
|
||||
- When using RunAsUser, the scheduler would initially
|
||||
start any previously queued (pending) jobs with
|
||||
RunAsUser disabled - all backends would be running as
|
||||
root.
|
||||
- If a backend failed for a printer, CUPS would
|
||||
incorrectly requeue the job for printing again.
|
||||
- Added support for IPP collections and files.
|
||||
- Added experimental support for generic CGI scripts and
|
||||
programs, Java, Perl, PHP, and Python to the
|
||||
scheduler. See the file "CGI.txt" for more
|
||||
information.
|
||||
- The CUPS API now supports HTTP cookies and the Expect:
|
||||
field.
|
||||
- The cancel command now correctly supports the "-u
|
||||
user" option to cancel all jobs for the named user.
|
||||
- The Purge-Jobs operation now supports the my-jobs
|
||||
boolean attribute and a new purge-jobs boolean
|
||||
attribute to control whether job history data is
|
||||
purged from the scheduler; the default is false for
|
||||
my-jobs and true for purge-jobs to match the original
|
||||
implementation.
|
||||
- The scheduler would not timeout printers when only
|
||||
using SLP browsing.
|
||||
- If the scheduler was unable to execute a filter, it
|
||||
would try to restart the job indefinitely until the
|
||||
filter could be executed.
|
||||
- When writing BSD printcap files, the scheduler now
|
||||
includes the rm and rp attributes, allowing the file
|
||||
to be exported to LPD clients. [Patch from Dominic
|
||||
Kubla]
|
||||
- The scheduler optimization to reference IPP attribute
|
||||
data instead of performing a full copy caused problems
|
||||
when the referenced data was deleted before it was
|
||||
sent. It now only references attributes that change
|
||||
only when the scheduler is restarted. The change also
|
||||
reduced the memory footprint of a printer object to
|
||||
2k.
|
||||
- The scheduler now holds signals while logging messages
|
||||
to avoid potential deadlock issues when handling
|
||||
signals on Solaris 8.
|
||||
- The lpadmin command now allows printer access control
|
||||
by group name as well as user name.
|
||||
- "lpoptions -l" got in an infinite loop if no default
|
||||
printer was available.
|
||||
- The scheduler now logs the job-originating-host-name
|
||||
attribute in the page_log file, and uses "-" for any
|
||||
empty fields (patch from Dominik Kubla).
|
||||
- The pdftops filter now scales PDF pages within the
|
||||
printable area of the page.
|
||||
- The pstops filter didn't include the page-label and
|
||||
classification boxes when printing EPS or non-
|
||||
conformant PS files.
|
||||
- The imagetops filter didn't always correctly position
|
||||
the image on the page when printing in landscape
|
||||
orientation.
|
||||
- The ppdEmit() functions now support the
|
||||
RequiresPageRegion attribute when sending InputSlot
|
||||
and ManualFeed commands.
|
||||
- The PPD loading code now supports standard options
|
||||
outside of OpenUI/CloseUI as required by the PPD spec.
|
||||
- The cupstestppd program has been upgraded to provide a
|
||||
concise PASS/FAIL report, additional detailed
|
||||
conformance testing, and support for gzip'd PPD files.
|
||||
- The PPD loading code is now much more strict when
|
||||
loading a PPD file, and tracks more format errors.
|
||||
- The scheduler ignored child signals when gathering the
|
||||
list of available devices, when it should have been
|
||||
using the default signal handler.
|
||||
- The cupsEncodeOptions() function could encode an
|
||||
option with a NULL last string.
|
||||
- The socket backend could report the wrong number of
|
||||
backchannel bytes if an error occurred on the link.
|
||||
- The cups-polld program now only sleeps after getting
|
||||
all printers and classes. This allows for longer
|
||||
intervals without excessive delays before classes show
|
||||
up...
|
||||
- Added a new httpWait() function to support waiting for
|
||||
data for a specific number of milliseconds.
|
||||
- httpGets() now times out after 1 second on
|
||||
non-blocking HTTP connections.
|
||||
- The scheduler no longer accepts rangeOfInteger values
|
||||
that are out of order (e.g. 5-1)
|
||||
- The sides attribute was incorrectly sent as a name
|
||||
value; it is a keyword value.
|
||||
- The IPP backend now detects if the destination queue
|
||||
has gone away and reports an error.
|
||||
- The scheduler and HTTP API now allocate their select()
|
||||
sets to support larger numbers of clients on systems
|
||||
that support it.
|
||||
- The scheduler now sets the CFProcessPath environment
|
||||
variable under MacOS X.
|
||||
- The cupsLangDefault() function now uses the
|
||||
CoreFoundation localization API under MacOS X.
|
||||
- The httpSeparate() function didn't handle file URIs of
|
||||
the form "file:///path" properly.
|
||||
- The lpadmin command now supports a "protocol" option
|
||||
for specifying the binary communications protocol to
|
||||
use when printing binary PostScript data.
|
||||
- The scheduler did not properly parse the SystemGroup
|
||||
directive, so only the first group would be used.
|
||||
- Revamped how strings are stored in the scheduler,
|
||||
providing a substantial improvement in memory usage
|
||||
for systems with large numbers of printers.
|
||||
- The PostScript filter now supports binary PostScript
|
||||
files and files beginning with the PJL language escape
|
||||
sequence.
|
||||
- The PPD API now provides additional information from
|
||||
the PPD file.
|
||||
- The USB backend didn't compile on Solaris Intel.
|
||||
- The cupstestppd utility now supports the "-q" option
|
||||
(quiet) for use in scripts, etc.
|
||||
- Merged several weight-reducing changes into the CUPS
|
||||
baseline donated by Apple.
|
||||
- Added preliminary support for CDSA; patch provided by
|
||||
Apple.
|
||||
- Implicit classes are now created from identical
|
||||
printer classes on the network.
|
||||
- The lp command now supports a "-H restart" option to
|
||||
restart previously printed jobs. This functionality
|
||||
only works if you have enabled the PreserveJobFiles
|
||||
option.
|
||||
- The scheduler now supports URIs in HTTP request lines
|
||||
to conform to the HTTP/1.1 specification.
|
||||
- The time-at-xyz attributes were not recognized in
|
||||
banner files if prefixed by a question mark, e.g.
|
||||
"{?time-at-creation}".
|
||||
- Added support for pre-filtering application/pictwps
|
||||
files on MacOS clients before sending them to a server
|
||||
via IPP.
|
||||
- The scheduler now allows file:/dev/null device URIs
|
||||
even if FileDevices is set to No.
|
||||
- CUPS uses strerror() for hostname resolution errors,
|
||||
when it should have used hstrerror().
|
||||
- The USB backend no longer tries to guess the serial
|
||||
number of a device from the USB devices file; this
|
||||
means that printers that don't report their serial
|
||||
numbers in the device ID string will not be
|
||||
individually selectable.
|
||||
- The pstops filter didn't handle page ranges properly
|
||||
when a page contained an embedded document.
|
||||
- Added a translation of the web interface to German.
|
||||
- When printing using the OutputOrder=Reverse option
|
||||
with duplexing, the output order is now truly
|
||||
reversed; the order of sub-pages when printing N-up is
|
||||
the same.
|
||||
- The pstops filter did not always output the extra
|
||||
blank page when printing a document with an odd number
|
||||
of pages with duplexing enabled.
|
||||
- The ippAddXYZ functions no longer allow the
|
||||
application to add less than 1 value.
|
||||
- Fixed a URL rewrite bug in the web interface - local
|
||||
access was sometimes redirected away from localhost...
|
||||
- The ppdOpen() functions could get in an infinite loop
|
||||
if the PPD file contained a keyword or text that was
|
||||
too large for the buffer.
|
||||
- Added preliminary support for GNU TLS; patch provided
|
||||
by Jeff Licquia.
|
||||
- Now timeout IPP attribute reads after 1 second inside
|
||||
an attribute definition.
|
||||
- Now timeout connections that have been shutdown (due
|
||||
to errors) after 30 seconds instead of the Timeout
|
||||
setting (300 seconds by default). This provides
|
||||
faster recovery from DoS attacks.
|
||||
- A denial-of-service attack warning message was being
|
||||
written to the log files by the scheduler for every
|
||||
detection. This caused a DoS of its own in some
|
||||
situations. The warning message is now written no more
|
||||
than once per minute.
|
||||
- Fixed the CIE colorspace support code in the image and
|
||||
PS RIPs.
|
||||
- The job-quota-period, job-page-limit, and job-k-limit
|
||||
attributes were not flagged as integers, so setting
|
||||
quotas would not work.
|
||||
- Added an additional response check in the scheduler to
|
||||
more quickly recover from denial-of-service attacks.
|
||||
- The cupstestppd file was incorrectly installed in the
|
||||
/usr/sbin directory instead of /usr/bin.
|
||||
- The EPM list file did not include the cupstestppd
|
||||
program or man page files.
|
||||
|
||||
|
||||
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
|
||||
@@ -599,9 +1558,8 @@ 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, LogFormat,
|
||||
Require, UseCanonicalName, Satisfy, <Limit>,
|
||||
<LimitExcept>, LimitRequestSize, and Options
|
||||
- Added support for Apache ListenBackLog, Require,
|
||||
Satisfy, <Limit>, <LimitExcept>, and LimitRequestSize
|
||||
directives.
|
||||
- Added support for all Apache log levels...
|
||||
- Added support for "double" HostNameLookups.
|
||||
|
||||
+10
-3
@@ -1,4 +1,4 @@
|
||||
CREDITS.txt - 01/27/2000
|
||||
CREDITS.txt - 04/26/2003
|
||||
------------------------
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
@@ -8,19 +8,26 @@ 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.
|
||||
Bjoern Jacke - I18N stuff.
|
||||
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.
|
||||
Gilles QUERRET - French man pages.
|
||||
Petter Reinholdtsen - HP-UX compiler stuff.
|
||||
Stuart Stevens - HP JetDirect IPP information.
|
||||
Kiko - Bug fixes.
|
||||
L. Peter Deutsch - MD5 code.
|
||||
Andrea Suatoni - IRIX desktop integration and testing.
|
||||
|
||||
If I've missed someone, please let me know by sending an email to
|
||||
"mike@easysw.com".
|
||||
|
||||
+14
-10
@@ -1,5 +1,5 @@
|
||||
ENCRYPTION - CUPS v1.1.7 - 02/21/2001
|
||||
-------------------------------------
|
||||
ENCRYPTION - CUPS v1.1.19 - 05/27/2003
|
||||
--------------------------------------
|
||||
|
||||
This file describes the encryption support provided by CUPS.
|
||||
|
||||
@@ -17,15 +17,16 @@ LEGAL STUFF
|
||||
|
||||
BEFORE USING THE ENCRYPTION SUPPORT, PLEASE VERIFY THAT IT IS
|
||||
LEGAL TO DO SO IN YOUR COUNTRY. CUPS by itself doesn't include
|
||||
any encryption code, but it can link against the OpenSSL library
|
||||
which does.
|
||||
any encryption code, but it can link against the OpenSSL, GNU
|
||||
TLS, or CDSA libraries which do.
|
||||
|
||||
|
||||
OVERVIEW OF ENCRYPTION SUPPORT IN CUPS
|
||||
|
||||
CUPS supports SSL/2.0, SSL/3.0, and TLS/1.0 encryption using
|
||||
keys as large as 128-bits. Encryption support is provided via
|
||||
the OpenSSL library and some new hooks in the CUPS code.
|
||||
the OpenSSL, GNU TLS, or CDSA libraries and some new hooks in
|
||||
the CUPS code.
|
||||
|
||||
CUPS provides support for dedicated (https) and "upgrade" (TLS)
|
||||
encryption of sessions. The "HTTP Upgrade" method is described
|
||||
@@ -79,19 +80,22 @@ to /etc/cups/cupsd.conf.
|
||||
|
||||
BEFORE YOU BEGIN
|
||||
|
||||
You'll need the OpenSSL library from:
|
||||
You'll need the OpenSSL, GNU TLS, or CDSA libraries from:
|
||||
|
||||
http://www.openssl.org
|
||||
http://www.openssl.org/
|
||||
http://www.gnutls.org/
|
||||
http://www.intel.com/labs/archive/cdsa.htm
|
||||
|
||||
|
||||
CONFIGURING WITH ENCRYPTION SUPPORT
|
||||
|
||||
Once you have the OpenSSL library installed, you'll need to
|
||||
configure CUPS to use it with the "--enable-ssl" option:
|
||||
Once you have the OpenSSL, GNU TLS, or CDSA libraries installed,
|
||||
you'll need to configure CUPS to use it with the "--enable-ssl"
|
||||
option:
|
||||
|
||||
./configure --enable-ssl
|
||||
|
||||
If the OpenSSL stuff is not in a standard location, make sure to
|
||||
If the library stuff is not in a standard location, make sure to
|
||||
define the CFLAGS, CXXFLAGS, and LDFLAGS environment variables
|
||||
with the appropriate compiler and linker options first.
|
||||
|
||||
|
||||
+23
-3
@@ -1,4 +1,4 @@
|
||||
INSTALL - CUPS v1.1.13 - 01/31/2002
|
||||
INSTALL - CUPS v1.1.19 - 05/27/2003
|
||||
-----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source
|
||||
@@ -6,6 +6,10 @@ 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
|
||||
|
||||
@@ -29,6 +33,22 @@ 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
|
||||
|
||||
@@ -118,9 +138,9 @@ You can find the RPM software at:
|
||||
|
||||
http://www.rpm.org
|
||||
|
||||
The RPM software is at:
|
||||
The EPM software is at:
|
||||
|
||||
http://www.easysw.com/epm
|
||||
http://www.easysw.com/epm/
|
||||
|
||||
|
||||
CREATING BINARY DISTRIBUTIONS WITH EPM
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
INSTALL_fr - CUPS v1.1.19 - 04/08/2003
|
||||
--------------------------------------
|
||||
|
||||
Vous cherchez des instructions d'installation ? Lisez le fichier
|
||||
INSTALL.txt (anglais) et/ou reportez vous au "Manuel de
|
||||
l'administrateur" (en français) situé dans le sous-répertoire
|
||||
"doc/fr"
|
||||
|
||||
Vous trouverez deux autres manuels en français dans ce
|
||||
sous-répertoire :
|
||||
|
||||
- Aperçu de CUPS
|
||||
- Manuel de l'utilisateur
|
||||
|
||||
Une fois CUPS installé, si vous configurez votre navigateur
|
||||
"web" pour que la langue de base soit le français, vous
|
||||
disposerez également d'une interface "web" en français pour
|
||||
l'administration et d'utilistation de CUPS.
|
||||
|
||||
+125
-63
@@ -7,7 +7,7 @@
|
||||
|
||||
<H2 ALIGN="CENTER">Common UNIX Printing System License Agreement</H2>
|
||||
|
||||
<P ALIGN="CENTER">Copyright 1997-2002 by Easy Software Products<BR>
|
||||
<P ALIGN="CENTER">Copyright 1997-2003 by Easy Software Products<BR>
|
||||
44141 AIRPORT VIEW DR STE 204<BR>
|
||||
HOLLYWOOD, MARYLAND 20636-3111 USA<BR>
|
||||
<BR>
|
||||
@@ -17,84 +17,146 @@ 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. A copy of these
|
||||
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, with exceptions for Apple operating systems and the
|
||||
OpenSSL toolkit. A copy of the exceptions and 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
|
||||
"/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>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>For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>Use the CUPS software at no charge.
|
||||
<LI>Use the CUPS software at no charge.</LI>
|
||||
|
||||
<LI>Distribute verbatim copies of the software in source or
|
||||
binary form.
|
||||
<LI>Distribute verbatim copies of the software in source
|
||||
or binary form.</LI>
|
||||
|
||||
<LI>Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
<LI>Sell verbatim copies of the software for a media
|
||||
fee, or sell support for the software.</LI>
|
||||
|
||||
<LI>Distribute or sell printer drivers and filters that use
|
||||
CUPS so long as source code is made available under the GPL.
|
||||
<LI>Distribute or sell printer drivers and filters that
|
||||
use CUPS so long as source code is made available under
|
||||
the GPL.</LI>
|
||||
|
||||
</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.
|
||||
<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>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.
|
||||
<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.
|
||||
|
||||
<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. 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.
|
||||
<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.
|
||||
|
||||
<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 "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:
|
||||
<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:
|
||||
|
||||
<BLOCKQUOTE>
|
||||
Derek B. Noonburg<BR>
|
||||
@@ -104,12 +166,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 -->
|
||||
@@ -123,7 +185,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>
|
||||
|
||||
|
||||
+105
-56
@@ -1,6 +1,6 @@
|
||||
Common UNIX Printing System License Agreement
|
||||
|
||||
Copyright 1997-2002 by Easy Software Products
|
||||
Copyright 1997-2003 by Easy Software Products
|
||||
44141 AIRPORT VIEW DR STE 204
|
||||
HOLLYWOOD, MARYLAND 20636-3111 USA
|
||||
|
||||
@@ -11,72 +11,121 @@
|
||||
|
||||
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 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 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.
|
||||
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 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:
|
||||
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.
|
||||
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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
|
||||
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. 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.
|
||||
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.
|
||||
|
||||
|
||||
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 "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:
|
||||
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:
|
||||
|
||||
Derek B. Noonburg
|
||||
Email: derekn@foolabs.com
|
||||
@@ -85,11 +134,11 @@ distribution licensing 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
|
||||
|
||||
+52
-44
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Common makefile definitions for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -26,21 +26,22 @@
|
||||
# Programs...
|
||||
#
|
||||
|
||||
AR = @AR@
|
||||
AWK = @AWK@
|
||||
CC = @LIBTOOL@ @CC@
|
||||
CXX = @LIBTOOL@ @CXX@
|
||||
DSO = @DSO@
|
||||
HTMLDOC = @HTMLDOC@
|
||||
INSTALL = @INSTALL@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN = /bin/ln -sf
|
||||
MV = @MV@
|
||||
NROFF = @NROFF@
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
AR = @AR@
|
||||
AWK = @AWK@
|
||||
CC = @LIBTOOL@ @CC@
|
||||
CXX = @LIBTOOL@ @CXX@
|
||||
DSO = @DSO@
|
||||
HTMLDOC = @HTMLDOC@
|
||||
INSTALL = @INSTALL@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN = @LN@ -sf
|
||||
MV = @MV@
|
||||
NROFF = @NROFF@
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
STRIP = @STRIP@
|
||||
|
||||
#
|
||||
# Installation programs...
|
||||
@@ -64,14 +65,15 @@ CUPS_GROUP = @CUPS_GROUP@
|
||||
# Libraries...
|
||||
#
|
||||
|
||||
LIBCUPS = @LIBCUPS@
|
||||
LIBCUPSIMAGE = @LIBCUPSIMAGE@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBMALLOC = @LIBMALLOC@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBSLP = @LIBSLP@
|
||||
LIBTIFF = @LIBTIFF@
|
||||
LIBZ = @LIBZ@
|
||||
LIBCUPS = @LIBCUPS@
|
||||
LIBCUPSIMAGE = @LIBCUPSIMAGE@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBMALLOC = @LIBMALLOC@
|
||||
LIBPAPER = @LIBPAPER@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBSLP = @LIBSLP@
|
||||
LIBTIFF = @LIBTIFF@
|
||||
LIBZ = @LIBZ@
|
||||
|
||||
#
|
||||
# Program options...
|
||||
@@ -81,21 +83,24 @@ LIBZ = @LIBZ@
|
||||
# extra debug info)
|
||||
#
|
||||
|
||||
ARFLAGS = @ARFLAGS@
|
||||
CFLAGS = @CFLAGS@ -I.. $(OPTIONS)
|
||||
CXXFLAGS = @CXXFLAGS@ -I.. $(OPTIONS)
|
||||
DSOFLAGS = @DSOFLAGS@
|
||||
DSOLIBS = @DSOLIBS@
|
||||
IMGLIBS = @IMGLIBS@ -lm
|
||||
LDFLAGS = @LDFLAGS@ $(OPTIM)
|
||||
LINKCUPS = @LINKCUPS@
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(NETLIBS) @LIBS@
|
||||
NETLIBS = @NETLIBS@
|
||||
OPTIM = @OPTIM@
|
||||
OPTIONS =
|
||||
PAMLIBS = @PAMLIBS@
|
||||
SSLLIBS = @SSLLIBS@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
BACKLIBS = @BACKLIBS@
|
||||
CFLAGS = $(RC_CFLAGS) @CPPFLAGS@ @CFLAGS@ -I.. $(OPTIONS)
|
||||
COMMONLIBS = @COMMONLIBS@
|
||||
CXXFLAGS = $(RC_CFLAGS) @CPPFLAGS@ @CXXFLAGS@ -I.. $(OPTIONS)
|
||||
CXXLIBS = @CXXLIBS@
|
||||
DSOFLAGS = @LDFLAGS@ @DSOFLAGS@
|
||||
DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
|
||||
IMGLIBS = @IMGLIBS@ -lm
|
||||
LDFLAGS = -L../cups -L../filter $(RC_CFLAGS) @LDFLAGS@ $(OPTIM)
|
||||
LINKCUPS = @LINKCUPS@
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(NETLIBS) @LIBS@ $(COMMONLIBS)
|
||||
NETLIBS = @NETLIBS@
|
||||
OPTIM = @OPTIM@
|
||||
OPTIONS =
|
||||
PAMLIBS = @PAMLIBS@
|
||||
SSLLIBS = @SSLLIBS@
|
||||
|
||||
#
|
||||
# Directories...
|
||||
@@ -126,6 +131,8 @@ srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
|
||||
BUILDROOT = $(DSTROOT)
|
||||
|
||||
AMANDIR = $(BUILDROOT)@AMANDIR@
|
||||
BINDIR = $(BUILDROOT)@bindir@
|
||||
DATADIR = $(BUILDROOT)@CUPS_DATADIR@
|
||||
@@ -166,13 +173,14 @@ 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
|
||||
pack -f t
|
||||
$(MV) t.z $@
|
||||
$(RM) $@ $@.tmp $@.tmp.z
|
||||
-$(NROFF) -man $< >$@.tmp
|
||||
pack -f $@.tmp
|
||||
$(MV) $@.tmp.z $@
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$"
|
||||
|
||||
+28
-6
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Top-level Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -28,7 +28,7 @@ include Makedefs
|
||||
# Directories to make...
|
||||
#
|
||||
|
||||
DIRS = cups backend berkeley cgi-bin filter man pdftops pstoraster \
|
||||
DIRS = cups backend berkeley cgi-bin filter man pdftops \
|
||||
scheduler systemv
|
||||
|
||||
#
|
||||
@@ -52,11 +52,22 @@ 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:
|
||||
install: installhdrs
|
||||
for dir in $(DIRS); do\
|
||||
echo Installing in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\
|
||||
@@ -93,8 +104,8 @@ install:
|
||||
fi
|
||||
if test "x$(INITDIR)" = "x" -a "x$(INITDDIR)" != "x"; then \
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \
|
||||
if test "$(INITDDIR)" = "/System/Library/StartupItems/CUPS"; then \
|
||||
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/CUPS; \
|
||||
if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \
|
||||
$(INSTALL_SCRIPT) cups.osx $(BUILDROOT)$(INITDDIR)/PrintingServices; \
|
||||
$(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; \
|
||||
@@ -103,12 +114,23 @@ install:
|
||||
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...
|
||||
#
|
||||
|
||||
test: all
|
||||
check test: all
|
||||
echo Running CUPS test suite...
|
||||
cd test; ./run-stp-tests.sh
|
||||
|
||||
|
||||
+15
-15
@@ -1,9 +1,13 @@
|
||||
README - CUPS v1.1.13 - 01/31/2002
|
||||
README - CUPS v1.1.19 - 05/27/2003
|
||||
----------------------------------
|
||||
|
||||
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
|
||||
|
||||
@@ -21,11 +25,12 @@ functionality. CUPS adds network printer browsing and
|
||||
PostScript Printer Description ("PPD") based printing options to
|
||||
support real-world printing under UNIX.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Drivers for thousands of printers are provided with our ESP
|
||||
Print Pro software, available at:
|
||||
@@ -243,17 +248,13 @@ file.
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
CUPS is Copyright 1993-2002 by Easy Software Products. CUPS,
|
||||
CUPS is Copyright 1993-2003 by Easy Software Products. CUPS,
|
||||
the CUPS logo, and the Common UNIX Printing System are the
|
||||
trademark property of Easy Software Products.
|
||||
|
||||
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
|
||||
|
||||
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 0.92 software,
|
||||
The PDF filter (pdftops) is based on the Xpdf software,
|
||||
Copyright 1996-2002 by Derek B. Noonburg.
|
||||
|
||||
This software is based in part on the work of the Independent
|
||||
@@ -278,6 +279,5 @@ For commercial licensing information, please contact:
|
||||
WWW: http://www.cups.org
|
||||
|
||||
Note that commercial licensors may also require a license from
|
||||
Artifex Software Inc. which handles commercial licensing of the
|
||||
Ghostscript software, and from Derek B. Noonburg who developed
|
||||
the Xpdf software used to print PDF files.
|
||||
Derek B. Noonburg who developed the Xpdf software used to print
|
||||
PDF files.
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
README_fr - CUPS v1.1.19 - 04/08/2003
|
||||
-------------------------------------
|
||||
|
||||
Vous cherchez des instructions d'installation ? Lisez le fichier
|
||||
INSTALL.txt (anglais) et/ou reportez vous au "Manuel de
|
||||
l'administrateur" (en français) situé dans le sous-répertoire
|
||||
"doc/fr"
|
||||
|
||||
Vous trouverez deux autres manuels en français dans ce
|
||||
sous-répertoire :
|
||||
|
||||
- Aperçu de CUPS
|
||||
- Manuel de l'utilisateur
|
||||
|
||||
Une fois CUPS installé, si vous configurez votre navigateur
|
||||
"web" pour que la langue de base soit le français, vous
|
||||
disposerez également d'une interface "web" en français pour
|
||||
l'administration et d'utilistation de CUPS.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
betest
|
||||
ipp
|
||||
lpd
|
||||
usb
|
||||
parallel
|
||||
betest
|
||||
scsi
|
||||
serial
|
||||
socket
|
||||
usb
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
# 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
|
||||
scsi.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
|
||||
scsi.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
|
||||
+32
-18
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Backend makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -21,12 +21,14 @@
|
||||
# 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 serial socket usb
|
||||
BACKENDS = ipp lpd parallel scsi serial socket usb
|
||||
TARGETS = betest $(BACKENDS)
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o serial.o socket.o usb.o
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o scsi.o serial.o socket.o usb.o
|
||||
|
||||
|
||||
#
|
||||
@@ -44,11 +46,19 @@ 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:
|
||||
install: all
|
||||
$(INSTALL_DIR) $(SERVERBIN)/backend
|
||||
for file in $(BACKENDS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
|
||||
@@ -65,8 +75,6 @@ betest: betest.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o betest betest.o $(LIBS)
|
||||
|
||||
betest.o: ../cups/string.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# ipp
|
||||
@@ -78,8 +86,6 @@ ipp: ipp.o ../cups/$(LIBCUPS)
|
||||
$(RM) http
|
||||
$(LN) ipp http
|
||||
|
||||
ipp.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpd
|
||||
@@ -89,8 +95,6 @@ lpd: lpd.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpd lpd.o $(LIBS)
|
||||
|
||||
lpd.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# parallel
|
||||
@@ -100,7 +104,16 @@ parallel: parallel.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS)
|
||||
|
||||
parallel.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# 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
|
||||
|
||||
|
||||
#
|
||||
@@ -109,9 +122,7 @@ parallel.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
serial: serial.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o serial serial.o $(LIBS)
|
||||
|
||||
serial.o: ../cups/cups.h ../Makedefs
|
||||
$(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -122,8 +133,6 @@ socket: socket.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o socket socket.o $(LIBS)
|
||||
|
||||
socket.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# usb
|
||||
@@ -131,9 +140,14 @@ socket.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
usb: usb.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o usb usb.o $(LIBS)
|
||||
$(CC) $(LDFLAGS) -o usb usb.o $(BACKLIBS) $(LIBS)
|
||||
|
||||
usb.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
|
||||
|
||||
#
|
||||
|
||||
+3
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Backend test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
|
||||
+500
-75
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,12 +21,17 @@
|
||||
* 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.
|
||||
* password_cb() - Disable the password prompt for
|
||||
* cupsDoFileRequest().
|
||||
* report_printer_state() - Report the printer state.
|
||||
* run_pictwps_filter() - Convert PICT files to PostScript when printing
|
||||
* remotely.
|
||||
* sigterm_handler() - Handle 'terminate' signals that stop the backend.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -42,6 +47,47 @@
|
||||
#include <cups/language.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
|
||||
/*
|
||||
* Globals...
|
||||
*/
|
||||
|
||||
static char tmpfilename[1024] = ""; /* Temporary spool file name */
|
||||
|
||||
|
||||
/*
|
||||
* Some OS's don't have hstrerror(), most notably Solaris...
|
||||
*/
|
||||
|
||||
#ifndef HAVE_HSTRERROR
|
||||
# define hstrerror cups_hstrerror
|
||||
|
||||
const char * /* O - Error string */
|
||||
cups_hstrerror(int error) /* I - Error number */
|
||||
{
|
||||
static const char * const errors[] =
|
||||
{
|
||||
"OK",
|
||||
"Host not found.",
|
||||
"Try again.",
|
||||
"Unrecoverable lookup error.",
|
||||
"No data associated with name."
|
||||
};
|
||||
|
||||
|
||||
if (error < 0 || error > 4)
|
||||
return ("Unknown hostname lookup error.");
|
||||
else
|
||||
return (errors[error]);
|
||||
}
|
||||
#elif defined(_AIX)
|
||||
/*
|
||||
* AIX doesn't provide a prototype but does provide the function...
|
||||
*/
|
||||
extern const char *hstrerror(int);
|
||||
#endif /* !HAVE_HSTRERROR */
|
||||
|
||||
|
||||
/*
|
||||
@@ -51,6 +97,11 @@
|
||||
const char *password_cb(const char *);
|
||||
int report_printer_state(ipp_t *ipp);
|
||||
|
||||
#ifdef __APPLE__
|
||||
int run_pictwps_filter(char **argv, char *filename, int length);
|
||||
#endif /* __APPLE__ */
|
||||
static void sigterm_handler(int sig);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
@@ -77,8 +128,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char method[255], /* Method in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
filename[1024]; /* File to print */
|
||||
resource[1024]; /* Resource info (printer name) */
|
||||
char *filename; /* File to print */
|
||||
int port; /* Port number (not used) */
|
||||
char uri[HTTP_MAX_URI];/* Updated URI without user/pass */
|
||||
ipp_status_t ipp_status; /* Status of IPP request */
|
||||
@@ -88,10 +139,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*supported; /* get-printer-attributes response */
|
||||
ipp_attribute_t *job_id_attr; /* job-id attribute */
|
||||
int job_id; /* job-id value */
|
||||
ipp_attribute_t *job_sheets; /* job-media-sheets-completed attribute */
|
||||
ipp_attribute_t *job_state; /* job-state attribute */
|
||||
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 */
|
||||
@@ -101,6 +157,20 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
int version; /* IPP version */
|
||||
int reasons; /* Number of printer-state-reasons shown */
|
||||
static const char * const pattrs[] =
|
||||
{ /* Printer attributes we want */
|
||||
"copies-supported",
|
||||
"charset-supported",
|
||||
"document-format-supported",
|
||||
"printer-is-accepting-jobs",
|
||||
"printer-state",
|
||||
"printer-state-reasons",
|
||||
};
|
||||
static const char * const jattrs[] =
|
||||
{ /* Job attributes we want */
|
||||
"job-media-sheets-completed",
|
||||
"job-state"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
@@ -109,6 +179,27 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Ignore SIGPIPE and catch SIGTERM signals...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIGSET
|
||||
sigset(SIGPIPE, SIG_IGN);
|
||||
sigset(SIGTERM, sigterm_handler);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
sigaddset(&action.sa_mask, SIGTERM);
|
||||
action.sa_handler = sigterm_handler;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
signal(SIGTERM, sigterm_handler);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
@@ -132,6 +223,18 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the content type...
|
||||
*/
|
||||
|
||||
if (argc > 6)
|
||||
content_type = getenv("CONTENT_TYPE");
|
||||
else
|
||||
content_type = "application/vnd.cups-raw";
|
||||
|
||||
if (content_type == NULL)
|
||||
content_type = "application/octet-stream";
|
||||
|
||||
/*
|
||||
* If we have 7 arguments, print the file named on the command-line.
|
||||
* Otherwise, copy stdin to a temporary file and print the temporary
|
||||
@@ -149,7 +252,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
|
||||
if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0)
|
||||
{
|
||||
perror("ERROR: unable to create temporary file");
|
||||
return (1);
|
||||
@@ -160,17 +263,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
perror("ERROR: unable to write to temporary file");
|
||||
close(fd);
|
||||
unlink(filename);
|
||||
unlink(tmpfilename);
|
||||
return (1);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
filename = tmpfilename;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
filename = argv[6];
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -198,16 +299,47 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
do
|
||||
{
|
||||
fprintf(stderr, "INFO: Connecting to %s...\n", hostname);
|
||||
fprintf(stderr, "INFO: Connecting to %s on port %d...\n", hostname, port);
|
||||
|
||||
if ((http = httpConnect(hostname, port)) == NULL)
|
||||
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
|
||||
{
|
||||
if (errno == ECONNREFUSED)
|
||||
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 || strcmp(filename, argv[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)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else if (h_errno)
|
||||
{
|
||||
fprintf(stderr, "INFO: Unable to lookup host \'%s\' - %s\n",
|
||||
hostname, hstrerror(h_errno));
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to IPP host");
|
||||
@@ -217,6 +349,8 @@ 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
|
||||
@@ -259,10 +393,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
|
||||
NULL, pattrs);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
fputs("DEBUG: Getting supported attributes...\n", stderr);
|
||||
|
||||
if ((supported = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
@@ -286,10 +426,23 @@ 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 if (ipp_status == IPP_NOT_FOUND)
|
||||
{
|
||||
fputs("ERROR: Destination printer does not exist!\n", stderr);
|
||||
|
||||
if (supported)
|
||||
ippDelete(supported);
|
||||
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to get printer status (%s)!\n",
|
||||
ippErrorString(ipp_status));
|
||||
sleep(10);
|
||||
}
|
||||
|
||||
if (supported)
|
||||
ippDelete(supported);
|
||||
@@ -327,25 +480,46 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
while (ipp_status > IPP_OK_CONFLICT);
|
||||
|
||||
/*
|
||||
* 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...)
|
||||
* 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 (argc < 7)
|
||||
if (getenv("CLASS") != NULL)
|
||||
{
|
||||
#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));
|
||||
printer_state = ippFindAttribute(supported, "printer-state",
|
||||
IPP_TAG_ENUM);
|
||||
printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs",
|
||||
IPP_TAG_BOOLEAN);
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
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 || strcmp(filename, argv[6]))
|
||||
unlink(filename);
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
*/
|
||||
|
||||
sleep(5);
|
||||
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -442,10 +616,34 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
options = NULL;
|
||||
num_options = cupsParseOptions(argv[5], 0, &options);
|
||||
|
||||
if (argc > 6)
|
||||
content_type = getenv("CONTENT_TYPE");
|
||||
else
|
||||
content_type = "application/vnd.cups-raw";
|
||||
#ifdef __APPLE__
|
||||
if (content_type != NULL && strcasecmp(content_type, "application/pictwps") == 0)
|
||||
{
|
||||
if (format_sup != NULL)
|
||||
{
|
||||
for (i = 0; i < format_sup->num_values; i ++)
|
||||
if (strcasecmp(content_type, format_sup->values[i].string.text) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (format_sup == NULL || i >= format_sup->num_values)
|
||||
{
|
||||
/*
|
||||
* Remote doesn't support "application/pictwps" (i.e. it's not MacOS X)
|
||||
* so convert the document to PostScript...
|
||||
*/
|
||||
|
||||
if (run_pictwps_filter(argv, filename, sizeof(filename)))
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* Change the MIME type to application/postscript...
|
||||
*/
|
||||
|
||||
content_type = "application/postscript";
|
||||
}
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
if (content_type != NULL && format_sup != NULL)
|
||||
{
|
||||
@@ -476,6 +674,16 @@ 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...
|
||||
*/
|
||||
@@ -556,13 +764,21 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
|
||||
job_id);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "job-state");
|
||||
if (argv[2][0])
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]),
|
||||
NULL, jattrs);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if (!copies_sup)
|
||||
httpReconnect(http);
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
@@ -593,24 +809,32 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ((job_state = ippFindAttribute(response, "job-state", IPP_TAG_ENUM)) != NULL)
|
||||
{
|
||||
/*
|
||||
* Stop polling if the job is finished or pending-held...
|
||||
*/
|
||||
|
||||
if (job_state->values[0].integer > IPP_JOB_PROCESSING ||
|
||||
job_state->values[0].integer == IPP_JOB_HELD)
|
||||
if (response != NULL)
|
||||
{
|
||||
if ((job_sheets = ippFindAttribute(response, "job-media-sheets-completed",
|
||||
IPP_TAG_INTEGER)) != NULL)
|
||||
fprintf(stderr, "PAGE: total %d\n", job_sheets->values[0].integer);
|
||||
|
||||
if ((job_state = ippFindAttribute(response, "job-state",
|
||||
IPP_TAG_ENUM)) != NULL)
|
||||
{
|
||||
ippDelete(response);
|
||||
break;
|
||||
/*
|
||||
* Stop polling if the job is finished or pending-held...
|
||||
*/
|
||||
|
||||
if (job_state->values[0].integer > IPP_JOB_PROCESSING ||
|
||||
job_state->values[0].integer == IPP_JOB_HELD)
|
||||
{
|
||||
ippDelete(response);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
|
||||
/*
|
||||
* Now check on the printer state...
|
||||
*/
|
||||
@@ -630,13 +854,20 @@ 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, "job-state-reasons");
|
||||
"requested-attributes", NULL, "printer-state-reasons");
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if (!copies_sup)
|
||||
httpReconnect(http);
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) != NULL)
|
||||
{
|
||||
reasons = report_printer_state(response);
|
||||
@@ -661,11 +892,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
ippDelete(supported);
|
||||
|
||||
/*
|
||||
* Close and remove the temporary file if necessary...
|
||||
* Remove the temporary file if necessary...
|
||||
*/
|
||||
|
||||
if (argc < 7)
|
||||
unlink(filename);
|
||||
if (tmpfilename[0])
|
||||
unlink(tmpfilename);
|
||||
|
||||
/*
|
||||
* Return the queue status...
|
||||
@@ -701,74 +932,86 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
int i; /* Looping var */
|
||||
int count; /* Count of reasons shown... */
|
||||
ipp_attribute_t *reasons; /* printer-state-reasons */
|
||||
const char *reason; /* Current reason */
|
||||
const char *message; /* Message to show */
|
||||
char unknown[1024]; /* Unknown message string */
|
||||
const char *prefix; /* Prefix for STATE: line */
|
||||
char state[1024]; /* State string */
|
||||
|
||||
|
||||
if ((reasons = ippFindAttribute(ipp, "printer-state-reasons",
|
||||
IPP_TAG_KEYWORD)) == NULL)
|
||||
return (0);
|
||||
|
||||
state[0] = '\0';
|
||||
prefix = "STATE: ";
|
||||
|
||||
for (i = 0, count = 0; i < reasons->num_values; i ++)
|
||||
{
|
||||
reason = reasons->values[i].string.text;
|
||||
|
||||
strlcat(state, prefix, sizeof(state));
|
||||
strlcat(state, reason, sizeof(state));
|
||||
|
||||
prefix = ",";
|
||||
message = NULL;
|
||||
|
||||
if (strncmp(reasons->values[i].string.text, "media-needed", 12) == 0)
|
||||
if (strncmp(reason, "media-needed", 12) == 0)
|
||||
message = "Media tray needs to be filled.";
|
||||
else if (strncmp(reasons->values[i].string.text, "media-jam", 9) == 0)
|
||||
else if (strncmp(reason, "media-jam", 9) == 0)
|
||||
message = "Media jam!";
|
||||
else if (strncmp(reasons->values[i].string.text, "moving-to-paused", 16) == 0 ||
|
||||
strncmp(reasons->values[i].string.text, "paused", 6) == 0 ||
|
||||
strncmp(reasons->values[i].string.text, "shutdown", 8) == 0)
|
||||
else if (strncmp(reason, "moving-to-paused", 16) == 0 ||
|
||||
strncmp(reason, "paused", 6) == 0 ||
|
||||
strncmp(reason, "shutdown", 8) == 0)
|
||||
message = "Printer off-line.";
|
||||
else if (strncmp(reasons->values[i].string.text, "toner-low", 9) == 0)
|
||||
else if (strncmp(reason, "toner-low", 9) == 0)
|
||||
message = "Toner low.";
|
||||
else if (strncmp(reasons->values[i].string.text, "toner-empty", 11) == 0)
|
||||
else if (strncmp(reason, "toner-empty", 11) == 0)
|
||||
message = "Out of toner!";
|
||||
else if (strncmp(reasons->values[i].string.text, "cover-open", 10) == 0)
|
||||
else if (strncmp(reason, "cover-open", 10) == 0)
|
||||
message = "Cover open.";
|
||||
else if (strncmp(reasons->values[i].string.text, "interlock-open", 14) == 0)
|
||||
else if (strncmp(reason, "interlock-open", 14) == 0)
|
||||
message = "Interlock open.";
|
||||
else if (strncmp(reasons->values[i].string.text, "door-open", 9) == 0)
|
||||
else if (strncmp(reason, "door-open", 9) == 0)
|
||||
message = "Door open.";
|
||||
else if (strncmp(reasons->values[i].string.text, "input-tray-missing", 18) == 0)
|
||||
else if (strncmp(reason, "input-tray-missing", 18) == 0)
|
||||
message = "Media tray missing!";
|
||||
else if (strncmp(reasons->values[i].string.text, "media-low", 9) == 0)
|
||||
else if (strncmp(reason, "media-low", 9) == 0)
|
||||
message = "Media tray almost empty.";
|
||||
else if (strncmp(reasons->values[i].string.text, "media-empty", 11) == 0)
|
||||
else if (strncmp(reason, "media-empty", 11) == 0)
|
||||
message = "Media tray empty!";
|
||||
else if (strncmp(reasons->values[i].string.text, "output-tray-missing", 19) == 0)
|
||||
else if (strncmp(reason, "output-tray-missing", 19) == 0)
|
||||
message = "Output tray missing!";
|
||||
else if (strncmp(reasons->values[i].string.text, "output-area-almost-full", 23) == 0)
|
||||
else if (strncmp(reason, "output-area-almost-full", 23) == 0)
|
||||
message = "Output bin almost full.";
|
||||
else if (strncmp(reasons->values[i].string.text, "output-area-full", 16) == 0)
|
||||
else if (strncmp(reason, "output-area-full", 16) == 0)
|
||||
message = "Output bin full!";
|
||||
else if (strncmp(reasons->values[i].string.text, "marker-supply-low", 17) == 0)
|
||||
else if (strncmp(reason, "marker-supply-low", 17) == 0)
|
||||
message = "Ink/toner almost empty.";
|
||||
else if (strncmp(reasons->values[i].string.text, "marker-supply-empty", 19) == 0)
|
||||
else if (strncmp(reason, "marker-supply-empty", 19) == 0)
|
||||
message = "Ink/toner empty!";
|
||||
else if (strncmp(reasons->values[i].string.text, "marker-waste-almost-full", 24) == 0)
|
||||
else if (strncmp(reason, "marker-waste-almost-full", 24) == 0)
|
||||
message = "Ink/toner waste bin almost full.";
|
||||
else if (strncmp(reasons->values[i].string.text, "marker-waste-full", 17) == 0)
|
||||
else if (strncmp(reason, "marker-waste-full", 17) == 0)
|
||||
message = "Ink/toner waste bin full!";
|
||||
else if (strncmp(reasons->values[i].string.text, "fuser-over-temp", 15) == 0)
|
||||
else if (strncmp(reason, "fuser-over-temp", 15) == 0)
|
||||
message = "Fuser temperature high!";
|
||||
else if (strncmp(reasons->values[i].string.text, "fuser-under-temp", 16) == 0)
|
||||
else if (strncmp(reason, "fuser-under-temp", 16) == 0)
|
||||
message = "Fuser temperature low!";
|
||||
else if (strncmp(reasons->values[i].string.text, "opc-near-eol", 12) == 0)
|
||||
else if (strncmp(reason, "opc-near-eol", 12) == 0)
|
||||
message = "OPC almost at end-of-life.";
|
||||
else if (strncmp(reasons->values[i].string.text, "opc-life-over", 13) == 0)
|
||||
else if (strncmp(reason, "opc-life-over", 13) == 0)
|
||||
message = "OPC at end-of-life!";
|
||||
else if (strncmp(reasons->values[i].string.text, "developer-low", 13) == 0)
|
||||
else if (strncmp(reason, "developer-low", 13) == 0)
|
||||
message = "Developer almost empty.";
|
||||
else if (strncmp(reasons->values[i].string.text, "developer-empty", 15) == 0)
|
||||
else if (strncmp(reason, "developer-empty", 15) == 0)
|
||||
message = "Developer empty!";
|
||||
else if (strstr(reasons->values[i].string.text, "error") != NULL)
|
||||
else if (strstr(reason, "error") != NULL)
|
||||
{
|
||||
message = unknown;
|
||||
|
||||
snprintf(unknown, sizeof(unknown), "Unknown printer error (%s)!",
|
||||
reasons->values[i].string.text);
|
||||
reason);
|
||||
}
|
||||
|
||||
if (message)
|
||||
@@ -783,10 +1026,192 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s\n", state);
|
||||
|
||||
return (count);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* 'run_pictwps_filter()' - Convert PICT files to PostScript when printing
|
||||
* remotely.
|
||||
*
|
||||
* This step is required because the PICT format is not documented and
|
||||
* subject to change, so developing a filter for other OS's is infeasible.
|
||||
* Also, fonts required by the PICT file need to be embedded on the
|
||||
* client side (which has the fonts), so we run the filter to get a
|
||||
* PostScript file for printing...
|
||||
*/
|
||||
|
||||
int /* O - Exit status of filter */
|
||||
run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
char *filename, /* I - Filename buffer */
|
||||
int length) /* I - Size of filename buffer */
|
||||
{
|
||||
struct stat fileinfo; /* Print file information */
|
||||
const char *ppdfile; /* PPD file for destination printer */
|
||||
int pid; /* Child process ID */
|
||||
int fd; /* Temporary file descriptor */
|
||||
int status; /* Exit status of filter */
|
||||
const char *printer; /* PRINTER env var */
|
||||
static char ppdenv[1024]; /* PPD environment variable */
|
||||
|
||||
|
||||
/*
|
||||
* First get the PPD file for the printer...
|
||||
*/
|
||||
|
||||
printer = getenv("PRINTER");
|
||||
if (!printer)
|
||||
{
|
||||
fputs("ERROR: PRINTER environment variable not defined!\n", stderr);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if ((ppdfile = cupsGetPPD(printer)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n",
|
||||
printer, ippErrorString(cupsLastError()));
|
||||
/*return (-1);*/
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(ppdenv, sizeof(ppdenv), "PPD=%s", ppdfile);
|
||||
putenv(ppdenv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Then create a temporary file for printing...
|
||||
*/
|
||||
|
||||
if ((fd = cupsTempFd(filename, length)) < 0)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to create temporary file - %s.\n",
|
||||
strerror(errno));
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the owner of the spool file - it is owned by the user we want to run
|
||||
* as...
|
||||
*/
|
||||
|
||||
stat(argv[6], &fileinfo);
|
||||
|
||||
if (ppdfile)
|
||||
chown(ppdfile, fileinfo.st_uid, fileinfo.st_gid);
|
||||
|
||||
fchown(fd, fileinfo.st_uid, fileinfo.st_gid);
|
||||
|
||||
/*
|
||||
* Finally, run the filter to convert the file...
|
||||
*/
|
||||
|
||||
if ((pid = fork()) == 0)
|
||||
{
|
||||
/*
|
||||
* Child process for pictwpstops... Redirect output of pictwpstops to a
|
||||
* file...
|
||||
*/
|
||||
|
||||
close(1);
|
||||
dup(fd);
|
||||
close(fd);
|
||||
|
||||
if (!getuid())
|
||||
{
|
||||
/*
|
||||
* Change to an unpriviledged user...
|
||||
*/
|
||||
|
||||
setgid(fileinfo.st_gid);
|
||||
setuid(fileinfo.st_uid);
|
||||
}
|
||||
|
||||
execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5],
|
||||
argv[6], NULL);
|
||||
perror("ERROR: Unable to exec pictwpstops");
|
||||
return (errno);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
if (pid < 0)
|
||||
{
|
||||
/*
|
||||
* Error!
|
||||
*/
|
||||
|
||||
perror("ERROR: Unable to fork pictwpstops");
|
||||
unlink(filename);
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now wait for the filter to complete...
|
||||
*/
|
||||
|
||||
if (wait(&status) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to wait for pictwpstops");
|
||||
close(fd);
|
||||
unlink(filename);
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
|
||||
close(fd);
|
||||
|
||||
if (status)
|
||||
{
|
||||
if (status >= 256)
|
||||
fprintf(stderr, "ERROR: pictwpstops exited with status %d!\n",
|
||||
status / 256);
|
||||
else
|
||||
fprintf(stderr, "ERROR: pictwpstops exited on signal %d!\n",
|
||||
status);
|
||||
|
||||
unlink(filename);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return with no errors..
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'sigterm_handler()' - Handle 'terminate' signals that stop the backend.
|
||||
*/
|
||||
|
||||
static void
|
||||
sigterm_handler(int sig) /* I - Signal */
|
||||
{
|
||||
(void)sig; /* remove compiler warnings... */
|
||||
|
||||
/*
|
||||
* Remove the temporary file if necessary...
|
||||
*/
|
||||
|
||||
if (tmpfilename[0])
|
||||
unlink(tmpfilename);
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
|
||||
+541
-282
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+46
-13
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Parallel port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -83,7 +85,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) */
|
||||
FILE *fp; /* Print file */
|
||||
int fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -103,6 +105,20 @@ 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...
|
||||
*/
|
||||
@@ -125,7 +141,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
fp = 0;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -134,7 +150,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -176,6 +192,11 @@ 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",
|
||||
@@ -228,14 +249,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
if (fp != 0)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -261,7 +282,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,8 +292,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -330,7 +354,16 @@ list_devices(void)
|
||||
strcpy(basedevice, "/dev/par");
|
||||
}
|
||||
else
|
||||
strcpy(basedevice, "/dev/unknown-parallel");
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,10 +409,10 @@ list_devices(void)
|
||||
|
||||
if (strncmp(line, "MODEL:", 6) == 0 &&
|
||||
strncmp(line, "MODEL:Unknown", 13) != 0)
|
||||
strncpy(model, line + 6, sizeof(model) - 1);
|
||||
strlcpy(model, line + 6, sizeof(model));
|
||||
else if (strncmp(line, "MANUFACTURER:", 13) == 0 &&
|
||||
strncmp(line, "MANUFACTURER:Unknown", 20) != 0)
|
||||
strncpy(make, line + 13, sizeof(make) - 1);
|
||||
strlcpy(make, line + 13, sizeof(make));
|
||||
}
|
||||
|
||||
fclose(probe);
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* "$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 */
|
||||
#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$".
|
||||
*/
|
||||
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* "$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$".
|
||||
*/
|
||||
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
* "$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$".
|
||||
*/
|
||||
+139
-15
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Serial port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -72,6 +74,13 @@
|
||||
# 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...
|
||||
@@ -101,7 +110,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) */
|
||||
FILE *fp; /* Print file */
|
||||
int fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -124,6 +133,20 @@ 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 +169,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
fp = 0;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -155,7 +178,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -291,18 +314,24 @@ 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 */
|
||||
# endif /* B115200 */
|
||||
# ifdef B230400
|
||||
case 230400 :
|
||||
cfsetispeed(&opts, B230400);
|
||||
cfsetospeed(&opts, B230400);
|
||||
break;
|
||||
# endif /* B230400 */
|
||||
default :
|
||||
fprintf(stderr, "WARNING: Unsupported baud rate %s!\n", value);
|
||||
break;
|
||||
@@ -417,10 +446,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
if (fp != 0)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
if (dtrdsr)
|
||||
@@ -454,7 +483,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, bufsize, fp)) > 0)
|
||||
while ((nbytes = read(fp, buffer, bufsize)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -480,7 +509,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -491,8 +521,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
tcsetattr(fd, TCSADRAIN, &origopts);
|
||||
|
||||
close(fd);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -510,7 +542,7 @@ list_devices(void)
|
||||
/* Funky hex numbering used for some devices */
|
||||
#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
|
||||
|
||||
#ifdef __linux
|
||||
#if defined(__linux) || defined(linux) || defined(__linux__)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
@@ -522,8 +554,24 @@ 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)
|
||||
@@ -857,7 +905,83 @@ 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
|
||||
}
|
||||
|
||||
|
||||
+124
-24
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* AppSocket backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -43,6 +45,8 @@
|
||||
#ifdef WIN32
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
@@ -50,6 +54,46 @@
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Some OS's don't have hstrerror(), most notably Solaris...
|
||||
*/
|
||||
|
||||
#ifndef HAVE_HSTRERROR
|
||||
# define hstrerror cups_hstrerror
|
||||
|
||||
const char * /* O - Error string */
|
||||
cups_hstrerror(int error) /* I - Error number */
|
||||
{
|
||||
static const char * const errors[] =
|
||||
{
|
||||
"OK",
|
||||
"Host not found.",
|
||||
"Try again.",
|
||||
"Unrecoverable lookup error.",
|
||||
"No data associated with name."
|
||||
};
|
||||
|
||||
|
||||
if (error < 0 || error > 4)
|
||||
return ("Unknown hostname lookup error.");
|
||||
else
|
||||
return (errors[error]);
|
||||
}
|
||||
#elif defined(_AIX)
|
||||
/*
|
||||
* AIX doesn't provide a prototype but does provide the function...
|
||||
*/
|
||||
extern const char *hstrerror(int);
|
||||
#endif /* !HAVE_HSTRERROR */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void print_backchannel(const unsigned char *buffer, int nbytes);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the printer or server.
|
||||
*
|
||||
@@ -58,15 +102,15 @@
|
||||
* 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 */
|
||||
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 (not used) */
|
||||
FILE *fp; /* Print file */
|
||||
int fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int port; /* Port number */
|
||||
int delay; /* Delay for retries... */
|
||||
@@ -75,8 +119,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
struct sockaddr_in addr; /* Socket address */
|
||||
struct hostent *hostaddr; /* Host address */
|
||||
int wbytes; /* Number of bytes written */
|
||||
size_t nbytes, /* Number of bytes read */
|
||||
tbytes; /* Total number of bytes written */
|
||||
int nbytes; /* Number of bytes read */
|
||||
size_t tbytes; /* Total number of bytes written */
|
||||
char buffer[8192], /* Output buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
struct timeval timeout; /* Timeout for select() */
|
||||
@@ -92,6 +136,20 @@ 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...
|
||||
*/
|
||||
@@ -115,7 +173,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
fp = 0;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -124,7 +182,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -149,7 +207,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if ((hostaddr = httpGetHostByName(hostname)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s\n",
|
||||
hostname, strerror(errno));
|
||||
hostname, hstrerror(h_errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -177,7 +235,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (error == ECONNREFUSED)
|
||||
if (error == ECONNREFUSED || error == EHOSTDOWN ||
|
||||
error == EHOSTUNREACH)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
|
||||
hostname, delay);
|
||||
@@ -224,16 +283,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
if (fp != 0)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
fputs("INFO: Connected to host, sending print job...\n", stderr);
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -263,22 +322,22 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
FD_ZERO(&input);
|
||||
FD_SET(fd, &input);
|
||||
#ifdef __hpux
|
||||
if (select(fd + 1, (int *)&input, NULL, NULL, &timeout) > 0)
|
||||
#else
|
||||
if (select(fd + 1, &input, NULL, NULL, &timeout) > 0)
|
||||
#endif /* __hpux */
|
||||
{
|
||||
/*
|
||||
* Grab the data coming back and spit it out to stderr...
|
||||
*/
|
||||
|
||||
if ((nbytes = recv(fd, buffer, sizeof(buffer), 0)) > 0)
|
||||
fprintf(stderr, "INFO: Received %u bytes of back-channel data!\n",
|
||||
{
|
||||
fprintf(stderr, "INFO: Received %d bytes of back-channel data!\n",
|
||||
nbytes);
|
||||
print_backchannel((unsigned char *)buffer, nbytes);
|
||||
}
|
||||
}
|
||||
else if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -313,9 +372,12 @@ 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 %u bytes of back-channel data!\n",
|
||||
{
|
||||
fprintf(stderr, "INFO: Received %d bytes of back-channel data!\n",
|
||||
nbytes);
|
||||
else
|
||||
print_backchannel((unsigned char *)buffer, nbytes);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
else
|
||||
@@ -333,8 +395,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Close the input file and return...
|
||||
*/
|
||||
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
@@ -342,6 +404,44 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'print_backchannel()' - Print the contents of a back-channel buffer.
|
||||
*/
|
||||
|
||||
void
|
||||
print_backchannel(const unsigned char *buffer, /* I - Data buffer */
|
||||
int nbytes) /* I - Number of bytes */
|
||||
{
|
||||
char line[255], /* Formatted line */
|
||||
*lineptr; /* Pointer into line */
|
||||
|
||||
|
||||
for (lineptr = line; nbytes > 0; buffer ++, nbytes --)
|
||||
{
|
||||
if (*buffer < 0x20 || *buffer >= 0x7f)
|
||||
{
|
||||
snprintf(lineptr, sizeof(line) - (lineptr - line), "<%02X>", *buffer);
|
||||
lineptr += strlen(lineptr);
|
||||
}
|
||||
else
|
||||
*lineptr++ = *buffer;
|
||||
|
||||
if ((lineptr - line) > 72)
|
||||
{
|
||||
*lineptr = '\0';
|
||||
fprintf(stderr, "DEBUG: DATA: %s\n", line);
|
||||
lineptr = line;
|
||||
}
|
||||
}
|
||||
|
||||
if (lineptr > line)
|
||||
{
|
||||
*lineptr = '\0';
|
||||
fprintf(stderr, "DEBUG: DATA: %s\n", line);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+477
-175
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* USB port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -46,12 +48,35 @@
|
||||
# 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
|
||||
# ifdef __sparc
|
||||
# include <sys/ecppio.h>
|
||||
# else
|
||||
# include <sys/ecppsys.h>
|
||||
# endif /* __sparc */
|
||||
#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);
|
||||
|
||||
|
||||
/*
|
||||
@@ -66,13 +91,7 @@ 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) */
|
||||
FILE *fp; /* Print file */
|
||||
int fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
@@ -84,6 +103,9 @@ 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 */
|
||||
|
||||
|
||||
/*
|
||||
@@ -92,6 +114,20 @@ 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...
|
||||
*/
|
||||
@@ -114,7 +150,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
fp = 0;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
@@ -123,7 +159,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
if ((fp = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
@@ -132,43 +168,28 @@ 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(resource, O_WRONLY | O_EXCL)) == -1)
|
||||
if ((fd = open_device(argv[0])) == -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 port device file \"%s\": %s\n",
|
||||
resource, strerror(errno));
|
||||
fprintf(stderr, "ERROR: Unable to open USB device \"%s\": %s\n",
|
||||
argv[0], strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -209,6 +230,27 @@ 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...
|
||||
*/
|
||||
@@ -217,14 +259,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
if (fp != 0)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
lseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
@@ -235,6 +277,7 @@ 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);
|
||||
@@ -250,7 +293,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
|
||||
(unsigned long)tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,13 +303,120 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
if (fp != 0)
|
||||
close(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
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 */
|
||||
serial_number[1024]; /* Serial number 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
|
||||
serial_number[0] = '\0';
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
@@ -275,180 +426,331 @@ list_devices(void)
|
||||
{
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
int length; /* Length of device ID info */
|
||||
int fd; /* File descriptor */
|
||||
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 */
|
||||
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 */
|
||||
|
||||
|
||||
/*
|
||||
* First try opening one of the USB devices to load the driver
|
||||
* module as needed...
|
||||
* First figure out which USB printer filename to use...
|
||||
*/
|
||||
|
||||
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 look at the device list for the USB bus...
|
||||
*/
|
||||
|
||||
if ((probe = fopen("/proc/bus/usb/devices", "r")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Scan the device list...
|
||||
*/
|
||||
|
||||
i = 0;
|
||||
|
||||
memset(make, 0, sizeof(make));
|
||||
memset(model, 0, sizeof(model));
|
||||
|
||||
while (fgets(line, sizeof(line), probe) != NULL)
|
||||
{
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
/*
|
||||
* String attribute...
|
||||
*/
|
||||
|
||||
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 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...
|
||||
*/
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
fclose(probe);
|
||||
|
||||
/*
|
||||
* Write empty device listings for unused USB devices...
|
||||
*/
|
||||
|
||||
for (; 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);
|
||||
}
|
||||
}
|
||||
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 open each USB device...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
{
|
||||
/*
|
||||
* Just check manually for USB devices...
|
||||
*/
|
||||
sprintf(device, format, i);
|
||||
|
||||
for (i = 0; i < 16; i ++)
|
||||
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
|
||||
{
|
||||
sprintf(device, "/dev/usb/lp%d", i);
|
||||
|
||||
if (access(device, 0))
|
||||
if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(device_id)), device_id) == 0)
|
||||
{
|
||||
sprintf(device, "/dev/usb/usblp%d", i);
|
||||
length = (((unsigned)device_id[0] & 255) << 8) +
|
||||
((unsigned)device_id[1] & 255);
|
||||
|
||||
if (access(device, 0))
|
||||
{
|
||||
sprintf(device, "/dev/usblp%d", i);
|
||||
/*
|
||||
* 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...
|
||||
*/
|
||||
|
||||
if (access(device, 0))
|
||||
continue;
|
||||
}
|
||||
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';
|
||||
}
|
||||
else
|
||||
device_id[0] = '\0';
|
||||
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
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);
|
||||
}
|
||||
#elif defined(__sgi)
|
||||
#elif defined(__sun)
|
||||
#elif defined(__hpux)
|
||||
#elif defined(__osf)
|
||||
#elif defined(__FreeBSD__)
|
||||
int i; /* Looping var */
|
||||
char device[255]; /* Device filename */
|
||||
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 */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
/*
|
||||
* Open each USB device...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/unlpt%d", 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(__NetBSD__) || defined(__OpenBSD__)
|
||||
#elif defined(__hpux)
|
||||
#elif defined(__osf)
|
||||
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
int i; /* Looping var */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
for (i = 0; i < 8; 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$".
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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 ../cups/string.h
|
||||
lpc.o: ../config.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: ../cups/string.h ../config.h ../cups/cups.h ../cups/ipp.h
|
||||
lpr.o: ../cups/http.h ../cups/md5.h ../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 ../cups/string.h ../config.h
|
||||
+16
-9
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Berkeley commands makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -43,11 +43,19 @@ 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:
|
||||
install: all
|
||||
$(INSTALL_DIR) $(BINDIR)
|
||||
$(INSTALL_BIN) lpq $(BINDIR)
|
||||
$(INSTALL_BIN) lpr $(BINDIR)
|
||||
@@ -64,8 +72,6 @@ lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpc lpc.o $(LIBS)
|
||||
|
||||
lpc.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpq
|
||||
@@ -75,8 +81,6 @@ lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpq lpq.o $(LIBS)
|
||||
|
||||
lpq.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpr
|
||||
@@ -86,8 +90,6 @@ lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
|
||||
|
||||
lpr.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lprm
|
||||
@@ -97,7 +99,12 @@ lprm: lprm.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
|
||||
|
||||
lprm.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
|
||||
|
||||
#
|
||||
|
||||
+2
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpc" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
#include <cups/string.h>
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+49
-18
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpq" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -26,6 +26,7 @@
|
||||
* main() - Parse options and commands.
|
||||
* show_jobs() - Show jobs.
|
||||
* show_printer() - Show printer status.
|
||||
* usage() - Show program usage.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -38,8 +39,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <config.h>
|
||||
#include <cups/string.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
@@ -52,6 +52,7 @@
|
||||
static int show_jobs(http_t *, const char *, const char *, const int,
|
||||
const int);
|
||||
static void show_printer(http_t *, const char *);
|
||||
static void usage(void);
|
||||
|
||||
|
||||
/*
|
||||
@@ -72,9 +73,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
longstatus; /* Show file details */
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dests; /* Destinations */
|
||||
#ifdef HAVE_LIBSSL
|
||||
#ifdef HAVE_SSL
|
||||
http_encryption_t encryption; /* Encryption? */
|
||||
#endif /* HAVE_LIBSSL */
|
||||
#endif /* HAVE_SSL */
|
||||
|
||||
|
||||
/*
|
||||
@@ -112,7 +113,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
#ifdef HAVE_SSL
|
||||
encryption = HTTP_ENCRYPT_REQUIRED;
|
||||
|
||||
if (http)
|
||||
@@ -120,7 +121,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
#endif /* HAVE_SSL */
|
||||
break;
|
||||
|
||||
case 'P' : /* Printer */
|
||||
@@ -129,11 +130,31 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
|
||||
if (i >= argc)
|
||||
{
|
||||
httpClose(http);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
|
||||
usage();
|
||||
}
|
||||
|
||||
dest = argv[i];
|
||||
}
|
||||
|
||||
if ((instance = strchr(dest, '/')) != NULL)
|
||||
*instance = '\0';
|
||||
*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);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'a' : /* All printers */
|
||||
@@ -145,10 +166,11 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
break;
|
||||
|
||||
default :
|
||||
fputs("Usage: lpq [-P dest] [-l] [+interval]\n", stderr);
|
||||
httpClose(http);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
return (1);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
|
||||
usage();
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (isdigit(argv[i][0]))
|
||||
@@ -415,20 +437,17 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies,
|
||||
jobname);
|
||||
else
|
||||
{
|
||||
strncpy(namestr, jobname, sizeof(namestr) - 1);
|
||||
namestr[sizeof(namestr) - 1] = '\0';
|
||||
}
|
||||
strlcpy(namestr, jobname, sizeof(namestr));
|
||||
|
||||
printf("%s: %-34.34s[job %d localhost]\n", jobuser, rankstr, jobid);
|
||||
printf(" %-40.40s%d bytes\n", namestr, jobsize);
|
||||
printf("%s: %-33.33s [job %d localhost]\n", jobuser, rankstr, jobid);
|
||||
printf(" %-39.39s %d bytes\n", namestr, jobsize);
|
||||
}
|
||||
else
|
||||
#ifdef __osf__
|
||||
printf("%-6s %-10.10s %-4d %-10d %-27.27s %d bytes\n", rankstr, jobuser,
|
||||
jobpriority, jobid, jobname, jobsize);
|
||||
#else
|
||||
printf("%-7s %-8.8s%-8d%-32.32s%d bytes\n", rankstr, jobuser,
|
||||
printf("%-7s %-7.7s %-7d %-31.31s %d bytes\n", rankstr, jobuser,
|
||||
jobid, jobname, jobsize);
|
||||
#endif /* __osf */
|
||||
|
||||
@@ -537,6 +556,18 @@ show_printer(http_t *http, /* I - HTTP connection to server */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'usage()' - Show program usage.
|
||||
*/
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
fputs("Usage: lpq [-P dest] [-l] [+interval]\n", stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+35
-25
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpr" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -33,12 +33,14 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <config.h>
|
||||
#include <cups/string.h>
|
||||
#include <cups/cups.h>
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
# include <unistd.h>
|
||||
# include <signal.h>
|
||||
|
||||
|
||||
@@ -84,6 +86,7 @@ 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 */
|
||||
|
||||
|
||||
@@ -101,12 +104,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
switch (ch = argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
#ifdef HAVE_SSL
|
||||
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
#endif /* HAVE_SSL */
|
||||
break;
|
||||
|
||||
case '1' : /* TROFF font set 1 */
|
||||
@@ -227,12 +230,6 @@ 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;
|
||||
@@ -281,6 +278,13 @@ 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 ++;
|
||||
|
||||
@@ -303,23 +307,25 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
if (num_dests == 0)
|
||||
num_dests = cupsGetDests(&dests);
|
||||
|
||||
for (j = 0, dest = dests; j < num_dests; j ++, dest ++)
|
||||
if (dest->is_default)
|
||||
{
|
||||
printer = dests[j].name;
|
||||
if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL)
|
||||
{
|
||||
printer = dest->name;
|
||||
|
||||
for (j = 0; j < dest->num_options; j ++)
|
||||
if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
|
||||
num_options = cupsAddOption(dest->options[j].name,
|
||||
dest->options[j].value,
|
||||
num_options, &options);
|
||||
break;
|
||||
}
|
||||
for (j = 0; j < dest->num_options; j ++)
|
||||
if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
|
||||
num_options = cupsAddOption(dest->options[j].name,
|
||||
dest->options[j].value,
|
||||
num_options, &options);
|
||||
}
|
||||
}
|
||||
|
||||
if (printer == NULL)
|
||||
{
|
||||
fputs("lpr: error - no default destination available.\n", stderr);
|
||||
if (cupsLastError() >= IPP_BAD_REQUEST)
|
||||
fputs("lpr: error - scheduler not responding!\n", stderr);
|
||||
else
|
||||
fputs("lpr: error - no default destination available.\n", stderr);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -344,18 +350,22 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
#ifndef WIN32
|
||||
# if defined(HAVE_SIGSET)
|
||||
sigset(SIGHUP, sighandler);
|
||||
sigset(SIGINT, sighandler);
|
||||
if (sigset(SIGINT, sighandler) == SIG_IGN)
|
||||
sigset(SIGINT, SIG_IGN);
|
||||
sigset(SIGTERM, sighandler);
|
||||
# elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = sighandler;
|
||||
|
||||
sigaction(SIGHUP, &action, NULL);
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGINT, NULL, &oldaction);
|
||||
if (oldaction.sa_handler != SIG_IGN)
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
# else
|
||||
signal(SIGHUP, sighandler);
|
||||
signal(SIGINT, sighandler);
|
||||
if (signal(SIGINT, sighandler) == SIG_IGN)
|
||||
signal(SIGINT, SIG_IGN);
|
||||
signal(SIGTERM, sighandler);
|
||||
# endif
|
||||
#endif /* !WIN32 */
|
||||
|
||||
+13
-5
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lprm" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -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>
|
||||
|
||||
|
||||
/*
|
||||
@@ -98,14 +98,14 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
#ifdef HAVE_SSL
|
||||
encryption = HTTP_ENCRYPT_REQUIRED;
|
||||
|
||||
httpEncryption(http, encryption);
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
#endif /* HAVE_SSL */
|
||||
break;
|
||||
|
||||
case 'P' : /* Cancel jobs on a printer */
|
||||
@@ -119,6 +119,14 @@ 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 :
|
||||
@@ -133,7 +141,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Cancel a job or printer...
|
||||
*/
|
||||
|
||||
if (isdigit(argv[i][0]))
|
||||
if (isdigit(argv[i][0]) && cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
|
||||
{
|
||||
dest = NULL;
|
||||
op = IPP_CANCEL_JOB;
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# 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
|
||||
+15
-13
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# CGI makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
# 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
|
||||
@@ -45,11 +45,19 @@ 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:
|
||||
install: all
|
||||
$(INSTALL_DIR) $(SERVERBIN)/cgi-bin
|
||||
for file in $(CGIS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \
|
||||
@@ -66,9 +74,6 @@ libcgi.a: $(LIBOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
$(LIBOBJS): cgi.h
|
||||
ipp-var.o: ipp-var.h
|
||||
|
||||
|
||||
#
|
||||
# admin.cgi
|
||||
@@ -78,8 +83,6 @@ 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
|
||||
@@ -89,8 +92,6 @@ 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
|
||||
@@ -100,8 +101,6 @@ 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
|
||||
@@ -111,9 +110,12 @@ 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
|
||||
|
||||
$(OBJS): ../Makedefs
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
|
||||
|
||||
#
|
||||
|
||||
+150
-153
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Administration CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -29,7 +29,6 @@
|
||||
* 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.
|
||||
*/
|
||||
@@ -52,7 +51,6 @@ 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);
|
||||
|
||||
@@ -111,15 +109,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Do the operation...
|
||||
*/
|
||||
|
||||
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)
|
||||
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);
|
||||
@@ -127,6 +117,8 @@ 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)
|
||||
@@ -241,7 +233,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
@@ -264,17 +256,14 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
name = cgiGetVariable("PRINTER_NAME");
|
||||
if (isdigit(*name))
|
||||
ptr = name;
|
||||
else
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && *ptr != '_')
|
||||
break;
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/')
|
||||
break;
|
||||
|
||||
if (*ptr || ptr == name)
|
||||
if (*ptr || ptr == name || strlen(name) > 127)
|
||||
{
|
||||
cgiSetVariable("ERROR", "The class name may only contain letters, "
|
||||
"numbers, and the underscore.");
|
||||
cgiSetVariable("ERROR", "The class name may only contain up to 127 printable "
|
||||
"characters.");
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
@@ -458,7 +447,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -559,7 +548,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
*/
|
||||
|
||||
if (oldinfo)
|
||||
ippSetCGIVars(oldinfo, NULL, NULL);
|
||||
ippSetCGIVars(oldinfo, NULL, NULL, NULL, 0);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "modify-printer.tmpl", getenv("LANG"));
|
||||
}
|
||||
@@ -578,17 +567,14 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
return;
|
||||
}
|
||||
|
||||
if (isdigit(*name))
|
||||
ptr = name;
|
||||
else
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && *ptr != '_')
|
||||
break;
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/')
|
||||
break;
|
||||
|
||||
if (*ptr || ptr == name)
|
||||
if (*ptr || ptr == name || strlen(name) > 127)
|
||||
{
|
||||
cgiSetVariable("ERROR", "The printer name may only contain letters, "
|
||||
"numbers, and the underscore.");
|
||||
cgiSetVariable("ERROR", "The printer name may only contain up to 127 printable "
|
||||
"characters.");
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
return;
|
||||
}
|
||||
@@ -624,7 +610,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
@@ -635,8 +621,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
if (oldinfo &&
|
||||
(attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
strncpy(uri, attr->values[0].string.text, sizeof(uri) - 1);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
strlcpy(uri, attr->values[0].string.text, sizeof(uri));
|
||||
if ((uriptr = strchr(uri, ':')) != NULL && strncmp(uriptr, "://", 3) == 0)
|
||||
*uriptr = '\0';
|
||||
|
||||
@@ -789,10 +774,9 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
* Let the user choose a model...
|
||||
*/
|
||||
|
||||
strncpy(make, var, sizeof(make) - 1);
|
||||
make[sizeof(make) - 1] = '\0';
|
||||
strlcpy(make, var, sizeof(make));
|
||||
|
||||
ippSetCGIVars(response, "ppd-make", make);
|
||||
ippSetCGIVars(response, "ppd-make", make, NULL, 0);
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "choose-model.tmpl",
|
||||
getenv("LANG"));
|
||||
}
|
||||
@@ -852,8 +836,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name",
|
||||
NULL, cgiGetVariable("PPD_NAME"));
|
||||
|
||||
strncpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri) - 1);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
strlcpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri));
|
||||
if (strncmp(uri, "serial:", 7) == 0)
|
||||
{
|
||||
/*
|
||||
@@ -887,7 +870,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -933,6 +916,7 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
ppd_file_t *ppd; /* PPD file */
|
||||
ppd_group_t *group; /* Option group */
|
||||
ppd_option_t *option; /* Option */
|
||||
ppd_attr_t *protocol; /* cupsProtocol attribute */
|
||||
|
||||
|
||||
/*
|
||||
@@ -952,10 +936,28 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
* Get the PPD file...
|
||||
*/
|
||||
|
||||
cupsSetServer("localhost");
|
||||
|
||||
if ((filename = cupsGetPPD(printer)) == NULL)
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
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"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -967,19 +969,34 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
else
|
||||
have_options = 0;
|
||||
|
||||
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 ++)
|
||||
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 ++)
|
||||
if ((var = cgiGetVariable(option->keyword)) != NULL)
|
||||
{
|
||||
DEBUG_printf(("<LI>%s = \"%s\"</LI>\n", option->keyword, var));
|
||||
have_options = 1;
|
||||
break;
|
||||
ppdMarkOption(ppd, option->keyword, var);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else
|
||||
printf("<LI>%s not defined!</LI>\n", option->keyword);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!have_options)
|
||||
DEBUG_puts("</UL></LI>");
|
||||
}
|
||||
|
||||
DEBUG_printf(("</UL>\n"
|
||||
"<P>ppdConflicts(ppd) = %d\n", ppdConflicts(ppd)));
|
||||
|
||||
if (!have_options || ppdConflicts(ppd))
|
||||
{
|
||||
/*
|
||||
* Show the options to the user...
|
||||
@@ -988,11 +1005,31 @@ 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 ++)
|
||||
{
|
||||
cgiSetVariable("GROUP", group->text);
|
||||
if (strcmp(group->text, "InstallableOptions") == 0)
|
||||
cgiSetVariable("GROUP",
|
||||
cupsLangString(language, CUPS_MSG_OPTIONS_INSTALLED));
|
||||
else
|
||||
cgiSetVariable("GROUP", group->text);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-header.tmpl",
|
||||
getenv("LANG"));
|
||||
|
||||
@@ -1005,7 +1042,11 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
|
||||
cgiSetVariable("KEYWORD", option->keyword);
|
||||
cgiSetVariable("KEYTEXT", option->text);
|
||||
cgiSetVariable("DEFCHOICE", option->defchoice);
|
||||
|
||||
if (option->conflicted)
|
||||
cgiSetVariable("CONFLICTED", "1");
|
||||
else
|
||||
cgiSetVariable("CONFLICTED", "0");
|
||||
|
||||
cgiSetSize("CHOICES", option->num_choices);
|
||||
cgiSetSize("TEXT", option->num_choices);
|
||||
@@ -1013,6 +1054,9 @@ 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)
|
||||
@@ -1110,6 +1154,45 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Binary protocol support...
|
||||
*/
|
||||
|
||||
if (ppd->protocols && strstr(ppd->protocols, "BCP"))
|
||||
{
|
||||
protocol = ppdFindAttr(ppd, "cupsProtocol", NULL);
|
||||
|
||||
cgiSetVariable("GROUP", "PS Binary Protocol");
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-header.tmpl",
|
||||
getenv("LANG"));
|
||||
|
||||
cgiSetSize("CHOICES", 2);
|
||||
cgiSetSize("TEXT", 2);
|
||||
cgiSetArray("CHOICES", 0, "None");
|
||||
cgiSetArray("TEXT", 0, "None");
|
||||
|
||||
if (strstr(ppd->protocols, "TBCP"))
|
||||
{
|
||||
cgiSetArray("CHOICES", 1, "TBCP");
|
||||
cgiSetArray("TEXT", 1, "TBCP");
|
||||
}
|
||||
else
|
||||
{
|
||||
cgiSetArray("CHOICES", 1, "BCP");
|
||||
cgiSetArray("TEXT", 1, "BCP");
|
||||
}
|
||||
|
||||
cgiSetVariable("KEYWORD", "protocol");
|
||||
cgiSetVariable("KEYTEXT", "PS Binary Protocol");
|
||||
cgiSetVariable("DEFCHOICE", protocol ? protocol->value : "None");
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-pickone.tmpl",
|
||||
getenv("LANG"));
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "option-trailer.tmpl",
|
||||
getenv("LANG"));
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "config-printer2.tmpl",
|
||||
getenv("LANG"));
|
||||
}
|
||||
@@ -1133,7 +1216,9 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
|
||||
while (get_line(line, sizeof(line), in) != NULL)
|
||||
{
|
||||
if (strncmp(line, "*Default", 8) != 0)
|
||||
if (!strncmp(line, "*cupsProtocol:", 14) && cgiGetVariable("protocol"))
|
||||
continue;
|
||||
else if (strncmp(line, "*Default", 8))
|
||||
fprintf(out, "%s\n", line);
|
||||
else
|
||||
{
|
||||
@@ -1141,8 +1226,7 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
* Get default option name...
|
||||
*/
|
||||
|
||||
strncpy(keyword, line + 8, sizeof(keyword) - 1);
|
||||
keyword[sizeof(keyword) - 1] = '\0';
|
||||
strlcpy(keyword, line + 8, sizeof(keyword));
|
||||
|
||||
for (keyptr = keyword; *keyptr; keyptr ++)
|
||||
if (*keyptr == ':' || isspace(*keyptr))
|
||||
@@ -1162,6 +1246,9 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
}
|
||||
|
||||
if ((var = cgiGetVariable("protocol")) != NULL)
|
||||
fprintf(out, "*cupsProtocol: %s\n", cgiGetVariable("protocol"));
|
||||
|
||||
fclose(in);
|
||||
fclose(out);
|
||||
close(outfd);
|
||||
@@ -1208,7 +1295,7 @@ do_config_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_NOT_AUTHORIZED;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1289,7 +1376,7 @@ do_delete_class(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1365,7 +1452,7 @@ do_delete_printer(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1377,98 +1464,6 @@ 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.
|
||||
*/
|
||||
@@ -1528,7 +1523,7 @@ do_printer_op(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
status = cupsLastError();
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
@@ -1543,6 +1538,8 @@ 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"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+3
-13
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI support library definitions.
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* Copyright 1997-2003 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,16 +38,6 @@
|
||||
# endif /* WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Stuff for WIN32 and OS/2...
|
||||
*/
|
||||
|
||||
# if defined(WIN32) || defined(__EMX__)
|
||||
# define strcasecmp stricmp
|
||||
# define strncasecmp strnicmp
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
+8
-5
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Class status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -202,13 +202,16 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
uri);
|
||||
}
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "all");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
@@ -259,7 +262,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
@@ -320,12 +323,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
CUPS_DATADIR "/data/testprint.ps")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
status = cupsLastError();
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", pclass);
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI HTML functions.
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* Copyright 1997-2003 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
|
||||
|
||||
+100
-42
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP variable routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -72,6 +72,10 @@ 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 */
|
||||
}
|
||||
|
||||
|
||||
@@ -82,13 +86,16 @@ ippSetServerVersion(void)
|
||||
void
|
||||
ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
const char *filter_name, /* I - Filter name */
|
||||
const char *filter_value) /* I - Filter value */
|
||||
const char *filter_value, /* I - Filter value */
|
||||
const char *prefix, /* I - Prefix for name or NULL */
|
||||
int parent_el) /* I - Parent element number */
|
||||
{
|
||||
int element; /* Element in CGI array */
|
||||
ipp_attribute_t *attr, /* Attribute in response... */
|
||||
*filter; /* Filtering attribute */
|
||||
int i; /* Looping var */
|
||||
char name[1024], /* Name of attribute */
|
||||
*nameptr, /* Pointer into name */
|
||||
value[16384], /* Value(s) */
|
||||
*valptr; /* Pointer into value */
|
||||
char method[HTTP_MAX_URI],
|
||||
@@ -99,19 +106,46 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
int port; /* URI data */
|
||||
int ishttps; /* Using encryption? */
|
||||
const char *server; /* Name of server */
|
||||
char servername[1024];/* Locale server name */
|
||||
struct tm *date; /* Date information */
|
||||
|
||||
|
||||
ippSetServerVersion();
|
||||
DEBUG_printf(("<P>ippSetCGIVars(response=%p, filter_name=\"%s\", filter_value=\"%s\", prefix=\"%s\")\n",
|
||||
response, filter_name, filter_value, prefix));
|
||||
|
||||
/*
|
||||
* Set common CGI template variables...
|
||||
*/
|
||||
|
||||
if (!prefix)
|
||||
ippSetServerVersion();
|
||||
|
||||
/*
|
||||
* Get the server name associated with the client interface as well as
|
||||
* the locally configured hostname. We'll check *both* of these to
|
||||
* see if the printer URL is local...
|
||||
*/
|
||||
|
||||
server = getenv("SERVER_NAME");
|
||||
gethostname(servername, sizeof(servername));
|
||||
|
||||
/*
|
||||
* Flag whether we are using SSL on this connection...
|
||||
*/
|
||||
|
||||
server = getenv("SERVER_NAME");
|
||||
ishttps = getenv("HTTPS") != NULL;
|
||||
|
||||
for (attr = response->attrs;
|
||||
attr && attr->group_tag == IPP_TAG_OPERATION;
|
||||
attr = attr->next);
|
||||
/*
|
||||
* Loop through the attributes and set them for the template...
|
||||
*/
|
||||
|
||||
for (element = 0; attr != NULL; attr = attr->next, element ++)
|
||||
attr = response->attrs;
|
||||
|
||||
if (!prefix)
|
||||
while (attr && attr->group_tag == IPP_TAG_OPERATION)
|
||||
attr = attr->next;
|
||||
|
||||
for (element = parent_el; attr != NULL; attr = attr->next, element ++)
|
||||
{
|
||||
/*
|
||||
* Copy attributes to a separator...
|
||||
@@ -150,13 +184,21 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
if (attr->name == NULL)
|
||||
continue;
|
||||
|
||||
for (i = 0; attr->name[i]; i ++)
|
||||
if (attr->name[i] == '-')
|
||||
name[i] = '_';
|
||||
else
|
||||
name[i] = attr->name[i];
|
||||
if (prefix)
|
||||
{
|
||||
snprintf(name, sizeof(name), "%s.", prefix);
|
||||
nameptr = name + strlen(name);
|
||||
}
|
||||
else
|
||||
nameptr = name;
|
||||
|
||||
name[i] = '\0';
|
||||
for (i = 0; attr->name[i] && nameptr < (name + sizeof(name) - 1); i ++)
|
||||
if (attr->name[i] == '-')
|
||||
*nameptr++ = '_';
|
||||
else
|
||||
*nameptr++ = attr->name[i];
|
||||
|
||||
*nameptr = '\0';
|
||||
|
||||
/*
|
||||
* Add "job_printer_name" variable if we have a "job_printer_uri"
|
||||
@@ -177,14 +219,13 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
* Copy values...
|
||||
*/
|
||||
|
||||
value[0] = '\0'; /* Initially an empty string */
|
||||
value[sizeof(value) - 1] = '\0'; /* In case string gets full */
|
||||
valptr = value; /* Start at the beginning */
|
||||
value[0] = '\0'; /* Initially an empty string */
|
||||
valptr = value; /* Start at the beginning */
|
||||
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
if (i)
|
||||
strncat(valptr, ",", sizeof(value) - (valptr - value) - 1);
|
||||
strlcat(valptr, ",", sizeof(value) - (valptr - value));
|
||||
|
||||
valptr += strlen(valptr);
|
||||
|
||||
@@ -209,7 +250,7 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
break;
|
||||
|
||||
case IPP_TAG_NOVALUE :
|
||||
strncat(valptr, "novalue", sizeof(value) - (valptr - value) - 1);
|
||||
strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
@@ -236,32 +277,35 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
strcmp(method, "http") == 0)
|
||||
{
|
||||
/*
|
||||
* Map localhost access to localhost and local port...
|
||||
* Map local access to a local URI...
|
||||
*/
|
||||
|
||||
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))
|
||||
if (strcasecmp(hostname, server) == 0 ||
|
||||
strcasecmp(hostname, servername) == 0)
|
||||
{
|
||||
strcpy(hostname, "localhost");
|
||||
port = atoi(getenv("SERVER_PORT"));
|
||||
/*
|
||||
* Make URI relative to the current server...
|
||||
*/
|
||||
|
||||
strlcpy(uri, resource, sizeof(uri));
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Rewrite URI with HTTP address...
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
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);
|
||||
strlcat(valptr, uri, sizeof(value) - (valptr - value));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -272,10 +316,17 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
case IPP_TAG_KEYWORD :
|
||||
case IPP_TAG_CHARSET :
|
||||
case IPP_TAG_LANGUAGE :
|
||||
strncat(valptr, attr->values[i].string.text,
|
||||
sizeof(value) - (valptr - value) - 1);
|
||||
case IPP_TAG_MIMETYPE :
|
||||
strlcat(valptr, attr->values[i].string.text,
|
||||
sizeof(value) - (valptr - value));
|
||||
break;
|
||||
|
||||
case IPP_TAG_BEGIN_COLLECTION :
|
||||
snprintf(value, sizeof(value), "%s%d", name, i + 1);
|
||||
ippSetCGIVars(attr->values[i].collection, filter_name,
|
||||
filter_value, value, element);
|
||||
break;
|
||||
|
||||
default :
|
||||
break; /* anti-compiler-warning-code */
|
||||
}
|
||||
@@ -285,12 +336,19 @@ ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
|
||||
* Add the element...
|
||||
*/
|
||||
|
||||
cgiSetArray(name, element, value);
|
||||
if (attr->value_tag != IPP_TAG_BEGIN_COLLECTION)
|
||||
{
|
||||
cgiSetArray(name, element, value);
|
||||
|
||||
DEBUG_printf(("<P>%s[%d]=\"%s\"\n", name, element, value));
|
||||
}
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG_puts("<P>Leaving ippSetCGIVars()...");
|
||||
}
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP variable definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -26,7 +26,6 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/debug.h>
|
||||
#include <cups/language.h>
|
||||
@@ -47,7 +46,8 @@
|
||||
|
||||
extern char *ippGetTemplateDir(void);
|
||||
extern void ippSetServerVersion(void);
|
||||
extern void ippSetCGIVars(ipp_t *, const char *, const char *);
|
||||
extern void ippSetCGIVars(ipp_t *, const char *, const char *,
|
||||
const char *, int);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+158
-38
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Job status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -23,7 +23,8 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* main() - Main entry for CGI.
|
||||
* do_job_op() - Do a job operation.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -33,6 +34,13 @@
|
||||
#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.
|
||||
*/
|
||||
@@ -46,7 +54,8 @@ 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...
|
||||
@@ -78,43 +87,69 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
|
||||
|
||||
/*
|
||||
* 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)
|
||||
if ((op = cgiGetVariable("OP")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
/*
|
||||
* Do the operation...
|
||||
*/
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
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, NULL, 0);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
|
||||
@@ -134,6 +169,91 @@ 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$".
|
||||
*/
|
||||
|
||||
+22
-7
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Printer status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -54,6 +54,8 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
const char *op; /* Operation to perform, if any */
|
||||
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
/*
|
||||
* Get any form variables...
|
||||
*/
|
||||
@@ -77,7 +79,8 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Tell the client to expect HTML...
|
||||
*/
|
||||
|
||||
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
|
||||
printf("Content-Type: text/html;charset=%s\r\n\r\n",
|
||||
cupsLangEncoding(language));
|
||||
|
||||
/*
|
||||
* See if we need to show a list of printers or the status of a
|
||||
@@ -87,7 +90,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
ippSetServerVersion();
|
||||
|
||||
printer = argv[0];
|
||||
if (strcmp(printer, "/") == 0 || strcmp(printer, "printers.cgi") == 0)
|
||||
if (strcmp(printer, "/") == 0 || strstr(printer, "printers.cgi") != NULL)
|
||||
{
|
||||
printer = NULL;
|
||||
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_PRINTER));
|
||||
@@ -202,15 +205,24 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
uri);
|
||||
}
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "all");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
}
|
||||
else if (printer)
|
||||
fprintf(stderr, "ERROR: Get-Printer-Attributes request failed - %s (%x)\n",
|
||||
ippErrorString(cupsLastError()), cupsLastError());
|
||||
else
|
||||
fprintf(stderr, "ERROR: CUPS-Get-Printers request failed - %s (%x)\n",
|
||||
ippErrorString(cupsLastError()), cupsLastError());
|
||||
|
||||
/*
|
||||
* Write the report...
|
||||
@@ -259,11 +271,14 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Get-Jobs request failed - %s (%x)\n",
|
||||
ippErrorString(cupsLastError()), cupsLastError());
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -320,12 +335,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
CUPS_DATADIR "/data/testprint.ps")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippSetCGIVars(response, NULL, NULL, NULL, 0);
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
status = cupsLastError();
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", printer);
|
||||
|
||||
|
||||
+4
-13
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI template function.
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* Copyright 1997-2003 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,28 +373,19 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
}
|
||||
else if (innername[0] == '?')
|
||||
{
|
||||
if ((innerval = cgiGetArray(innername + 1, element)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
}
|
||||
else if ((innerval = cgiGetArray(innername, element)) == NULL)
|
||||
snprintf(s, sizeof(s), "{%s}", innername);
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
strlcpy(s, innerval, sizeof(compare) - (s - compare));
|
||||
|
||||
s += strlen(s);
|
||||
}
|
||||
|
||||
+4
-4
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI form variable and array functions.
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* Copyright 1997-2003 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)
|
||||
if (name == NULL || value == NULL || element < 0 || element > 100000)
|
||||
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)
|
||||
if (name == NULL || size < 0 || size > 100000)
|
||||
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)
|
||||
if (name == NULL || value == NULL || element < 0 || element > 100000)
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
cupsd.conf
|
||||
pam.conf
|
||||
+5
-1
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Configuration file makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1993-2002 by Easy Software Products.
|
||||
# Copyright 1993-2003 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -65,6 +65,10 @@ 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 2010 2002-01-02 17:59:21Z mike $"
|
||||
# "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $"
|
||||
#
|
||||
# Sample class configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -85,5 +85,5 @@
|
||||
#</Class>
|
||||
|
||||
#
|
||||
# End of "$Id: classes.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
# End of "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $".
|
||||
#
|
||||
|
||||
+6
-4
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: client.conf 2010 2002-01-02 17:59:21Z mike $"
|
||||
# "$Id: client.conf 3705 2003-05-09 19:14:44Z mike $"
|
||||
#
|
||||
# Sample client configuration file for the Common UNIX Printing System
|
||||
# (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -34,7 +34,9 @@
|
||||
#
|
||||
# ServerName: the hostname of your server. By default CUPS will use the
|
||||
# hostname of the system or the value of the CUPS_SERVER environment
|
||||
# variable.
|
||||
# variable. ONLY ONE SERVER NAME MAY BE SPECIFIED AT A TIME. To use
|
||||
# more than one server you must use a local scheduler with browsing
|
||||
# and possibly polling.
|
||||
#
|
||||
|
||||
#ServerName myhost.domain.com
|
||||
@@ -61,5 +63,5 @@
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id: client.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
# End of "$Id: client.conf 3705 2003-05-09 19:14:44Z mike $".
|
||||
#
|
||||
|
||||
+117
-12
@@ -4,7 +4,7 @@
|
||||
# Sample configuration file for the Common UNIX Printing System (CUPS)
|
||||
# scheduler.
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -134,6 +134,16 @@
|
||||
|
||||
#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@".
|
||||
@@ -194,6 +204,13 @@ 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.
|
||||
@@ -201,6 +218,28 @@ LogLevel info
|
||||
|
||||
#MaxJobs 500
|
||||
|
||||
#
|
||||
# MaxJobsPerPrinter: maximum number of active jobs per printer. The default
|
||||
# is 0 for no limit.
|
||||
#
|
||||
|
||||
#MaxJobsPerPrinter 0
|
||||
|
||||
#
|
||||
# MaxJobsPerUser: maximum number of active jobs per user. The default
|
||||
# is 0 for no limit.
|
||||
#
|
||||
|
||||
#MaxJobsPerUser 0
|
||||
|
||||
#
|
||||
# MaxPrinterHistory: controls the maximum number of history collections
|
||||
# in the printer-state-history attribute. Set to 0 to disable history
|
||||
# data.
|
||||
#
|
||||
|
||||
#MaxPrinterHistory 10
|
||||
|
||||
#
|
||||
# Printcap: the name of the printcap file. Default is /etc/printcap.
|
||||
# Leave blank to disable printcap file generation.
|
||||
@@ -257,6 +296,25 @@ LogLevel info
|
||||
#ServerRoot @CUPS_SERVERROOT@
|
||||
|
||||
|
||||
########
|
||||
######## Fax Support
|
||||
########
|
||||
|
||||
#
|
||||
# FaxRetryLimit: the number of times a fax job is retried.
|
||||
# The default is 5 times.
|
||||
#
|
||||
|
||||
#FaxRetryLimit 5
|
||||
|
||||
#
|
||||
# FaxRetryInterval: the number of seconds between fax job retries.
|
||||
# The default is 300 seconds/5 minutes.
|
||||
#
|
||||
|
||||
#FaxRetryInterval 300
|
||||
|
||||
|
||||
########
|
||||
######## Encryption Support
|
||||
########
|
||||
@@ -282,16 +340,16 @@ LogLevel info
|
||||
|
||||
#
|
||||
# User/Group: the user and group the server runs under. Normally this
|
||||
# must be lp and sys, however you can configure things for another user
|
||||
# or group as needed.
|
||||
# must be @CUPS_USER@ and @CUPS_GROUP@, 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...
|
||||
# program is run, or if the RunAsUser directive is specified...
|
||||
#
|
||||
|
||||
#User lp
|
||||
#Group sys
|
||||
#User @CUPS_USER@
|
||||
#Group @CUPS_GROUP@
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
@@ -377,6 +435,15 @@ 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.)
|
||||
@@ -415,7 +482,7 @@ Port 631
|
||||
# NOTE: If you choose to use SLPv2, it is *strongly* recommended that
|
||||
# you have at least one SLP Directory Agent (DA) on your
|
||||
# network. Otherwise, browse updates can take several seconds,
|
||||
# during which the scheduler will not response to client
|
||||
# during which the scheduler will not respond to client
|
||||
# requests.
|
||||
#
|
||||
|
||||
@@ -433,11 +500,21 @@ 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
|
||||
@@ -468,6 +545,8 @@ 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!
|
||||
@@ -515,6 +594,7 @@ Port 631
|
||||
#
|
||||
|
||||
#BrowseRelay source-address destination-address
|
||||
#BrowseRelay @IF(src) @IF(dst)
|
||||
|
||||
#
|
||||
# BrowseTimeout: the timeout for network printers - if we don't
|
||||
@@ -586,7 +666,14 @@ Port 631
|
||||
# will be "sys", "system", or "root" (checked for in that order.)
|
||||
#
|
||||
|
||||
#SystemGroup sys
|
||||
#SystemGroup @CUPS_GROUP@
|
||||
|
||||
#
|
||||
# RootCertDuration: How frequently the root certificate is regenerated.
|
||||
# Defaults to 300 seconds.
|
||||
#
|
||||
|
||||
#RootCertDuration 300
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
@@ -610,11 +697,11 @@ Port 631
|
||||
#
|
||||
# Order: the order of Allow/Deny processing.
|
||||
#
|
||||
# Allow: allows access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
# Allow: allows access from the specified hostname, domain, IP address,
|
||||
# network, or interface.
|
||||
#
|
||||
# Deny: denies access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
# Deny: denies access from the specified hostname, domain, IP address,
|
||||
# network, or interface.
|
||||
#
|
||||
# Both "Allow" and "Deny" accept the following notations for addresses:
|
||||
#
|
||||
@@ -629,10 +716,21 @@ 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.
|
||||
#
|
||||
@@ -666,6 +764,13 @@ 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
|
||||
|
||||
+37
-6
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.convs 2062 2002-01-23 22:30:42Z mike $"
|
||||
# "$Id: mime.convs 3709 2003-05-12 17:38:18Z mike $"
|
||||
#
|
||||
# MIME converts file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
# 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
|
||||
@@ -46,12 +46,27 @@
|
||||
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-bitmap 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
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -68,8 +83,24 @@ text/html application/postscript 33 texttops
|
||||
# Raster filters...
|
||||
#
|
||||
|
||||
image/* application/vnd.cups-raster 100 imagetoraster
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
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-bitmap 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
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -83,5 +114,5 @@ application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
#application/octet-stream application/vnd.cups-raw 0 -
|
||||
|
||||
#
|
||||
# End of "$Id: mime.convs 2062 2002-01-23 22:30:42Z mike $".
|
||||
# End of "$Id: mime.convs 3709 2003-05-12 17:38:18Z mike $".
|
||||
#
|
||||
|
||||
+21
-16
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.types 2010 2002-01-02 17:59:21Z mike $"
|
||||
# "$Id: mime.types 3564 2003-04-07 18:03:28Z mike $"
|
||||
#
|
||||
# MIME types file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products.
|
||||
# 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
|
||||
@@ -41,6 +41,8 @@
|
||||
# printable(offset,length) True if bytes are printable 8-bit chars
|
||||
# (CR, NL, TAB, BS, 32-126, 128-254)
|
||||
# string(offset,"string") True if bytes are identical to string
|
||||
# istring(offset,"string") True if bytes are identical to
|
||||
# case-insensitive string
|
||||
# char(offset,value) True if byte is identical
|
||||
# short(offset,value) True if 16-bit integer is identical
|
||||
# int(offset,value) True if 32-bit integer is identical
|
||||
@@ -68,16 +70,21 @@
|
||||
# Application-generated files...
|
||||
#
|
||||
|
||||
application/msword doc string(0,<D0CF11E0A1B11AE1>)
|
||||
#application/msword doc string(0,<D0CF11E0A1B11AE1>)
|
||||
application/pdf pdf string(0,%PDF)
|
||||
application/postscript ai eps ps string(0,%!) string(0,<04>%!)
|
||||
application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
|
||||
contains(0,128,<1B>%-12345X) + \
|
||||
(contains(0,1024,"LANGUAGE=POSTSCRIPT") \
|
||||
contains(0,1024,"LANGUAGE = Postscript") \
|
||||
contains(0,1024,"LANGUAGE = POSTSCRIPT"))
|
||||
application/vnd.hp-HPGL hpgl string(0,<1B>&)\
|
||||
string(0,<1B>E<1B>%0B) string(0,<201B>)\
|
||||
string(0,<1B>E<1B>%0B) \
|
||||
string(0,<1B>%-1B) string(0,<201B>)\
|
||||
string(0,BP;) string(0,IN;) string(0,DF;) \
|
||||
string(0,BPINPS;) \
|
||||
(contains(0,128,<1B>%-12345X) + \
|
||||
(contains(9,512,"LANGUAGE=HPGL") \
|
||||
contains(9,512,"LANGUAGE = HPGL")))
|
||||
(contains(0,1024,"LANGUAGE=HPGL") \
|
||||
contains(0,1024,"LANGUAGE = HPGL")))
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -100,7 +107,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
|
||||
#image/x-xwindowdump xwd string(4,<00000007>)
|
||||
image/x-sun-raster ras string(0,<59a66a95>)
|
||||
|
||||
#image/fpx fpx
|
||||
@@ -113,7 +120,7 @@ image/x-bitmap bmp string(0,BM) && !printable(2,14)
|
||||
#
|
||||
|
||||
text/html html htm printable(0,1024) +\
|
||||
(string(0,"<HTML>") string(0,"<!DOCTYPE"))
|
||||
(istring(0,"<HTML>") istring(0,"<!DOCTYPE"))
|
||||
application/x-cshell csh printable(0,1024) + string(0,#!) +\
|
||||
(contains(2,80,/csh) contains(2,80,/tcsh))
|
||||
application/x-perl pl printable(0,1024) + string(0,#!) +\
|
||||
@@ -128,17 +135,15 @@ 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(9,512,"LANGUAGE=POSTSCRIPT") \
|
||||
contains(9,512,"LANGUAGE = Postscript") \
|
||||
contains(9,512,"LANGUAGE = POSTSCRIPT"))
|
||||
application/vnd.cups-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(9,512,"LANGUAGE=PCL") \
|
||||
contains(9,512,"LANGUAGE = PCL")))
|
||||
(contains(0,1024,"LANGUAGE=PCL") \
|
||||
contains(0,1024,"LANGUAGE = PCL")))
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -152,5 +157,5 @@ application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
|
||||
#application/octet-stream
|
||||
|
||||
#
|
||||
# End of "$Id: mime.types 2010 2002-01-02 17:59:21Z mike $".
|
||||
# End of "$Id: mime.types 3564 2003-04-07 18:03:28Z mike $".
|
||||
#
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
auth required @PAMMOD@ nullok shadow
|
||||
account required @PAMMOD@
|
||||
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: printers.conf 2010 2002-01-02 17:59:21Z mike $"
|
||||
# "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $"
|
||||
#
|
||||
# Sample printer configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -92,5 +92,5 @@
|
||||
#</Printer>
|
||||
|
||||
#
|
||||
# End of "$Id: printers.conf 2010 2002-01-02 17:59:21Z mike $".
|
||||
# End of "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $".
|
||||
#
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl "$Id: cups-common.m4 3724 2003-05-14 18:24:38Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,12 +22,17 @@ dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
dnl We need at least autoconf 2.13...
|
||||
AC_PREREQ(2.13)
|
||||
dnl We need at least autoconf 2.50...
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Version number information...
|
||||
CUPS_VERSION="1.1.19"
|
||||
AC_SUBST(CUPS_VERSION)
|
||||
AC_DEFINE_UNQUOTED(CUPS_SVERSION, "CUPS v$CUPS_VERSION")
|
||||
|
||||
dnl Default compiler flags...
|
||||
CFLAGS="${CFLAGS:=}"
|
||||
CPPFLAGS="${CPPFLAGS:=}"
|
||||
@@ -47,6 +52,7 @@ fi
|
||||
AC_PROG_RANLIB
|
||||
AC_PATH_PROG(AR,ar)
|
||||
AC_PATH_PROG(HTMLDOC,htmldoc)
|
||||
AC_PATH_PROG(LN,ln)
|
||||
AC_PATH_PROG(MV,mv)
|
||||
AC_PATH_PROG(NROFF,nroff)
|
||||
if test "$NROFF" = ""; then
|
||||
@@ -59,6 +65,17 @@ if test "$NROFF" = ""; then
|
||||
fi
|
||||
AC_PATH_PROG(RM,rm)
|
||||
AC_PATH_PROG(SED,sed)
|
||||
AC_PATH_PROG(STRIP,strip)
|
||||
|
||||
if test "x$AR" = x; then
|
||||
AC_MSG_ERROR([Unable to find required library archive command.])
|
||||
fi
|
||||
if test "x$CC" = x; then
|
||||
AC_MSG_ERROR([Unable to find required C compiler command.])
|
||||
fi
|
||||
if test "x$CXX" = x; then
|
||||
AC_MSG_ERROR([Unable to find required C++ compiler command.])
|
||||
fi
|
||||
|
||||
dnl Architecture checks...
|
||||
AC_C_BIGENDIAN
|
||||
@@ -68,16 +85,34 @@ AC_SEARCH_LIBS(crypt, crypt)
|
||||
AC_SEARCH_LIBS(getspent, sec gen)
|
||||
|
||||
LIBMALLOC=""
|
||||
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")
|
||||
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
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBMALLOC)
|
||||
|
||||
dnl Check for libpaper support...
|
||||
AC_ARG_ENABLE(libpaper, [ --enable-libpaper turn on libpaper support, default=no])
|
||||
|
||||
if test x$enable_libpaper = xyes; then
|
||||
AC_CHECK_LIB(paper,systempapername,
|
||||
AC_DEFINE(HAVE_LIBPAPER)
|
||||
LIBPAPER="-lpaper",
|
||||
LIBPAPER="")
|
||||
else
|
||||
LIBPAPER=""
|
||||
fi
|
||||
AC_SUBST(LIBPAPER)
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
@@ -86,11 +121,12 @@ 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)
|
||||
AC_CHECK_FUNCS(strdup strcasecmp strncasecmp strlcat strlcpy)
|
||||
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
|
||||
echo Forcing snprintf emulation for HP-UX.
|
||||
else
|
||||
@@ -150,6 +186,21 @@ esac
|
||||
|
||||
AC_SUBST(ARFLAGS)
|
||||
|
||||
dnl Extra platform-specific libraries...
|
||||
case $uname in
|
||||
Darwin*)
|
||||
BACKLIBS="-framework IOKit"
|
||||
COMMONLIBS="-framework CoreFoundation"
|
||||
;;
|
||||
*)
|
||||
BACKLIBS=""
|
||||
COMMONLIBS=""
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(BACKLIBS)
|
||||
AC_SUBST(COMMONLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl End of "$Id: cups-common.m4 3724 2003-05-14 18:24:38Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-compiler.m4 2075 2002-01-26 21:35:09Z mike $"
|
||||
dnl "$Id: cups-compiler.m4 3520 2003-03-25 16:25:55Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,14 +27,17 @@ 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
|
||||
@@ -52,13 +55,17 @@ if test -n "$GCC"; then
|
||||
AC_MSG_CHECKING(if libsupc++ is required)
|
||||
|
||||
SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
|
||||
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
|
||||
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
|
||||
|
||||
CXX="$CC"
|
||||
|
||||
@@ -173,15 +180,16 @@ else
|
||||
esac
|
||||
fi
|
||||
|
||||
case $uname in
|
||||
Darwin* | *BSD)
|
||||
ARFLAGS="-rcv"
|
||||
;;
|
||||
*)
|
||||
ARFLAGS="crvs"
|
||||
;;
|
||||
esac
|
||||
if test $uname = HP-UX; then
|
||||
# HP-UX 10.20 (at least) needs this definition to get the
|
||||
# h_errno global...
|
||||
OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
|
||||
|
||||
# HP-UX 11.00 (at least) needs this definition to get the
|
||||
# u_short type used by the IP headers...
|
||||
OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-compiler.m4 2075 2002-01-26 21:35:09Z mike $".
|
||||
dnl End of "$Id: cups-compiler.m4 3520 2003-03-25 16:25:55Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-directories.m4 2064 2002-01-24 18:51:13Z mike $"
|
||||
dnl "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl Directory stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,6 +81,10 @@ 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
|
||||
@@ -106,9 +110,9 @@ if test x$rcdir = x; then
|
||||
;;
|
||||
|
||||
Darwin*)
|
||||
# Darwin and MacOS X - this is just strange...
|
||||
# Darwin and MacOS X...
|
||||
INITDIR=""
|
||||
INITDDIR="/System/Library/StartupItems/CUPS"
|
||||
INITDDIR="/System/Library/StartupItems/PrintingServices"
|
||||
;;
|
||||
|
||||
Linux*)
|
||||
@@ -180,8 +184,8 @@ case "$uname" in
|
||||
*)
|
||||
# All others
|
||||
INSTALL_SYSV="install-sysv"
|
||||
CUPS_SERVERBIN="$exec_prefix/lib/cups"
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$exec_prefix/lib/cups")
|
||||
CUPS_SERVERBIN="$libdir/cups"
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$libdir/cups")
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -234,5 +238,5 @@ AC_SUBST(CUPS_FONTPATH)
|
||||
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$fontpath")
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-directories.m4 2064 2002-01-24 18:51:13Z mike $".
|
||||
dnl End of "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-image.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl Image library stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,8 +65,18 @@ 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 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl End of "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-libtool.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl Libtool stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl End of "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-manpages.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl Manpage stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl End of "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-network.m4 2081 2002-01-27 21:16:14Z mike $"
|
||||
dnl "$Id: cups-network.m4 3349 2003-02-12 19:31:12Z mike $"
|
||||
dnl
|
||||
dnl Networking stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,10 +29,20 @@ if test "$uname" != "IRIX"; then
|
||||
AC_CHECK_LIB(nsl,gethostbyaddr,NETLIBS="$NETLIBS -lnsl")
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(rresvport)
|
||||
AC_CHECK_FUNCS(rresvport getifaddrs hstrerror)
|
||||
|
||||
AC_CHECK_MEMBER(struct sockaddr.sa_len,,,[#include <sys/socket.h>])
|
||||
AC_CHECK_HEADER(sys/sockio.h,AC_DEFINE(HAVE_SYS_SOCKIO_H))
|
||||
|
||||
AC_SUBST(NETLIBS)
|
||||
|
||||
maxfiles=4096
|
||||
|
||||
AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for CUPS. ],
|
||||
maxfiles=$withval)
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-network.m4 2081 2002-01-27 21:16:14Z mike $".
|
||||
dnl End of "$Id: cups-network.m4 3349 2003-02-12 19:31:12Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openslp.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl OpenSLP configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,13 +22,14 @@ 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",)
|
||||
CXXFLAGS="-I$withval $CXXFLAGS"
|
||||
CPPFLAGS="-I$withval $CPPFLAGS",)
|
||||
|
||||
LIBSLP=""
|
||||
|
||||
@@ -43,5 +44,5 @@ AC_SUBST(LIBSLP)
|
||||
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openslp.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl End of "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openssl.m4 2035 2002-01-14 20:29:17Z mike $"
|
||||
dnl "$Id: cups-openssl.m4 3250 2003-01-28 13:35:56Z mike $"
|
||||
dnl
|
||||
dnl OpenSSL stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl OpenSSL/GNUTLS stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,48 +22,88 @@ 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_ENABLE(openssl, [ --enable-openssl use OpenSSL for SSL/TLS support, default=yes])
|
||||
AC_ARG_ENABLE(gnutls, [ --enable-gnutls use GNU TLS for SSL/TLS support, default=yes])
|
||||
AC_ARG_ENABLE(cdsassl, [ --enable-cdsassl use CDSA for 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",)
|
||||
CXXFLAGS="-I$withval $CXXFLAGS"
|
||||
CPPFLAGS="-I$withval $CPPFLAGS",)
|
||||
|
||||
SSLLIBS=""
|
||||
|
||||
if test x$enable_ssl != xno; then
|
||||
AC_CHECK_HEADER(openssl/ssl.h,
|
||||
dnl Save the current libraries so the crypto stuff isn't always
|
||||
dnl included...
|
||||
SAVELIBS="$LIBS"
|
||||
dnl Check for the OpenSSL library first, which has precedence over
|
||||
dnl CDSA and GNUTLS...
|
||||
if test "x${SSLLIBS}" = "x" -a "x${enable_openssl}" != "xno"; then
|
||||
AC_CHECK_HEADER(openssl/ssl.h,
|
||||
dnl Save the current libraries so the crypto stuff isn't always
|
||||
dnl included...
|
||||
SAVELIBS="$LIBS"
|
||||
|
||||
dnl Some ELF systems can't resolve all the symbols in libcrypto
|
||||
dnl if libcrypto was linked against RSAREF, and fail to link the
|
||||
dnl test program correctly, even though a correct installation
|
||||
dnl of OpenSSL exists. So we test the linking three times in
|
||||
dnl case the RSAREF libraries are needed.
|
||||
dnl Some ELF systems can't resolve all the symbols in libcrypto
|
||||
dnl if libcrypto was linked against RSAREF, and fail to link the
|
||||
dnl test program correctly, even though a correct installation
|
||||
dnl of OpenSSL exists. So we test the linking three times in
|
||||
dnl case the RSAREF libraries are needed.
|
||||
|
||||
for libcrypto in \
|
||||
"-lcrypto" \
|
||||
"-lcrypto -lrsaref" \
|
||||
"-lcrypto -lRSAglue -lrsaref"
|
||||
do
|
||||
AC_CHECK_LIB(ssl,SSL_new,
|
||||
[SSLLIBS="-lssl $libcrypto"
|
||||
AC_DEFINE(HAVE_LIBSSL)],,
|
||||
$libcrypto)
|
||||
for libcrypto in \
|
||||
"-lcrypto" \
|
||||
"-lcrypto -lrsaref" \
|
||||
"-lcrypto -lRSAglue -lrsaref"
|
||||
do
|
||||
AC_CHECK_LIB(ssl,SSL_new,
|
||||
[SSLLIBS="-lssl $libcrypto"
|
||||
AC_DEFINE(HAVE_SSL)
|
||||
AC_DEFINE(HAVE_LIBSSL)],,
|
||||
$libcrypto)
|
||||
|
||||
if test "x${SSLLIBS}" != "x"; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test "x${SSLLIBS}" != "x"; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
LIBS="$SAVELIBS")
|
||||
LIBS="$SAVELIBS")
|
||||
fi
|
||||
|
||||
dnl If OpenSSL wasn't found, look for CDSA...
|
||||
if test "x${SSLLIBS}" = "x" -a "x${enable_cdsassl}" != "xno"; then
|
||||
if test $uname = Darwin; then
|
||||
AC_CHECK_HEADER(Security/SecureTransport.h,
|
||||
[SSLLIBS="-framework CoreFoundation -framework Security"
|
||||
AC_DEFINE(HAVE_SSL)
|
||||
AC_DEFINE(HAVE_CDSASSL)])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Then look for GNU TLS...
|
||||
if test "x${SSLLIBS}" = "x" -a "x${enable_gnutls}" != "xno"; then
|
||||
AC_CHECK_HEADER(gnutls/gnutls.h,
|
||||
dnl Save the current libraries so the crypto stuff isn't always
|
||||
dnl included...
|
||||
SAVELIBS="$LIBS"
|
||||
|
||||
TEST_GNUTLS_LIBS=`libgnutls-config --libs`
|
||||
AC_CHECK_LIB(gnutls, gnutls_init,
|
||||
[SSLLIBS=$TEST_GNUTLS_LIBS
|
||||
AC_DEFINE(HAVE_SSL)
|
||||
AC_DEFINE(HAVE_GNUTLS)],,
|
||||
$TEST_GNUTLS_LIBS)
|
||||
|
||||
LIBS="$SAVELIBS")
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(SSLLIBS)
|
||||
|
||||
EXPORT_SSLLIBS="$SSLLIBS"
|
||||
AC_SUBST(EXPORT_SSLLIBS)
|
||||
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openssl.m4 2035 2002-01-14 20:29:17Z mike $".
|
||||
dnl End of "$Id: cups-openssl.m4 3250 2003-01-28 13:35:56Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-opsys.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-opsys.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl Operating system stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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="${GROUP:=admin}"
|
||||
CUPS_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 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-opsys.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-pam.m4 2013 2002-01-02 18:50:43Z mike $"
|
||||
dnl "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $"
|
||||
dnl
|
||||
dnl PAM stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,11 +31,14 @@ 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
|
||||
@@ -49,11 +52,20 @@ 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 2013 2002-01-02 18:50:43Z mike $".
|
||||
dnl End of "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $".
|
||||
dnl
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
dnl
|
||||
dnl "$Id: cups-scripting.m4 3472 2003-03-14 17:04:09Z mike $"
|
||||
dnl
|
||||
dnl Scripting configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2003 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
|
||||
dnl copyright law. Distribution and use rights are outlined in the file
|
||||
dnl "LICENSE.txt" which should have been included with this file. If this
|
||||
dnl file is missing or damaged please contact Easy Software Products
|
||||
dnl at:
|
||||
dnl
|
||||
dnl Attn: CUPS Licensing Information
|
||||
dnl Easy Software Products
|
||||
dnl 44141 Airport View Drive, Suite 204
|
||||
dnl Hollywood, Maryland 20636-3111 USA
|
||||
dnl
|
||||
dnl Voice: (301) 373-9603
|
||||
dnl EMail: cups-info@cups.org
|
||||
dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
dnl Do we have Java?
|
||||
AC_ARG_WITH(java, [ --with-java set Java interpreter for web interfaces ],
|
||||
CUPS_JAVA="$withval",
|
||||
CUPS_JAVA="")
|
||||
|
||||
if test "x$CUPS_JAVA" = x; then
|
||||
AC_PATH_PROG(JAVA,java)
|
||||
CUPS_JAVA="$JAVA"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_JAVA, "$CUPS_JAVA")
|
||||
|
||||
if test "x$CUPS_JAVA" != x; then
|
||||
AC_DEFINE(HAVE_JAVA)
|
||||
fi
|
||||
|
||||
dnl Do we have Perl?
|
||||
AC_ARG_WITH(perl, [ --with-perl set Perl interpreter for web interfaces ],
|
||||
CUPS_PERL="$withval",
|
||||
CUPS_PERL="")
|
||||
|
||||
if test "x$CUPS_PERL" = x; then
|
||||
AC_PATH_PROG(PERL,perl)
|
||||
CUPS_PERL="$PERL"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PERL, "$CUPS_PERL")
|
||||
|
||||
if test "x$CUPS_PERL" != x; then
|
||||
AC_DEFINE(HAVE_PERL)
|
||||
fi
|
||||
|
||||
dnl Do we have PHP?
|
||||
AC_ARG_WITH(php, [ --with-php set PHP interpreter for web interfaces ],
|
||||
CUPS_PHP="$withval",
|
||||
CUPS_PHP="")
|
||||
|
||||
if test "x$CUPS_PHP" = x; then
|
||||
AC_PATH_PROG(PHP,php)
|
||||
CUPS_PHP="$PHP"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PHP, "$CUPS_PHP")
|
||||
|
||||
if test "x$CUPS_PHP" != x; then
|
||||
AC_DEFINE(HAVE_PHP)
|
||||
fi
|
||||
|
||||
dnl Do we have Python?
|
||||
AC_ARG_WITH(python, [ --with-python set Python interpreter for web interfaces ],
|
||||
CUPS_PYTHON="$withval",
|
||||
CUPS_PYTHON="")
|
||||
|
||||
if test "x$CUPS_PYTHON" = x; then
|
||||
AC_PATH_PROG(PYTHON,python)
|
||||
CUPS_PYTHON="$PYTHON"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PYTHON, "$CUPS_PYTHON")
|
||||
|
||||
if test "x$CUPS_PYTHON" != x; then
|
||||
AC_DEFINE(HAVE_PYTHON)
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-scripting.m4 3472 2003-03-14 17:04:09Z mike $".
|
||||
dnl
|
||||
@@ -1,9 +1,9 @@
|
||||
dnl
|
||||
dnl "$Id: cups-sharedlibs.m4 2064 2002-01-24 18:51:13Z mike $"
|
||||
dnl "$Id: cups-sharedlibs.m4 3737 2003-05-16 19:07:15Z mike $"
|
||||
dnl
|
||||
dnl Shared library support for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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
|
||||
@@ -45,19 +45,19 @@ if test x$enable_shared != xno; then
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi2.4,-soname,\$@ -shared \$(OPTIM)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi2.5,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
OSF1* | Linux* | NetBSD* | OpenBSD*)
|
||||
OSF1* | Linux* | *BSD*)
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
Darwin* | FreeBSD*)
|
||||
Darwin*)
|
||||
LIBCUPS="libcups.2.dylib"
|
||||
LIBCUPSIMAGE="libcupsimage.2.dylib"
|
||||
DSO="ld"
|
||||
DSOFLAGS="$DSOFLAGS -dylib /usr/lib/dylib1.o -lc"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc"
|
||||
;;
|
||||
AIX*)
|
||||
LIBCUPS="libcups_s.a"
|
||||
@@ -87,16 +87,15 @@ AC_SUBST(LIBCUPS)
|
||||
AC_SUBST(LIBCUPSIMAGE)
|
||||
|
||||
if test x$enable_shared = xno; then
|
||||
LINKCUPS="-L../cups -lcups"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage"
|
||||
LINKCUPS="$LINKCUPS \$(SSLLIBS)"
|
||||
LINKCUPS="../cups/libcups.a \$(SSLLIBS)"
|
||||
LINKCUPSIMAGE="../filter/libcupsimage.a"
|
||||
else
|
||||
if test $uname = AIX; then
|
||||
LINKCUPS="-L../cups -lcups_s"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage_s"
|
||||
LINKCUPS="-lcups_s"
|
||||
LINKCUPSIMAGE="-lcupsimage_s"
|
||||
else
|
||||
LINKCUPS="-L../cups -lcups"
|
||||
LINKCUPSIMAGE="-L../filter -lcupsimage"
|
||||
LINKCUPS="-lcups"
|
||||
LINKCUPSIMAGE="-lcupsimage"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -104,6 +103,8 @@ AC_SUBST(LINKCUPS)
|
||||
AC_SUBST(LINKCUPSIMAGE)
|
||||
|
||||
dnl Update libraries for DSOs...
|
||||
EXPORT_LDFLAGS=""
|
||||
|
||||
if test "$DSO" != ":"; then
|
||||
# When using DSOs the image libraries are linked to libcupsimage.so
|
||||
# rather than to the executables. This makes things smaller if you
|
||||
@@ -118,23 +119,27 @@ if test "$DSO" != ":"; then
|
||||
case $uname in
|
||||
HP-UX*)
|
||||
# HP-UX
|
||||
DSOFLAGS="+b $libdir +fb $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,+b,$libdir,+fb"
|
||||
DSOFLAGS="+s +b $libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
|
||||
EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
DSOFLAGS="-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -R$libdir"
|
||||
EXPORT_LDFLAGS="-R$libdir"
|
||||
;;
|
||||
*BSD* | Darwin*)
|
||||
*BSD*)
|
||||
# *BSD
|
||||
DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,-R$libdir"
|
||||
EXPORT_LDFLAGS="-Wl,-R$libdir"
|
||||
;;
|
||||
Linux*)
|
||||
# Linux
|
||||
DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
|
||||
EXPORT_LDFLAGS="-Wl,-rpath,$libdir"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
@@ -144,7 +149,8 @@ fi
|
||||
|
||||
AC_SUBST(DSOLIBS)
|
||||
AC_SUBST(IMGLIBS)
|
||||
AC_SUBST(EXPORT_LDFLAGS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-sharedlibs.m4 2064 2002-01-24 18:51:13Z mike $".
|
||||
dnl End of "$Id: cups-sharedlibs.m4 3737 2003-05-16 19:07:15Z mike $".
|
||||
dnl
|
||||
|
||||
+68
-4
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* @configure_input@
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -28,7 +28,7 @@
|
||||
* Version of software...
|
||||
*/
|
||||
|
||||
#define CUPS_SVERSION "CUPS v1.1.13"
|
||||
#define CUPS_SVERSION "CUPS v1.1.19rc3"
|
||||
|
||||
|
||||
/*
|
||||
@@ -39,6 +39,13 @@
|
||||
#define CUPS_DEFAULT_GROUP "sys"
|
||||
|
||||
|
||||
/*
|
||||
* Maximum number of file descriptors to support.
|
||||
*/
|
||||
|
||||
#define CUPS_MAX_FDS 4096
|
||||
|
||||
|
||||
/*
|
||||
* Where are files stored?
|
||||
*/
|
||||
@@ -95,6 +102,8 @@
|
||||
#define HAVE_LIBPAM 0
|
||||
#endif /* !HAVE_LIBPAM */
|
||||
|
||||
#undef HAVE_PAM_PAM_APPL_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <shadow.h>?
|
||||
@@ -111,11 +120,12 @@
|
||||
|
||||
|
||||
/*
|
||||
* Use <string.h>, <strings.h>, or both?
|
||||
* Use <string.h>, <strings.h>, and/or <bstring.h>?
|
||||
*/
|
||||
|
||||
#undef HAVE_STRING_H
|
||||
#undef HAVE_STRINGS_H
|
||||
#undef HAVE_BSTRING_H
|
||||
|
||||
|
||||
/*
|
||||
@@ -125,6 +135,8 @@
|
||||
#undef HAVE_STRDUP
|
||||
#undef HAVE_STRCASECMP
|
||||
#undef HAVE_STRNCASECMP
|
||||
#undef HAVE_STRLCAT
|
||||
#undef HAVE_STRLCPY
|
||||
|
||||
|
||||
/*
|
||||
@@ -167,10 +179,13 @@
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the OpenSSL library?
|
||||
* Which encryption libraries do we have?
|
||||
*/
|
||||
|
||||
#undef HAVE_CDSASSL
|
||||
#undef HAVE_GNUTLS
|
||||
#undef HAVE_LIBSSL
|
||||
#undef HAVE_SSL
|
||||
|
||||
|
||||
/*
|
||||
@@ -180,6 +195,13 @@
|
||||
#undef HAVE_LIBSLP
|
||||
|
||||
|
||||
/*
|
||||
* Do we have libpaper?
|
||||
*/
|
||||
|
||||
#undef HAVE_LIBPAPER
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <sys/ioctl.h>?
|
||||
*/
|
||||
@@ -209,6 +231,48 @@
|
||||
#undef HAVE_RRESVPORT
|
||||
|
||||
|
||||
/*
|
||||
* Do we have getifaddrs()?
|
||||
*/
|
||||
|
||||
#undef HAVE_GETIFADDRS
|
||||
|
||||
|
||||
/*
|
||||
* Do we have hstrerror()?
|
||||
*/
|
||||
|
||||
#undef HAVE_HSTRERROR
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
|
||||
/*
|
||||
* Various scripting languages...
|
||||
*/
|
||||
|
||||
#undef HAVE_JAVA
|
||||
#define CUPS_JAVA "/usr/bin/java"
|
||||
#undef HAVE_PERL
|
||||
#define CUPS_PERL "/usr/bin/perl"
|
||||
#undef HAVE_PHP
|
||||
#define CUPS_PHP "/usr/bin/php"
|
||||
#undef HAVE_PYTHON
|
||||
#define CUPS_PYTHON "/usr/bin/python"
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+4
-2
@@ -3,7 +3,7 @@ dnl "$Id$"
|
||||
dnl
|
||||
dnl Configuration script for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-2003 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,9 @@ 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)
|
||||
sinclude(config-scripts/cups-scripting.m4)
|
||||
|
||||
AC_OUTPUT(Makedefs cups.list cups.sh cups-config conf/cupsd.conf conf/pam.conf)
|
||||
|
||||
chmod +x cups-config
|
||||
|
||||
|
||||
+9
-8
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
#!/bin/sh
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# CUPS configuration utility.
|
||||
#
|
||||
# Copyright 2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 2001-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
|
||||
@@ -23,7 +23,7 @@
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
|
||||
VERSION="1.1.13"
|
||||
VERSION="@CUPS_VERSION@"
|
||||
APIVERSION="1.1"
|
||||
|
||||
prefix=@prefix@
|
||||
@@ -38,9 +38,10 @@ cups_serverbin=@CUPS_SERVERBIN@
|
||||
cups_serverroot=@CUPS_SERVERROOT@
|
||||
|
||||
# flags for C++ compiler:
|
||||
CFLAGS="@CFLAGS@"
|
||||
LDFLAGS="@LDFLAGS@"
|
||||
LIBS="@SSLLIBS@ @NETLIBS@ @LIBS@"
|
||||
CFLAGS=""
|
||||
LDFLAGS="@EXPORT_LDFLAGS@"
|
||||
LIBS="@EXPORT_SSLLIBS@ @NETLIBS@"
|
||||
IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@ @EXPORT_LIBZ@"
|
||||
|
||||
if test $includedir != /usr/include; then
|
||||
CFLAGS="$CFLAGS -I$includedir"
|
||||
@@ -98,13 +99,13 @@ while test $# -gt 0; do
|
||||
if test $image = no; then
|
||||
echo -lcups $LIBS
|
||||
else
|
||||
echo -lcupsimage -lcups $LIBS
|
||||
echo -lcupsimage $IMGLIBS -lcups $LIBS
|
||||
fi
|
||||
else
|
||||
if test $image = no; then
|
||||
echo $libdir/libcups.a $LIBS
|
||||
else
|
||||
echo $libdir/libcupsimage.a $libdir/libcups.a $LIBS
|
||||
echo $libdir/libcupsimage.a $IMGLIBS $libdir/libcups.a $LIBS
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
+99
@@ -15,6 +15,105 @@ 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>
|
||||
|
||||
+145
-43
@@ -4,7 +4,7 @@
|
||||
# ESP Package Manager (EPM) file list for the Common UNIX Printing
|
||||
# System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -25,18 +25,30 @@
|
||||
|
||||
# Product information
|
||||
%product Common UNIX Printing System
|
||||
%copyright 1993-2002 by Easy Software Products, All Rights Reserved.
|
||||
%copyright 1993-2003 by Easy Software Products, All Rights Reserved.
|
||||
%vendor Easy Software Products
|
||||
%license LICENSE.txt
|
||||
%readme README.txt
|
||||
%version 1.1.13
|
||||
%provides cups
|
||||
%provides cupsys
|
||||
%version @CUPS_VERSION@
|
||||
%description The Common UNIX Printing System provides a portable printing
|
||||
%description layer for UNIX® operating systems. It has been developed by
|
||||
%description Easy Software Products to promote a standard printing solution
|
||||
%description for all UNIX vendors and users. CUPS provides the System V and
|
||||
%description Berkeley command-line interfaces.
|
||||
%provides cups-devel
|
||||
%provides cups-libs
|
||||
%provides cupsys
|
||||
%provides cupsys-bsd
|
||||
%provides cupsys-client
|
||||
%provides cupsys-devel
|
||||
%provides cups-pstoraster
|
||||
%provides libcups1
|
||||
%provides libcupsys2
|
||||
%provides libcupsys2-dev
|
||||
|
||||
%format rpm deb portable
|
||||
%provides libcups.so.2
|
||||
%provides libcupsimage.so.2
|
||||
%format all
|
||||
|
||||
#
|
||||
# GNU variables...
|
||||
@@ -82,6 +94,7 @@ $SERVERBIN=@CUPS_SERVERBIN@
|
||||
$SERVERROOT=@CUPS_SERVERROOT@
|
||||
|
||||
$CUPS_USER=@CUPS_USER@
|
||||
$CUPS_GROUP=@CUPS_GROUP@
|
||||
|
||||
$CAT1EXT=@CAT1EXT@
|
||||
$CAT3EXT=@CAT3EXT@
|
||||
@@ -111,6 +124,7 @@ 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,16 +137,16 @@ 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/gziptoany filter/gziptoany
|
||||
f 0555 root sys $SERVERBIN/filter/hpgltops filter/hpgltops
|
||||
f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops
|
||||
f 0555 root sys $SERVERBIN/filter/imagetoraster filter/imagetoraster
|
||||
f 0555 root sys $SERVERBIN/filter/pdftops pdftops/pdftops
|
||||
f 0555 root sys $SERVERBIN/filter/pstops filter/pstops
|
||||
f 0555 root sys $SERVERBIN/filter/texttops filter/texttops
|
||||
f 0555 root sys $SERVERBIN/filter/rastertodymo filter/rastertodymo
|
||||
f 0555 root sys $SERVERBIN/filter/rastertoepson filter/rastertoepson
|
||||
f 0555 root sys $SERVERBIN/filter/rastertohp filter/rastertohp
|
||||
f 0555 root sys $SERVERBIN/filter/hpgltops filter/hpgltops
|
||||
f 0555 root sys $SERVERBIN/filter/imagetoraster filter/imagetoraster
|
||||
f 0555 root sys $SERVERBIN/filter/texttops filter/texttops
|
||||
|
||||
# Admin commands
|
||||
l 0555 root sys $BINDIR/disable $SBINDIR/accept
|
||||
@@ -154,6 +168,7 @@ l 0555 root sys /usr/etc/lpc $SBINDIR/lpc
|
||||
|
||||
# User commands
|
||||
f 0555 root sys $BINDIR/cancel systemv/cancel
|
||||
f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd
|
||||
f 0555 root sys $BINDIR/lp systemv/lp
|
||||
f 0555 root sys $BINDIR/lpoptions systemv/lpoptions
|
||||
f 4555 $CUPS_USER sys $BINDIR/lppasswd systemv/lppasswd
|
||||
@@ -177,7 +192,12 @@ 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 !hpux !aix
|
||||
%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
|
||||
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
|
||||
@@ -195,13 +215,14 @@ f 0444 root sys $LOCALEDIR/be/cups_be locale/be/cups_be
|
||||
f 0444 root sys $LOCALEDIR/cs/cups_cs locale/cs/cups_cs
|
||||
f 0444 root sys $LOCALEDIR/de/cups_de locale/de/cups_de
|
||||
f 0444 root sys $LOCALEDIR/en/cups_en locale/en/cups_en
|
||||
f 0444 root sys $LOCALEDIR/en_US/cups_en_US locale/en_US/cups_en_US
|
||||
f 0444 root sys $LOCALEDIR/es/cups_es locale/es/cups_es
|
||||
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/ru_RU/cups_ru_RU locale/ru_RU/cups_ru_RU
|
||||
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/uk_UA/cups_uk_UA locale/uk_UA/cups_uk_UA
|
||||
f 0444 root sys $LOCALEDIR/zh_CN/cups_zh_CN locale/zh_CN/cups_zh_CN
|
||||
|
||||
d 0555 root sys $DATADIR -
|
||||
@@ -246,21 +267,8 @@ 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 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
|
||||
f 0444 root sys $DATADIR/fonts/Symbol fonts/Symbol
|
||||
|
||||
d 0555 root sys $DATADIR/model -
|
||||
f 0444 root sys $DATADIR/model ppd/*.ppd
|
||||
@@ -268,6 +276,12 @@ 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/de -
|
||||
c 0444 root sys $DATADIR/templates/de templates/de/*.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 -
|
||||
@@ -277,21 +291,20 @@ c 0600 root sys $SERVERROOT conf/*.conf
|
||||
c 0600 root sys $SERVERROOT/mime.convs conf/mime.convs
|
||||
c 0600 root sys $SERVERROOT/mime.types conf/mime.types
|
||||
|
||||
%system linux
|
||||
%if PAMDIR
|
||||
d 0555 root sys $PAMDIR -
|
||||
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
|
||||
|
||||
%system linux
|
||||
# Linux almost always supports PAM...
|
||||
c 0644 root sys $PAMDIR/cups conf/pam.conf
|
||||
|
||||
%system irix
|
||||
# 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 data/cups.irix
|
||||
c 0644 root sys $PAMDIR/cups conf/pam.irix
|
||||
|
||||
%system all
|
||||
%endif
|
||||
|
||||
# Developer files
|
||||
f 0555 root sys $BINDIR/cups-config cups-config
|
||||
@@ -306,12 +319,22 @@ f 0444 root sys $INCLUDEDIR/cups/ppd.h cups/ppd.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/raster.h filter/raster.h
|
||||
|
||||
f 0444 root sys $LIBDIR/libcups.a cups/libcups.a
|
||||
f 0444 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a
|
||||
|
||||
# Documentation files
|
||||
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
|
||||
f 0444 root sys $DOCDIR/robots.txt doc/robots.txt
|
||||
d 0555 root sys $DOCDIR/de -
|
||||
f 0444 root sys $DOCDIR/de doc/de/*.css
|
||||
f 0444 root sys $DOCDIR/de doc/de/*.html
|
||||
f 0444 root sys $DOCDIR/de doc/de/*.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
|
||||
|
||||
@@ -321,13 +344,15 @@ 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 $PMANDIR/man3 -
|
||||
d 0555 root sys $MANDIR/man5 -
|
||||
d 0555 root sys $PMANDIR -
|
||||
d 0555 root sys $PMANDIR/cat3 -
|
||||
d 0555 root sys $PMANDIR/man3 -
|
||||
|
||||
f 0444 root sys $MANDIR/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/cupstestppd.$CAT1EXT man/cupstestppd.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lpoptions.$CAT1EXT man/lpoptions.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lppasswd.$CAT1EXT man/lppasswd.$CAT1EXT
|
||||
@@ -360,6 +385,7 @@ f 0444 root sys $AMANDIR/cat$MAN8DIR/lpinfo.$CAT8EXT man/lpinfo.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpmove.$CAT8EXT man/lpmove.$CAT8EXT
|
||||
|
||||
f 0444 root sys $MANDIR/man1/backend.$MAN1EXT man/backend.man
|
||||
f 0444 root sys $MANDIR/man1/cupstestppd.$MAN1EXT man/cupstestppd.man
|
||||
f 0444 root sys $MANDIR/man1/filter.$MAN1EXT man/filter.man
|
||||
f 0444 root sys $MANDIR/man1/lpoptions.$MAN1EXT man/lpoptions.man
|
||||
f 0444 root sys $MANDIR/man1/lppasswd.$MAN1EXT man/lppasswd.man
|
||||
@@ -368,7 +394,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.man
|
||||
l 0444 root sys $MANDIR/man1/cancel.$MAN1EXT lp.$MAN1EXT
|
||||
|
||||
f 0444 root sys $PMANDIR/man3/cups-config.$MAN3EXT man/cups-config.man
|
||||
|
||||
@@ -379,18 +405,94 @@ 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.man
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/reject.$MAN8EXT accept.$MAN8EXT
|
||||
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.man
|
||||
l 0444 root sys $AMANDIR/man$MAN8DIR/disable.$MAN8EXT enable.$MAN8EXT
|
||||
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
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
#!/bin/sh
|
||||
|
||||
##
|
||||
# PrintingServices - a.k.a. CUPS
|
||||
##
|
||||
|
||||
. /etc/rc.common
|
||||
|
||||
StartService ()
|
||||
{
|
||||
if [ "${CUPS:=-YES-}" = "-YES-" ]; then
|
||||
ConsoleMessage "Starting printing services"
|
||||
/usr/sbin/cupsd
|
||||
fi
|
||||
}
|
||||
|
||||
StopService ()
|
||||
{
|
||||
# Until cupsd has a pid file...
|
||||
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
|
||||
if test "$pid" != ""; then
|
||||
ConsoleMessage "Stopping printing services"
|
||||
kill "${pid}"
|
||||
fi
|
||||
}
|
||||
|
||||
RestartService ()
|
||||
{
|
||||
# Until cupsd has a pid file...
|
||||
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
|
||||
if test "x$pid" != x; then
|
||||
ConsoleMessage "Restarting printing services"
|
||||
kill -HUP "${pid}"
|
||||
else
|
||||
StartService
|
||||
fi
|
||||
}
|
||||
|
||||
RunService "$1"
|
||||
+4
-8
@@ -1,11 +1,7 @@
|
||||
{
|
||||
Description = "CUPS Printing";
|
||||
Provides = ("CUPS");
|
||||
Description = "Printing Services";
|
||||
Provides = ("PrintingServices");
|
||||
Requires = ("Resolver");
|
||||
OrderPreference = "None";
|
||||
Messages =
|
||||
{
|
||||
start = "Starting CUPS";
|
||||
stop = "Stopping CUPS";
|
||||
};
|
||||
Uses = ("Network Time");
|
||||
OrderPreference = "Late";
|
||||
}
|
||||
|
||||
+60
-29
@@ -4,7 +4,7 @@
|
||||
#
|
||||
# Startup/shutdown script for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -47,10 +47,21 @@
|
||||
case "`uname`" in
|
||||
IRIX*)
|
||||
IS_ON=/sbin/chkconfig
|
||||
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
fi
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
|
||||
NetBSD*)
|
||||
*BSD*)
|
||||
IS_ON=:
|
||||
ECHO=echo
|
||||
ECHO_OK=:
|
||||
ECHO_ERROR=:
|
||||
;;
|
||||
|
||||
Darwin*)
|
||||
@@ -61,44 +72,59 @@ 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
|
||||
|
||||
#
|
||||
# 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.
|
||||
# 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.
|
||||
#
|
||||
|
||||
if test "`uname`" = "Darwin"; then
|
||||
ECHO=ConsoleMessage
|
||||
else
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do
|
||||
if test -f $file; then
|
||||
. $file
|
||||
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
|
||||
|
||||
#
|
||||
@@ -140,25 +166,30 @@ 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 "cups: scheduler ${1}ed."
|
||||
else
|
||||
$ECHO "cups: scheduler stopped."
|
||||
$ECHO_OK
|
||||
$ECHO "cups: ${1}ed scheduler."
|
||||
fi
|
||||
;;
|
||||
|
||||
stop)
|
||||
if test "$pid" != ""; then
|
||||
kill $pid
|
||||
$ECHO "cups: scheduler stopped."
|
||||
$ECHO_OK
|
||||
$ECHO "cups: stopped scheduler."
|
||||
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
|
||||
;;
|
||||
|
||||
|
||||
+45
-54
@@ -1,11 +1,11 @@
|
||||
#
|
||||
# "$Id: cups.spec 2010 2002-01-02 17:59:21Z mike $"
|
||||
# "$Id: cups.spec 3724 2003-05-14 18:24:38Z mike $"
|
||||
#
|
||||
# RPM "spec" file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Original version by Jason McMullan <jmcc@ontv.com>.
|
||||
#
|
||||
# Copyright 1999-2002 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1999-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
|
||||
@@ -26,13 +26,13 @@
|
||||
|
||||
Summary: Common Unix Printing System
|
||||
Name: cups
|
||||
Version: 1.1.13
|
||||
Release: 0
|
||||
Version: 1.1.19
|
||||
Release: 1
|
||||
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: Michael Sweet <mike@easysw.com>
|
||||
Packager: Anonymous <anonymous@foo.com>
|
||||
Vendor: Easy Software Products
|
||||
|
||||
# Use buildroot so as not to disturb the version already installed
|
||||
@@ -42,17 +42,15 @@ 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
|
||||
%package libs
|
||||
Summary: Common Unix Printing System - shared libraries
|
||||
Group: System Environment/Libraries
|
||||
Provides: libcups1
|
||||
|
||||
%description
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
@@ -65,10 +63,9 @@ 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
|
||||
%description libs
|
||||
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.
|
||||
UNIX® operating systems. This package contains the CUPS shared libraries.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
@@ -138,58 +135,37 @@ rm -rf $RPM_BUILD_ROOT
|
||||
# RC dirs are a pain under Linux... Uncomment the appropriate ones if you
|
||||
# don't use Red Hat or Mandrake...
|
||||
|
||||
# OLD RedHat/Mandrake
|
||||
/etc/rc.d/init.d/*
|
||||
/etc/rc.d/rc0.d/*
|
||||
/etc/rc.d/rc3.d/*
|
||||
/etc/rc.d/rc5.d/*
|
||||
|
||||
#/etc/init.d/*
|
||||
#/etc/rc0.d/*
|
||||
#/etc/rc3.d/*
|
||||
#/etc/rc5.d/*
|
||||
|
||||
#/sbin/rc.d/*
|
||||
#/sbin/rc.d/rc0.d/*
|
||||
#/sbin/rc.d/rc3.d/*
|
||||
#/sbin/rc.d/rc5.d/*
|
||||
|
||||
# NEW RedHat/Mandrake
|
||||
#/etc/init.d/*
|
||||
#/etc/rc0.d/*
|
||||
#/etc/rc3.d/*
|
||||
#/etc/rc5.d/*
|
||||
|
||||
/usr/bin/cancel
|
||||
/usr/bin/disable
|
||||
/usr/bin/enable
|
||||
/usr/bin/lp*
|
||||
/usr/lib/*.so*
|
||||
%dir /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/lib/cups/*
|
||||
/usr/sbin/*
|
||||
%dir /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/*
|
||||
/usr/share/cups/*
|
||||
%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
|
||||
@@ -203,26 +179,41 @@ 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/man1/*
|
||||
/usr/share/man/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/*
|
||||
%dir /usr/share/man/fr/cat3
|
||||
/usr/share/man/fr/cat3/*
|
||||
%dir /usr/share/man/fr/man3
|
||||
/usr/share/man/fr/man3/*
|
||||
|
||||
%files libs
|
||||
/usr/lib/*.so*
|
||||
|
||||
#
|
||||
# End of "$Id: cups.spec 2010 2002-01-02 17:59:21Z mike $".
|
||||
# End of "$Id: cups.spec 3724 2003-05-14 18:24:38Z mike $".
|
||||
#
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>Starting CUPS</key>
|
||||
<string>Starting CUPS</string>
|
||||
<key>Starting printing services</key>
|
||||
<string>Starting printing services</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
libcups.a
|
||||
libcups.la
|
||||
libcups.sl
|
||||
libcups.sl.2
|
||||
libcups.so
|
||||
libcups.so.2
|
||||
libcups_s.a
|
||||
libcups.2.dylib
|
||||
libcups.dylib
|
||||
testhttp
|
||||
testipp
|
||||
testlang
|
||||
testppd
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# DO NOT DELETE
|
||||
|
||||
attr.o: ppd.h debug.h string.h ../config.h
|
||||
dest.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
|
||||
emit.o: ppd.h string.h ../config.h
|
||||
encode.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h debug.h
|
||||
http.o: string.h ../config.h http.h md5.h http-private.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 string.h ../config.h md5.h
|
||||
options.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.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 string.h ../config.h md5.h ppd.h debug.h
|
||||
usersys.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h
|
||||
util.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
|
||||
util.o: debug.h
|
||||
testhttp.o: http.h string.h ../config.h md5.h
|
||||
testlang.o: language.h
|
||||
+54
-50
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Support library Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
# 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
|
||||
@@ -21,6 +21,8 @@
|
||||
# EMail: cups-info@cups.org
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
# This file is subject to the Apple OS-Developed Software exception.
|
||||
#
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
@@ -28,10 +30,11 @@ include ../Makedefs
|
||||
# Object files...
|
||||
#
|
||||
|
||||
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
|
||||
LIBOBJS = attr.o 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 testipp.o testlang.o
|
||||
|
||||
|
||||
#
|
||||
@@ -45,7 +48,8 @@ HEADERS = cups.h http.h ipp.h language.h md5.h ppd.h
|
||||
# Targets in this directory...
|
||||
#
|
||||
|
||||
TARGETS = $(LIBCUPS) libcups.a
|
||||
TARGETS = $(LIBCUPS) libcups.a \
|
||||
testhttp testipp testlang
|
||||
|
||||
|
||||
#
|
||||
@@ -60,33 +64,43 @@ all: $(TARGETS)
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS) `basename $(LIBCUPS) .2`
|
||||
$(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
|
||||
|
||||
|
||||
#
|
||||
# Install object and target files...
|
||||
#
|
||||
|
||||
install: all
|
||||
$(INSTALL_DIR) $(INCLUDEDIR)/cups
|
||||
for file in $(HEADERS); do \
|
||||
$(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \
|
||||
done
|
||||
install: all installhdrs
|
||||
$(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); \
|
||||
$(STRIP) -x $(LIBDIR)/$(LIBCUPS); \
|
||||
$(RM) $(LIBDIR)/libcups.dylib; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \
|
||||
fi
|
||||
if test $(LIBCUPS) = "libcups_s.a"; then \
|
||||
if test $(LIBCUPS) != "libcups.a"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
fi
|
||||
$(RANLIB) $(LIBDIR)/libcups.a
|
||||
|
||||
installhdrs:
|
||||
$(INSTALL_DIR) $(INCLUDEDIR)/cups
|
||||
for file in $(HEADERS); do \
|
||||
$(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \
|
||||
done
|
||||
|
||||
|
||||
#
|
||||
@@ -95,7 +109,7 @@ install: all
|
||||
|
||||
libcups.so.2 libcups.sl.2: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(SSLLIBS)
|
||||
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(SSLLIBS) $(COMMONLIBS)
|
||||
$(RM) `basename $@ .2`
|
||||
$(LN) $@ `basename $@ .2`
|
||||
|
||||
@@ -107,10 +121,10 @@ libcups.so.2 libcups.sl.2: $(LIBOBJS) ../Makedefs
|
||||
libcups.2.dylib: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ \
|
||||
-dylib_install_name $(LIBDIR)/libcups.dylib \
|
||||
-dylib_current_version 2.0.4 \
|
||||
-dylib_compatibility_version 2.0.0 \
|
||||
$(LIBOBJS) $(SSLLIBS)
|
||||
-install_name $(libdir)/$@ \
|
||||
-current_version 2.5.0 \
|
||||
-compatibility_version 2.0.0 \
|
||||
$(LIBOBJS) $(SSLLIBS) $(COMMONLIBS)
|
||||
$(RM) libcups.dylib
|
||||
$(LN) $@ libcups.dylib
|
||||
|
||||
@@ -123,7 +137,7 @@ libcups_s.a: $(LIBOBJS) ../Makedefs
|
||||
echo Creating $@...
|
||||
$(RM) libcups_s.exp
|
||||
(echo _ipp_add_attr; echo _ipp_free_attr) >libcups_s.exp
|
||||
$(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o $(LIBOBJS) $(SSLLIBS) -lm
|
||||
$(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o $(LIBOBJS) $(SSLLIBS) $(COMMONLIBS) -lm
|
||||
$(RM) $@
|
||||
$(AR) $(ARFLAGS) $@ libcups_s.o
|
||||
|
||||
@@ -135,7 +149,7 @@ libcups_s.a: $(LIBOBJS) ../Makedefs
|
||||
libcups.la: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
|
||||
-version-info 2:4 $(SSLLIBS)
|
||||
-version-info 2:5 $(SSLLIBS) $(COMMONLIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -158,23 +172,6 @@ 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)
|
||||
@@ -182,25 +179,32 @@ util.o: cups.h http.h ipp.h
|
||||
|
||||
testhttp: testhttp.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS) $(SSLLIBS)
|
||||
|
||||
testhttp.o: http.h
|
||||
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
|
||||
|
||||
|
||||
#
|
||||
# testppd
|
||||
# testipp (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testppd: testppd.o ppd-debug.o language.o mark.o page.o
|
||||
testipp: testipp.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o ppd-debug.o language.o mark.o page.o
|
||||
$(CC) $(LDFLAGS) -o $@ testipp.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
|
||||
|
||||
testppd.o: ppd.h
|
||||
ppd-debug.o: ppd.c language.h ppd.h
|
||||
echo Compiling $< with debugging...
|
||||
$(CC) $(OPTIM) $(CFLAGS) -DDEBUG -c -o $@ $<
|
||||
|
||||
$(OBJS): ../Makedefs ../config.h
|
||||
#
|
||||
# testlang (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testlang: testlang.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testlang.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
|
||||
|
||||
|
||||
#
|
||||
# Dependencies...
|
||||
#
|
||||
|
||||
include Dependencies
|
||||
|
||||
|
||||
#
|
||||
|
||||
+180
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* PPD model-specific attribute routines 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-9600
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ppdFindAttr() - Find the first matching attribute...
|
||||
* ppdFindNextAttr() - Find the next matching attribute...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "ppd.h"
|
||||
#include "debug.h"
|
||||
#include "string.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/*
|
||||
* Private function...
|
||||
*/
|
||||
|
||||
extern int _ppd_attr_compare(ppd_attr_t **a, ppd_attr_t **b);
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdFindAttr()' - Find the first matching attribute...
|
||||
*/
|
||||
|
||||
ppd_attr_t * /* O - Attribute or NULL if not found */
|
||||
ppdFindAttr(ppd_file_t *ppd, /* I - PPD file data */
|
||||
const char *name, /* I - Attribute name */
|
||||
const char *spec) /* I - Specifier string or NULL */
|
||||
{
|
||||
ppd_attr_t key, /* Search key */
|
||||
*keyptr, /* Pointer to key */
|
||||
**match; /* Matching attribute */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (ppd == NULL || name == NULL || ppd->num_attrs == 0)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Do a binary search for a matching attribute...
|
||||
*/
|
||||
|
||||
memset(&key, 0, sizeof(key));
|
||||
strncpy(key.name, name, sizeof(key.name) - 1);
|
||||
if (spec)
|
||||
strncpy(key.spec, spec, sizeof(key.spec) - 1);
|
||||
|
||||
keyptr = &key;
|
||||
|
||||
match = bsearch(&keyptr, ppd->attrs, ppd->num_attrs, sizeof(ppd_attr_t *),
|
||||
(int (*)(const void *, const void *))_ppd_attr_compare);
|
||||
|
||||
if (match == NULL)
|
||||
{
|
||||
/*
|
||||
* No match!
|
||||
*/
|
||||
|
||||
ppd->cur_attr = -1;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (match > ppd->attrs && spec == NULL)
|
||||
{
|
||||
/*
|
||||
* Find the first attribute with the same name...
|
||||
*/
|
||||
|
||||
while (match > ppd->attrs)
|
||||
{
|
||||
if (strcmp(match[-1]->name, name) != 0)
|
||||
break;
|
||||
|
||||
match --;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the current attribute and return its value...
|
||||
*/
|
||||
|
||||
ppd->cur_attr = match - ppd->attrs;
|
||||
|
||||
return (*match);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdFindNextAttr()' - Find the next matching attribute...
|
||||
*/
|
||||
|
||||
ppd_attr_t * /* O - Attribute or NULL if not found */
|
||||
ppdFindNextAttr(ppd_file_t *ppd, /* I - PPD file data */
|
||||
const char *name, /* I - Attribute name */
|
||||
const char *spec) /* I - Specifier string or NULL */
|
||||
{
|
||||
ppd_attr_t **match; /* Matching attribute */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (ppd == NULL || name == NULL || ppd->num_attrs == 0 || ppd->cur_attr < 0)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* See if there are more attributes to return...
|
||||
*/
|
||||
|
||||
ppd->cur_attr ++;
|
||||
|
||||
if (ppd->cur_attr >= ppd->num_attrs)
|
||||
{
|
||||
/*
|
||||
* Nope...
|
||||
*/
|
||||
|
||||
ppd->cur_attr = -1;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the next attribute to see if it is a match...
|
||||
*/
|
||||
|
||||
match = ppd->attrs + ppd->cur_attr;
|
||||
|
||||
if (strcmp((*match)->name, name) != 0 ||
|
||||
(spec != NULL && strcmp((*match)->spec, spec) != 0))
|
||||
{
|
||||
/*
|
||||
* Nope...
|
||||
*/
|
||||
|
||||
ppd->cur_attr = -1;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the next attribute's value...
|
||||
*/
|
||||
|
||||
return (*match);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+30
-2
@@ -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 /MT /W3 /GX /O2 /I "..\visualc" /I ".." /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 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 /MTd /W3 /Gm /GX /Zi /Od /I "..\visualc" /I ".." /I "../visualc" /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 BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
@@ -93,10 +93,26 @@ 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
|
||||
@@ -105,6 +121,10 @@ 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
|
||||
@@ -137,6 +157,10 @@ 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
|
||||
@@ -173,6 +197,10 @@ 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
|
||||
|
||||
+8
-2
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* API definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -20,6 +20,8 @@
|
||||
* 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_
|
||||
@@ -46,7 +48,10 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0113
|
||||
# define CUPS_VERSION 1.0119
|
||||
# define CUPS_VERSION_MAJOR 1
|
||||
# define CUPS_VERSION_MINOR 1
|
||||
# define CUPS_VERSION_PATCH 19
|
||||
# define CUPS_DATE_ANY -1
|
||||
|
||||
|
||||
@@ -76,6 +81,7 @@ enum /* Not a typedef'd enum so we can OR */
|
||||
CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */
|
||||
CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class */
|
||||
CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */
|
||||
CUPS_PRINTER_FAX = 0x40000, /* Fax queue */
|
||||
CUPS_PRINTER_OPTIONS = 0xfffc /* ~(CLASS | REMOTE | IMPLICIT) */
|
||||
};
|
||||
|
||||
|
||||
+3
-1
@@ -18,7 +18,7 @@
|
||||
"Cyan",
|
||||
"Magenta",
|
||||
"Yellow",
|
||||
"Copyright 1993-2002 by Easy Software Products, All Rights Reserved.",
|
||||
"Copyright 1993-2003 by Easy Software Products, All Rights Reserved.",
|
||||
"General",
|
||||
"Printer",
|
||||
"Image",
|
||||
@@ -108,6 +108,8 @@
|
||||
"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.",
|
||||
|
||||
+3
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Debugging macros for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -20,6 +20,8 @@
|
||||
* 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_
|
||||
|
||||
+13
-4
@@ -4,7 +4,7 @@
|
||||
* User-defined destination (and option) support for the Common UNIX
|
||||
* Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -22,6 +22,8 @@
|
||||
* 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.
|
||||
@@ -263,8 +265,7 @@ cupsGetDests(cups_dest_t **dests) /* O - Destinations */
|
||||
* Grab printer and instance name...
|
||||
*/
|
||||
|
||||
strncpy(name, defprinter, sizeof(name) - 1);
|
||||
name[sizeof(name) - 1] = '\0';
|
||||
strlcpy(name, defprinter, sizeof(name));
|
||||
|
||||
if ((instance = strchr(name, '/')) != NULL)
|
||||
*instance++ = '\0';
|
||||
@@ -596,6 +597,14 @@ 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...
|
||||
*/
|
||||
@@ -659,7 +668,7 @@ cups_get_sdests(ipp_op_t op, /* I - get-printers or get-classes */
|
||||
cups_lang_t *language; /* Default language */
|
||||
const char *name; /* printer-name attribute */
|
||||
char job_sheets[1024]; /* job-sheets option */
|
||||
static const char *pattrs[] = /* Attributes we're interested in */
|
||||
static const char * const pattrs[] = /* Attributes we're interested in */
|
||||
{
|
||||
"printer-name",
|
||||
"job-sheets-default"
|
||||
|
||||
+253
-28
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD code emission routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -23,13 +23,17 @@
|
||||
*
|
||||
* 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
|
||||
* 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...
|
||||
* 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...
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -51,9 +55,19 @@
|
||||
* 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.
|
||||
@@ -151,6 +165,16 @@ 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);
|
||||
|
||||
@@ -172,25 +196,52 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
if (fprintf(fp, "%%%%BeginFeature: %s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
|
||||
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)
|
||||
{
|
||||
/*
|
||||
* Variable size; write out standard size options (this should
|
||||
* eventually be changed to use the parameter positions defined
|
||||
* in the PPD file...)
|
||||
* Variable size; write out standard size options, using the
|
||||
* parameter positions defined in the PPD file...
|
||||
*/
|
||||
|
||||
ppd_attr_t *attr; /* PPD attribute */
|
||||
int pos, /* Position of custom value */
|
||||
values[5]; /* Values for custom command */
|
||||
|
||||
|
||||
fputs("%%BeginFeature: *CustomPageSize True\n", fp);
|
||||
|
||||
size = ppdPageSize(ppd, "Custom");
|
||||
fprintf(fp, "%.0f %.0f 0 0 0\n", size->width, size->length);
|
||||
|
||||
memset(values, 0, sizeof(values));
|
||||
|
||||
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL)
|
||||
{
|
||||
pos = atoi(attr->value) - 1;
|
||||
|
||||
if (pos < 0 || pos > 4)
|
||||
pos = 0;
|
||||
}
|
||||
else
|
||||
pos = 0;
|
||||
|
||||
values[pos] = (int)size->width;
|
||||
|
||||
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL)
|
||||
{
|
||||
pos = atoi(attr->value) - 1;
|
||||
|
||||
if (pos < 0 || pos > 4)
|
||||
pos = 1;
|
||||
}
|
||||
else
|
||||
pos = 1;
|
||||
|
||||
values[pos] = (int)size->length;
|
||||
|
||||
fprintf(fp, "%d %d %d %d %d\n", values[0], values[1],
|
||||
values[2], values[3], values[4]);
|
||||
|
||||
if (choices[i]->code == NULL)
|
||||
{
|
||||
@@ -200,10 +251,16 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Level 2 command sequence...
|
||||
*/
|
||||
|
||||
fputs("pop pop pop\n", fp);
|
||||
fputs("<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
fputs(ppd_custom_code, fp);
|
||||
}
|
||||
}
|
||||
else if (fprintf(fp, "%%%%BeginFeature: *%s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
|
||||
{
|
||||
@@ -250,11 +307,23 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
ppd_section_t section) /* I - Section to write */
|
||||
{
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
count, /* Number of choices */
|
||||
custom_size; /* Non-zero if this option is a custom size */
|
||||
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);
|
||||
|
||||
@@ -276,9 +345,22 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
snprintf(buf, sizeof(buf), "%%%%BeginFeature: %s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice);
|
||||
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)
|
||||
{
|
||||
custom_size = 1;
|
||||
|
||||
strcpy(buf, "%%BeginFeature: *CustomPageSize True\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
custom_size = 0;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%%%%BeginFeature: *%s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword,
|
||||
choices[i]->choice);
|
||||
}
|
||||
|
||||
if (write(fd, buf, strlen(buf)) < 1)
|
||||
{
|
||||
@@ -286,10 +368,78 @@ ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
if (custom_size)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
/*
|
||||
* Variable size; write out standard size options, using the
|
||||
* parameter positions defined in the PPD file...
|
||||
*/
|
||||
|
||||
ppd_attr_t *attr; /* PPD attribute */
|
||||
int pos, /* Position of custom value */
|
||||
values[5]; /* Values for custom command */
|
||||
|
||||
|
||||
size = ppdPageSize(ppd, "Custom");
|
||||
|
||||
memset(values, 0, sizeof(values));
|
||||
|
||||
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL)
|
||||
{
|
||||
pos = atoi(attr->value) - 1;
|
||||
|
||||
if (pos < 0 || pos > 4)
|
||||
pos = 0;
|
||||
}
|
||||
else
|
||||
pos = 0;
|
||||
|
||||
values[pos] = (int)size->width;
|
||||
|
||||
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL)
|
||||
{
|
||||
pos = atoi(attr->value) - 1;
|
||||
|
||||
if (pos < 0 || pos > 4)
|
||||
pos = 1;
|
||||
}
|
||||
else
|
||||
pos = 1;
|
||||
|
||||
values[pos] = (int)size->length;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d %d %d %d %d\n", values[0], values[1],
|
||||
values[2], values[3], values[4]);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
if (write(fd, "%%EndFeature\n", 13) < 1)
|
||||
@@ -403,6 +553,81 @@ 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 */
|
||||
*page; /* PageSize/PageRegion */
|
||||
ppd_size_t *size; /* Current media size */
|
||||
ppd_attr_t *rpr; /* RequiresPageRegion value */
|
||||
|
||||
|
||||
/*
|
||||
* 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 (input_slot != NULL)
|
||||
rpr = ppdFindAttr(ppd, "RequiresPageRegion", input_slot->choice);
|
||||
else
|
||||
rpr = NULL;
|
||||
|
||||
if (!rpr)
|
||||
rpr = ppdFindAttr(ppd, "RequiresPageRegion", "All");
|
||||
|
||||
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);
|
||||
|
||||
if ((rpr && rpr->value && !strcmp(rpr->value, "False")) ||
|
||||
(!rpr && !ppd->num_filters))
|
||||
{
|
||||
/*
|
||||
* Either the PPD file specifies no PageRegion code or the PPD file
|
||||
* not for a CUPS raster driver and thus defaults to no PageRegion
|
||||
* code... Unmark the PageRegion choice so that we don't output the
|
||||
* code...
|
||||
*/
|
||||
|
||||
page = ppdFindMarkedChoice(ppd, "PageRegion");
|
||||
|
||||
if (page)
|
||||
page->marked = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_sort()' - Sort options by ordering numbers...
|
||||
*/
|
||||
|
||||
+211
-136
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option encoding routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -37,6 +39,53 @@
|
||||
#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 const 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-k-limit", IPP_TAG_INTEGER },
|
||||
{ "job-page-limit", IPP_TAG_INTEGER },
|
||||
{ "job-priority", IPP_TAG_INTEGER },
|
||||
{ "job-quota-period", IPP_TAG_INTEGER },
|
||||
{ "landscape", IPP_TAG_BOOLEAN },
|
||||
{ "media", IPP_TAG_KEYWORD },
|
||||
{ "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 },
|
||||
{ "sides", IPP_TAG_KEYWORD },
|
||||
{ "wrap", IPP_TAG_BOOLEAN }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
|
||||
*/
|
||||
@@ -46,14 +95,13 @@ 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 */
|
||||
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 */
|
||||
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 */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)\n", ipp, num_options, options));
|
||||
@@ -94,13 +142,49 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
* Count the number of values...
|
||||
*/
|
||||
|
||||
for (count = 1, sep = options[i].value;
|
||||
(sep = strchr(sep + 1, ',')) != NULL;
|
||||
count ++);
|
||||
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 ++;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
/*
|
||||
@@ -111,8 +195,29 @@ 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)
|
||||
{
|
||||
/*
|
||||
@@ -152,92 +257,111 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
* Scan the value string for values...
|
||||
*/
|
||||
|
||||
if (*val == '\0')
|
||||
for (j = 0; j < count; val = sep, j ++)
|
||||
{
|
||||
/*
|
||||
* Old-style System V boolean value...
|
||||
* Find the end of this value and mark it if needed...
|
||||
*/
|
||||
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
|
||||
if (strncasecmp(attr->name, "no", 2) == 0)
|
||||
{
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
|
||||
strcpy(attr->name, attr->name + 2);
|
||||
attr->values[0].boolean = 0;
|
||||
}
|
||||
if ((sep = strchr(val, ',')) != NULL)
|
||||
*sep++ = '\0';
|
||||
else
|
||||
{
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
attr->values[0].boolean = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sep = val + strlen(val);
|
||||
|
||||
/*
|
||||
* Scan the value string for values...
|
||||
* Copy the option value(s) over as needed by the type...
|
||||
*/
|
||||
|
||||
for (j = 0; *val != '\0'; val = sep, j ++)
|
||||
switch (attr->value_tag)
|
||||
{
|
||||
/*
|
||||
* 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))
|
||||
{
|
||||
case IPP_TAG_INTEGER :
|
||||
case IPP_TAG_ENUM :
|
||||
/*
|
||||
* String value(s)...
|
||||
* Integer/enumeration value...
|
||||
*/
|
||||
|
||||
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)
|
||||
{
|
||||
/*
|
||||
@@ -248,58 +372,9 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
DEBUG_printf(("cupsEncodeOptions: Added string value \'%s\'...\n",
|
||||
val));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* "$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 const 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 gethostbyname() 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$".
|
||||
*/
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Private HTTP definitions 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.
|
||||
*/
|
||||
|
||||
#ifndef _CUPS_HTTP_PRIVATE_H_
|
||||
# define _CUPS_HTTP_PRIVATE_H_
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include "http.h"
|
||||
# include "config.h"
|
||||
|
||||
# if defined HAVE_LIBSSL
|
||||
/*
|
||||
* The OpenSSL library provides its own SSL/TLS context structure for its
|
||||
* IO and protocol management...
|
||||
*/
|
||||
|
||||
# include <openssl/err.h>
|
||||
# include <openssl/rand.h>
|
||||
# include <openssl/ssl.h>
|
||||
|
||||
typedef SSL http_tls_t;
|
||||
|
||||
# elif defined HAVE_GNUTLS
|
||||
/*
|
||||
* The GNU TLS library is more of a "bare metal" SSL/TLS library...
|
||||
*/
|
||||
# include <gnutls/gnutls.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gnutls_session session; /* GNU TLS session object */
|
||||
void *credentials; /* GNU TLS credentials object */
|
||||
} http_tls_t;
|
||||
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
/*
|
||||
* Darwin's Security framework provides its own SSL/TLS context structure
|
||||
* for its IO and protocol management...
|
||||
*/
|
||||
|
||||
# include <Security/SecureTransport.h>
|
||||
|
||||
typedef SSLConnectionRef http_tls_t;
|
||||
|
||||
# endif /* HAVE_LIBSSL */
|
||||
|
||||
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -0,0 +1,316 @@
|
||||
/*
|
||||
* "$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...
|
||||
*/
|
||||
|
||||
uri += 2;
|
||||
|
||||
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$".
|
||||
*/
|
||||
+662
-486
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+21
-3
@@ -4,7 +4,7 @@
|
||||
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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_
|
||||
@@ -44,7 +46,9 @@
|
||||
# include <arpa/inet.h>
|
||||
# include <netinet/in_systm.h>
|
||||
# include <netinet/ip.h>
|
||||
# include <netinet/tcp.h>
|
||||
# if !defined(__APPLE__) || !defined(TCP_NODELAY)
|
||||
# include <netinet/tcp.h>
|
||||
# endif /* !__APPLE__ || !TCP_NODELAY */
|
||||
# endif /* WIN32 */
|
||||
|
||||
# include "md5.h"
|
||||
@@ -277,6 +281,10 @@ typedef struct
|
||||
int nonce_count; /* Nonce count */
|
||||
void *tls; /* TLS state information */
|
||||
http_encryption_t encryption; /* Encryption requirements */
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
fd_set *input_set; /* select() set for httpWait() */
|
||||
http_status_t expect; /* Expect: header */
|
||||
char *cookie; /* Cookie value(s) */
|
||||
} http_t;
|
||||
|
||||
|
||||
@@ -308,7 +316,11 @@ 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, ...);
|
||||
extern int httpPrintf(http_t *http, const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
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);
|
||||
@@ -330,6 +342,12 @@ extern char *httpMD5Final(const char *, const char *, const char *,
|
||||
char [33]);
|
||||
extern char *httpMD5String(const md5_byte_t *, char [33]);
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
extern void httpClearCookie(http_t *http);
|
||||
#define httpGetCookie(http) ((http)->cookie)
|
||||
extern void httpSetCookie(http_t *http, const char *cookie);
|
||||
extern int httpWait(http_t *http, int msec);
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
|
||||
@@ -0,0 +1,175 @@
|
||||
/*
|
||||
* "$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 * const 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"
|
||||
},
|
||||
* const 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"
|
||||
},
|
||||
* const 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$".
|
||||
*/
|
||||
+1058
-537
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+43
-8
@@ -4,7 +4,7 @@
|
||||
* Internet Printing Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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_
|
||||
@@ -46,12 +48,14 @@ extern "C" {
|
||||
* IPP version string...
|
||||
*/
|
||||
|
||||
# define IPP_VERSION "\001\000"
|
||||
# define IPP_VERSION "\001\001"
|
||||
|
||||
/*
|
||||
* IPP registered port number... This is the default value - applications
|
||||
* should use the ippPort() function so that you can customize things in
|
||||
* /etc/services if needed!
|
||||
* IPP registered port number...
|
||||
*
|
||||
* Note: Applications should never use IPP_PORT, but instead use the
|
||||
* ippPort() function to allow overrides via the IPP_PORT environment
|
||||
* variable and services file if needed!
|
||||
*/
|
||||
|
||||
# define IPP_PORT 631
|
||||
@@ -303,6 +307,10 @@ typedef enum /**** IPP status codes... ****/
|
||||
|
||||
typedef unsigned char ipp_uchar_t;/**** Unsigned 8-bit integer/character ****/
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
typedef int (*ipp_iocb_t)(void *, ipp_uchar_t *, int);
|
||||
/**** IPP IO Callback Function ****/
|
||||
|
||||
typedef union /**** Request Header ****/
|
||||
{
|
||||
struct /* Any Header */
|
||||
@@ -325,8 +333,18 @@ typedef union /**** Request Header ****/
|
||||
ipp_status_t status_code; /* Status code */
|
||||
int request_id; /* Request ID */
|
||||
} status;
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
struct /* Event Header */
|
||||
{
|
||||
ipp_uchar_t version[2]; /* Protocol version number */
|
||||
int status_code; /* Status code */
|
||||
int request_id; /* Request ID */
|
||||
} event;
|
||||
} ipp_request_t;
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
typedef struct ipp_str ipp_t;
|
||||
|
||||
typedef union /**** Attribute Value ****/
|
||||
{
|
||||
@@ -360,6 +378,9 @@ typedef union /**** Attribute Value ****/
|
||||
int length; /* Length of attribute */
|
||||
void *data; /* Data in attribute */
|
||||
} unknown; /* Unknown attribute type */
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
ipp_t *collection; /* Collection value */
|
||||
} ipp_value_t;
|
||||
|
||||
typedef struct ipp_attribute_s /**** Attribute ****/
|
||||
@@ -372,7 +393,7 @@ typedef struct ipp_attribute_s /**** Attribute ****/
|
||||
ipp_value_t values[1]; /* Values */
|
||||
} ipp_attribute_t;
|
||||
|
||||
typedef struct /**** Request State ****/
|
||||
struct ipp_str /**** IPP Request/Response/Notification ****/
|
||||
{
|
||||
ipp_state_t state; /* State of request */
|
||||
ipp_request_t request; /* Request header */
|
||||
@@ -380,7 +401,7 @@ typedef struct /**** Request State ****/
|
||||
*last, /* Last attribute in list */
|
||||
*current; /* Current attribute (for read/write) */
|
||||
ipp_tag_t curtag; /* Current attribute group tag */
|
||||
} ipp_t;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
@@ -398,7 +419,7 @@ extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char
|
||||
extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres);
|
||||
extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp);
|
||||
extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, const char *charset, const char *value);
|
||||
extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const char *charset, const char **values);
|
||||
extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const char *charset, const char * const *values);
|
||||
extern time_t ippDateToTime(const ipp_uchar_t *date);
|
||||
extern void ippDelete(ipp_t *ipp);
|
||||
extern const char *ippErrorString(ipp_status_t error);
|
||||
@@ -414,6 +435,20 @@ extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp);
|
||||
extern int ippPort(void);
|
||||
extern void ippSetPort(int p);
|
||||
|
||||
/**** New in CUPS 1.1.19 ****/
|
||||
extern ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_t *value);
|
||||
extern ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const ipp_t **values);
|
||||
extern void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr);
|
||||
extern ipp_state_t ippReadFile(int fd, ipp_t *ipp);
|
||||
extern ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);
|
||||
extern ipp_state_t ippWriteFile(int fd, ipp_t *ipp);
|
||||
extern ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);
|
||||
|
||||
|
||||
/*
|
||||
* "Private" functions used internally by CUPS...
|
||||
*/
|
||||
|
||||
extern ipp_attribute_t *_ipp_add_attr(ipp_t *, int);
|
||||
extern void _ipp_free_attr(ipp_attribute_t *);
|
||||
|
||||
|
||||
+429
-125
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* I18N/language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -21,13 +21,17 @@
|
||||
* 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.)
|
||||
* for the given language.
|
||||
* cupsLangFlush() - Flush all language data out of the cache.
|
||||
* cupsLangFree() - Free language data.
|
||||
* cupsLangGet() - Get a language.
|
||||
* cupsLangEncoding() - Return the character encoding (us-ascii, etc.)
|
||||
* for the given language.
|
||||
* cupsLangFlush() - Flush all language data out of the cache.
|
||||
* cupsLangFree() - Free language data.
|
||||
* cupsLangGet() - Get a language.
|
||||
* appleLangDefault() - Get the default locale string.
|
||||
* cups_cache_lookup() - Lookup a language in the cache...
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -37,18 +41,38 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef WIN32
|
||||
# include <io.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
#endif /* WIN32 */
|
||||
#include "string.h"
|
||||
#include "language.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
#ifdef __APPLE__
|
||||
# include <CoreFoundation/CoreFoundation.h>
|
||||
static const char *appleLangDefault(void);
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
static cups_lang_t *cups_cache_lookup(const char *name,
|
||||
cups_encoding_t encoding);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static cups_lang_t *lang_cache = NULL; /* Language string cache */
|
||||
static char *lang_blank = ""; /* Blank constant string */
|
||||
static char *lang_encodings[] = /* Encoding strings */
|
||||
{
|
||||
static cups_lang_t *lang_cache = NULL;
|
||||
/* Language string cache */
|
||||
static const char lang_blank[] = "";
|
||||
/* Blank constant string */
|
||||
static const char * const lang_encodings[] =
|
||||
{ /* Encoding strings */
|
||||
"us-ascii",
|
||||
"iso-8859-1",
|
||||
"iso-8859-2",
|
||||
@@ -77,8 +101,8 @@ static char *lang_encodings[] = /* Encoding strings */
|
||||
"koi8-r",
|
||||
"koi8-u"
|
||||
};
|
||||
static char *lang_default[] = /* Default POSIX locale */
|
||||
{
|
||||
static const char * const lang_default[] =
|
||||
{ /* Default POSIX locale */
|
||||
#include "cups_C.h"
|
||||
NULL
|
||||
};
|
||||
@@ -93,9 +117,9 @@ char * /* O - Character encoding */
|
||||
cupsLangEncoding(cups_lang_t *lang) /* I - Language data */
|
||||
{
|
||||
if (lang == NULL)
|
||||
return (lang_encodings[0]);
|
||||
return ((char*)lang_encodings[0]);
|
||||
else
|
||||
return (lang_encodings[lang->encoding]);
|
||||
return ((char*)lang_encodings[lang->encoding]);
|
||||
}
|
||||
|
||||
|
||||
@@ -106,20 +130,34 @@ cupsLangEncoding(cups_lang_t *lang) /* I - Language data */
|
||||
void
|
||||
cupsLangFlush(void)
|
||||
{
|
||||
int i; /* Looping var */
|
||||
cups_lang_t *lang, /* Current language */
|
||||
*next; /* Next language */
|
||||
int i; /* Looping var */
|
||||
cups_lang_t *lang, /* Current language */
|
||||
*next; /* Next language */
|
||||
|
||||
|
||||
/*
|
||||
* Free all languages in the cache...
|
||||
*/
|
||||
|
||||
for (lang = lang_cache; lang != NULL; lang = next)
|
||||
{
|
||||
/*
|
||||
* Free all messages...
|
||||
*/
|
||||
|
||||
for (i = 0; i < CUPS_MSG_MAX; i ++)
|
||||
if (lang->messages[i] != NULL && lang->messages[i] != lang_blank)
|
||||
free(lang->messages[i]);
|
||||
|
||||
/*
|
||||
* Then free the language structure itself...
|
||||
*/
|
||||
|
||||
next = lang->next;
|
||||
free(lang);
|
||||
}
|
||||
|
||||
lang_cache = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,136 +179,218 @@ cupsLangFree(cups_lang_t *lang) /* I - Language to free */
|
||||
* 'cupsLangGet()' - Get a language.
|
||||
*/
|
||||
|
||||
cups_lang_t * /* O - Language data */
|
||||
cupsLangGet(const char *language) /* I - Language or locale */
|
||||
cups_lang_t * /* O - Language data */
|
||||
cupsLangGet(const char *language) /* I - Language or locale */
|
||||
{
|
||||
int i, count; /* Looping vars */
|
||||
char langname[32], /* Requested language name */
|
||||
real[32], /* Real language name */
|
||||
*realptr, /* Pointer into real language name */
|
||||
filename[1024], /* Filename for language locale file */
|
||||
*localedir; /* Directory for locale files */
|
||||
FILE *fp; /* Language locale file pointer */
|
||||
char line[1024]; /* Line from file */
|
||||
cups_msg_t msg; /* Message number */
|
||||
char *text; /* Message text */
|
||||
cups_lang_t *lang; /* Current language... */
|
||||
int i, count; /* Looping vars */
|
||||
char langname[16], /* Requested language name */
|
||||
country[16], /* Country code */
|
||||
charset[16], /* Character set */
|
||||
*ptr, /* Pointer into language/ */
|
||||
real[48], /* Real language name */
|
||||
filename[1024], /* Filename for language locale file */
|
||||
*localedir; /* Directory for locale files */
|
||||
cups_encoding_t encoding; /* Encoding to use */
|
||||
FILE *fp; /* Language locale file pointer */
|
||||
char line[1024]; /* Line from file */
|
||||
cups_msg_t msg; /* Message number */
|
||||
char *text; /* Message text */
|
||||
cups_lang_t *lang; /* Current language... */
|
||||
const char *oldlocale; /* Old locale name */
|
||||
static const char * const locale_encodings[] =
|
||||
{ /* Locale charset names */
|
||||
"ASCII",
|
||||
"ISO8859-1",
|
||||
"ISO8859-2",
|
||||
"ISO8859-3",
|
||||
"ISO8859-4",
|
||||
"ISO8859-5",
|
||||
"ISO8859-6",
|
||||
"ISO8859-7",
|
||||
"ISO8859-8",
|
||||
"ISO8859-9",
|
||||
"ISO8859-10",
|
||||
"UTF-8",
|
||||
"ISO8859-13",
|
||||
"ISO8859-14",
|
||||
"ISO8859-15",
|
||||
"CP874",
|
||||
"CP1250",
|
||||
"CP1251",
|
||||
"CP1252",
|
||||
"CP1253",
|
||||
"CP1254",
|
||||
"CP1255",
|
||||
"CP1256",
|
||||
"CP1257",
|
||||
"CP1258",
|
||||
"KOI8R",
|
||||
"KOI8U"
|
||||
};
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* Convert the language string passed in to a locale string. "C" is the
|
||||
* standard POSIX locale and is copied unchanged. Otherwise the
|
||||
* language string is converted from ll-cc (language-country) to ll_cc
|
||||
* to match the file naming convention used by all POSIX-compliant
|
||||
* operating systems.
|
||||
* Apple's setlocale doesn't give us the user's localization
|
||||
* preference so we have to look it up this way...
|
||||
*/
|
||||
|
||||
if (language == NULL || language[0] == '\0' ||
|
||||
if (language == NULL)
|
||||
{
|
||||
language = appleLangDefault();
|
||||
setlocale(LC_ALL, language);
|
||||
}
|
||||
#elif defined(LC_MESSAGES)
|
||||
if (language == NULL)
|
||||
language = setlocale(LC_MESSAGES, "");
|
||||
#else
|
||||
if (language == NULL)
|
||||
language = setlocale(LC_ALL, "");
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
* Set the locale back to POSIX while we do string ops, since
|
||||
* apparently some buggy C libraries break ctype() for non-I18N
|
||||
* chars...
|
||||
*/
|
||||
|
||||
#if defined(__APPLE__) || !defined(LC_CTYPE)
|
||||
oldlocale = setlocale(LC_ALL, "C");
|
||||
#else
|
||||
oldlocale = setlocale(LC_CTYPE, "C");
|
||||
#endif /* __APPLE__ || !LC_CTYPE */
|
||||
|
||||
/*
|
||||
* Parse the language string passed in to a locale string. "C" is the
|
||||
* standard POSIX locale and is copied unchanged. Otherwise the
|
||||
* language string is converted from ll-cc[.charset] (language-country)
|
||||
* to ll_CC[.CHARSET] to match the file naming convention used by all
|
||||
* POSIX-compliant operating systems. Invalid language names are mapped
|
||||
* to the POSIX locale.
|
||||
*/
|
||||
|
||||
country[0] = '\0';
|
||||
charset[0] = '\0';
|
||||
|
||||
if (language == NULL || !language[0] ||
|
||||
strcmp(language, "POSIX") == 0)
|
||||
strcpy(langname, "C");
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Copy the locale string over safely...
|
||||
* Copy the parts of the locale string over safely...
|
||||
*/
|
||||
|
||||
strncpy(langname, language, sizeof(langname) - 1);
|
||||
langname[sizeof(langname) - 1] = '\0';
|
||||
}
|
||||
for (ptr = langname; *language; language ++)
|
||||
if (*language == '_' || *language == '-')
|
||||
{
|
||||
language ++;
|
||||
break;
|
||||
}
|
||||
else if (ptr < (langname + sizeof(langname) - 1))
|
||||
*ptr++ = tolower(*language);
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
for (ptr = country; *language; language ++)
|
||||
if (*language == '.')
|
||||
{
|
||||
language ++;
|
||||
break;
|
||||
}
|
||||
else if (ptr < (country + sizeof(country) - 1))
|
||||
*ptr++ = toupper(*language);
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
for (ptr = charset; *language; language ++)
|
||||
if (ptr < (charset + sizeof(charset) - 1))
|
||||
*ptr++ = toupper(*language);
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (strlen(langname) < 2)
|
||||
strcpy(real, "C");
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Convert the language name to a normalized form, e.g.:
|
||||
*
|
||||
* ll[_CC[.charset]]
|
||||
* Force a POSIX locale for an invalid language name...
|
||||
*/
|
||||
|
||||
real[0] = tolower(langname[0]);
|
||||
real[1] = tolower(langname[1]);
|
||||
|
||||
count = 2;
|
||||
|
||||
if (langname[count] == '_' || langname[count] == '-')
|
||||
if (strlen(langname) != 2)
|
||||
{
|
||||
/*
|
||||
* Add country code...
|
||||
*/
|
||||
|
||||
real[count] = '_';
|
||||
real[count + 1] = toupper(langname[count + 1]);
|
||||
real[count + 2] = toupper(langname[count + 2]);
|
||||
|
||||
count += 3;
|
||||
strcpy(langname, "C");
|
||||
country[0] = '\0';
|
||||
charset[0] = '\0';
|
||||
}
|
||||
|
||||
if (langname[count] == '.')
|
||||
{
|
||||
/*
|
||||
* Add charset...
|
||||
*/
|
||||
|
||||
strncpy(real + count, langname + count, sizeof(real) - count - 1);
|
||||
langname[count] = '\0';
|
||||
count += strlen(langname + count);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
langname[count] = '\0';
|
||||
real[count] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we already have this language loaded...
|
||||
* Restore the locale...
|
||||
*/
|
||||
|
||||
for (lang = lang_cache; lang != NULL; lang = lang->next)
|
||||
if (strcmp(lang->language, langname) == 0)
|
||||
{
|
||||
lang->used ++;
|
||||
|
||||
return (lang);
|
||||
}
|
||||
|
||||
#if defined(__APPLE__) || !defined(LC_CTYPE)
|
||||
setlocale(LC_ALL, oldlocale);
|
||||
#else
|
||||
setlocale(LC_CTYPE, oldlocale);
|
||||
#endif /* __APPLE__ || !LC_CTYPE */
|
||||
|
||||
/*
|
||||
* Next try to open a locale file; we will try the charset-localized
|
||||
* file first, then the country-localized file, and finally look for
|
||||
* a generic language file. If all else fails we will use the POSIX
|
||||
* locale.
|
||||
* Figure out the desired encoding...
|
||||
*/
|
||||
|
||||
encoding = CUPS_US_ASCII;
|
||||
|
||||
for (i = 0; i < (int)(sizeof(locale_encodings) / sizeof(locale_encodings[0])); i ++)
|
||||
if (!strcmp(charset, locale_encodings[i]))
|
||||
{
|
||||
encoding = (cups_encoding_t)i;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now find the message catalog for this locale...
|
||||
*/
|
||||
|
||||
if ((localedir = getenv("LOCALEDIR")) == NULL)
|
||||
localedir = CUPS_LOCALEDIR;
|
||||
|
||||
do
|
||||
{
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir,
|
||||
real, real);
|
||||
/*
|
||||
* See if we already have this language/country loaded...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(filename, "r")) == NULL)
|
||||
snprintf(real, sizeof(real), "%s_%s", langname, country);
|
||||
|
||||
if ((lang = cups_cache_lookup(real, encoding)) != NULL)
|
||||
return (lang);
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir, real, real);
|
||||
|
||||
if (access(filename, 0))
|
||||
{
|
||||
/*
|
||||
* Country localization not available, look for generic localization...
|
||||
*/
|
||||
|
||||
if ((lang = cups_cache_lookup(langname, encoding)) != NULL)
|
||||
return (lang);
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir,
|
||||
langname, langname);
|
||||
|
||||
if (access(filename, 0))
|
||||
{
|
||||
if ((realptr = strchr(real, '.')) != NULL)
|
||||
*realptr = '\0';
|
||||
else if ((realptr = strchr(real, '_')) != NULL)
|
||||
*realptr = '\0';
|
||||
/*
|
||||
* No generic localization, so use POSIX...
|
||||
*/
|
||||
|
||||
strcpy(real, "C");
|
||||
snprintf(filename, sizeof(filename), "%s/C/cups_C", localedir);
|
||||
}
|
||||
else
|
||||
strcpy(real, langname);
|
||||
}
|
||||
while (fp == NULL && strchr(real, '_') != NULL && strchr(real, '.') != NULL);
|
||||
|
||||
/*
|
||||
* OK, we have an open messages file; the first line will contain the
|
||||
* language encoding (us-ascii, iso-8859-1, etc.), and the rest will
|
||||
* be messages consisting of:
|
||||
* Open the messages file; the first line contains the default
|
||||
* language encoding (us-ascii, iso-8859-1, etc.), and the rest are
|
||||
* messages consisting of:
|
||||
*
|
||||
* #### SP message text
|
||||
*
|
||||
@@ -285,11 +405,13 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
* All leading whitespace is deleted.
|
||||
*/
|
||||
|
||||
if (strcmp(real, "C"))
|
||||
fp = fopen(filename, "r");
|
||||
else
|
||||
fp = NULL;
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
strncpy(line, lang_default[0], sizeof(line) - 1);
|
||||
line[sizeof(line) - 1] = '\0';
|
||||
}
|
||||
strlcpy(line, lang_default[0], sizeof(line));
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -338,7 +460,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
if (lang->messages[i] != NULL && lang->messages[i] != lang_blank)
|
||||
free(lang->messages[i]);
|
||||
|
||||
lang->messages[i] = lang_blank;
|
||||
lang->messages[i] = (char*)lang_blank;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -346,15 +468,19 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
lang->used ++;
|
||||
strncpy(lang->language, langname, sizeof(lang->language) - 1);
|
||||
lang->language[sizeof(lang->language) - 1] = '\0';
|
||||
strlcpy(lang->language, real, sizeof(lang->language));
|
||||
|
||||
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
|
||||
if (strcmp(lang_encodings[i], line) == 0)
|
||||
{
|
||||
lang->encoding = (cups_encoding_t)i;
|
||||
break;
|
||||
}
|
||||
if (charset[0])
|
||||
lang->encoding = encoding;
|
||||
else
|
||||
{
|
||||
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
|
||||
if (strcmp(lang_encodings[i], line) == 0)
|
||||
{
|
||||
lang->encoding = (cups_encoding_t)i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the strings from the file...
|
||||
@@ -374,8 +500,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
if (lang_default[count] == NULL)
|
||||
break;
|
||||
|
||||
strncpy(line, lang_default[count], sizeof(line) - 1);
|
||||
/* Already set last byte to 0 above... */
|
||||
strlcpy(line, lang_default[count], sizeof(line));
|
||||
}
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
break;
|
||||
@@ -425,6 +550,185 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* Code & data to translate OSX's language names to their ISO 639-1 locale.
|
||||
*
|
||||
* In Radar bug #2563420 there's a request to have CoreFoundation export a
|
||||
* function to do this mapping. If this function gets implemented we should
|
||||
* use it.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char * const name; /* Language name */
|
||||
const char * const locale; /* Locale name */
|
||||
} apple_name_locale_t;
|
||||
|
||||
static const apple_name_locale_t apple_name_locale[] =
|
||||
{
|
||||
{ "English" , "en_US.UTF-8" }, { "French" , "fr.UTF-8" },
|
||||
{ "German" , "de.UTF-8" }, { "Italian" , "it.UTF-8" },
|
||||
{ "Dutch" , "nl.UTF-8" }, { "Swedish" , "sv.UTF-8" },
|
||||
{ "Spanish" , "es.UTF-8" }, { "Danish" , "da.UTF-8" },
|
||||
{ "Portuguese" , "pt.UTF-8" }, { "Norwegian" , "no.UTF-8" },
|
||||
{ "Hebrew" , "he.UTF-8" }, { "Japanese" , "ja.UTF-8" },
|
||||
{ "Arabic" , "ar.UTF-8" }, { "Finnish" , "fi.UTF-8" },
|
||||
{ "Greek" , "el.UTF-8" }, { "Icelandic" , "is.UTF-8" },
|
||||
{ "Maltese" , "mt.UTF-8" }, { "Turkish" , "tr.UTF-8" },
|
||||
{ "Croatian" , "hr.UTF-8" }, { "Chinese" , "zh.UTF-8" },
|
||||
{ "Urdu" , "ur.UTF-8" }, { "Hindi" , "hi.UTF-8" },
|
||||
{ "Thai" , "th.UTF-8" }, { "Korean" , "ko.UTF-8" },
|
||||
{ "Lithuanian" , "lt.UTF-8" }, { "Polish" , "pl.UTF-8" },
|
||||
{ "Hungarian" , "hu.UTF-8" }, { "Estonian" , "et.UTF-8" },
|
||||
{ "Latvian" , "lv.UTF-8" }, { "Sami" , "se.UTF-8" },
|
||||
{ "Faroese" , "fo.UTF-8" }, { "Farsi" , "fa.UTF-8" },
|
||||
{ "Russian" , "ru.UTF-8" }, { "Chinese" , "zh.UTF-8" },
|
||||
{ "Dutch" , "nl.UTF-8" }, { "Irish" , "ga.UTF-8" },
|
||||
{ "Albanian" , "sq.UTF-8" }, { "Romanian" , "ro.UTF-8" },
|
||||
{ "Czech" , "cs.UTF-8" }, { "Slovak" , "sk.UTF-8" },
|
||||
{ "Slovenian" , "sl.UTF-8" }, { "Yiddish" , "yi.UTF-8" },
|
||||
{ "Serbian" , "sr.UTF-8" }, { "Macedonian" , "mk.UTF-8" },
|
||||
{ "Bulgarian" , "bg.UTF-8" }, { "Ukrainian" , "uk.UTF-8" },
|
||||
{ "Byelorussian", "be.UTF-8" }, { "Uzbek" , "uz.UTF-8" },
|
||||
{ "Kazakh" , "kk.UTF-8" }, { "Azerbaijani", "az.UTF-8" },
|
||||
{ "Azerbaijani" , "az.UTF-8" }, { "Armenian" , "hy.UTF-8" },
|
||||
{ "Georgian" , "ka.UTF-8" }, { "Moldavian" , "mo.UTF-8" },
|
||||
{ "Kirghiz" , "ky.UTF-8" }, { "Tajiki" , "tg.UTF-8" },
|
||||
{ "Turkmen" , "tk.UTF-8" }, { "Mongolian" , "mn.UTF-8" },
|
||||
{ "Mongolian" , "mn.UTF-8" }, { "Pashto" , "ps.UTF-8" },
|
||||
{ "Kurdish" , "ku.UTF-8" }, { "Kashmiri" , "ks.UTF-8" },
|
||||
{ "Sindhi" , "sd.UTF-8" }, { "Tibetan" , "bo.UTF-8" },
|
||||
{ "Nepali" , "ne.UTF-8" }, { "Sanskrit" , "sa.UTF-8" },
|
||||
{ "Marathi" , "mr.UTF-8" }, { "Bengali" , "bn.UTF-8" },
|
||||
{ "Assamese" , "as.UTF-8" }, { "Gujarati" , "gu.UTF-8" },
|
||||
{ "Punjabi" , "pa.UTF-8" }, { "Oriya" , "or.UTF-8" },
|
||||
{ "Malayalam" , "ml.UTF-8" }, { "Kannada" , "kn.UTF-8" },
|
||||
{ "Tamil" , "ta.UTF-8" }, { "Telugu" , "te.UTF-8" },
|
||||
{ "Sinhalese" , "si.UTF-8" }, { "Burmese" , "my.UTF-8" },
|
||||
{ "Khmer" , "km.UTF-8" }, { "Lao" , "lo.UTF-8" },
|
||||
{ "Vietnamese" , "vi.UTF-8" }, { "Indonesian" , "id.UTF-8" },
|
||||
{ "Tagalog" , "tl.UTF-8" }, { "Malay" , "ms.UTF-8" },
|
||||
{ "Malay" , "ms.UTF-8" }, { "Amharic" , "am.UTF-8" },
|
||||
{ "Tigrinya" , "ti.UTF-8" }, { "Oromo" , "om.UTF-8" },
|
||||
{ "Somali" , "so.UTF-8" }, { "Swahili" , "sw.UTF-8" },
|
||||
{ "Kinyarwanda" , "rw.UTF-8" }, { "Rundi" , "rn.UTF-8" },
|
||||
{ "Nyanja" , "" }, { "Malagasy" , "mg.UTF-8" },
|
||||
{ "Esperanto" , "eo.UTF-8" }, { "Welsh" , "cy.UTF-8" },
|
||||
{ "Basque" , "eu.UTF-8" }, { "Catalan" , "ca.UTF-8" },
|
||||
{ "Latin" , "la.UTF-8" }, { "Quechua" , "qu.UTF-8" },
|
||||
{ "Guarani" , "gn.UTF-8" }, { "Aymara" , "ay.UTF-8" },
|
||||
{ "Tatar" , "tt.UTF-8" }, { "Uighur" , "ug.UTF-8" },
|
||||
{ "Dzongkha" , "dz.UTF-8" }, { "Javanese" , "jv.UTF-8" },
|
||||
{ "Sundanese" , "su.UTF-8" }, { "Galician" , "gl.UTF-8" },
|
||||
{ "Afrikaans" , "af.UTF-8" }, { "Breton" , "br.UTF-8" },
|
||||
{ "Inuktitut" , "iu.UTF-8" }, { "Scottish" , "gd.UTF-8" },
|
||||
{ "Manx" , "gv.UTF-8" }, { "Irish" , "ga.UTF-8" },
|
||||
{ "Tongan" , "to.UTF-8" }, { "Greek" , "el.UTF-8" },
|
||||
{ "Greenlandic" , "kl.UTF-8" }, { "Azerbaijani", "az.UTF-8" }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'appleLangDefault()' - Get the default locale string.
|
||||
*/
|
||||
|
||||
static const char * /* O - Locale string */
|
||||
appleLangDefault(void)
|
||||
{
|
||||
int i; /* Looping var */
|
||||
CFPropertyListRef localizationList; /* List of localization data */
|
||||
CFStringRef localizationName; /* Current name */
|
||||
char buff[256]; /* Temporary buffer */
|
||||
static const char *language = NULL; /* Cached language */
|
||||
|
||||
|
||||
/*
|
||||
* Only do the lookup and translation the first time.
|
||||
*/
|
||||
|
||||
if (language == NULL)
|
||||
{
|
||||
localizationList = CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList != NULL &&
|
||||
CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
{
|
||||
localizationName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
|
||||
if (localizationName != NULL &&
|
||||
CFGetTypeID(localizationName) == CFStringGetTypeID())
|
||||
{
|
||||
CFIndex length = CFStringGetLength(localizationName);
|
||||
|
||||
if (length <= sizeof(buff) &&
|
||||
CFStringGetCString(localizationName, buff, sizeof(buff), kCFStringEncodingASCII))
|
||||
{
|
||||
buff[sizeof(buff) - 1] = '\0';
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
|
||||
i++)
|
||||
{
|
||||
if (strcasecmp(buff, apple_name_locale[i].name) == 0)
|
||||
{
|
||||
language = apple_name_locale[i].locale;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't find the language, default to en_US...
|
||||
*/
|
||||
|
||||
if (language == NULL)
|
||||
language = apple_name_locale[0].locale;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the cached locale...
|
||||
*/
|
||||
|
||||
return (language);
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_cache_lookup()' - Lookup a language in the cache...
|
||||
*/
|
||||
|
||||
static cups_lang_t * /* O - Language data or NULL */
|
||||
cups_cache_lookup(const char *name,/* I - Name of locale */
|
||||
cups_encoding_t encoding)
|
||||
/* I - Encoding of locale */
|
||||
{
|
||||
cups_lang_t *lang; /* Current language */
|
||||
|
||||
|
||||
/*
|
||||
* Loop through the cache and return a match if found...
|
||||
*/
|
||||
|
||||
for (lang = lang_cache; lang != NULL; lang = lang->next)
|
||||
if (!strcmp(lang->language, name) && encoding == lang->encoding)
|
||||
{
|
||||
lang->used ++;
|
||||
|
||||
return (lang);
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+6
-7
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Multi-language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -20,6 +20,8 @@
|
||||
* 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_
|
||||
@@ -150,6 +152,8 @@ 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
|
||||
@@ -201,12 +205,7 @@ typedef struct cups_lang_str /**** Language Cache Structure ****/
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
# if defined(WIN32) || defined(__EMX__)
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_ALL, ""))
|
||||
# else
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_MESSAGES, ""))
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
# define cupsLangDefault() cupsLangGet(NULL)
|
||||
extern char *cupsLangEncoding(cups_lang_t *lang);
|
||||
extern void cupsLangFlush(void);
|
||||
extern void cupsLangFree(cups_lang_t *lang);
|
||||
|
||||
+3
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option marking routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products, all rights reserved.
|
||||
* 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
|
||||
@@ -23,6 +23,8 @@
|
||||
*
|
||||
* 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.
|
||||
|
||||
+4
-2
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MD5 password support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2002 by Easy Software Products.
|
||||
* 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* 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.
|
||||
@@ -123,7 +125,7 @@ httpMD5String(const md5_byte_t *sum, /* I - MD5 sum data */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char *md5ptr; /* Pointer into MD5 string */
|
||||
static char *hex = "0123456789abcdef";
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
/* Hex digits */
|
||||
|
||||
|
||||
|
||||
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