Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 641f3d83c2 |
-1723
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -1,26 +0,0 @@
|
||||
CREDITS.txt - 01/27/2000
|
||||
------------------------
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
like to thank the following individuals for their contributions:
|
||||
|
||||
Nathaniel Barbour - Lots of testing and feedback.
|
||||
N. Becker - setsid().
|
||||
Jean-Eric Cuendet - GhostScript filters for CUPS.
|
||||
Van Dang - HTTP and IPP policeman.
|
||||
Dr. ZP Han - setgid()/setuid().
|
||||
Guy Harris - *BSD shared libraries and lots of other fixes.
|
||||
Wang Jian - CUPS RPM corrections.
|
||||
Roderick Johnstone - Beta tester of the millenium.
|
||||
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
|
||||
Mark Lawrence - Microsoft interoperability testing.
|
||||
Jason McMullan - Original CUPS RPM distributions.
|
||||
Wes Morgan - *BSD fixes.
|
||||
Ulrich Oldendorf - German locale.
|
||||
Petter Reinholdtsen - HP-UX compiler stuff.
|
||||
Stuart Stevens - HP JetDirect IPP information.
|
||||
Kiko - Bug fixes.
|
||||
L. Peter Deutsch - MD5 code.
|
||||
|
||||
If I've missed someone, please let me know by sending an email to
|
||||
"mike@easysw.com".
|
||||
@@ -1,138 +0,0 @@
|
||||
ENCRYPTION - CUPS v1.1.7 - 02/21/2001
|
||||
-------------------------------------
|
||||
|
||||
This file describes the encryption support provided by CUPS.
|
||||
|
||||
WARNING: CLIENTS CURRENTLY TRUST ALL CERTIFICATES FROM SERVERS.
|
||||
This makes the CUPS client applications vulnerable to "man in
|
||||
the middle" attacks, so we don't recommend using this to do
|
||||
remote administration over WANs at this time.
|
||||
|
||||
Future versions of CUPS will keep track of server certificates
|
||||
and provide a callback/confirmation interface for accepting new
|
||||
certificates and warning when a certificate has changed.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
CUPS provides support for dedicated (https) and "upgrade" (TLS)
|
||||
encryption of sessions. The "HTTP Upgrade" method is described
|
||||
in RFC 2817; basically, the client can be secure or unsecure,
|
||||
and the client or server initiates an upgrade to a secure
|
||||
connection via some new HTTP fields and status codes. The HTTP
|
||||
Upgrade method is new and no browsers we know of support it yet.
|
||||
Stick with "https" for web browsers.
|
||||
|
||||
The current implementation is very basic. The CUPS client
|
||||
software (lp, lpr, etc.) uses encryption as requested by the
|
||||
user or server.
|
||||
|
||||
The user can specify the "-E" option with the printing commands
|
||||
to force encryption of the connection. Encryption can also be
|
||||
specified using the Encryption directive in the client.conf file
|
||||
or in the CUPS_ENCRYPTION environment variable:
|
||||
|
||||
Never
|
||||
|
||||
Never do encryption.
|
||||
|
||||
Always
|
||||
|
||||
Always do SSL/TLS encryption using the https scheme.
|
||||
|
||||
IfRequested
|
||||
|
||||
Upgrade to TLS encryption if the server asks for it.
|
||||
This is the default setting.
|
||||
|
||||
Required
|
||||
|
||||
Always upgrade to TLS encryption as soon as the
|
||||
connection is made. This is different than the "Always"
|
||||
mode above since the connection is initially unsecure
|
||||
and the client initiates the upgrade to TLS encryption.
|
||||
(same as using the "-E" option)
|
||||
|
||||
These keywords are also used in the cupsd.conf file to secure
|
||||
particular locations. To secure all traffic on the server, listen
|
||||
on port 443 (https port) instead of port 631 and change the "ipp"
|
||||
service listing (or add it if you don't have one) in /etc/services
|
||||
to 443. To provide both secure and normal methods, add a line
|
||||
reading:
|
||||
|
||||
SSLPort 443
|
||||
|
||||
to /etc/cups/cupsd.conf.
|
||||
|
||||
|
||||
BEFORE YOU BEGIN
|
||||
|
||||
You'll need the OpenSSL library from:
|
||||
|
||||
http://www.openssl.org
|
||||
|
||||
|
||||
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:
|
||||
|
||||
./configure --enable-ssl
|
||||
|
||||
If the OpenSSL 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.
|
||||
|
||||
|
||||
GENERATING A SERVER CERTIFICATE AND KEY
|
||||
|
||||
The following OpenSSL command will generate a server certificate
|
||||
and key that you can play with. Since the certificate is not
|
||||
properly signed it will generate all kinds of warnings in
|
||||
Netscape and MSIE:
|
||||
|
||||
openssl req -new -x509 -keyout /etc/cups/ssl/server.key \
|
||||
-out /etc/cups/ssl/server.crt -days 365 -nodes
|
||||
|
||||
chmod 600 /etc/cups/ssl/server.*
|
||||
|
||||
The "-nodes" option prevents the certificate and key from being
|
||||
encrypted. The cupsd process runs in the background, detached
|
||||
from any input source; if you encrypt these files then cupsd
|
||||
will not be able to load them!
|
||||
|
||||
Send all rants about non-encrypted certificate and key files to
|
||||
/dev/null. It makes sense to encrypt user files, but not for
|
||||
files used by system processes/daemons...
|
||||
|
||||
|
||||
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.
|
||||
-170
@@ -1,170 +0,0 @@
|
||||
INSTALL - CUPS v1.1.10 - 08/06/2001
|
||||
-----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source
|
||||
code. For more information on CUPS see the file called
|
||||
"README.txt". A complete change log can be found in
|
||||
"CHANGES.txt".
|
||||
|
||||
|
||||
BEFORE YOU BEGIN
|
||||
|
||||
You'll need ANSI-compliant C and C++ compilers, plus a make
|
||||
program and Bourne shell. The GNU compiler tools work well -
|
||||
we've tested the current CUPS code against GCC 2.95.x with
|
||||
excellent results.
|
||||
|
||||
The makefiles used by the project should work with all versions
|
||||
of make. We've tested them with GNU make as well as the make
|
||||
programs shipped by Compaq, HP, SGI, and Sun. FreeBSD users
|
||||
should use GNU make (gmake).
|
||||
|
||||
Besides these tools you'll want the following libraries:
|
||||
|
||||
- JPEG 6b or higher
|
||||
- PNG 1.0.6 or higher
|
||||
- TIFF 3.4 or higher
|
||||
- ZLIB 1.1.3 or higher
|
||||
|
||||
CUPS will compile and run without these, however you'll miss out on
|
||||
many of the features provided by CUPS.
|
||||
|
||||
|
||||
CONFIGURATION
|
||||
|
||||
CUPS uses GNU autoconf, so you should find the usual "configure"
|
||||
script in the main CUPS source directory. To configure CUPS for
|
||||
your system, type:
|
||||
|
||||
./configure ENTER
|
||||
|
||||
The default installation will put the CUPS software in the
|
||||
"/etc", "/usr", and "/var" directories on your system, which
|
||||
will overwrite any existing printing commands on your system.
|
||||
Use the "--prefix" option to install the CUPS software in
|
||||
another location:
|
||||
|
||||
./configure --prefix=/some/directory ENTER
|
||||
|
||||
If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in
|
||||
a system default location (typically "/usr/include" and
|
||||
"/usr/lib") you'll need to set the CFLAGS, CXXFLAGS, DSOFLAGS,
|
||||
and LDFLAGS environment variables prior to running configure:
|
||||
|
||||
setenv CFLAGS "-I/some/directory" ENTER
|
||||
setenv CXXFLAGS "-I/some/directory" ENTER
|
||||
setenv DSOFLAGS "-L/some/directory" ENTER
|
||||
setenv LDFLAGS "-L/some/directory" ENTER
|
||||
./configure ... ENTER
|
||||
|
||||
or:
|
||||
|
||||
CFLAGS="-I/some/directory"; export CFLAGS ENTER
|
||||
CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER
|
||||
DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER
|
||||
LDFLAGS="-L/some/directory"; export LDFLAGS ENTER
|
||||
./configure ... ENTER
|
||||
|
||||
To enable support for encryption, you'll also want to add the
|
||||
"--enable-ssl" option:
|
||||
|
||||
./configure --enable-ssl
|
||||
|
||||
SSL and TLS support require the OpenSSL library, available at:
|
||||
|
||||
http://www.openssl.org
|
||||
|
||||
If the OpenSSL header files and libraries are not in a standard
|
||||
location, specify the locations of these files using the
|
||||
--with-openssl-includes and --with-openssl-libs directives:
|
||||
|
||||
./configure --enable-ssl \
|
||||
--with-openssl-includes=/foo/bar/include \
|
||||
--with-openssl-libs=/foo/bar/lib
|
||||
|
||||
See the file "ENCRYPTION.txt" for information on using the
|
||||
encryption support in CUPS.
|
||||
|
||||
Once you have configured things, just type:
|
||||
|
||||
make ENTER
|
||||
|
||||
or if you have FreeBSD, NetBSD, or OpenBSD type:
|
||||
|
||||
gmake ENTER
|
||||
|
||||
to build the software.
|
||||
|
||||
|
||||
INSTALLING THE SOFTWARE
|
||||
|
||||
Once you have built the software you need to install it. The
|
||||
"install" target provides a quick way to install the software on
|
||||
your local system:
|
||||
|
||||
make install ENTER
|
||||
|
||||
or for FreeBSD, NetBSD, or OpenBSD:
|
||||
|
||||
gmake install ENTER
|
||||
|
||||
You can also build binary packages that can be installed on other
|
||||
machines using the RPM spec file ("cups.spec") or EPM list file
|
||||
("cups.list"). The latter also supports building of binary RPMs,
|
||||
so it may be more convenient to use - we use EPM to build all of
|
||||
our binary distributions.
|
||||
|
||||
You can find the RPM software at:
|
||||
|
||||
http://www.rpm.org
|
||||
|
||||
The RPM software is at:
|
||||
|
||||
http://www.easysw.com/epm
|
||||
|
||||
|
||||
CREATING BINARY DISTRIBUTIONS WITH EPM
|
||||
|
||||
The top level makefile supports generation of many types of binary
|
||||
distributions using EPM. To build a binary distribution type:
|
||||
|
||||
make <format> ENTER
|
||||
|
||||
or
|
||||
|
||||
gmake <format> ENTER
|
||||
|
||||
for FreeBSD, NetBSD, and OpenBSD. The <format> target is one of
|
||||
the following:
|
||||
|
||||
epm - Builds a portable shell script and tar file based
|
||||
distribution. This format will also backup your
|
||||
existing printing system if you decide to remove
|
||||
CUPS at some future time.
|
||||
aix - Builds an AIX binary distribution.
|
||||
bsd - Builds a *BSD binary distribution.
|
||||
deb - Builds a Debian binary distribution.
|
||||
depot - Builds a HP-UX binary distribution.
|
||||
pkg - Builds a Solaris binary distribution.
|
||||
rpm - Builds a RPM binary distribution.
|
||||
tardist - Builds an IRIX binary distribution.
|
||||
|
||||
|
||||
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.
|
||||
+43
-552
@@ -3,36 +3,26 @@
|
||||
<TITLE>Software License Agreement - Common UNIX Printing System</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#ffffff" TEXT="#000000">
|
||||
<BODY BGCOLOR=#ffffff>
|
||||
|
||||
<H2 ALIGN="CENTER">Common UNIX Printing System License Agreement</H2>
|
||||
|
||||
<P ALIGN="CENTER">Copyright 1997-2001 by Easy Software Products<BR>
|
||||
<P ALIGN="CENTER">Copyright 1997-1999 by Easy Software Products<BR>
|
||||
44141 AIRPORT VIEW DR STE 204<BR>
|
||||
HOLLYWOOD, MARYLAND 20636-3111 USA<BR>
|
||||
<BR>
|
||||
Voice: +1.301.373.9600<BR>
|
||||
Email: <A HREF="mailto:cups-info@cups.org">cups-info@cups.org</A><BR>
|
||||
WWW: <A HREF="http://www.cups.org">http://www.cups.org</A>
|
||||
Voice: +1.301.373.9603<BR>
|
||||
Email: cups-info@cups.org<BR>
|
||||
WWW: http://www.cups.org
|
||||
|
||||
<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>, or CUPS<SUP>TM</SUP>,
|
||||
is provided under the GNU General Public License, Version 2. A copy of
|
||||
this license follows 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.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.92.
|
||||
|
||||
<P>For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:
|
||||
<P>For those not familiar with the GNU General Public License, the license
|
||||
basically allows you to:
|
||||
|
||||
<UL>
|
||||
|
||||
@@ -44,88 +34,66 @@ allows you to:
|
||||
<LI>Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
|
||||
<LI>Distribute or sell printer drivers and filters that use
|
||||
CUPS so long as source code is made available under the GPL.
|
||||
<LI>Distribute or sell printer drivers and filters that use the
|
||||
CUPS API so long as source code is made available under the GPL.
|
||||
|
||||
</UL>
|
||||
|
||||
<P>What this license <B>does not</B> allow you to do is make changes or
|
||||
add features to CUPS and then sell a binary distribution without source
|
||||
code. You must provide source for any new drivers, changes, or
|
||||
additions to the software, and all code must be provided under the GPL
|
||||
or LGPL as appropriate.
|
||||
code. You have to provide source for any new drivers, changes, or
|
||||
additions to the software, and all code must be provided under the GPL.
|
||||
|
||||
<P>The GNU LGPL relaxes the "link-to" restriction, allowing you to
|
||||
develop applications that use the CUPS API library under other licenses
|
||||
and/or conditions as appropriate for your application.
|
||||
|
||||
<H3>Trademarks</H3>
|
||||
|
||||
<P>Easy Software Products has trademarked the Common UNIX Printing
|
||||
System, CUPS, and CUPS logo. These names and logos may be used freely
|
||||
in any direct port or binary distribution of CUPS. 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>Also, since we have trademarked the Common UNIX Printing System, CUPS,
|
||||
and CUPS logo, you may not release a derivative product using those names
|
||||
without permission from Easy Software Products.
|
||||
|
||||
<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.
|
||||
release source code for their drivers or additions and modifications to
|
||||
CUPS under the GPL. For pricing 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:
|
||||
<P>The Common UNIX Printing System utilizes GNU GhostScript 4.03 to
|
||||
convert PostScript files into a stream of raster images. For binary
|
||||
distribution licensing of this software, please contact:
|
||||
|
||||
<BLOCKQUOTE>
|
||||
Miles Jones<BR>
|
||||
<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.92 software. For binary
|
||||
distribution licensing of this software, please contact:
|
||||
|
||||
<BLOCKQUOTE>
|
||||
Derek B. Noonburg<BR>
|
||||
Email: <A HREF="mailto:derekn@foolabs.com">derekn@foolabs.com</A><BR>
|
||||
WWW: <A HREF="http://www.foolabs.com/xpdf/">http://www.foolabs.com/xpdf/</A>
|
||||
EMail: info@arsoft.com
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<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 distributors and
|
||||
resellers of CUPS. Support for users of CUPS is available from Easy
|
||||
Software Products through our ESP Print software.
|
||||
|
||||
<UL><PRE>
|
||||
<A HREF="http://www.easysw.com">http://www.easysw.com</A>
|
||||
</PRE></UL>
|
||||
<H3>Trademarks</H3>
|
||||
|
||||
<!-- NEW PAGE -->
|
||||
<H2>GNU GENERAL PUBLIC LICENSE</H2>
|
||||
<P>The Common UNIX Printing System, CUPS, and the CUPS logo are the
|
||||
trademark property of Easy Software Products. Any derivative of this
|
||||
software may not use any of these trademarks without the expressed
|
||||
written consent of Easy Software Products.
|
||||
|
||||
<P>Version 2, June 1991
|
||||
<H2 ALIGN="CENTER">GNU General Public License</H2>
|
||||
|
||||
<PRE>
|
||||
Copyright 1989, 1991 Free Software Foundation, Inc.
|
||||
<P ALIGN="CENTER">Version 2, June 1991<BR>
|
||||
<BR>
|
||||
Copyright 1989, 1991 Free Software Foundation, Inc.<BR>
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim
|
||||
<P ALIGN="CENTER">Everyone is permitted to copy and distribute verbatim
|
||||
copies of this license document, but changing it is not allowed.
|
||||
<PRE>
|
||||
|
||||
<H4>Preamble</H4>
|
||||
<H3>Preamble</H3>
|
||||
|
||||
<P>The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@@ -175,8 +143,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
<P>The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
<H4>GNU GENERAL PUBLIC LICENSE<BR>
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
|
||||
<H3>GNU GENERAL PUBLIC LICENSE<BR>
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H3>
|
||||
|
||||
<OL START="0">
|
||||
|
||||
@@ -386,7 +354,7 @@ of promoting the sharing and reuse of software generally.
|
||||
|
||||
</OL>
|
||||
|
||||
<H4>NO WARRANTY</H4>
|
||||
<H3>NO WARRANTY</H3>
|
||||
|
||||
<OL START="11">
|
||||
|
||||
@@ -412,484 +380,7 @@ POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
</OL>
|
||||
|
||||
<H4>END OF TERMS AND CONDITIONS</H4>
|
||||
|
||||
<!-- NEW PAGE -->
|
||||
<H2>GNU LIBRARY GENERAL PUBLIC LICENSE</H2>
|
||||
|
||||
<P>Version 2, June 1991
|
||||
|
||||
<PRE>
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
</PRE>
|
||||
|
||||
<H4>Preamble</H4>
|
||||
|
||||
<P>The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
<P>This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
<P>When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
<P>To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
<P>For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
<P>Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
<P>Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
<P>Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
<P>Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
<P>The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
<P>Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
<P>However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
<P>The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
<P>Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
|
||||
|
||||
<P><STRONG>0.</STRONG>
|
||||
This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
<P>A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
<P>The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
<P>"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
<P>Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
<P><STRONG>1.</STRONG>
|
||||
You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
<P>You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
<P><STRONG>2.</STRONG>
|
||||
You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
<OL TYPE="a">
|
||||
|
||||
<LI>The modified work must itself be a software library.
|
||||
|
||||
<P>
|
||||
<LI>You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
<P>
|
||||
<LI>You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
<P>
|
||||
<LI>If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
<P>(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
</OL>
|
||||
|
||||
<P>These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
<P>Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
<P>In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
<P><STRONG>3.</STRONG>
|
||||
You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
<P>Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
<P>This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
<P><STRONG>4.</STRONG>
|
||||
You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
<P>If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
<P><STRONG>5.</STRONG>
|
||||
A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
<P>However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
<P>When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
<P>If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
<P>Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
<P><STRONG>6.</STRONG>
|
||||
As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
<P>You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
<OL TYPE="a">
|
||||
|
||||
<LI>Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
<P>
|
||||
<LI>Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
<P>
|
||||
<LI>If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
<P>
|
||||
<LI>Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
</OL>
|
||||
|
||||
<P>For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
<P>It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
<P><STRONG>7.</STRONG>
|
||||
You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
<OL TYPE="a">
|
||||
|
||||
<LI>Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
<P>
|
||||
<LI>Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
</OL>
|
||||
|
||||
<P><STRONG>8.</STRONG>
|
||||
You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
<P><STRONG>9.</STRONG>
|
||||
You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
<P><STRONG>10.</STRONG>
|
||||
Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
<P><STRONG>11.</STRONG>
|
||||
If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
<P>If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
<P>It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
<P>This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
<P><STRONG>12.</STRONG>
|
||||
If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
<P><STRONG>13.</STRONG>
|
||||
The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
<P>Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
<P><STRONG>14.</STRONG>
|
||||
If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
<P><STRONG>NO WARRANTY</STRONG>
|
||||
|
||||
<P><STRONG>15.</STRONG>
|
||||
BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
<P><STRONG>16.</STRONG>
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
<H4>END OF TERMS AND CONDITIONS</H4>
|
||||
<H3>END OF TERMS AND CONDITIONS</H3>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
+22
-61
@@ -3,7 +3,9 @@
|
||||
#
|
||||
# Common makefile definitions for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# @configure_input@
|
||||
#
|
||||
# Copyright 1997-1999 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,37 +30,20 @@
|
||||
|
||||
AR = @AR@
|
||||
AWK = @AWK@
|
||||
CC = @LIBTOOL@ @CC@
|
||||
CXX = @LIBTOOL@ @CXX@
|
||||
CC = @CC@
|
||||
CHMOD = @CHMOD@
|
||||
CP = @CP@
|
||||
DSO = @DSO@
|
||||
HTMLDOC = @HTMLDOC@
|
||||
INSTALL = @INSTALL@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN = /bin/ln -sf
|
||||
MV = @MV@
|
||||
MKDIR = @MKDIR@ -p
|
||||
NROFF = @NROFF@
|
||||
PACK = @PACK@
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
|
||||
#
|
||||
# Installation programs...
|
||||
#
|
||||
|
||||
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -m 755 -s
|
||||
INSTALL_DATA = $(INSTALL) -m 644
|
||||
INSTALL_DIR = $(INSTALL) -d
|
||||
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -m 755
|
||||
INSTALL_MAN = $(INSTALL) -m 644
|
||||
INSTALL_SCRIPT = $(INSTALL) -m 755
|
||||
|
||||
#
|
||||
# Default user and group for the scheduler...
|
||||
#
|
||||
|
||||
CUPS_USER = @CUPS_USER@
|
||||
CUPS_GROUP = @CUPS_GROUP@
|
||||
SMBCLIENT = @SMBCLIENT@
|
||||
|
||||
#
|
||||
# Libraries...
|
||||
@@ -67,9 +52,7 @@ CUPS_GROUP = @CUPS_GROUP@
|
||||
LIBCUPS = @LIBCUPS@
|
||||
LIBCUPSIMAGE = @LIBCUPSIMAGE@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBMALLOC = @LIBMALLOC@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBSLP = @LIBSLP@
|
||||
LIBTIFF = @LIBTIFF@
|
||||
LIBZ = @LIBZ@
|
||||
|
||||
@@ -82,20 +65,20 @@ LIBZ = @LIBZ@
|
||||
#
|
||||
|
||||
ARFLAGS = crvs
|
||||
CFLAGS = @CFLAGS@ -I.. $(OPTIONS)
|
||||
CXXFLAGS = @CXXFLAGS@ -I.. $(OPTIONS)
|
||||
DSOFLAGS = @DSOFLAGS@
|
||||
CFLAGS = @CFLAGS@ $(OPTIM) -I.. $(OPTIONS)
|
||||
DSOLIBS = @DSOLIBS@
|
||||
IMGLIBS = @IMGLIBS@ -lm
|
||||
LDFLAGS = @LDFLAGS@ $(OPTIM)
|
||||
LINKCUPS = @LINKCUPS@
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(NETLIBS) @LIBS@
|
||||
LIBS = -L../cups -lcups $(NETLIBS) @LIBS@
|
||||
NETLIBS = @NETLIBS@
|
||||
OPTIM = @OPTIM@
|
||||
OPTIONS =
|
||||
PAMLIBS = @PAMLIBS@
|
||||
SSLLIBS = @SSLLIBS@
|
||||
|
||||
#
|
||||
# Formatted man page extension...
|
||||
#
|
||||
|
||||
CAT = @CAT@
|
||||
|
||||
#
|
||||
# Directories...
|
||||
@@ -126,51 +109,29 @@ srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
|
||||
AMANDIR = @AMANDIR@
|
||||
BINDIR = @bindir@
|
||||
DATADIR = @CUPS_DATADIR@
|
||||
DOCDIR = @CUPS_DOCROOT@
|
||||
INCLUDEDIR = $(includedir)
|
||||
INITDIR = @INITDIR@
|
||||
INITDDIR = @INITDDIR@
|
||||
LIBDIR = $(libdir)
|
||||
LOCALEDIR = @CUPS_LOCALEDIR@
|
||||
LOGDIR = @CUPS_LOGDIR@
|
||||
MANDIR = @mandir@
|
||||
PAMDIR = @PAMDIR@
|
||||
REQUESTS = @CUPS_REQUESTS@
|
||||
SBINDIR = @sbindir@
|
||||
SERVERBIN = @CUPS_SERVERBIN@
|
||||
SERVERROOT = @CUPS_SERVERROOT@
|
||||
|
||||
CAT1EXT = @CAT1EXT@
|
||||
CAT5EXT = @CAT5EXT@
|
||||
CAT8EXT = @CAT8EXT@
|
||||
MAN8EXT = @MAN8EXT@
|
||||
MAN8DIR = @MAN8DIR@
|
||||
|
||||
#
|
||||
# Rules...
|
||||
#
|
||||
|
||||
.SILENT:
|
||||
.SUFFIXES: .a .c .cxx .h .man .o .0 .1 .1m .5 .8 .z
|
||||
.SUFFIXES: .a .c .gz .h .o .z .1 .5 .8
|
||||
.c.o:
|
||||
echo Compiling $<...
|
||||
$(CC) $(OPTIM) $(CFLAGS) -c $<
|
||||
.cxx.o:
|
||||
echo Compiling $<...
|
||||
$(CXX) $(OPTIM) $(CXXFLAGS) -c $<
|
||||
.man.0 .man.1 .man.1m .man.5 .man.8:
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
.1.z .5.z .8.z .1.gz .5.gz .8.gz:
|
||||
echo Formatting $<...
|
||||
$(RM) $@
|
||||
$(NROFF) -man $< >$@
|
||||
.man.z:
|
||||
echo Formatting $<...
|
||||
$(RM) $@ t.z
|
||||
$(NROFF) -man $< >t
|
||||
pack -f t
|
||||
$(MV) t.z $@
|
||||
$(PACK) t
|
||||
-mv t.$(CAT) $@
|
||||
|
||||
#
|
||||
# End of "$Id$"
|
||||
|
||||
+10
-71
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Top-level Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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 pstoraster \
|
||||
scheduler systemv
|
||||
|
||||
#
|
||||
@@ -38,7 +38,7 @@ DIRS = cups backend berkeley cgi-bin filter man pdftops pstoraster \
|
||||
all:
|
||||
for dir in $(DIRS); do\
|
||||
echo Making all in $$dir... ;\
|
||||
(cd $$dir ; $(MAKE) $(MFLAGS)) || exit 1;\
|
||||
(cd $$dir; make);\
|
||||
done
|
||||
|
||||
#
|
||||
@@ -48,7 +48,7 @@ all:
|
||||
clean:
|
||||
for dir in $(DIRS); do\
|
||||
echo Cleaning in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\
|
||||
(cd $$dir; make clean);\
|
||||
done
|
||||
|
||||
#
|
||||
@@ -58,79 +58,18 @@ clean:
|
||||
install:
|
||||
for dir in $(DIRS); do\
|
||||
echo Installing in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\
|
||||
(cd $$dir; make install);\
|
||||
done
|
||||
echo Installing in conf...
|
||||
(cd conf; $(MAKE) $(MFLAGS) install)
|
||||
(cd conf; make install)
|
||||
echo Installing in data...
|
||||
(cd data; $(MAKE) $(MFLAGS) install)
|
||||
(cd data; make install)
|
||||
echo Installing in doc...
|
||||
(cd doc; $(MAKE) $(MFLAGS) install)
|
||||
(cd doc; make install)
|
||||
echo Installing in fonts...
|
||||
(cd fonts; $(MAKE) $(MFLAGS) install)
|
||||
echo Installing in locale...
|
||||
(cd locale; $(MAKE) $(MFLAGS) install)
|
||||
(cd fonts; make install)
|
||||
echo Installing in ppd...
|
||||
(cd ppd; $(MAKE) $(MFLAGS) install)
|
||||
echo Installing in templates...
|
||||
(cd templates; $(MAKE) $(MFLAGS) install)
|
||||
echo Installing startup script...
|
||||
if test "x$(INITDIR)" != "x"; then \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDIR)/init.d; \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDIR)/init.d/cups; \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDIR)/rc0.d; \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDIR)/rc0.d/K00cups; \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDIR)/rc2.d; \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDIR)/rc2.d/S99cups; \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDIR)/rc3.d; \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDIR)/rc3.d/S99cups; \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDIR)/rc5.d; \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDIR)/rc5.d/S99cups; \
|
||||
fi
|
||||
if test "x$(INITDIR)" = "x" -a "x$(INITDDIR)" != "x"; then \
|
||||
$(INSTALL_DIR) $(prefix)/$(INITDDIR); \
|
||||
$(INSTALL_SCRIPT) cups.sh $(prefix)/$(INITDDIR)/cups; \
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# Run the test suite...
|
||||
#
|
||||
|
||||
test: all
|
||||
echo Running CUPS test suite...
|
||||
cd test; ./run-stp-tests.sh
|
||||
|
||||
|
||||
#
|
||||
# Make software distributions using EPM (http://www.easysw.com/epm)...
|
||||
#
|
||||
|
||||
EPMFLAGS = -v
|
||||
|
||||
aix:
|
||||
epm $(EPMFLAGS) -f aix cups
|
||||
|
||||
bsd:
|
||||
epm $(EPMFLAGS) -f bsd cups
|
||||
|
||||
epm:
|
||||
epm $(EPMFLAGS) cups
|
||||
|
||||
rpm:
|
||||
epm $(EPMFLAGS) -f rpm cups
|
||||
|
||||
deb:
|
||||
epm $(EPMFLAGS) -f deb cups
|
||||
|
||||
depot:
|
||||
epm $(EPMFLAGS) -f depot cups
|
||||
|
||||
pkg:
|
||||
epm $(EPMFLAGS) -f pkg cups
|
||||
|
||||
tardist:
|
||||
epm $(EPMFLAGS) -f tardist cups
|
||||
(cd ppd; make install)
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
+108
-196
@@ -1,168 +1,99 @@
|
||||
README - CUPS v1.1.10 - 08/08/2001
|
||||
----------------------------------
|
||||
README - CUPS v1.0b6 - 07/30/1999
|
||||
---------------------------------
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt"
|
||||
instead...
|
||||
BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE
|
||||
|
||||
WARNING - This is a BETA release of CUPS, which means that it may
|
||||
contain "bugs" that could prevent you from printing. If
|
||||
you are concerned that this may cause you lost time or
|
||||
money, please STOP and do not install this software!
|
||||
|
||||
BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
CUPS provides a portable printing layer for UNIX(r)-based
|
||||
operating systems. It has been developed by Easy Software
|
||||
Products to promote a standard printing solution for all UNIX
|
||||
vendors and users. CUPS provides the System V and Berkeley
|
||||
command-line interfaces.
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. It has been developed by Easy Software
|
||||
Products to promote a standard printing solution for all UNIX vendors
|
||||
and users. CUPS provides the System V and Berkeley command-line
|
||||
interfaces.
|
||||
|
||||
CUPS uses the Internet Printing Protocol ("IPP") as the basis
|
||||
for managing print jobs and queues. The Line Printer Daemon
|
||||
("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a.
|
||||
JetDirect) protocols are also supported with reduced
|
||||
functionality. CUPS adds network printer browsing and
|
||||
PostScript Printer Description ("PPD") based printing options to
|
||||
support real-world printing under UNIX.
|
||||
CUPS uses the Internet Printing Protocol (IETF-IPP) as the basis for
|
||||
managing print jobs and queues. The Line Printer Daemon (LPD,
|
||||
RFC1179), Server Message Block (SMB), and AppSocket protocols are also
|
||||
supported with reduced functionality.
|
||||
|
||||
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 adds network printer browsing and PostScript Printer Description
|
||||
("PPD")-based printing options to support real world applications under
|
||||
UNIX.
|
||||
|
||||
Drivers for thousands of printers are provided with our ESP
|
||||
Print Pro software, available at:
|
||||
CUPS also includes a customized version of GNU GhostScript (currently
|
||||
based off GNU GhostScript 4.03) and an image file RIP that can be used
|
||||
to support non-PostScript printers.
|
||||
|
||||
http://www.easysw.com/printpro
|
||||
|
||||
CUPS is licensed under the GNU General Public License and GNU
|
||||
Library General Public License. Please contact Easy Software
|
||||
Products for commercial support and "binary distribution"
|
||||
rights.
|
||||
CUPS is Copyright 1993-1999 by Easy Software Products, All Rights
|
||||
Reserved. CUPS is currently licensed under the terms of the GNU
|
||||
General Public License. Please see the license file for details.
|
||||
|
||||
|
||||
SYSTEM REQUIREMENTS
|
||||
|
||||
Binary distributions require a minimum of 10MB of free disk
|
||||
space. We do not recommend using CUPS on a workstation with less
|
||||
than 32MB of RAM or a PC with less than 16MB of RAM.
|
||||
Binary distributions require a minimum of 10MB of free disk space. We
|
||||
do not recommend using CUPS on a workstation with less than 32MB of RAM
|
||||
or a PC with less than 16MB of RAM.
|
||||
|
||||
If you are installing from source you'll need ANSI-compliant C
|
||||
and C++ compilers and optionally one or more image file support
|
||||
libraries. Complete source installation instructions can be
|
||||
found in the file "INSTALL.txt".
|
||||
If you are installing from source you'll need an ANSI C compiler and
|
||||
optionally one or more image file support libraries. Complete source
|
||||
installation instructions can be found in the CUPS System
|
||||
Administrator's Manual in the files "doc/sam.html" or "doc/sam.pdf".
|
||||
|
||||
|
||||
SOFTWARE REQUIREMENTS
|
||||
|
||||
The following operating system software is required to install
|
||||
one of the binary distributions from Easy Software Products:
|
||||
The following operating system software is required to install one of
|
||||
the binary distributions from Easy Software Products:
|
||||
|
||||
- AIX 4.3 or higher
|
||||
- Compaq Tru64 UNIX (aka OSF1 aka Digital UNIX) 4.0 or higher
|
||||
- Digital UNIX (aka OSF1 aka Compaq Tru64 UNIX) 4.0 or higher
|
||||
- HP-UX 10.20 or higher
|
||||
- IRIX 5.3 or higher
|
||||
- Linux 2.0 with glibc2 or higher
|
||||
- Linux 2.0.36 with glibc2 or higher (tested with RedHat 5.2)
|
||||
- Solaris 2.5 or higher (SPARC or Intel)
|
||||
|
||||
|
||||
INSTALLING "PORTABLE" CUPS DISTRIBUTIONS
|
||||
INSTALLING CUPS
|
||||
|
||||
We are currently distributing "portable" CUPS binary
|
||||
distributions in TAR format with installation and removal
|
||||
scripts generated by our ESP Package Manager (EPM) software,
|
||||
which is available from:
|
||||
We are currently distributing CUPS binary distributions in TAR format
|
||||
with installation and removal scripts generated by our ESP Package
|
||||
Manager (EPM) software, which is also included with the source
|
||||
distribution.
|
||||
|
||||
http://www.easysw.com/epm
|
||||
WARNING: Installing CUPS will overwrite your existing printing system.
|
||||
Backup files are made by the installation script and restored by the
|
||||
removal script, so if you experience problems you should be able to
|
||||
remove the CUPS software to restore your previous configuration.
|
||||
However, Easy Software Products makes no warranty for this and will not
|
||||
be liable for any lost revenues, etc.
|
||||
|
||||
WARNING: Installing CUPS will overwrite your existing printing
|
||||
system. Backup files are made by the installation script and
|
||||
restored by the removal script, so if you experience problems
|
||||
you should be able to remove the CUPS software to restore your
|
||||
previous configuration. However, Easy Software Products makes
|
||||
no warranty for this and will not be liable for any lost
|
||||
revenues, etc.
|
||||
|
||||
To install the CUPS software you will need to be logged in as
|
||||
root (doing an "su" is good enough). Once you are the root
|
||||
user, run the installation script with:
|
||||
To install the CUPS software you will need to be logged in as root
|
||||
(doing an "su" is good enough). Once you are the root user, run the
|
||||
installation script with:
|
||||
|
||||
./cups.install ENTER
|
||||
|
||||
After asking you a few yes/no questions the CUPS software will
|
||||
be installed and the scheduler will be started automatically.
|
||||
After asking you a few yes/no questions the CUPS software will be
|
||||
installed and the scheduler will be started automatically.
|
||||
|
||||
|
||||
INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS
|
||||
SETTING UP PRINTER QUEUES
|
||||
|
||||
The host-specific distributions use the operating system
|
||||
software installation tools. To install a host-specific
|
||||
distribution please consult the CUPS Software Administrators
|
||||
Manual or your operating system documentation.
|
||||
CUPS works best with PPD (PostScript Printer Description) files. In a
|
||||
pinch you can also use System V style printer interface scripts.
|
||||
|
||||
|
||||
READING THE DOCUMENTATION
|
||||
|
||||
Once you have installed the software you can access the
|
||||
documentation (and a bunch of other stuff) on-line at:
|
||||
|
||||
http://localhost:631
|
||||
|
||||
If you're having trouble getting that far, the documentation is
|
||||
located in the "/usr/share/doc/cups" directory in the binary
|
||||
distributions, and under the "doc" directory in the source
|
||||
archives.
|
||||
|
||||
Please read the documentation before asking questions.
|
||||
|
||||
|
||||
GETTING SUPPORT AND OTHER RESOURCES
|
||||
|
||||
If you have problems, READ THE DOCUMENTATION FIRST!
|
||||
|
||||
You can subscribe to the CUPS mailing list by sending a message
|
||||
containing "subscribe cups" to majordomo@cups.org. This list is
|
||||
provided to discuss problems, questions, and improvements to the
|
||||
CUPS software. New releases of CUPS are announced to this list
|
||||
as well.
|
||||
|
||||
Commercial support (with a guaranteed response time) is
|
||||
available from Easy Software Products. For more information
|
||||
see:
|
||||
|
||||
http://www.easysw.com/cups
|
||||
|
||||
See the CUPS web site at "http://www.cups.org" for other site
|
||||
links.
|
||||
|
||||
|
||||
SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
|
||||
|
||||
CUPS 1.1 includes a new web-based administration tool that
|
||||
allows you to manage printers, classes, and jobs on your
|
||||
server. To access the printer administration tools open the
|
||||
following URL in your browser:
|
||||
|
||||
http://localhost:631/admin
|
||||
|
||||
You will be asked for the administration password (root or any
|
||||
other user in the sys/system/root group on your system) and then
|
||||
shown a menu of available functions.
|
||||
|
||||
DO NOT use the hostname for your machine - it will not work with
|
||||
the default CUPS configuration. To enable administration access
|
||||
on other addresses, consult the CUPS Software Administrators
|
||||
Manual.
|
||||
|
||||
|
||||
SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
|
||||
|
||||
CUPS works best with PPD (PostScript Printer Description)
|
||||
files. In a pinch you can also use System V style printer
|
||||
interface scripts.
|
||||
|
||||
Six sample PPD files are provided with this distribution that
|
||||
utilize the PostScript and image file RIPs and the sample EPSON
|
||||
and HP printer drivers. To add the sample DeskJet driver to the
|
||||
system for a printer connected to the parallel port, use one of
|
||||
the following commands:
|
||||
Two sample PPD files are provided with this distribution that utilize
|
||||
the PostScript and image file RIPs and the sample HP printer driver.
|
||||
To add the sample DeskJet driver to the system for a printer connected
|
||||
to the parallel port, use one of the following commands:
|
||||
|
||||
Digital UNIX:
|
||||
|
||||
@@ -178,106 +109,87 @@ the following commands:
|
||||
|
||||
Linux:
|
||||
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/par0 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/par1 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/par2 -E
|
||||
|
||||
Solaris:
|
||||
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E
|
||||
|
||||
Similarly, for the other sample drivers you can use:
|
||||
Similarly, for the sample LaserJet driver you can use "LaserJet" and
|
||||
"laserjet.ppd".
|
||||
|
||||
Driver PPD File
|
||||
----------------------------- ------------
|
||||
Dymo Label Printers dymo.ppd
|
||||
EPSON Stylus Color Series stcolor.ppd
|
||||
EPSON Stylus Photo Series stphoto.ppd
|
||||
EPSON Stylus New Color Series stcolor2.ppd
|
||||
EPSON Stylus New Photo Series stphoto2.ppd
|
||||
EPSON 9-pin Series epson9.ppd
|
||||
EPSON 24-pin Series epson24.ppd
|
||||
HP DeskJet Series deskjet.ppd
|
||||
HP New DeskJet Series deskjet2.ppd
|
||||
HP LaserJet Series laserjet.ppd
|
||||
OKIDATA 9-Pin Series okidata9.ppd
|
||||
OKIDATA 24-Pin Series okidat24.ppd
|
||||
|
||||
These sample drivers provide basic printing capabilities, but
|
||||
generally do not exercise the full potential of the printers or
|
||||
CUPS. For commercial printer drivers check out our ESP Print
|
||||
Pro software at:
|
||||
|
||||
http://www.easysw.com/printpro
|
||||
For other printers and interfaces see the CUPS System Administator's
|
||||
Manual included with this software.
|
||||
|
||||
|
||||
PRINTING FILES
|
||||
|
||||
CUPS provides both the System V "lp" and Berkeley "lpr" commands
|
||||
for printing:
|
||||
CUPS provides both the System V "lp" and Berkeley "lpr" commands for
|
||||
printing:
|
||||
|
||||
lp filename
|
||||
lpr filename
|
||||
|
||||
Both the "lp" and "lpr" commands support printing options for
|
||||
the driver:
|
||||
Both the "lp" and "lpr" commands support printing options for the
|
||||
driver:
|
||||
|
||||
lp -omedia=A4 -oresolution=600dpi filename
|
||||
lpr -omedia=A4 -oresolution=600dpi filename
|
||||
|
||||
CUPS recognizes many types of images files as well as PDF,
|
||||
PostScript, HP-GL/2, and text files, so you can print those
|
||||
files directly rather than through an application.
|
||||
CUPS recognizes many types of images files as well as PostScript, HP-GL/2,
|
||||
and text files, so you can print those files directly rather than through
|
||||
an application.
|
||||
|
||||
If you have an application that generates output specifically
|
||||
for your printer then you need to use the "-oraw" or "-l"
|
||||
options:
|
||||
If you have an application that generates output specifically for your
|
||||
printer then you need to use the "-oraw" or "-l" options:
|
||||
|
||||
lp -oraw filename
|
||||
lpr -l filename
|
||||
|
||||
This will prevent the filters from misinterpreting your print
|
||||
file.
|
||||
This will prevent the filters from misinterpreting your print file.
|
||||
|
||||
|
||||
REPORTING PROBLEMS
|
||||
|
||||
If you have 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.
|
||||
|
||||
|
||||
OTHER RESOURCES
|
||||
|
||||
See the CUPS web site at "http://www.cups.org" for other site links.
|
||||
|
||||
You can subscribe to the CUPS mailing list by sending a message
|
||||
containing "subscribe cups" to majordomo@cups.org. This list is
|
||||
provided to discuss problems, questions, and improvements to the CUPS
|
||||
software. New releases of CUPS are announced to this list as well.
|
||||
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
CUPS is Copyright 1993-2001 by Easy Software Products. CUPS,
|
||||
the CUPS logo, and the Common UNIX Printing System are the
|
||||
trademark property of Easy Software Products.
|
||||
CUPS is Copyright 1993-1999 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,
|
||||
Copyright 1996-2001 by Derek B. Noonburg.
|
||||
|
||||
This software is based in part on the work of the Independent
|
||||
JPEG Group.
|
||||
|
||||
CUPS is provided under the terms of the GNU General Public
|
||||
License and GNU Library General Public License. This program is
|
||||
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the "LICENSE.html",
|
||||
"LICENSE.txt", or "cups.license" files for more information.
|
||||
|
||||
For commercial licensing information, please contact:
|
||||
CUPS is provided under the terms of the GNU General Public License
|
||||
which is located in the files "LICENSE.html" and "LICENSE.txt" (or the
|
||||
file "cups.license" for a binary distribution.) For commercial
|
||||
licensing information, please contact:
|
||||
|
||||
Attn: CUPS Licensing Information
|
||||
Easy Software Products
|
||||
44141 Airport View Drive, Suite 204
|
||||
Hollywood, Maryland 20636-3111 USA
|
||||
|
||||
Voice: +1.301.373.9600
|
||||
Voice: +1.301.373.9603
|
||||
Email: cups-info@cups.org
|
||||
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.
|
||||
If you're interested in a complete, commercial printing solution for
|
||||
UNIX, check out our ESP Print Pro software at:
|
||||
|
||||
http://www.easysw.com/printpro
|
||||
|
||||
+21
-43
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Backend makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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
|
||||
@@ -24,10 +24,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
BACKENDS = ipp lpd parallel serial socket usb
|
||||
TARGETS = betest $(BACKENDS)
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o serial.o socket.o usb.o
|
||||
|
||||
TARGETS = ipp lpd parallel serial smb socket
|
||||
OBJS = ipp.o lpd.o parallel.o serial.o socket.o
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -35,38 +33,22 @@ OBJS = betest.o ipp.o lpd.o parallel.o serial.o socket.o usb.o
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Clean all object files...
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS) http
|
||||
|
||||
rm -f $(OBJS) $(TARGETS)
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install:
|
||||
$(INSTALL_DIR) $(SERVERBIN)/backend
|
||||
for file in $(BACKENDS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
|
||||
done
|
||||
$(RM) $(SERVERBIN)/backend/http
|
||||
$(LN) ipp $(SERVERBIN)/backend/http
|
||||
|
||||
|
||||
#
|
||||
# betest
|
||||
#
|
||||
|
||||
betest: betest.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o betest betest.o $(LIBS)
|
||||
|
||||
betest.o: ../cups/string.h ../Makedefs
|
||||
|
||||
-$(MKDIR) $(SERVERROOT)/backend
|
||||
$(CP) $(TARGETS) $(SERVERROOT)/backend
|
||||
-$(LN) ipp $(SERVERROOT)/backend/http
|
||||
$(CHMOD) u+s $(SERVERROOT)/backend/lpd
|
||||
|
||||
#
|
||||
# ipp
|
||||
@@ -75,12 +57,10 @@ betest.o: ../cups/string.h ../Makedefs
|
||||
ipp: ipp.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o ipp ipp.o $(LIBS)
|
||||
$(RM) http
|
||||
$(LN) ipp http
|
||||
-$(LN) ipp http
|
||||
|
||||
ipp.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpd
|
||||
#
|
||||
@@ -91,7 +71,6 @@ lpd: lpd.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpd.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# parallel
|
||||
#
|
||||
@@ -102,7 +81,6 @@ parallel: parallel.o ../cups/$(LIBCUPS)
|
||||
|
||||
parallel.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# serial
|
||||
#
|
||||
@@ -113,6 +91,18 @@ serial: serial.o ../cups/$(LIBCUPS)
|
||||
|
||||
serial.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# smb
|
||||
#
|
||||
# Note: reading through these commands is a good way to get a headache... :)
|
||||
#
|
||||
|
||||
smb: smb.sh ../Makedefs
|
||||
echo Generating $@...
|
||||
$(RM) smb
|
||||
sedcmd="1,\$$s/^SMBCLIENT=.\*/SMBCLIENT=`echo $(SMBCLIENT) | sed -e '1,$$s/\\//\\\\\\//g'`/" ;\
|
||||
$(SED) -e "$$sedcmd" <smb.sh >smb
|
||||
$(CHMOD) +x smb
|
||||
|
||||
#
|
||||
# socket
|
||||
@@ -124,18 +114,6 @@ socket: socket.o ../cups/$(LIBCUPS)
|
||||
|
||||
socket.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# usb
|
||||
#
|
||||
|
||||
usb: usb.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o usb usb.o $(LIBS)
|
||||
|
||||
usb.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Backend test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE" 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
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Run the named backend.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <cups/string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Run the named backend.
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* betest device-uri job-id user title copies options [file]
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments (7 or 8) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
char backend[255]; /* Method in URI */
|
||||
|
||||
|
||||
if (argc < 7 || argc > 8)
|
||||
{
|
||||
fputs("Usage: betest device-uri job-id user title copies options [file]\n",
|
||||
stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the method from the device-uri - that's the program we want to
|
||||
* execute.
|
||||
*/
|
||||
|
||||
if (sscanf(argv[1], "%254[^:]", backend) != 1)
|
||||
{
|
||||
fputs("betest: Bad device-uri - no colon!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute and return
|
||||
*/
|
||||
|
||||
execl(backend, argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7],
|
||||
NULL);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+252
-504
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,7 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
* password_cb() - Disable the password prompt for cupsDoFileRequest().
|
||||
* main() - Send a file to the printer or server.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -39,21 +38,6 @@
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
const char *password_cb(const char *);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
char *password = NULL;
|
||||
|
||||
|
||||
/*
|
||||
@@ -69,6 +53,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int n, n2; /* Attribute values */
|
||||
char *option, /* Name of option */
|
||||
*val, /* Pointer to option value */
|
||||
*s; /* Pointer into option value */
|
||||
int num_options; /* Number of printer options */
|
||||
cups_option_t *options; /* Printer options */
|
||||
char method[255], /* Method in URI */
|
||||
@@ -77,51 +65,22 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
filename[1024]; /* 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 */
|
||||
char password[255], /* Password info */
|
||||
uri[HTTP_MAX_URI];/* Updated URI without user/pass */
|
||||
http_status_t status; /* Status of HTTP job */
|
||||
FILE *fp; /* File to print */
|
||||
http_t *http; /* HTTP connection */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response, /* IPP response */
|
||||
*supported; /* get-printer-attributes response */
|
||||
ipp_attribute_t *job_id_attr; /* job-id attribute */
|
||||
int job_id; /* job-id value */
|
||||
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 */
|
||||
const char *charset; /* Character set to use */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *job_id; /* job-id attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
int copies; /* Number of copies remaining */
|
||||
const char *content_type; /* CONTENT_TYPE environment variable */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
int version; /* IPP version */
|
||||
struct stat fileinfo; /* File statistics */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total bytes written */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
|
||||
|
||||
/*
|
||||
* Make sure status messages are not buffered...
|
||||
*/
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
char *s;
|
||||
|
||||
if ((s = strrchr(argv[0], '/')) != NULL)
|
||||
s ++;
|
||||
else
|
||||
s = argv[0];
|
||||
|
||||
printf("network %s \"Unknown\" \"Internet Printing Protocol\"\n", s);
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
|
||||
argv[0]);
|
||||
@@ -130,43 +89,18 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
/*
|
||||
* If we have 7 arguments, print the file named on the command-line.
|
||||
* Otherwise, copy stdin to a temporary file and print the temporary
|
||||
* file.
|
||||
* Otherwise, print stdin...
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
fp = stdin;
|
||||
else if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
/*
|
||||
* Copy stdin to a temporary file...
|
||||
*/
|
||||
|
||||
int fd; /* Temporary file */
|
||||
char buffer[8192]; /* Buffer for copying */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
|
||||
{
|
||||
perror("ERROR: unable to create temporary file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
if (write(fd, buffer, bytes) < bytes)
|
||||
{
|
||||
perror("ERROR: unable to write to temporary file");
|
||||
close(fd);
|
||||
unlink(filename);
|
||||
return (1);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
perror("ERROR: Unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
stat(argv[6], &fileinfo);
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -174,44 +108,20 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
httpSeparate(argv[0], method, username, hostname, &port, resource);
|
||||
|
||||
/*
|
||||
* Set the authentication info, if any...
|
||||
*/
|
||||
|
||||
cupsSetPasswordCB(password_cb);
|
||||
|
||||
if (username[0])
|
||||
{
|
||||
if ((password = strchr(username, ':')) != NULL)
|
||||
*password++ = '\0';
|
||||
|
||||
cupsSetUser(username);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try connecting to the remote server...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
fprintf(stderr, "INFO: Connecting to %s...\n", hostname);
|
||||
fprintf(stderr, "INFO: Connecting to %s...\n", hostname);
|
||||
|
||||
if ((http = httpConnect(hostname, port)) == NULL)
|
||||
{
|
||||
if (errno == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to IPP host");
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
if ((http = httpConnect(hostname, port)) == NULL)
|
||||
{
|
||||
perror("ERROR: Unable to connect to IPP host");
|
||||
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
return (1);
|
||||
}
|
||||
while (http == NULL);
|
||||
|
||||
/*
|
||||
* Build a URI for the printer and fill the standard IPP attributes for
|
||||
@@ -219,391 +129,244 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* might contain username:password information...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "%s://%s:%d%s", method, hostname, port, resource);
|
||||
request = ippNew();
|
||||
request->request.op.operation_id = IPP_PRINT_JOB;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
sprintf(uri, "%s://%s:%d%s", method, hostname, port, resource);
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
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 != NULL ? language->language : "C");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, argv[3]);
|
||||
|
||||
/*
|
||||
* First validate the destination and see if the device supports multiple
|
||||
* copies. We have to do this because some IPP servers (e.g. HP JetDirect)
|
||||
* don't support the copies attribute...
|
||||
* Handle options on the command-line...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
charset_sup = NULL;
|
||||
copies_sup = NULL;
|
||||
format_sup = NULL;
|
||||
version = 1;
|
||||
supported = NULL;
|
||||
options = NULL;
|
||||
num_options = cupsParseOptions(argv[5], 0, &options);
|
||||
|
||||
do
|
||||
{
|
||||
/*
|
||||
* Build the IPP request...
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
request->request.op.version[1] = version;
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, "utf-8");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language != NULL ? language->language : "en");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if ((supported = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
ipp_status = supported->request.status.status_code;
|
||||
|
||||
if (ipp_status > IPP_OK_CONFLICT)
|
||||
{
|
||||
if (supported)
|
||||
ippDelete(supported);
|
||||
|
||||
if (ipp_status == IPP_PRINTER_BUSY ||
|
||||
ipp_status == IPP_SERVICE_UNAVAILABLE)
|
||||
{
|
||||
fputs("INFO: Printer busy; will retry in 10 seconds...\n", stderr);
|
||||
sleep(10);
|
||||
}
|
||||
else if ((ipp_status == IPP_BAD_REQUEST ||
|
||||
ipp_status == IPP_VERSION_NOT_SUPPORTED) && version == 1)
|
||||
{
|
||||
/*
|
||||
* Switch to IPP/1.0...
|
||||
*/
|
||||
|
||||
fputs("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n", stderr);
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Printer will not accept print file (%s)!\n",
|
||||
ippErrorString(ipp_status));
|
||||
}
|
||||
else if ((copies_sup = ippFindAttribute(supported, "copies-supported",
|
||||
IPP_TAG_RANGE)) != NULL)
|
||||
{
|
||||
/*
|
||||
* Has the "copies-supported" attribute - does it have an upper
|
||||
* bound > 1?
|
||||
*/
|
||||
|
||||
if (copies_sup->values[0].range.upper <= 1)
|
||||
copies_sup = NULL; /* No */
|
||||
}
|
||||
|
||||
charset_sup = ippFindAttribute(supported, "charset-supported",
|
||||
IPP_TAG_CHARSET);
|
||||
format_sup = ippFindAttribute(supported, "document-format-supported",
|
||||
IPP_TAG_MIMETYPE);
|
||||
|
||||
if (format_sup)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: document-format-supported (%d values)\n",
|
||||
format_sup->num_values);
|
||||
for (i = 0; i < format_sup->num_values; i ++)
|
||||
fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i,
|
||||
format_sup->values[i].string.text);
|
||||
}
|
||||
}
|
||||
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...)
|
||||
*/
|
||||
|
||||
if (argc < 7)
|
||||
{
|
||||
#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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* See if the printer supports multiple copies...
|
||||
*/
|
||||
|
||||
if (copies_sup || argc < 7)
|
||||
copies = 1;
|
||||
if (cupsGetOption("raw", num_options, options))
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/vnd.cups-raw");
|
||||
else
|
||||
copies = atoi(argv[4]);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/octet-stream");
|
||||
|
||||
/*
|
||||
* Figure out the character set to use...
|
||||
*/
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", atoi(argv[4]));
|
||||
|
||||
charset = language ? cupsLangEncoding(language) : "us-ascii";
|
||||
|
||||
if (charset_sup)
|
||||
for (i = 0; i < num_options; i ++)
|
||||
{
|
||||
/*
|
||||
* See if IPP server supports the requested character set...
|
||||
* Skip the "raw" option - handled above...
|
||||
*/
|
||||
|
||||
for (i = 0; i < charset_sup->num_values; i ++)
|
||||
if (strcasecmp(charset, charset_sup->values[i].string.text) == 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
* If not, choose us-ascii or utf-8...
|
||||
*/
|
||||
|
||||
if (i >= charset_sup->num_values)
|
||||
{
|
||||
/*
|
||||
* See if us-ascii is supported...
|
||||
*/
|
||||
|
||||
for (i = 0; i < charset_sup->num_values; i ++)
|
||||
if (strcasecmp("us-ascii", charset_sup->values[i].string.text) == 0)
|
||||
break;
|
||||
|
||||
if (i < charset_sup->num_values)
|
||||
charset = "us-ascii";
|
||||
else
|
||||
charset = "utf-8";
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Then issue the print-job request...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
/*
|
||||
* Build the IPP request...
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
request->request.op.version[1] = version;
|
||||
request->request.op.operation_id = IPP_PRINT_JOB;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, charset);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language != NULL ? language->language : "en");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
fprintf(stderr, "DEBUG: printer-uri = \"%s\"\n", uri);
|
||||
|
||||
if (argv[2][0])
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
fprintf(stderr, "DEBUG: requesting-user-name = \"%s\"\n", argv[2]);
|
||||
|
||||
if (argv[3][0])
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
|
||||
argv[3]);
|
||||
|
||||
fprintf(stderr, "DEBUG: job-name = \"%s\"\n", argv[3]);
|
||||
|
||||
/*
|
||||
* Handle options on the command-line...
|
||||
*/
|
||||
|
||||
options = NULL;
|
||||
num_options = cupsParseOptions(argv[5], 0, &options);
|
||||
|
||||
if (argc > 6)
|
||||
content_type = getenv("CONTENT_TYPE");
|
||||
else
|
||||
content_type = "application/vnd.cups-raw";
|
||||
|
||||
if (content_type != NULL && 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 (i < format_sup->num_values)
|
||||
num_options = cupsAddOption("document-format", content_type,
|
||||
num_options, &options);
|
||||
}
|
||||
|
||||
if (copies_sup)
|
||||
{
|
||||
/*
|
||||
* Only send options if the destination printer supports the copies
|
||||
* attribute. This is a hack for the HP JetDirect implementation of
|
||||
* IPP, which does not accept extension attributes and incorrectly
|
||||
* reports a client-error-bad-request error instead of the
|
||||
* successful-ok-unsupported-attributes status. In short, at least
|
||||
* some HP implementations of IPP are non-compliant.
|
||||
*/
|
||||
|
||||
cupsEncodeOptions(request, num_options, options);
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies",
|
||||
atoi(argv[4]));
|
||||
}
|
||||
|
||||
cupsFreeOptions(num_options, options);
|
||||
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoFileRequest(http, request, resource, filename)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
ipp_status = response->request.status.status_code;
|
||||
|
||||
if (ipp_status > IPP_OK_CONFLICT)
|
||||
{
|
||||
if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
|
||||
ipp_status == IPP_PRINTER_BUSY)
|
||||
{
|
||||
fputs("INFO: Printer is busy; retrying print job...\n", stderr);
|
||||
sleep(10);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Print file was not accepted (%s)!\n",
|
||||
ippErrorString(ipp_status));
|
||||
}
|
||||
else if ((job_id_attr = ippFindAttribute(response, "job-id",
|
||||
IPP_TAG_INTEGER)) == NULL)
|
||||
{
|
||||
fputs("INFO: Print file accepted - job ID unknown.\n", stderr);
|
||||
job_id = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
job_id = job_id_attr->values[0].integer;
|
||||
fprintf(stderr, "INFO: Print file accepted - job ID %d.\n", job_id);
|
||||
}
|
||||
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
if (ipp_status <= IPP_OK_CONFLICT)
|
||||
{
|
||||
fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
|
||||
copies --;
|
||||
}
|
||||
else if (ipp_status != IPP_SERVICE_UNAVAILABLE &&
|
||||
ipp_status != IPP_PRINTER_BUSY)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Wait for the job to complete...
|
||||
*/
|
||||
|
||||
if (!job_id)
|
||||
if (strcmp(options[i].name, "raw") == 0)
|
||||
continue;
|
||||
|
||||
fputs("INFO: Waiting for job to complete...\n", stderr);
|
||||
/*
|
||||
* 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, and option=MxN.
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
option = options[i].name;
|
||||
val = options[i].value;
|
||||
|
||||
if (*val == '\0')
|
||||
val = NULL;
|
||||
|
||||
if (val != NULL)
|
||||
{
|
||||
if (strcasecmp(val, "true") == 0 ||
|
||||
strcasecmp(val, "on") == 0 ||
|
||||
strcasecmp(val, "yes") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - true...
|
||||
*/
|
||||
|
||||
n = 1;
|
||||
val = "";
|
||||
}
|
||||
else if (strcasecmp(val, "false") == 0 ||
|
||||
strcasecmp(val, "off") == 0 ||
|
||||
strcasecmp(val, "no") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - false...
|
||||
*/
|
||||
|
||||
n = 0;
|
||||
val = "";
|
||||
}
|
||||
|
||||
n = strtol(val, &s, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strncmp(option, "no", 2) == 0)
|
||||
{
|
||||
option += 2;
|
||||
n = 0;
|
||||
}
|
||||
else
|
||||
n = 1;
|
||||
|
||||
s = "";
|
||||
}
|
||||
|
||||
if (*s != '\0' && *s != '-' && (*s != 'x' || s == val))
|
||||
/*
|
||||
* String value(s)...
|
||||
*/
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, option, NULL, val);
|
||||
else if (val != NULL)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOB_ATTRIBUTES request...
|
||||
* Numeric value, range, or resolution...
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
request->request.op.version[1] = version;
|
||||
request->request.op.operation_id = IPP_GET_JOB_ATTRIBUTES;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, charset);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language != NULL ? language->language : "en");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
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");
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) == NULL)
|
||||
ipp_status = cupsLastError();
|
||||
else
|
||||
ipp_status = response->request.status.status_code;
|
||||
|
||||
if (ipp_status == IPP_NOT_FOUND)
|
||||
if (*s == '-')
|
||||
{
|
||||
/*
|
||||
* Job has gone away and/or the server has no job history...
|
||||
*/
|
||||
n2 = strtol(s + 1, NULL, 0);
|
||||
ippAddRange(request, IPP_TAG_JOB, option, n, n2);
|
||||
}
|
||||
else if (*s == 'x')
|
||||
{
|
||||
n2 = strtol(s + 1, &s, 0);
|
||||
|
||||
ippDelete(response);
|
||||
if (strcmp(s, "dpc") == 0)
|
||||
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_CM, n, n2);
|
||||
else if (strcmp(s, "dpi") == 0)
|
||||
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_INCH, n, n2);
|
||||
else
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, option, NULL, val);
|
||||
}
|
||||
else
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, option, n);
|
||||
}
|
||||
else
|
||||
/*
|
||||
* Boolean value...
|
||||
*/
|
||||
ippAddBoolean(request, IPP_TAG_JOB, option, (char)n);
|
||||
}
|
||||
|
||||
ipp_status = IPP_OK;
|
||||
/*
|
||||
* Now fill in the HTTP request stuff...
|
||||
*/
|
||||
|
||||
httpClearFields(http);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
|
||||
httpEncode64(password, username);
|
||||
httpSetField(http, HTTP_FIELD_AUTHORIZATION, password);
|
||||
|
||||
if (fp != stdin)
|
||||
{
|
||||
sprintf(buffer, "%u", ippLength(request) + (size_t)fileinfo.st_size);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, buffer);
|
||||
}
|
||||
else
|
||||
httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked");
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/*
|
||||
* POST the request, retrying as needed...
|
||||
*/
|
||||
|
||||
if (httpPost(http, resource))
|
||||
{
|
||||
fputs("INFO: Unable to POST print request; retrying...\n", stderr);
|
||||
sleep(10);
|
||||
httpReconnect(http);
|
||||
continue;
|
||||
}
|
||||
|
||||
fputs("INFO: POST successful, sending IPP request...\n", stderr);
|
||||
|
||||
/*
|
||||
* Send the IPP request...
|
||||
*/
|
||||
|
||||
request->state = IPP_IDLE;
|
||||
|
||||
if (ippWrite(http, request) == IPP_ERROR)
|
||||
{
|
||||
fputs("ERROR: Unable to send IPP request!\n", stderr);
|
||||
status = HTTP_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
fputs("INFO: IPP request sent, sending print file...\n", stderr);
|
||||
|
||||
/*
|
||||
* Then send the file...
|
||||
*/
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
tbytes += nbytes;
|
||||
fprintf(stderr, "INFO: Sending print file, %uk...\n", tbytes / 1024);
|
||||
|
||||
if (httpWrite(http, buffer, nbytes) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
status = HTTP_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ipp_status > IPP_OK_CONFLICT)
|
||||
{
|
||||
if (ipp_status != IPP_SERVICE_UNAVAILABLE &&
|
||||
ipp_status != IPP_PRINTER_BUSY)
|
||||
{
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
fprintf(stderr, "ERROR: Unable to get job %d attributes (%s)!\n",
|
||||
job_id, ippErrorString(ipp_status));
|
||||
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)
|
||||
{
|
||||
ippDelete(response);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait 10 seconds before polling again...
|
||||
*/
|
||||
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
sleep(10);
|
||||
}
|
||||
|
||||
fputs("INFO: Print file sent; checking status...\n", stderr);
|
||||
|
||||
/*
|
||||
* Finally, check the status from the HTTP server...
|
||||
*/
|
||||
|
||||
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
|
||||
|
||||
if (status == HTTP_OK)
|
||||
{
|
||||
response = ippNew();
|
||||
ippRead(http, response);
|
||||
|
||||
if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
fprintf(stderr, "ERROR: Print file was not accepted (%04x)!\n",
|
||||
response->request.status.status_code);
|
||||
else if ((job_id = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL)
|
||||
fputs("INFO: Print file accepted - job ID unknown.\n", stderr);
|
||||
else
|
||||
fprintf(stderr, "INFO: Print file accepted - job ID %d.\n",
|
||||
job_id->values[0].integer);
|
||||
}
|
||||
else
|
||||
{
|
||||
response = NULL;
|
||||
httpFlush(http);
|
||||
|
||||
fprintf(stderr, "ERROR: Print request was not accepted (%d)!\n", status);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -611,38 +374,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
|
||||
if (supported)
|
||||
ippDelete(supported);
|
||||
if (request != NULL)
|
||||
ippDelete(request);
|
||||
if (response != NULL)
|
||||
ippDelete(response);
|
||||
|
||||
/*
|
||||
* Close and remove the temporary file if necessary...
|
||||
* Close the print file as needed...
|
||||
*/
|
||||
|
||||
if (argc < 7)
|
||||
unlink(filename);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
/*
|
||||
* Return the queue status...
|
||||
*/
|
||||
|
||||
if (ipp_status <= IPP_OK_CONFLICT)
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
return (ipp_status > IPP_OK_CONFLICT);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'password_cb()' - Disable the password prompt for cupsDoFileRequest().
|
||||
*/
|
||||
|
||||
const char * /* O - Password */
|
||||
password_cb(const char *prompt) /* I - Prompt (not used) */
|
||||
{
|
||||
(void)prompt;
|
||||
|
||||
return (password);
|
||||
return (status != HTTP_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+45
-330
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Line Printer Daemon backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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,7 +26,6 @@
|
||||
* main() - Send a file to the printer or server.
|
||||
* lpd_command() - Send an LPR command sequence and wait for a reply.
|
||||
* lpd_queue() - Queue a file using the Line Printer Daemon protocol.
|
||||
* lpd_write() - Write a buffer of data to an LPD server.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -37,12 +36,10 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <signal.h>
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <winsock.h>
|
||||
@@ -53,20 +50,7 @@
|
||||
# include <netdb.h>
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* The order for control and data files in LPD requests...
|
||||
*/
|
||||
|
||||
#define ORDER_CONTROL_DATA 0
|
||||
#define ORDER_DATA_CONTROL 1
|
||||
|
||||
|
||||
/*
|
||||
* It appears that rresvport() is never declared on most systems...
|
||||
*/
|
||||
|
||||
extern int rresvport(int *port);
|
||||
extern int rresvport(int *port); /* Hello? No prototype for this... */
|
||||
|
||||
|
||||
/*
|
||||
@@ -75,9 +59,7 @@ extern int rresvport(int *port);
|
||||
|
||||
static int lpd_command(int lpd_fd, char *format, ...);
|
||||
static int lpd_queue(char *hostname, char *printer, char *filename,
|
||||
int fromstdin, char *user, char *title, int copies,
|
||||
int banner, int format, int order);
|
||||
static int lpd_write(int lpd_fd, char *buffer, int length);
|
||||
char *user, int copies);
|
||||
|
||||
|
||||
/*
|
||||
@@ -96,35 +78,12 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
*options, /* Pointer to options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr, /* Pointer into name or value */
|
||||
filename[1024], /* File to print */
|
||||
title[256]; /* Title string */
|
||||
filename[1024]; /* File to print */
|
||||
int port; /* Port number (not used) */
|
||||
int status; /* Status of LPD job */
|
||||
int banner; /* Print banner page? */
|
||||
int format; /* Print format */
|
||||
int order; /* Order of control/data files */
|
||||
|
||||
|
||||
/*
|
||||
* Make sure status messages are not buffered...
|
||||
*/
|
||||
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
puts("network lpd \"Unknown\" \"LPD/LPR Host or Printer\"");
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
|
||||
argv[0]);
|
||||
@@ -143,33 +102,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Copy stdin to a temporary file...
|
||||
*/
|
||||
|
||||
int fd; /* Temporary file */
|
||||
FILE *fp; /* Temporary file */
|
||||
char buffer[8192]; /* Buffer for copying */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
|
||||
if ((fp = fopen(cupsTempFile(filename, sizeof(filename)), "w")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to create temporary file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
if (write(fd, buffer, bytes) < bytes)
|
||||
if (fwrite(buffer, 1, bytes, fp) < bytes)
|
||||
{
|
||||
perror("ERROR: unable to write to temporary file");
|
||||
close(fd);
|
||||
fclose(fp);
|
||||
unlink(filename);
|
||||
return (1);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
strcpy(filename, argv[6]);
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -177,124 +133,12 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
httpSeparate(argv[0], method, username, hostname, &port, resource);
|
||||
|
||||
/*
|
||||
* See if there are any options...
|
||||
*/
|
||||
|
||||
banner = 0;
|
||||
format = 'l';
|
||||
order = ORDER_CONTROL_DATA;
|
||||
|
||||
if ((options = strchr(resource, '?')) != NULL)
|
||||
{
|
||||
/*
|
||||
* Yup, terminate the device name string and move to the first
|
||||
* character of the options...
|
||||
*/
|
||||
|
||||
*options++ = '\0';
|
||||
|
||||
/*
|
||||
* Parse options...
|
||||
*/
|
||||
|
||||
while (*options)
|
||||
{
|
||||
/*
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
for (ptr = name; *options && *options != '=';)
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
options ++;
|
||||
|
||||
for (ptr = value; *options && *options != '+';)
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '+')
|
||||
options ++;
|
||||
}
|
||||
else
|
||||
value[0] = '\0';
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
*/
|
||||
|
||||
if (strcasecmp(name, "banner") == 0)
|
||||
{
|
||||
/*
|
||||
* Set the banner...
|
||||
*/
|
||||
|
||||
banner = !value[0] ||
|
||||
strcasecmp(value, "on") == 0 ||
|
||||
strcasecmp(value, "yes") == 0 ||
|
||||
strcasecmp(value, "true") == 0;
|
||||
}
|
||||
else if (strcasecmp(name, "format") == 0 && value[0])
|
||||
{
|
||||
/*
|
||||
* Set output format...
|
||||
*/
|
||||
|
||||
if (strchr("cdfglnoprtv", value[0]) != NULL)
|
||||
format = value[0];
|
||||
else
|
||||
fprintf(stderr, "ERROR: Unknown format character \"%c\"\n", value[0]);
|
||||
}
|
||||
else if (strcasecmp(name, "order") == 0 && value[0])
|
||||
{
|
||||
/*
|
||||
* Set control/data order...
|
||||
*/
|
||||
|
||||
if (strcasecmp(value, "control,data") == 0)
|
||||
order = ORDER_CONTROL_DATA;
|
||||
else if (strcasecmp(value, "data,control") == 0)
|
||||
order = ORDER_DATA_CONTROL;
|
||||
else
|
||||
fprintf(stderr, "ERROR: Unknown file order \"%s\"\n", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanitize the document title...
|
||||
*/
|
||||
|
||||
strncpy(title, argv[3], sizeof(title) - 1);
|
||||
title[sizeof(title) - 1] = '\0';
|
||||
|
||||
for (ptr = title; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr) && !isspace(*ptr))
|
||||
*ptr = '_';
|
||||
|
||||
/*
|
||||
* Queue the job...
|
||||
*/
|
||||
|
||||
if (argc > 6)
|
||||
{
|
||||
status = lpd_queue(hostname, resource + 1, filename, 0,
|
||||
argv[2] /* user */, title, atoi(argv[4]) /* copies */,
|
||||
banner, format, order);
|
||||
|
||||
if (!status)
|
||||
fprintf(stderr, "PAGE: 1 %d\n", atoi(argv[4]));
|
||||
}
|
||||
else
|
||||
status = lpd_queue(hostname, resource + 1, filename, 1,
|
||||
argv[2] /* user */, title, 1, banner, format, order);
|
||||
status = lpd_queue(hostname, resource + 1, filename,
|
||||
argv[2] /* user */, atoi(argv[4]) /* copies */);
|
||||
|
||||
/*
|
||||
* Remove the temporary file if necessary...
|
||||
@@ -331,26 +175,22 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
|
||||
*/
|
||||
|
||||
va_start(ap, format);
|
||||
bytes = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
bytes = vsprintf(buf, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
fprintf(stderr, "DEBUG: lpd_command %2.2x %s", buf[0], buf + 1);
|
||||
fprintf(stderr, "DEBUG: lpd_command %02.2x %s", buf[0], buf + 1);
|
||||
|
||||
/*
|
||||
* Send the command...
|
||||
*/
|
||||
|
||||
fprintf(stderr, "DEBUG: Sending command string (%d bytes)...\n", bytes);
|
||||
|
||||
if (lpd_write(fd, buf, bytes) < bytes)
|
||||
if (send(fd, buf, bytes, 0) < bytes)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Read back the status from the command and return it...
|
||||
*/
|
||||
|
||||
fprintf(stderr, "DEBUG: Reading command status...\n");
|
||||
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
return (-1);
|
||||
|
||||
@@ -368,13 +208,8 @@ static int /* O - Zero on success, non-zero on failure */
|
||||
lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
char *printer, /* I - Printer/queue name */
|
||||
char *filename, /* I - File to print */
|
||||
int fromstdin, /* I - Printing from stdin? */
|
||||
char *user, /* I - Requesting user */
|
||||
char *title, /* I - Job title */
|
||||
int copies, /* I - Number of copies */
|
||||
int banner, /* I - Print LPD banner? */
|
||||
int format, /* I - Format specifier */
|
||||
int order) /* I - Order of data/control files */
|
||||
int copies) /* I - Number of copies */
|
||||
{
|
||||
FILE *fp; /* Job file */
|
||||
char localhost[255]; /* Local host name */
|
||||
@@ -390,9 +225,6 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total bytes written */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
|
||||
|
||||
/*
|
||||
@@ -416,31 +248,10 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
|
||||
for (port = 732;;)
|
||||
{
|
||||
if (getuid())
|
||||
if ((fd = rresvport(&port)) < 0)
|
||||
{
|
||||
/*
|
||||
* We're running as a normal user, so just create a regular socket...
|
||||
*/
|
||||
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to create socket");
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* We're running as root, so comply with RFC 1179 and reserve a
|
||||
* priviledged port between 721 and 732...
|
||||
*/
|
||||
|
||||
if ((fd = rresvport(&port)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to reserve port");
|
||||
sleep(30);
|
||||
continue;
|
||||
}
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
@@ -464,37 +275,13 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
sleep(30);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "INFO: Connected from port %d...\n", port);
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
if (fromstdin)
|
||||
{
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGTERM, SIG_IGN);
|
||||
#elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
|
||||
/*
|
||||
* Next, open the print file and figure out its size...
|
||||
*/
|
||||
@@ -521,60 +308,43 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
gethostname(localhost, sizeof(localhost));
|
||||
localhost[31] = '\0'; /* RFC 1179, Section 7.2 - host name < 32 chars */
|
||||
|
||||
snprintf(control, sizeof(control), "H%s\nP%s\nJ%s\n", localhost, user, title);
|
||||
sprintf(control, "H%s\nP%s\n", localhost, user);
|
||||
cptr = control + strlen(control);
|
||||
|
||||
if (banner)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "L%s\n", user);
|
||||
cptr += strlen(cptr);
|
||||
}
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%s\n", format,
|
||||
getpid() % 1000, localhost);
|
||||
sprintf(cptr, "ldfA%03.3d%s\n", getpid() % 1000, localhost);
|
||||
cptr += strlen(cptr);
|
||||
copies --;
|
||||
}
|
||||
|
||||
snprintf(cptr, sizeof(control) - (cptr - control),
|
||||
"UdfA%03d%s\nNdfA%03d%s\n",
|
||||
getpid() % 1000, localhost,
|
||||
getpid() % 1000, localhost);
|
||||
sprintf(cptr, "UdfA%03.3d%s\nNdfA%03.3d%s\n",
|
||||
getpid() % 1000, localhost,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
fprintf(stderr, "DEBUG: Control file is:\n%s", control);
|
||||
|
||||
if (order == ORDER_CONTROL_DATA)
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (send(fd, control, strlen(control) + 1, 0) < (strlen(control) + 1))
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
}
|
||||
else if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
perror("ERROR: Unable to write control file");
|
||||
status = 1;
|
||||
}
|
||||
else if (read(fd, &status, 1) < 1 || status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
status = 0;
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
/*
|
||||
* Send the print file...
|
||||
*/
|
||||
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
|
||||
lpd_command(fd, "\003%u dfA%03.3d%s\n", (unsigned)filestats.st_size,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
@@ -585,9 +355,9 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
fprintf(stderr, "INFO: Spooling LPR job, %u%% complete...\n",
|
||||
(unsigned)(100.0f * tbytes / filestats.st_size));
|
||||
(unsigned)(100 * tbytes / filestats.st_size));
|
||||
|
||||
if (lpd_write(fd, buffer, nbytes) < nbytes)
|
||||
if (send(fd, buffer, nbytes, 0) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
@@ -596,42 +366,17 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
tbytes += nbytes;
|
||||
}
|
||||
|
||||
if (tbytes < filestats.st_size)
|
||||
status = errno;
|
||||
else if (lpd_write(fd, "", 1) < 1)
|
||||
status = errno;
|
||||
else if (recv(fd, &status, 1, 0) < 1)
|
||||
status = errno;
|
||||
send(fd, "", 1, 0);
|
||||
|
||||
if (status != 0)
|
||||
if (tbytes < filestats.st_size)
|
||||
status = 1;
|
||||
else if (recv(fd, &status, 1, 0) < 1 || status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept data file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Data file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
if (status == 0 && order == ORDER_DATA_CONTROL)
|
||||
{
|
||||
lpd_command(fd, "\002%d cfA%03.3d%s\n", strlen(control), getpid() % 1000,
|
||||
localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
status = errno;
|
||||
perror("ERROR: Unable to write control file");
|
||||
}
|
||||
else if (read(fd, &status, 1) < 1)
|
||||
status = errno;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection and input file and return...
|
||||
*/
|
||||
@@ -643,36 +388,6 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'lpd_write()' - Write a buffer of data to an LPD server.
|
||||
*/
|
||||
|
||||
static int /* O - Number of bytes written or -1 on error */
|
||||
lpd_write(int lpd_fd, /* I - LPD socket */
|
||||
char *buffer, /* I - Buffer to write */
|
||||
int length) /* I - Number of bytes to write */
|
||||
{
|
||||
int bytes, /* Number of bytes written */
|
||||
total; /* Total number of bytes written */
|
||||
|
||||
|
||||
total = 0;
|
||||
while ((bytes = send(lpd_fd, buffer, length - total, 0)) >= 0)
|
||||
{
|
||||
total += bytes;
|
||||
buffer += bytes;
|
||||
|
||||
if (total == length)
|
||||
break;
|
||||
}
|
||||
|
||||
if (bytes < 0)
|
||||
return (-1);
|
||||
else
|
||||
return (length);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+21
-484
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Parallel port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,7 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified parallel port.
|
||||
* list_devices() - List all parallel devices.
|
||||
* main() - Send a file to the specified parallel port.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -34,9 +33,7 @@
|
||||
#include <cups/cups.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <io.h>
|
||||
@@ -46,24 +43,6 @@
|
||||
# include <termios.h>
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
#ifdef __sgi
|
||||
# include <invent.h>
|
||||
# ifndef INV_EPP_ECP_PLP
|
||||
# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */
|
||||
# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */
|
||||
# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */
|
||||
# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */
|
||||
# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */
|
||||
# endif /* !INV_EPP_ECP_PLP */
|
||||
#endif /* __sgi */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void list_devices(void);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the specified parallel port.
|
||||
@@ -84,35 +63,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*options; /* Pointer to options */
|
||||
int port; /* Port number (not used) */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
size_t nbytes, /* Number of bytes read */
|
||||
int error; /* Error code (if any) */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total number of bytes written */
|
||||
char buffer[8192], /* Output buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
struct termios opts; /* Parallel port options */
|
||||
#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);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
list_devices();
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fputs("Usage: parallel job-id user title copies options [file]\n", stderr);
|
||||
return (1);
|
||||
@@ -124,10 +83,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
fp = stdin;
|
||||
else
|
||||
{
|
||||
/*
|
||||
@@ -139,8 +95,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -167,23 +121,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Open the parallel port device...
|
||||
*/
|
||||
|
||||
do
|
||||
if ((fd = open(resource, O_WRONLY)) == -1)
|
||||
{
|
||||
if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
|
||||
{
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to open parallel port device file");
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
perror("ERROR: Unable to open parallel port device file");
|
||||
return (1);
|
||||
}
|
||||
while (fd < 0);
|
||||
|
||||
/*
|
||||
* Set any options provided...
|
||||
@@ -197,71 +139,27 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
tcsetattr(fd, TCSANOW, &opts);
|
||||
|
||||
/*
|
||||
* 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 (argc < 7)
|
||||
{
|
||||
#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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
copies --;
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
if (fp != stdin)
|
||||
if (write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
else
|
||||
tbytes += nbytes;
|
||||
bufptr = buffer;
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
|
||||
if (errno == ENOTTY)
|
||||
wbytes = write(fd, bufptr, nbytes);
|
||||
|
||||
if (wbytes < 0)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes -= wbytes;
|
||||
bufptr += wbytes;
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -276,367 +174,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List all parallel devices.
|
||||
*/
|
||||
|
||||
void
|
||||
list_devices(void)
|
||||
{
|
||||
#if defined(__hpux) || defined(__sgi) || defined(__sun)
|
||||
static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||
/* Funky hex numbering used for some devices */
|
||||
#endif /* __hpux || __sgi || __sun */
|
||||
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255], /* Device filename */
|
||||
probefile[255], /* Probe filename */
|
||||
basedevice[255]; /* Base device filename for ports */
|
||||
FILE *probe; /* /proc/parport/n/autoprobe 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 */
|
||||
|
||||
|
||||
for (i = 0; i < 4; i ++)
|
||||
{
|
||||
/*
|
||||
* First open the device to make sure the driver module is loaded...
|
||||
*/
|
||||
|
||||
if ((fd = open("/dev/parallel/0", O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
strcpy(basedevice, "/dev/parallel/");
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(device, "/dev/lp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
strcpy(basedevice, "/dev/lp");
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(device, "/dev/par%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
strcpy(basedevice, "/dev/par");
|
||||
}
|
||||
else
|
||||
strcpy(basedevice, "/dev/unknown-parallel");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Then try looking at the probe file...
|
||||
*/
|
||||
|
||||
sprintf(probefile, "/proc/parport/%d/autoprobe", i);
|
||||
if ((probe = fopen(probefile, "r")) == NULL)
|
||||
{
|
||||
/*
|
||||
* Linux 2.4 kernel has different path...
|
||||
*/
|
||||
|
||||
sprintf(probefile, "/proc/sys/dev/parport/parport%d/autoprobe", i);
|
||||
probe = fopen(probefile, "r");
|
||||
}
|
||||
|
||||
if (probe != NULL)
|
||||
{
|
||||
/*
|
||||
* Found a probe file!
|
||||
*/
|
||||
|
||||
memset(make, 0, sizeof(make));
|
||||
memset(model, 0, sizeof(model));
|
||||
strcpy(model, "Unknown");
|
||||
|
||||
while (fgets(line, sizeof(line), probe) != NULL)
|
||||
{
|
||||
/*
|
||||
* Strip trailing ; and/or newline.
|
||||
*/
|
||||
|
||||
if ((delim = strrchr(line, ';')) != NULL)
|
||||
*delim = '\0';
|
||||
else if ((delim = strrchr(line, '\n')) != NULL)
|
||||
*delim = '\0';
|
||||
|
||||
/*
|
||||
* Look for MODEL and MANUFACTURER lines...
|
||||
*/
|
||||
|
||||
if (strncmp(line, "MODEL:", 6) == 0 &&
|
||||
strncmp(line, "MODEL:Unknown", 13) != 0)
|
||||
strncpy(model, line + 6, sizeof(model) - 1);
|
||||
else if (strncmp(line, "MANUFACTURER:", 13) == 0 &&
|
||||
strncmp(line, "MANUFACTURER:Unknown", 20) != 0)
|
||||
strncpy(make, line + 13, sizeof(make) - 1);
|
||||
}
|
||||
|
||||
fclose(probe);
|
||||
|
||||
if (make[0])
|
||||
printf("direct parallel:%s%d \"%s %s\" \"Parallel Port #%d\"\n",
|
||||
basedevice, i, make, model, i + 1);
|
||||
else
|
||||
printf("direct parallel:%s%d \"%s\" \"Parallel Port #%d\"\n",
|
||||
basedevice, i, model, i + 1);
|
||||
}
|
||||
else if (fd >= 0)
|
||||
{
|
||||
/*
|
||||
* No probe file, but we know the port is there...
|
||||
*/
|
||||
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__sgi)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
inventory_t *inv; /* Hardware inventory info */
|
||||
|
||||
|
||||
/*
|
||||
* IRIX maintains a hardware inventory of most devices...
|
||||
*/
|
||||
|
||||
setinvent();
|
||||
|
||||
while ((inv = getinvent()) != NULL)
|
||||
{
|
||||
if (inv->inv_class == INV_PARALLEL &&
|
||||
(inv->inv_type == INV_ONBOARD_PLP ||
|
||||
inv->inv_type == INV_EPP_ECP_PLP))
|
||||
{
|
||||
/*
|
||||
* Standard parallel port...
|
||||
*/
|
||||
|
||||
puts("direct parallel:/dev/plp \"Unknown\" \"Onboard Parallel Port\"");
|
||||
}
|
||||
else if (inv->inv_class == INV_PARALLEL &&
|
||||
inv->inv_type == INV_EPC_PLP)
|
||||
{
|
||||
/*
|
||||
* EPC parallel port...
|
||||
*/
|
||||
|
||||
printf("direct parallel:/dev/plp%d \"Unknown\" \"Integral EPC parallel port, Ebus slot %d\"\n",
|
||||
inv->inv_controller, inv->inv_controller);
|
||||
}
|
||||
}
|
||||
|
||||
endinvent();
|
||||
|
||||
/*
|
||||
* Central Data makes serial and parallel "servers" that can be
|
||||
* connected in a number of ways. Look for ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/lpn%d%c", j, funky_hex[n]);
|
||||
else if (i == 9) /* PCI */
|
||||
sprintf(device, "/dev/lpp%d%c", j, funky_hex[n]);
|
||||
else /* SCSI */
|
||||
sprintf(device, "/dev/lp%d%d%c", i, j, funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else if (i == 9)
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data PCI Parallel Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__sun)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard parallel ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ecpp%d", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("direct parallel:%s \"Unknown\" \"Sun IEEE-1284 Parallel Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/bpp%d", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("direct parallel:%s \"Unknown\" \"Sun Standard Parallel Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/lp%d", i);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
printf("direct parallel:%s \"Unknown\" \"PC Parallel Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* MAGMA parallel ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 40; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/pm%02d", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("direct parallel:%s \"Unknown\" \"MAGMA Parallel Board #%d Port #%d\"\n",
|
||||
device, (i / 10) + 1, (i % 10) + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Central Data parallel ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 9; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/sts/lpN%d%c", j, funky_hex[n]);
|
||||
else
|
||||
sprintf(device, "/dev/sts/lp%c%d%c", i + 'C', j,
|
||||
funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__hpux)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard parallel ports...
|
||||
*/
|
||||
|
||||
if (access("/dev/rlp", 0) == 0)
|
||||
puts("direct parallel:/dev/rlp \"Unknown\" \"Standard Parallel Port (/dev/rlp)\"");
|
||||
|
||||
for (i = 0; i < 7; i ++)
|
||||
for (j = 0; j < 7; j ++)
|
||||
{
|
||||
sprintf(device, "/dev/c%dt%dd0_lp", i, j);
|
||||
if (access(device, 0) == 0)
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d,%d\"\n",
|
||||
device, i, j);
|
||||
}
|
||||
|
||||
/*
|
||||
* Central Data parallel ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 9; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/lpN%d%c", j, funky_hex[n]);
|
||||
else
|
||||
sprintf(device, "/dev/lp%c%d%c", i + 'C', j,
|
||||
funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__osf__)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/lp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/lpt%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
|
||||
sprintf(device, "/dev/lpa%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(_AIX)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/lp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+23
-587
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Serial port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,7 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the printer or server.
|
||||
* list_devices() - List all serial devices.
|
||||
* main() - Send a file to the printer or server.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -34,13 +33,7 @@
|
||||
#include <cups/cups.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef __hpux
|
||||
# include <sys/modem.h>
|
||||
#endif /* __hpux */
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <io.h>
|
||||
@@ -48,37 +41,8 @@
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# include <termios.h>
|
||||
# ifdef HAVE_SYS_IOCTL_H
|
||||
# include <sys/ioctl.h>
|
||||
# endif /* HAVE_SYS_IOCTL_H */
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
#ifdef __sgi
|
||||
# include <invent.h>
|
||||
# ifndef INV_EPP_ECP_PLP
|
||||
# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */
|
||||
# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */
|
||||
# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */
|
||||
# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */
|
||||
# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */
|
||||
# endif /* !INV_EPP_ECP_PLP */
|
||||
#endif /* __sgi */
|
||||
|
||||
#ifndef CRTSCTS
|
||||
# ifdef CNEW_RTSCTS
|
||||
# define CRTSCTS CNEW_RTSCTS
|
||||
# else
|
||||
# define CRTSCTS 0
|
||||
# endif /* CNEW_RTSCTS */
|
||||
#endif /* !CRTSCTS */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void list_devices(void);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the printer or server.
|
||||
@@ -102,37 +66,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*ptr; /* Pointer into name or value */
|
||||
int port; /* Port number (not used) */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
size_t nbytes, /* Number of bytes read */
|
||||
int error; /* Error code (if any) */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total number of bytes written */
|
||||
int dtrdsr; /* Do dtr/dsr flow control? */
|
||||
int bufsize; /* Size of output buffer for writes */
|
||||
char buffer[8192], /* Output buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
struct termios opts; /* Parallel port options */
|
||||
#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);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
list_devices();
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fputs("Usage: serial job-id user title copies options [file]\n", stderr);
|
||||
return (1);
|
||||
@@ -144,10 +86,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
fp = stdin;
|
||||
else
|
||||
{
|
||||
/*
|
||||
@@ -159,8 +98,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -184,26 +121,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the serial port device...
|
||||
* Open the parallel port device...
|
||||
*/
|
||||
|
||||
do
|
||||
if ((fd = open(resource, O_WRONLY)) == -1)
|
||||
{
|
||||
if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL | O_NDELAY)) == -1)
|
||||
{
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs("INFO: Serial port busy; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to open serial port device file");
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
perror("ERROR: Unable to open serial port device file");
|
||||
return (1);
|
||||
}
|
||||
while (fd < 0);
|
||||
|
||||
/*
|
||||
* Set any options provided...
|
||||
@@ -213,9 +138,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */
|
||||
|
||||
bufsize = 96; /* 9600 baud / 10 bits/char / 10Hz */
|
||||
dtrdsr = 0; /* No dtr/dsr flow control */
|
||||
|
||||
if (options != NULL)
|
||||
while (*options)
|
||||
{
|
||||
@@ -255,8 +177,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Set the baud rate...
|
||||
*/
|
||||
|
||||
bufsize = atoi(value) / 100;
|
||||
|
||||
#if B19200 == 19200
|
||||
cfsetispeed(&opts, atoi(value));
|
||||
cfsetospeed(&opts, atoi(value));
|
||||
@@ -287,18 +207,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
cfsetispeed(&opts, B38400);
|
||||
cfsetospeed(&opts, B38400);
|
||||
break;
|
||||
#ifdef B57600
|
||||
case 57600 :
|
||||
cfsetispeed(&opts, B57600);
|
||||
cfsetospeed(&opts, B57600);
|
||||
break;
|
||||
#endif /* B57600 */
|
||||
#ifdef B115200
|
||||
case 115200 :
|
||||
cfsetispeed(&opts, B115200);
|
||||
cfsetospeed(&opts, B115200);
|
||||
break;
|
||||
#endif /* B115200 */
|
||||
default :
|
||||
fprintf(stderr, "WARNING: Unsupported baud rate %s!\n", value);
|
||||
break;
|
||||
@@ -345,143 +253,35 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
else if (strcasecmp(value, "none") == 0)
|
||||
opts.c_cflag &= ~PARENB;
|
||||
}
|
||||
else if (strcasecmp(name, "flow") == 0)
|
||||
{
|
||||
/*
|
||||
* Set flow control...
|
||||
*/
|
||||
|
||||
if (strcasecmp(value, "none") == 0)
|
||||
{
|
||||
opts.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||
opts.c_cflag &= ~CRTSCTS;
|
||||
}
|
||||
else if (strcasecmp(value, "soft") == 0)
|
||||
{
|
||||
opts.c_iflag |= IXON | IXOFF | IXANY;
|
||||
opts.c_cflag &= ~CRTSCTS;
|
||||
}
|
||||
else if (strcasecmp(value, "hard") == 0 ||
|
||||
strcasecmp(value, "rtscts") == 0)
|
||||
{
|
||||
opts.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||
opts.c_cflag |= CRTSCTS;
|
||||
}
|
||||
else if (strcasecmp(value, "dtrdsr") == 0)
|
||||
{
|
||||
opts.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||
opts.c_cflag &= ~CRTSCTS;
|
||||
|
||||
dtrdsr = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tcsetattr(fd, TCSANOW, &opts);
|
||||
fcntl(fd, F_SETFL, 0);
|
||||
|
||||
/*
|
||||
* 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 (argc < 7)
|
||||
{
|
||||
#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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
if (bufsize > sizeof(buffer))
|
||||
bufsize = sizeof(buffer);
|
||||
|
||||
while (copies > 0)
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
copies --;
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
if (fp != stdin)
|
||||
if (write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
if (dtrdsr)
|
||||
{
|
||||
/*
|
||||
* Check the port and sleep until DSR is set...
|
||||
*/
|
||||
|
||||
int status;
|
||||
|
||||
|
||||
if (!ioctl(fd, TIOCMGET, &status))
|
||||
if (!(status & TIOCM_DSR))
|
||||
{
|
||||
/*
|
||||
* Wait for DSR to go high...
|
||||
*/
|
||||
|
||||
fputs("DEBUG: DSR is low; waiting for device...\n", stderr);
|
||||
|
||||
do
|
||||
{
|
||||
sleep(1);
|
||||
if (ioctl(fd, TIOCMGET, &status))
|
||||
break;
|
||||
}
|
||||
while (!(status & TIOCM_DSR));
|
||||
|
||||
fputs("DEBUG: DSR is high; writing to device...\n", stderr);
|
||||
}
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, bufsize, fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
else
|
||||
tbytes += nbytes;
|
||||
bufptr = buffer;
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
|
||||
if (errno == ENOTTY)
|
||||
wbytes = write(fd, bufptr, nbytes);
|
||||
|
||||
if (wbytes < 0)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes -= wbytes;
|
||||
bufptr += wbytes;
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the serial port and input file and return...
|
||||
* Close the socket connection and input file and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
@@ -492,370 +292,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List all serial devices.
|
||||
*/
|
||||
|
||||
void
|
||||
list_devices(void)
|
||||
{
|
||||
#if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__)
|
||||
static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||
/* Funky hex numbering used for some devices */
|
||||
#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
|
||||
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 100; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyS%d", i);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__sgi)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
inventory_t *inv; /* Hardware inventory info */
|
||||
|
||||
|
||||
/*
|
||||
* IRIX maintains a hardware inventory of most devices...
|
||||
*/
|
||||
|
||||
setinvent();
|
||||
|
||||
while ((inv = getinvent()) != NULL)
|
||||
{
|
||||
if (inv->inv_class == INV_SERIAL)
|
||||
{
|
||||
/*
|
||||
* Some sort of serial port...
|
||||
*/
|
||||
|
||||
if (inv->inv_type == INV_CDSIO || inv->inv_type == INV_CDSIO_E)
|
||||
{
|
||||
/*
|
||||
* CDSIO port...
|
||||
*/
|
||||
|
||||
for (n = 0; n < 6; n ++)
|
||||
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"CDSIO Board %d Serial Port #%d\"\n",
|
||||
n + 5 + 8 * inv->inv_controller, inv->inv_controller, n + 1);
|
||||
}
|
||||
else if (inv->inv_type == INV_EPC_SERIAL)
|
||||
{
|
||||
/*
|
||||
* Everest serial port...
|
||||
*/
|
||||
|
||||
if (inv->inv_unit == 0)
|
||||
i = 1;
|
||||
else
|
||||
i = 41 + 4 * (int)inv->inv_controller;
|
||||
|
||||
for (n = 0; n < (int)inv->inv_state; n ++)
|
||||
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"EPC Serial Port %d, Ebus slot %d\"\n",
|
||||
n + i, n + 1, (int)inv->inv_controller);
|
||||
}
|
||||
else if (inv->inv_state > 1)
|
||||
{
|
||||
/*
|
||||
* Standard serial port under IRIX 6.4 and earlier...
|
||||
*/
|
||||
|
||||
for (n = 0; n < (int)inv->inv_state; n ++)
|
||||
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"Onboard Serial Port %d\"\n",
|
||||
n + (int)inv->inv_unit + 1, n + (int)inv->inv_unit + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Standard serial port under IRIX 6.5 and beyond...
|
||||
*/
|
||||
|
||||
printf("serial serial:/dev/ttyd%d?baud=115200 \"Unknown\" \"Onboard Serial Port %d\"\n",
|
||||
(int)inv->inv_controller, (int)inv->inv_controller);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
endinvent();
|
||||
|
||||
/*
|
||||
* Central Data makes serial and parallel "servers" that can be
|
||||
* connected in a number of ways. Look for ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/ttydn%d%c", j, funky_hex[n]);
|
||||
else if (i == 9) /* PCI */
|
||||
sprintf(device, "/dev/ttydp%d%c", j, funky_hex[n]);
|
||||
else /* SCSI */
|
||||
sprintf(device, "/dev/ttyd%d%d%c", i, j, funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else if (i == 9)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data PCI Serial Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__sun)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 26; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/cua/%c", 'a' + i);
|
||||
if (access(device, 0) == 0)
|
||||
#ifdef B115200
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
#else
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
#endif /* B115200 */
|
||||
}
|
||||
|
||||
/*
|
||||
* MAGMA serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 40; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/term/%02d", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"MAGMA Serial Board #%d Port #%d\"\n",
|
||||
device, (i / 10) + 1, (i % 10) + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Central Data serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 9; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/sts/ttyN%d%c", j, funky_hex[n]);
|
||||
else
|
||||
sprintf(device, "/dev/sts/tty%c%d%c", i + 'C', j,
|
||||
funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__hpux)
|
||||
int i, j, n; /* Looping vars */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/tty%dp0", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Central Data serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 9; i ++)
|
||||
for (j = 0; j < 8; j ++)
|
||||
for (n = 0; n < 32; n ++)
|
||||
{
|
||||
if (i == 8) /* EtherLite */
|
||||
sprintf(device, "/dev/ttyN%d%c", j, funky_hex[n]);
|
||||
else
|
||||
sprintf(device, "/dev/tty%c%d%c", i + 'C', j,
|
||||
funky_hex[n]);
|
||||
|
||||
if (access(device, 0) == 0)
|
||||
{
|
||||
if (i == 8)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
|
||||
device, j, n);
|
||||
else
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
|
||||
device, i, j, n);
|
||||
}
|
||||
}
|
||||
#elif defined(__osf__)
|
||||
int i; /* Looping var */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 100; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/tty%02d", i);
|
||||
if (access(device, 0) == 0)
|
||||
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
|
||||
int i, j; /* Looping vars */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* SIO ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 32; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyd%c", funky_hex[i]);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Standard Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Cyclades ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
|
||||
for (j = 0; j < 32; j ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyc%d%c", i, funky_hex[j]);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n",
|
||||
device, i, j + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Digiboard ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
|
||||
for (j = 0; j < 32; j ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyD%d%c", i, funky_hex[j]);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Digiboard #%d Serial Port #%d\"\n",
|
||||
device, i, j + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Stallion ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 32; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyE%c", funky_hex[i]);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Stallion Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* SX ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 128; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyA%d", i + 1);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"SX Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__NetBSD__)
|
||||
int i, j; /* Looping vars */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
/*
|
||||
* Standard serial ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 4; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/tty%02d", i);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Cyclades-Z ports...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
|
||||
for (j = 0; j < 64; j ++)
|
||||
{
|
||||
sprintf(device, "/dev/ttyCZ%02d%02d", i, j);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Prt #%d\"\n",
|
||||
device, i, j + 1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
Arquivo executável
+88
@@ -0,0 +1,88 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# SMB printing script for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1993-1999 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
|
||||
# 44145 Airport View Drive, Suite 204
|
||||
# Hollywood, Maryland 20636-3111 USA
|
||||
#
|
||||
# Voice: (301) 373-9603
|
||||
# EMail: cups-info@cups.org
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
|
||||
SMBCLIENT=/usr/local/samba/bin/smbclient
|
||||
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# printer job user title copies options [filename]
|
||||
#
|
||||
|
||||
if [ $# -lt 5 -o $# -gt 6 ]; then
|
||||
# Too few or too many arguments
|
||||
echo 'Usage: smb job-id user title copies options [file]' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#
|
||||
# If "filename" is not on the command-line, then we read the print
|
||||
# data from stdin and write it to a temporary file.
|
||||
#
|
||||
|
||||
if [ $# = 5 ]; then
|
||||
# Collect all print data and put it in a temporary file...
|
||||
if [ "$TMPDIR" = "" ]; then
|
||||
TMPDIR=/var/tmp
|
||||
fi
|
||||
|
||||
filename="$TMPDIR/$$.smb"
|
||||
cat >$filename
|
||||
else
|
||||
# Use the file on the command-line...
|
||||
filename="$6"
|
||||
fi
|
||||
|
||||
#
|
||||
# Take apart the URI in $0...
|
||||
#
|
||||
|
||||
uri="$0"
|
||||
host=`echo $uri | awk -F/ '{print substr($3, index($3, "@") + 1)}'`
|
||||
user=`echo $uri | awk -F/ '{print substr($3, 0, index($3, "@") - 1)}'`
|
||||
if [ "$user" != "" ]; then
|
||||
user="-U $user"
|
||||
fi
|
||||
printer=`echo $uri | awk -F/ '{print $4}'`
|
||||
|
||||
#
|
||||
# Send the file to the remote system...
|
||||
#
|
||||
|
||||
$SMBCLIENT //$host/$printer $user -P -N <<EOF
|
||||
print $filename
|
||||
EOF
|
||||
|
||||
#
|
||||
# Lastly, remove the temporary file as needed...
|
||||
#
|
||||
|
||||
if [ $# = 5 ]; then
|
||||
rm -f $filename
|
||||
fi
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
+76
-191
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* AppSocket backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -38,7 +38,6 @@
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <signal.h>
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <winsock.h>
|
||||
@@ -67,9 +66,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024]; /* Resource info (not used) */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int port; /* Port number */
|
||||
int delay; /* Delay for retries... */
|
||||
int fd; /* AppSocket */
|
||||
int error; /* Error code (if any) */
|
||||
struct sockaddr_in addr; /* Socket address */
|
||||
@@ -81,27 +78,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
struct timeval timeout; /* Timeout for select() */
|
||||
fd_set input; /* Input set for select() */
|
||||
#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);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
puts("network socket \"Unknown\" \"AppSocket/HP JetDirect\"");
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
|
||||
argv[0]);
|
||||
@@ -114,10 +93,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
fp = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
fp = stdin;
|
||||
else
|
||||
{
|
||||
/*
|
||||
@@ -129,8 +105,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
perror("ERROR: unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
copies = atoi(argv[4]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -148,7 +122,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if ((hostaddr = gethostbyname(hostname)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s\n",
|
||||
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s",
|
||||
hostname, strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
@@ -161,183 +135,94 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
addr.sin_family = hostaddr->h_addrtype;
|
||||
addr.sin_port = htons(port);
|
||||
|
||||
while (copies > 0)
|
||||
for (;;)
|
||||
{
|
||||
for (delay = 5;;)
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
error = errno;
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (error == ECONNREFUSED)
|
||||
{
|
||||
perror("ERROR: Unable to create socket");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
error = errno;
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (error == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
|
||||
hostname, delay);
|
||||
sleep(delay);
|
||||
|
||||
if (delay < 30)
|
||||
delay += 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer (retrying in 30 seconds)");
|
||||
sleep(30);
|
||||
}
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...\n",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 (argc < 7)
|
||||
{
|
||||
#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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
fputs("INFO: Connected to host, sending print job...\n", stderr);
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
tbytes += nbytes;
|
||||
bufptr = buffer;
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
if ((wbytes = send(fd, bufptr, nbytes, 0)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes -= wbytes;
|
||||
bufptr += wbytes;
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for possible data coming back from the printer...
|
||||
*/
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
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",
|
||||
nbytes);
|
||||
}
|
||||
else if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
* Shutdown the socket and wait for the other end to finish...
|
||||
*/
|
||||
|
||||
fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr);
|
||||
|
||||
shutdown(fd, 1);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/*
|
||||
* Wait a maximum of 90 seconds for backchannel data or a closed
|
||||
* connection...
|
||||
*/
|
||||
|
||||
timeout.tv_sec = 90;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
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",
|
||||
nbytes);
|
||||
else
|
||||
break;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the input file and return...
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
fputs("INFO: Connected to host, sending print job...\n", stderr);
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
tbytes += nbytes;
|
||||
bufptr = buffer;
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
if ((wbytes = send(fd, bufptr, nbytes, 0)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes -= wbytes;
|
||||
bufptr += wbytes;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for possible data coming back from the printer...
|
||||
*/
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&input);
|
||||
FD_SET(fd, &input);
|
||||
if (select(fd + 1, &input, NULL, NULL, &timeout) > 0)
|
||||
{
|
||||
/*
|
||||
* 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",
|
||||
nbytes);
|
||||
}
|
||||
else if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection and input file and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
fputs("INFO: Ready to print.\n", stderr);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
-441
@@ -1,441 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* USB port backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE" 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
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified USB port.
|
||||
* list_devices() - List all USB devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <cups/string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <io.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# include <termios.h>
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
void list_devices(void);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the specified USB port.
|
||||
*
|
||||
* 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) */
|
||||
FILE *fp; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
int fd; /* Parallel device */
|
||||
int wbytes; /* Number of bytes written */
|
||||
size_t nbytes, /* Number of bytes read */
|
||||
tbytes; /* Total number of bytes written */
|
||||
char buffer[8192], /* Output buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
struct termios opts; /* Parallel port options */
|
||||
#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);
|
||||
|
||||
/*
|
||||
* Check command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
list_devices();
|
||||
return (0);
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fputs("Usage: USB 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 = stdin;
|
||||
copies = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Try to open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
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';
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the USB port device...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
|
||||
{
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to open USB port device file");
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (fd < 0);
|
||||
|
||||
/*
|
||||
* Set any options provided...
|
||||
*/
|
||||
|
||||
tcgetattr(fd, &opts);
|
||||
|
||||
opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */
|
||||
|
||||
/**** No options supported yet ****/
|
||||
|
||||
tcsetattr(fd, TCSANOW, &opts);
|
||||
|
||||
/*
|
||||
* 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 (argc < 7)
|
||||
{
|
||||
#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 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, send the print file...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
copies --;
|
||||
|
||||
if (fp != stdin)
|
||||
{
|
||||
fputs("PAGE: 1 1\n", stderr);
|
||||
rewind(fp);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
tbytes += nbytes;
|
||||
bufptr = buffer;
|
||||
|
||||
while (nbytes > 0)
|
||||
{
|
||||
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
|
||||
if (errno == ENOTTY)
|
||||
wbytes = write(fd, bufptr, nbytes);
|
||||
|
||||
if (wbytes < 0)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes -= wbytes;
|
||||
bufptr += wbytes;
|
||||
}
|
||||
|
||||
if (argc > 6)
|
||||
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the socket connection and input file and return...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'list_devices()' - List all USB devices.
|
||||
*/
|
||||
|
||||
void
|
||||
list_devices(void)
|
||||
{
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
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 */
|
||||
|
||||
|
||||
/*
|
||||
* First try opening one of the USB devices to load the driver
|
||||
* module as needed...
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Just probe manually for USB devices...
|
||||
*/
|
||||
|
||||
for (i = 0; i < 8; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/usb/lp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
}
|
||||
|
||||
sprintf(device, "/dev/usb/usblp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
|
||||
}
|
||||
|
||||
sprintf(device, "/dev/usblp%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
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 */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/unlpt%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct usb:%s \"Unknown\" \"USB Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
int i; /* Looping var */
|
||||
int fd; /* File descriptor */
|
||||
char device[255]; /* Device filename */
|
||||
|
||||
|
||||
for (i = 0; i < 3; i ++)
|
||||
{
|
||||
sprintf(device, "/dev/ulpt%d", i);
|
||||
if ((fd = open(device, O_WRONLY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("direct usb:%s \"Unknown\" \"USB Port #%d\"\n", device, i + 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+6
-16
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Berkeley commands makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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
|
||||
@@ -27,34 +27,28 @@ include ../Makedefs
|
||||
TARGETS = lpc lpq lpr lprm
|
||||
OBJS = lpc.o lpq.o lpr.o lprm.o
|
||||
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
#
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Clean all object files...
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS)
|
||||
|
||||
rm -f $(OBJS) $(TARGETS)
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install:
|
||||
$(INSTALL_DIR) $(BINDIR)
|
||||
$(INSTALL_BIN) lpq $(BINDIR)
|
||||
$(INSTALL_BIN) lpr $(BINDIR)
|
||||
$(INSTALL_BIN) lprm $(BINDIR)
|
||||
$(INSTALL_DIR) $(SBINDIR)
|
||||
$(INSTALL_BIN) lpc $(SBINDIR)
|
||||
|
||||
-$(MKDIR) $(BINDIR)
|
||||
-$(MKDIR) $(SBINDIR)
|
||||
$(CP) lpq lpr lprm $(BINDIR)
|
||||
$(CP) lpc $(SBINDIR)
|
||||
|
||||
#
|
||||
# lpc
|
||||
@@ -66,7 +60,6 @@ lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpc.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpq
|
||||
#
|
||||
@@ -77,7 +70,6 @@ lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpq.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lpr
|
||||
#
|
||||
@@ -88,7 +80,6 @@ lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpr.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# lprm
|
||||
#
|
||||
@@ -99,7 +90,6 @@ lprm: lprm.o ../cups/$(LIBCUPS)
|
||||
|
||||
lprm.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
|
||||
+14
-37
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpc" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -60,6 +60,7 @@ int
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
http_t *http; /* Connection to server */
|
||||
char line[1024], /* Input line from user */
|
||||
*params; /* Pointer to parameters */
|
||||
@@ -69,7 +70,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Connect to the scheduler...
|
||||
*/
|
||||
|
||||
http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
|
||||
http = httpConnect(cupsServer(), ippPort());
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
@@ -178,7 +179,7 @@ do_command(http_t *http, /* I - HTTP connection to server */
|
||||
strcmp(command, "?") == 0)
|
||||
show_help(params);
|
||||
else
|
||||
printf("%s is not implemented by the CUPS version of lpc.\n", command);
|
||||
puts("?Invalid command");
|
||||
}
|
||||
|
||||
|
||||
@@ -216,8 +217,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
ipp_t *request, /* IPP Request */
|
||||
*response, /* IPP Response */
|
||||
*jobs; /* IPP Get Jobs response */
|
||||
ipp_attribute_t *attr, /* Current attribute */
|
||||
*jattr; /* Current job attribute */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
char *printer, /* Printer name */
|
||||
*device; /* Device URI */
|
||||
@@ -229,13 +229,6 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
int match; /* Non-zero if this job matches */
|
||||
char printer_uri[HTTP_MAX_URI];
|
||||
/* Printer URI */
|
||||
static const char *requested[] =
|
||||
{ /* Requested attributes */
|
||||
"printer-name",
|
||||
"device-uri",
|
||||
"printer-state",
|
||||
"printer-is-accepting-jobs"
|
||||
};
|
||||
|
||||
|
||||
DEBUG_printf(("show_status(%08x, %08x)\n", http, dests));
|
||||
@@ -258,15 +251,11 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
attr = 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);
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", sizeof(requested) / sizeof(requested[0]),
|
||||
NULL, requested);
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
@@ -422,18 +411,14 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
"attributes-natural-language", NULL,
|
||||
language->language);
|
||||
|
||||
snprintf(printer_uri, sizeof(printer_uri),
|
||||
"ipp://localhost/printers/%s", printer);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, printer_uri);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "job-id");
|
||||
sprintf(printer_uri, "ipp://localhost/printers/%s", printer);
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, printer_uri);
|
||||
|
||||
if ((jobs = cupsDoRequest(http, request, "/jobs/")) != NULL)
|
||||
{
|
||||
for (jattr = jobs->attrs; jattr != NULL; jattr = jattr->next)
|
||||
if (jattr->name && strcmp(jattr->name, "job-id") == 0)
|
||||
for (attr = jobs->attrs; attr != NULL; attr = attr->next)
|
||||
if (strcmp(attr->name, "job-id") == 0)
|
||||
jobcount ++;
|
||||
|
||||
ippDelete(jobs);
|
||||
@@ -448,15 +433,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
if (strncmp(device, "file:", 5) == 0)
|
||||
printf("\tprinter is on device \'%s\' speed -1\n", device + 5);
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Just show the method...
|
||||
*/
|
||||
|
||||
*strchr(device, ':') = '\0';
|
||||
printf("\tprinter is on device \'%s\' speed -1\n", device);
|
||||
}
|
||||
|
||||
printf("\tqueuing is %sabled\n", accepting ? "en" : "dis");
|
||||
printf("\tprinting is %sabled\n",
|
||||
pstate == IPP_PRINTER_STOPPED ? "dis" : "en");
|
||||
|
||||
+29
-200
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpq" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,9 +23,8 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Parse options and commands.
|
||||
* show_jobs() - Show jobs.
|
||||
* show_printer() - Show printer status.
|
||||
* main() - Parse options and commands.
|
||||
* show_jobs() - Show jobs.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -39,7 +38,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <config.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
@@ -51,7 +49,6 @@
|
||||
|
||||
static int show_jobs(http_t *, const char *, const char *, const int,
|
||||
const int);
|
||||
static void show_printer(http_t *, const char *);
|
||||
|
||||
|
||||
/*
|
||||
@@ -66,42 +63,26 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
http_t *http; /* Connection to server */
|
||||
const char *dest, /* Desired printer */
|
||||
*user; /* Desired user */
|
||||
char *instance; /* Printer instance */
|
||||
int id, /* Desired job ID */
|
||||
interval, /* Reporting interval */
|
||||
longstatus; /* Show file details */
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dests; /* Destinations */
|
||||
http_encryption_t encryption; /* Encryption? */
|
||||
|
||||
|
||||
/*
|
||||
* Connect to the scheduler...
|
||||
*/
|
||||
|
||||
if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
|
||||
cupsEncryption())) == NULL)
|
||||
{
|
||||
fputs("lpq: Unable to contact server!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
http = httpConnect(cupsServer(), ippPort());
|
||||
|
||||
/*
|
||||
* Check for command-line options...
|
||||
*/
|
||||
|
||||
dest = NULL;
|
||||
dest = cupsGetDefault();
|
||||
user = NULL;
|
||||
id = 0;
|
||||
interval = 0;
|
||||
longstatus = 0;
|
||||
|
||||
num_dests = cupsGetDests(&dests);
|
||||
|
||||
for (i = 0; i < num_dests; i ++)
|
||||
if (dests[i].is_default)
|
||||
dest = dests[i].name;
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
if (argv[i][0] == '+')
|
||||
interval = atoi(argv[i] + 1);
|
||||
@@ -109,18 +90,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
{
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
encryption = HTTP_ENCRYPT_REQUIRED;
|
||||
|
||||
if (http)
|
||||
httpEncryption(http, encryption);
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
break;
|
||||
|
||||
case 'P' : /* Printer */
|
||||
if (argv[i][2])
|
||||
dest = argv[i] + 2;
|
||||
@@ -129,13 +98,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
i ++;
|
||||
dest = argv[i];
|
||||
}
|
||||
|
||||
if ((instance = strchr(dest, '/')) != NULL)
|
||||
*instance = '\0';
|
||||
break;
|
||||
|
||||
case 'a' : /* All printers */
|
||||
dest = NULL;
|
||||
break;
|
||||
|
||||
case 'l' : /* Long status */
|
||||
@@ -144,8 +106,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
default :
|
||||
fputs("Usage: lpq [-P dest] [-l] [+interval]\n", stderr);
|
||||
httpClose(http);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -160,16 +120,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (dest)
|
||||
show_printer(http, dest);
|
||||
|
||||
i = show_jobs(http, dest, user, id, longstatus);
|
||||
|
||||
if (i && interval)
|
||||
{
|
||||
fflush(stdout);
|
||||
sleep(interval);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
@@ -178,7 +132,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Close the connection to the server and return...
|
||||
*/
|
||||
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
|
||||
return (0);
|
||||
@@ -206,15 +159,10 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
ipp_jstate_t jobstate; /* job-state */
|
||||
int jobid, /* job-id */
|
||||
jobsize, /* job-k-octets */
|
||||
#ifdef __osf__
|
||||
jobpriority, /* job-priority */
|
||||
#endif /* __osf__ */
|
||||
jobcount, /* Number of jobs */
|
||||
jobcopies, /* Number of copies */
|
||||
rank; /* Rank of job */
|
||||
char resource[1024]; /* Resource string */
|
||||
char rankstr[255]; /* Rank string */
|
||||
char namestr[1024]; /* Job name string */
|
||||
static const char *ranks[10] =/* Ranking strings */
|
||||
{
|
||||
"th",
|
||||
@@ -243,6 +191,7 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri or printer-uri
|
||||
* [
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
@@ -270,9 +219,9 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(resource, sizeof(resource), "ipp://localhost/printers/%s", dest);
|
||||
sprintf(resource, "ipp://localhost/printers/%s", dest);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
|
||||
NULL, resource);
|
||||
}
|
||||
|
||||
@@ -287,18 +236,13 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if (!longstatus)
|
||||
puts("Rank\tPri Owner Job Files Total Size");
|
||||
|
||||
jobcount = 0;
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
if ((response = cupsDoRequest(http, request, "/jobs/")) != NULL)
|
||||
{
|
||||
if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
{
|
||||
fprintf(stderr, "lpq: get-jobs failed: %s\n",
|
||||
ippErrorString(response->request.status.status_code));
|
||||
ippDelete(response);
|
||||
return (0);
|
||||
}
|
||||
|
||||
rank = 1;
|
||||
|
||||
/*
|
||||
@@ -323,14 +267,11 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
jobid = 0;
|
||||
jobsize = 0;
|
||||
#ifdef __osf__
|
||||
jobpriority = 50;
|
||||
#endif /* __osf__ */
|
||||
jobstate = IPP_JOB_PENDING;
|
||||
jobname = "untitled";
|
||||
jobuser = NULL;
|
||||
jobdest = NULL;
|
||||
jobcopies = 1;
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
|
||||
{
|
||||
@@ -342,11 +283,9 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobsize = attr->values[0].integer * 1024;
|
||||
|
||||
#ifdef __osf__
|
||||
if (strcmp(attr->name, "job-priority") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobpriority = attr->values[0].integer;
|
||||
#endif /* __osf__ */
|
||||
|
||||
if (strcmp(attr->name, "job-state") == 0 &&
|
||||
attr->value_tag == IPP_TAG_ENUM)
|
||||
@@ -365,10 +304,6 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
jobname = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "copies") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobcopies = attr->values[0].integer;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
@@ -384,157 +319,51 @@ show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!longstatus && jobcount == 0)
|
||||
#ifdef __osf__
|
||||
puts("Rank Owner Pri Job Files Total Size");
|
||||
#else
|
||||
puts("Rank Owner Job File(s) Total Size");
|
||||
#endif /* __osf__ */
|
||||
|
||||
jobcount ++;
|
||||
|
||||
/*
|
||||
* Display the job...
|
||||
*/
|
||||
|
||||
if (jobstate == IPP_JOB_PROCESSING)
|
||||
strcpy(rankstr, "active");
|
||||
else
|
||||
{
|
||||
snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]);
|
||||
rank ++;
|
||||
}
|
||||
|
||||
if (longstatus)
|
||||
{
|
||||
puts("");
|
||||
|
||||
if (jobcopies > 1)
|
||||
snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies,
|
||||
jobname);
|
||||
if (jobstate == IPP_JOB_PROCESSING)
|
||||
printf("%s: active\t\t\t\t ", jobuser);
|
||||
else
|
||||
{
|
||||
strncpy(namestr, jobname, sizeof(namestr) - 1);
|
||||
namestr[sizeof(namestr) - 1] = '\0';
|
||||
printf("%s: %d%s\t\t\t\t ", jobuser, rank, ranks[rank % 10]);
|
||||
rank ++;
|
||||
}
|
||||
|
||||
printf("%s: %-34.34s[job %d localhost]\n", jobuser, rankstr, jobid);
|
||||
printf(" %-40.40s%d bytes\n", namestr, jobsize);
|
||||
printf("[job %03dlocalhost]\n", jobid);
|
||||
printf("\t%-33s%d bytes\n", jobname, 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,
|
||||
jobid, jobname, jobsize);
|
||||
#endif /* __osf */
|
||||
{
|
||||
if (jobstate == IPP_JOB_PROCESSING)
|
||||
printf("active\t");
|
||||
else
|
||||
{
|
||||
printf("%d%s\t", rank, ranks[rank % 10]);
|
||||
rank ++;
|
||||
}
|
||||
|
||||
printf(" %-5d%-7.7s%-7d%-19s%d bytes\n", jobpriority, jobuser, jobid,
|
||||
jobname, jobsize);
|
||||
}
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "lpq: get-jobs failed: %s\n", ippErrorString(cupsLastError()));
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (jobcount == 0)
|
||||
puts("no entries");
|
||||
|
||||
return (jobcount);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_printer()' - Show printer status.
|
||||
*/
|
||||
|
||||
static void
|
||||
show_printer(http_t *http, /* I - HTTP connection to server */
|
||||
const char *dest) /* I - Destination */
|
||||
{
|
||||
ipp_t *request, /* IPP Request */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
ipp_pstate_t state; /* Printer state */
|
||||
char uri[HTTP_MAX_URI];
|
||||
/* Printer URI */
|
||||
|
||||
|
||||
if (http == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
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);
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", dest);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
{
|
||||
fprintf(stderr, "lpq: get-printer-attributes failed: %s\n",
|
||||
ippErrorString(response->request.status.status_code));
|
||||
ippDelete(response);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
|
||||
state = (ipp_pstate_t)attr->values[0].integer;
|
||||
else
|
||||
state = IPP_PRINTER_STOPPED;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case IPP_PRINTER_IDLE :
|
||||
printf("%s is ready\n", dest);
|
||||
break;
|
||||
case IPP_PRINTER_PROCESSING :
|
||||
printf("%s is ready and printing\n", dest);
|
||||
break;
|
||||
case IPP_PRINTER_STOPPED :
|
||||
printf("%s is not ready\n", dest);
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "lpq: get-printer-attributes failed: %s\n",
|
||||
ippErrorString(cupsLastError()));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+65
-238
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lpr" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,8 +23,7 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Parse options and send files for printing.
|
||||
* sighandler() - Signal catcher for when we print from stdin...
|
||||
* main() - Parse options and send files for printing.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -33,30 +32,9 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <config.h>
|
||||
#include <cups/cups.h>
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
# include <signal.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions.
|
||||
*/
|
||||
|
||||
void sighandler(int);
|
||||
#endif /* !WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Globals...
|
||||
*/
|
||||
|
||||
char tempfile[1024]; /* Temporary file for printing from stdin */
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Parse options and send files for printing.
|
||||
*/
|
||||
@@ -65,32 +43,25 @@ int
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i, j; /* Looping var */
|
||||
int i; /* Looping var */
|
||||
int job_id; /* Job ID */
|
||||
char ch; /* Option character */
|
||||
char *printer, /* Destination printer or class */
|
||||
*instance; /* Instance */
|
||||
const char *dest; /* Destination printer */
|
||||
const char *title; /* Job title */
|
||||
int priority; /* Job priority (1-100) */
|
||||
int num_copies; /* Number of copies per file */
|
||||
int num_files; /* Number of files to print */
|
||||
const char *files[1000]; /* Files to print */
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dests, /* Destinations */
|
||||
*dest; /* Selected destination */
|
||||
int num_files; /* Number of files printed */
|
||||
int num_options; /* Number of options */
|
||||
cups_option_t *options; /* Options */
|
||||
int deletefile; /* Delete file after print? */
|
||||
int silent, /* Silent or verbose output? */
|
||||
deletefile; /* Delete file after print? */
|
||||
char tempfile[1024]; /* Temporary file for printing from stdin */
|
||||
char buffer[8192]; /* Copy buffer */
|
||||
int temp; /* Temporary file descriptor */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Signal action */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
FILE *temp; /* Temporary file pointer */
|
||||
|
||||
|
||||
silent = 0;
|
||||
deletefile = 0;
|
||||
printer = NULL;
|
||||
num_dests = 0;
|
||||
dests = NULL;
|
||||
dest = cupsGetDefault();
|
||||
num_options = 0;
|
||||
options = NULL;
|
||||
num_files = 0;
|
||||
@@ -98,34 +69,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
if (argv[i][0] == '-')
|
||||
switch (ch = argv[i][1])
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
break;
|
||||
|
||||
case '1' : /* TROFF font set 1 */
|
||||
case '2' : /* TROFF font set 2 */
|
||||
case '3' : /* TROFF font set 3 */
|
||||
case '4' : /* TROFF font set 4 */
|
||||
case 'i' : /* indent */
|
||||
case 'w' : /* width */
|
||||
if (argv[i][2] == '\0')
|
||||
{
|
||||
i ++;
|
||||
|
||||
if (i >= argc)
|
||||
{
|
||||
fprintf(stderr, "lpr: Expected value after -%c option!\n", ch);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
case 'c' : /* CIFPLOT */
|
||||
case 'd' : /* DVI */
|
||||
case 'f' : /* FORTRAN */
|
||||
@@ -134,7 +83,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
case 't' : /* Troff */
|
||||
case 'v' : /* Raster image */
|
||||
fprintf(stderr, "Warning: \'%c\' format modifier not supported - output may not be correct!\n",
|
||||
ch);
|
||||
argv[i][1]);
|
||||
break;
|
||||
|
||||
case 'o' : /* Option */
|
||||
@@ -143,28 +92,19 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
if (i >= argc)
|
||||
{
|
||||
fputs("lpr: Expected option=value after -o option!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
num_options = cupsParseOptions(argv[i], num_options, &options);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'l' : /* Literal/raw */
|
||||
num_options = cupsAddOption("raw", "", num_options, &options);
|
||||
num_options = cupsParseOptions("raw", num_options, &options);
|
||||
break;
|
||||
|
||||
case 'p' : /* Prettyprint */
|
||||
num_options = cupsAddOption("prettyprint", "", num_options, &options);
|
||||
num_options = cupsParseOptions("prettyprint", num_options, &options);
|
||||
break;
|
||||
|
||||
case 'h' : /* Suppress burst page */
|
||||
num_options = cupsAddOption("job-sheets", "none", num_options, &options);
|
||||
break;
|
||||
|
||||
case 's' : /* Don't use symlinks */
|
||||
break;
|
||||
|
||||
@@ -172,43 +112,17 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
fputs("Warning: email notification is not supported!\n", stderr);
|
||||
break;
|
||||
|
||||
case 'q' : /* Queue file but don't print */
|
||||
num_options = cupsAddOption("job-hold-until", "indefinite",
|
||||
num_options, &options);
|
||||
break;
|
||||
|
||||
case 'r' : /* Remove file after printing */
|
||||
deletefile = 1;
|
||||
break;
|
||||
|
||||
case 'P' : /* Destination printer or class */
|
||||
if (argv[i][2] != '\0')
|
||||
printer = argv[i] + 2;
|
||||
dest = argv[i] + 2;
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
if (i >= argc)
|
||||
{
|
||||
fputs("lpr: Expected destination after -P option!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
printer = argv[i];
|
||||
}
|
||||
|
||||
if ((instance = strrchr(printer, '/')) != NULL)
|
||||
*instance++ = '\0';
|
||||
|
||||
if (num_dests == 0)
|
||||
num_dests = cupsGetDests(&dests);
|
||||
|
||||
if ((dest = cupsGetDest(printer, instance, num_dests, dests)) != NULL)
|
||||
{
|
||||
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);
|
||||
dest = argv[i];
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -218,12 +132,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
if (i >= argc)
|
||||
{
|
||||
fputs("lpr: Expected copy count after -# option!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
num_copies = atoi(argv[i]);
|
||||
}
|
||||
|
||||
@@ -245,181 +153,100 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
if (i >= argc)
|
||||
{
|
||||
fprintf(stderr, "lpr: Expected name after -%c option!\n", ch);
|
||||
return (1);
|
||||
}
|
||||
|
||||
title = argv[i];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'U' : /* User */
|
||||
if (argv[i][2] != '\0')
|
||||
cupsSetUser(argv[i] + 2);
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
if (i >= argc)
|
||||
{
|
||||
fputs("lpr: Expected username after -U option!\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
cupsSetUser(argv[i]);
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
fprintf(stderr, "lpr: Unknown option \'%c\'!\n", argv[i][1]);
|
||||
return (1);
|
||||
}
|
||||
else if (num_files < 1000)
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Print a file...
|
||||
*/
|
||||
|
||||
files[num_files] = argv[i];
|
||||
num_files ++;
|
||||
|
||||
if (title == NULL)
|
||||
if (dest == NULL)
|
||||
{
|
||||
if ((title = strrchr(argv[i], '/')) != NULL)
|
||||
title ++;
|
||||
else
|
||||
title = argv[i];
|
||||
fputs("lpr: error - no default destination available.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
num_files ++;
|
||||
if (title)
|
||||
job_id = cupsPrintFile(dest, argv[i], title, num_options, options);
|
||||
else
|
||||
{
|
||||
char *filename;
|
||||
|
||||
if ((filename = strrchr(argv[i], '/')) != NULL)
|
||||
filename ++;
|
||||
else
|
||||
filename = argv[i];
|
||||
|
||||
job_id = cupsPrintFile(dest, argv[i], filename, num_options, options);
|
||||
}
|
||||
|
||||
if (job_id < 1)
|
||||
{
|
||||
fprintf(stderr, "lpr: unable to print file \'%s\'.\n", argv[i]);
|
||||
return (1);
|
||||
}
|
||||
else if (deletefile)
|
||||
unlink(argv[i]);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "lpr: Too many files - \"%s\"\n", argv[i]);
|
||||
|
||||
/*
|
||||
* See if we have any files to print; if not, print from stdin...
|
||||
* See if we printed anything; if not, print from stdin...
|
||||
*/
|
||||
|
||||
if (printer == NULL)
|
||||
if (num_files == 0)
|
||||
{
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (printer == NULL)
|
||||
{
|
||||
fputs("lpr: error - no default destination available.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (num_files > 0)
|
||||
{
|
||||
job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options);
|
||||
|
||||
if (deletefile)
|
||||
if (dest == NULL)
|
||||
{
|
||||
/*
|
||||
* Delete print files after printing...
|
||||
*/
|
||||
|
||||
for (i = 0; i < num_files; i ++)
|
||||
unlink(files[i]);
|
||||
fputs("lpr: error - no default destination available.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
num_files = 1;
|
||||
|
||||
#ifndef WIN32
|
||||
# if defined(HAVE_SIGSET)
|
||||
sigset(SIGHUP, sighandler);
|
||||
sigset(SIGINT, sighandler);
|
||||
sigset(SIGTERM, sighandler);
|
||||
# elif defined(HAVE_SIGACTION)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = sighandler;
|
||||
temp = fopen(cupsTempFile(tempfile, sizeof(tempfile)), "w");
|
||||
|
||||
sigaction(SIGHUP, &action, NULL);
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
# else
|
||||
signal(SIGHUP, sighandler);
|
||||
signal(SIGINT, sighandler);
|
||||
signal(SIGTERM, sighandler);
|
||||
# endif
|
||||
#endif /* !WIN32 */
|
||||
|
||||
if ((temp = cupsTempFd(tempfile, sizeof(tempfile))) < 0)
|
||||
if (temp == NULL)
|
||||
{
|
||||
fputs("lpr: unable to create temporary file.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
while ((i = read(0, buffer, sizeof(buffer))) > 0)
|
||||
write(temp, buffer, i);
|
||||
while ((i = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
fwrite(buffer, 1, i, temp);
|
||||
|
||||
i = lseek(temp, 0, SEEK_CUR);
|
||||
close(temp);
|
||||
i = ftell(temp);
|
||||
fclose(temp);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
fputs("lpr: stdin is empty, so no job has been sent.\n", stderr);
|
||||
fputs("lpr: standard input is empty, so no job has been sent.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (title)
|
||||
job_id = cupsPrintFile(printer, tempfile, title, num_options, options);
|
||||
job_id = cupsPrintFile(dest, tempfile, title, num_options, options);
|
||||
else
|
||||
job_id = cupsPrintFile(printer, tempfile, "(stdin)", num_options, options);
|
||||
job_id = cupsPrintFile(dest, tempfile, "(stdin)", num_options, options);
|
||||
|
||||
unlink(tempfile);
|
||||
}
|
||||
|
||||
if (job_id < 1)
|
||||
{
|
||||
fprintf(stderr, "lpr: unable to print file: %s\n",
|
||||
ippErrorString(cupsLastError()));
|
||||
return (1);
|
||||
if (job_id < 1)
|
||||
{
|
||||
fputs("lpr: unable to print standard input.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
/*
|
||||
* 'sighandler()' - Signal catcher for when we print from stdin...
|
||||
*/
|
||||
|
||||
void
|
||||
sighandler(int s) /* I - Signal number */
|
||||
{
|
||||
/*
|
||||
* Remove the temporary file we're using to print from stdin...
|
||||
*/
|
||||
|
||||
unlink(tempfile);
|
||||
|
||||
/*
|
||||
* Exit...
|
||||
*/
|
||||
|
||||
exit(s);
|
||||
}
|
||||
#endif /* !WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+11
-73
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* "lprm" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -50,42 +50,29 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
int i; /* Looping var */
|
||||
int job_id; /* Job ID */
|
||||
const char *dest; /* Destination printer */
|
||||
char *instance; /* Pointer to instance name */
|
||||
char uri[1024]; /* Printer or job URI */
|
||||
ipp_t *request; /* IPP request */
|
||||
ipp_t *response; /* IPP response */
|
||||
ipp_op_t op; /* Operation */
|
||||
cups_lang_t *language; /* Language */
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dests; /* Destinations */
|
||||
http_encryption_t encryption; /* Encryption? */
|
||||
|
||||
|
||||
/*
|
||||
* Setup to cancel individual print jobs...
|
||||
*/
|
||||
|
||||
op = IPP_CANCEL_JOB;
|
||||
job_id = 0;
|
||||
dest = NULL;
|
||||
response = NULL;
|
||||
http = NULL;
|
||||
encryption = cupsEncryption();
|
||||
|
||||
num_dests = cupsGetDests(&dests);
|
||||
|
||||
for (i = 0; i < num_dests; i ++)
|
||||
if (dests[i].is_default)
|
||||
dest = dests[i].name;
|
||||
op = IPP_CANCEL_JOB;
|
||||
job_id = 0;
|
||||
dest = cupsGetDefault();
|
||||
response = NULL;
|
||||
|
||||
/*
|
||||
* Open a connection to the server...
|
||||
*/
|
||||
|
||||
if ((http = httpConnectEncrypt(cupsServer(), ippPort(), encryption)) == NULL)
|
||||
if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
|
||||
{
|
||||
fputs("lprm: Unable to contact server!\n", stderr);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -97,17 +84,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
if (argv[i][0] == '-' && argv[i][1] != '\0')
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'E' : /* Encrypt */
|
||||
#ifdef HAVE_LIBSSL
|
||||
encryption = HTTP_ENCRYPT_REQUIRED;
|
||||
|
||||
httpEncryption(http, encryption);
|
||||
#else
|
||||
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
|
||||
argv[0]);
|
||||
#endif /* HAVE_LIBSSL */
|
||||
break;
|
||||
|
||||
case 'P' : /* Cancel jobs on a printer */
|
||||
if (argv[i][2])
|
||||
dest = argv[i] + 2;
|
||||
@@ -116,15 +92,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
i ++;
|
||||
dest = argv[i];
|
||||
}
|
||||
|
||||
if ((instance = strchr(dest, '/')) != NULL)
|
||||
*instance = '\0';
|
||||
break;
|
||||
|
||||
default :
|
||||
fprintf(stderr, "lprm: Unknown option \'%c\'!\n", argv[i][1]);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
@@ -148,10 +119,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
op = IPP_PURGE_JOBS;
|
||||
}
|
||||
else
|
||||
{
|
||||
dest = argv[i];
|
||||
job_id = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build an IPP request, which requires the following
|
||||
@@ -178,7 +146,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if (dest)
|
||||
{
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", dest);
|
||||
sprintf(uri, "ipp://localhost/printers/%s", dest);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
|
||||
@@ -191,9 +159,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
uri);
|
||||
}
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
||||
"requesting-user-name", NULL, cupsUser());
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
@@ -205,38 +170,16 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if (response != NULL)
|
||||
{
|
||||
switch (response->request.status.status_code)
|
||||
{
|
||||
case IPP_NOT_FOUND :
|
||||
fputs("lprm: Job or printer not found!\n", stderr);
|
||||
break;
|
||||
case IPP_NOT_AUTHORIZED :
|
||||
fputs("lprm: Not authorized to lprm job(s)!\n", stderr);
|
||||
break;
|
||||
case IPP_FORBIDDEN :
|
||||
fprintf(stderr, "lprm: You don't own job ID %d!\n", job_id);
|
||||
break;
|
||||
default :
|
||||
if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
fputs("lprm: Unable to lprm job(s)!\n", stderr);
|
||||
break;
|
||||
}
|
||||
|
||||
if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
{
|
||||
ippDelete(response);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
return (1);
|
||||
}
|
||||
if (response->request.status.status_code == IPP_NOT_FOUND)
|
||||
fputs("lprm: Job or printer not found!\n", stderr);
|
||||
else if (response->request.status.status_code > IPP_OK_CONFLICT)
|
||||
fputs("lprm: Unable to cancel job(s)!\n", stderr);
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs("lprm: Unable to cancel job(s)!\n", stderr);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -250,14 +193,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
if (!cupsCancelJob(dest, 0))
|
||||
{
|
||||
fputs("lprm: Unable to cancel job(s)!\n", stderr);
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
return (1);
|
||||
}
|
||||
|
||||
cupsFreeDests(num_dests, dests);
|
||||
httpClose(http);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
+15
-53
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# CGI makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products.
|
||||
# Copyright 1997-1999 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -24,11 +24,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
CGIS = admin.cgi classes.cgi jobs.cgi printers.cgi
|
||||
TARGETS = libcgi.a $(CGIS)
|
||||
LIBOBJS = html.o ipp-var.o template.o var.o
|
||||
OBJS = $(LIBOBJS) admin.o classes.o jobs.o printers.o
|
||||
|
||||
TARGETS = classes.cgi jobs.cgi printers.cgi
|
||||
OBJS = classes.o jobs.o printers.o
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -36,85 +33,50 @@ OBJS = $(LIBOBJS) admin.o classes.o jobs.o printers.o
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Clean all object files...
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS)
|
||||
|
||||
rm -f $(OBJS) $(TARGETS)
|
||||
|
||||
#
|
||||
# Install all targets...
|
||||
#
|
||||
|
||||
install:
|
||||
$(INSTALL_DIR) $(SERVERBIN)/cgi-bin
|
||||
for file in $(CGIS); do \
|
||||
$(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \
|
||||
done
|
||||
|
||||
|
||||
#
|
||||
# libcgi.a
|
||||
#
|
||||
|
||||
libcgi.a: $(LIBOBJS)
|
||||
echo Archiving $@...
|
||||
$(RM) $@
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
$(LIBOBJS): cgi.h
|
||||
ipp-var.o: ipp-var.h
|
||||
|
||||
|
||||
#
|
||||
# admin.cgi
|
||||
#
|
||||
|
||||
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
|
||||
|
||||
-$(MKDIR) $(SERVERROOT)/cgi-bin
|
||||
$(CP) $(TARGETS) $(SERVERROOT)/cgi-bin
|
||||
|
||||
#
|
||||
# classes.cgi
|
||||
#
|
||||
|
||||
classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS)
|
||||
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
|
||||
$(CC) $(LDFLAGS) -o $@ classes.o $(LIBS)
|
||||
|
||||
$(OBJS): ../Makedefs ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
#
|
||||
# jobs.cgi
|
||||
#
|
||||
|
||||
jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS)
|
||||
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
|
||||
$(CC) $(LDFLAGS) -o $@ jobs.o $(LIBS)
|
||||
|
||||
$(OBJS): ../Makedefs ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
#
|
||||
# printers.cgi
|
||||
#
|
||||
|
||||
printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
|
||||
printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS)
|
||||
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
|
||||
$(CC) $(LDFLAGS) -o $@ printers.o $(LIBS)
|
||||
|
||||
$(OBJS): ../Makedefs ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
-1599
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* CGI support library definitions.
|
||||
*
|
||||
* Copyright 1997-2001 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
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef _CGI_H_
|
||||
# define _CGI_H_
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <ctype.h>
|
||||
|
||||
# ifdef WIN32
|
||||
# include <direct.h>
|
||||
# include <io.h>
|
||||
# include <malloc.h>
|
||||
# define strcasecmp(s,t) stricmp((s),(t))
|
||||
# define strncasecmp(s,t,n) strnicmp((s),(t),(n))
|
||||
# else
|
||||
# include <unistd.h>
|
||||
# endif /* WIN32 */
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
extern int cgiInitialize(void);
|
||||
extern void cgiAbort(const char *title, const char *stylesheet,
|
||||
const char *format, ...);
|
||||
extern int cgiCheckVariables(const char *names);
|
||||
extern const char *cgiGetArray(const char *name, int element);
|
||||
extern int cgiGetSize(const char *name);
|
||||
extern void cgiSetSize(const char *name, int size);
|
||||
extern const char *cgiGetVariable(const char *name);
|
||||
extern void cgiSetArray(const char *name, int element,
|
||||
const char *value);
|
||||
extern void cgiSetVariable(const char *name, const char *value);
|
||||
extern void cgiCopyTemplateFile(FILE *out, const char *tmpl);
|
||||
extern void cgiCopyTemplateLang(FILE *out, const char *directory,
|
||||
const char *tmpl, const char *lang);
|
||||
|
||||
extern void cgiStartHTML(FILE *out, const char *author,
|
||||
const char *stylesheet,
|
||||
const char *keywords,
|
||||
const char *description,
|
||||
const char *title, ...);
|
||||
extern void cgiEndHTML(FILE *out);
|
||||
|
||||
extern FILE *cgiEMailOpen(const char *from, const char *to,
|
||||
const char *cc, const char *subject,
|
||||
int multipart);
|
||||
extern void cgiEMailPart(FILE *mail, const char *type,
|
||||
const char *charset, const char *encoding);
|
||||
extern void cgiEMailClose(FILE *mail);
|
||||
|
||||
extern char *cgiGetCookie(const char *name, char *buf, int buflen);
|
||||
extern void cgiSetCookie(const char *name, const char *value,
|
||||
const char *path, const char *domain,
|
||||
time_t expires, int secure);
|
||||
|
||||
# define cgiGetUser() getenv("REMOTE_USER")
|
||||
# define cgiGetHost() (getenv("REMOTE_HOST") == NULL ? getenv("REMOTE_ADDR") : getenv("REMOTE_HOST"))
|
||||
|
||||
#endif /* !_CGI_H_ */
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+389
-265
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Class status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,14 +23,30 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* main() - Main entry for CGI.
|
||||
* show_class_list() - Show a list of classes...
|
||||
* show_class_info() - Show class information.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "ipp-var.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void show_class_list(http_t *http, cups_lang_t *language);
|
||||
static void show_class_info(http_t *http, cups_lang_t *language,
|
||||
char *name);
|
||||
|
||||
|
||||
/*
|
||||
@@ -42,25 +58,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
cups_lang_t *language; /* Language information */
|
||||
char *pclass; /* Printer class name */
|
||||
char *name; /* Class name */
|
||||
http_t *http; /* Connection to the server */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
ipp_status_t status; /* Operation status... */
|
||||
char uri[HTTP_MAX_URI];
|
||||
/* Printer URI */
|
||||
const char *which_jobs; /* Which jobs to show */
|
||||
const char *op; /* Operation to perform, if any */
|
||||
|
||||
|
||||
/*
|
||||
* Get any form variables...
|
||||
*/
|
||||
|
||||
cgiInitialize();
|
||||
op = cgiGetVariable("OP");
|
||||
|
||||
/*
|
||||
* Get the request language...
|
||||
*/
|
||||
@@ -71,7 +72,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Connect to the HTTP server...
|
||||
*/
|
||||
|
||||
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
/*
|
||||
* Tell the client to expect HTML...
|
||||
@@ -80,265 +81,87 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
|
||||
|
||||
/*
|
||||
* See if we need to show a list of printers or the status of a
|
||||
* single printer...
|
||||
* See if we need to show a list of classes or the status of a
|
||||
* single class...
|
||||
*/
|
||||
|
||||
ippSetServerVersion();
|
||||
name = argv[0];
|
||||
if (strcmp(name, "/") == 0 || strcmp(name, "classes.cgi") == 0)
|
||||
name = NULL;
|
||||
|
||||
pclass = argv[0];
|
||||
if (strcmp(pclass, "/") == 0 || strcmp(pclass, "classes.cgi") == 0)
|
||||
{
|
||||
pclass = NULL;
|
||||
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_CLASS));
|
||||
}
|
||||
/*
|
||||
* Print the standard header...
|
||||
*/
|
||||
|
||||
puts("<HTML>");
|
||||
puts("<HEAD>");
|
||||
if (name)
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
|
||||
else
|
||||
cgiSetVariable("TITLE", pclass);
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
|
||||
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
|
||||
name == NULL ? "Classes" : name, getenv("SERVER_NAME"));
|
||||
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
|
||||
puts("<MAP NAME=\"navbar\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"505,10,585,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
|
||||
#endif /* ESPPRINTPRO */
|
||||
puts("</MAP>");
|
||||
puts("</HEAD>");
|
||||
puts("<BODY>");
|
||||
puts("<P ALIGN=CENTER>");
|
||||
puts("<A HREF=\"http://www.easysw.com\" ALT=\"Easy Software Products Home Page\">");
|
||||
puts("<IMG SRC=\"/images/logo.gif\" WIDTH=\"71\" HEIGHT=\"40\" BORDER=0 ALT=\"Easy Software Products Home Page\"></A>");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"600\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#else
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"540\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#endif /* ESPPRINTPRO */
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
|
||||
printf("<H1>%s on %s</H1>\n", name == NULL ? "Classes" : name,
|
||||
getenv("SERVER_NAME"));
|
||||
fflush(stdout);
|
||||
|
||||
if (op == NULL || strcasecmp(op, "print-test-page") != 0)
|
||||
{
|
||||
/*
|
||||
* Get the default destination...
|
||||
*/
|
||||
puts("<CENTER>");
|
||||
puts("<TABLE WIDTH=\"90%\" BORDER=\"1\">");
|
||||
puts("<TR>");
|
||||
puts("<TH>Name</TH>");
|
||||
puts("<TH WIDTH=\"50%\">Status</TH>");
|
||||
puts("<TH WIDTH=\"25%\">Jobs</TH>");
|
||||
puts("</TR>");
|
||||
|
||||
request = ippNew();
|
||||
request->request.op.operation_id = CUPS_GET_DEFAULT;
|
||||
request->request.op.request_id = 1;
|
||||
/*
|
||||
* Show the information...
|
||||
*/
|
||||
|
||||
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 ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
|
||||
cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text);
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
char method[HTTP_MAX_URI],
|
||||
username[HTTP_MAX_URI],
|
||||
hostname[HTTP_MAX_URI],
|
||||
resource[HTTP_MAX_URI],
|
||||
uri[HTTP_MAX_URI];
|
||||
int port; /* URI data */
|
||||
const char *server; /* Name of server */
|
||||
|
||||
|
||||
/*
|
||||
* Map localhost access to localhost...
|
||||
*/
|
||||
|
||||
server = getenv("SERVER_NAME");
|
||||
|
||||
httpSeparate(attr->values[0].string.text, method, username,
|
||||
hostname, &port, resource);
|
||||
|
||||
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))
|
||||
strcpy(hostname, "localhost");
|
||||
|
||||
/*
|
||||
* Rewrite URI with HTTP address...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "http://%s:%d%s", hostname, port,
|
||||
resource);
|
||||
|
||||
cgiSetVariable("DEFAULT_URI", uri);
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the class info...
|
||||
*/
|
||||
|
||||
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);
|
||||
|
||||
if (pclass == NULL)
|
||||
{
|
||||
/*
|
||||
* Build a CUPS_GET_CLASSES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
*/
|
||||
|
||||
request->request.op.operation_id = CUPS_GET_CLASSES;
|
||||
request->request.op.request_id = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s/classes/%s", getenv("SERVER_NAME"),
|
||||
pclass);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
|
||||
uri);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write the report...
|
||||
*/
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "classes.tmpl", getenv("LANG"));
|
||||
|
||||
/*
|
||||
* Get jobs for the specified class if a class has been chosen...
|
||||
*/
|
||||
|
||||
if (pclass != NULL)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s/classes/%s", getenv("SERVER_NAME"),
|
||||
pclass);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
|
||||
uri);
|
||||
|
||||
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
|
||||
NULL, which_jobs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name == NULL)
|
||||
show_class_list(http, language);
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Print a test page...
|
||||
*/
|
||||
show_class_info(http, language, name);
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/classes/%s", pclass);
|
||||
/*
|
||||
* Write a standard trailer...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Build an IPP_PRINT_JOB request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
* requesting-user-name
|
||||
* document-format
|
||||
*/
|
||||
puts("</TABLE>");
|
||||
puts("</CENTER>");
|
||||
|
||||
request = ippNew();
|
||||
puts("<HR>");
|
||||
|
||||
request->request.op.operation_id = IPP_PRINT_JOB;
|
||||
request->request.op.request_id = 1;
|
||||
puts("<P>The Common UNIX Printing System, CUPS, and the CUPS logo are the");
|
||||
puts("trademark property of <A HREF=\"http://www.easysw.com\">Easy Software");
|
||||
puts("Products</A>. CUPS is copyright 1997-1999 by Easy Software Products,");
|
||||
puts("All Rights Reserved.");
|
||||
|
||||
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, "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");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
|
||||
NULL, "Test Page");
|
||||
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/postscript");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoFileRequest(http, request, uri + 15,
|
||||
CUPS_DATADIR "/data/testprint.ps")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", pclass);
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(status));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
else
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "test-page.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
|
||||
puts("</BODY>");
|
||||
puts("</HTML>");
|
||||
|
||||
/*
|
||||
* Close the HTTP server connection...
|
||||
@@ -355,6 +178,307 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_class_list()' - Show a list of classes...
|
||||
*/
|
||||
|
||||
static void
|
||||
show_class_list(http_t *http, /* I - HTTP connection */
|
||||
cups_lang_t *language)/* I - Client's language */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
|
||||
|
||||
/*
|
||||
* Build a CUPS_GET_CLASSES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = CUPS_GET_CLASSES;
|
||||
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);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/classes/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Loop through the classes returned in the list and display
|
||||
* their devices...
|
||||
*/
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Show the class status for each class...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
|
||||
{
|
||||
if (strcmp(attr->name, "printer-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
show_class_info(http, language, attr->values[0].string.text);
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_class_info()' - Show class information.
|
||||
*/
|
||||
|
||||
static void
|
||||
show_class_info(http_t *http,
|
||||
cups_lang_t *language,
|
||||
char *name)
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response, /* IPP response */
|
||||
*jobs; /* IPP Get Jobs response */
|
||||
int jobcount; /* Number of jobs */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
char *message; /* Printer state message */
|
||||
int accepting; /* Accepting requests? */
|
||||
ipp_pstate_t pstate; /* Printer state */
|
||||
char uri[HTTP_MAX_URI];/* Printer URI */
|
||||
|
||||
|
||||
/*
|
||||
* Build a IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
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);
|
||||
|
||||
sprintf(uri, "ipp://localhost/classes/%s", name);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, uri + 15)) == NULL)
|
||||
{
|
||||
puts("<P>Unable to communicate with CUPS server!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (response->request.status.status_code == IPP_NOT_FOUND)
|
||||
{
|
||||
puts("<P>Class does not exist.");
|
||||
ippDelete(response);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Grab the needed class attributes...
|
||||
*/
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
|
||||
pstate = (ipp_pstate_t)attr->values[0].integer;
|
||||
else
|
||||
pstate = IPP_PRINTER_IDLE;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT)) != NULL)
|
||||
message = attr->values[0].string.text;
|
||||
else
|
||||
message = NULL;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs",
|
||||
IPP_TAG_BOOLEAN)) != NULL)
|
||||
accepting = attr->values[0].boolean;
|
||||
else
|
||||
accepting = 1;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
strcpy(uri, "http:");
|
||||
strcpy(uri + 5, strchr(attr->values[0].string.text, '/'));
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the class entry...
|
||||
*/
|
||||
|
||||
puts("<TR>");
|
||||
|
||||
printf("<TD VALIGN=TOP><A HREF=\"%s\">%s</A></TD>\n", uri, name);
|
||||
|
||||
puts("<TD VALIGN=TOP><IMG SRC=\"/images/classes.gif\" ALIGN=\"LEFT\">");
|
||||
|
||||
printf("%s: %s, %s<BR>\n",
|
||||
cupsLangString(language, CUPS_MSG_PRINTER_STATE),
|
||||
cupsLangString(language, pstate == IPP_PRINTER_IDLE ? CUPS_MSG_IDLE :
|
||||
pstate == IPP_PRINTER_PROCESSING ?
|
||||
CUPS_MSG_PROCESSING : CUPS_MSG_STOPPED),
|
||||
cupsLangString(language, accepting ? CUPS_MSG_ACCEPTING_JOBS :
|
||||
CUPS_MSG_NOT_ACCEPTING_JOBS));
|
||||
|
||||
if (message)
|
||||
printf("<BR CLEAR=ALL><I>\"%s\"</I>\n", message);
|
||||
else if (!accepting || pstate == IPP_PRINTER_STOPPED)
|
||||
puts("<BR CLEAR=ALL><I>\"Reason Unknown\"</I>");
|
||||
|
||||
puts("</TD>");
|
||||
|
||||
/*
|
||||
* Show a list of jobs as needed...
|
||||
*/
|
||||
|
||||
if (pstate != IPP_PRINTER_IDLE)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
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);
|
||||
|
||||
sprintf(uri, "ipp://localhost/printers/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
|
||||
jobs = cupsDoRequest(http, request, uri + 15);
|
||||
}
|
||||
else
|
||||
jobs = NULL;
|
||||
|
||||
puts("<TD VALIGN=\"TOP\">");
|
||||
jobcount = 0;
|
||||
|
||||
if (jobs != NULL)
|
||||
{
|
||||
char *username; /* Pointer to job-originating-user-name */
|
||||
int jobid, /* job-id */
|
||||
size; /* job-k-octets */
|
||||
|
||||
|
||||
for (attr = jobs->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Pull the needed attributes from this job...
|
||||
*/
|
||||
|
||||
jobid = 0;
|
||||
size = 0;
|
||||
username = NULL;
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
|
||||
{
|
||||
if (strcmp(attr->name, "job-id") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobid = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-k-octets") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
size = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
username = attr->values[0].string.text;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the job if it matches the current class...
|
||||
*/
|
||||
|
||||
if (username != NULL)
|
||||
{
|
||||
jobcount ++;
|
||||
printf("<A HREF=\"/jobs/%d\">%s-%d %s %dk</A><BR>\n", jobid, name,
|
||||
jobid, username, size);
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(jobs);
|
||||
}
|
||||
|
||||
if (jobcount == 0)
|
||||
puts("None");
|
||||
puts("</TD>");
|
||||
puts("</TR>");
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* CGI HTML functions.
|
||||
*
|
||||
* Copyright 1997-2001 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
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cgiStartHTML() - Start an HTML document stream.
|
||||
* cgiEndHTML() - End an HTML document stream.
|
||||
*/
|
||||
|
||||
#include "cgi.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiStartHTML()' - Start an HTML document stream.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiStartHTML(FILE *out, /* I - Output file to use */
|
||||
const char *stylesheet, /* I - Stylesheet to use */
|
||||
const char *author, /* I - Author name */
|
||||
const char *keywords, /* I - Search keywords */
|
||||
const char *description, /* I - Description of document */
|
||||
const char *title, /* I - Title for page */
|
||||
...) /* I - Any addition args for title */
|
||||
{
|
||||
va_list ap; /* Argument pointer */
|
||||
|
||||
|
||||
fputs("Content-type: text/html\n\n", out);
|
||||
fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" "
|
||||
"\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n", out);
|
||||
fputs("<HTML>\n", out);
|
||||
fputs("<HEAD>\n", out);
|
||||
|
||||
fputs("\t<TITLE>\n", out);
|
||||
va_start(ap, title);
|
||||
vfprintf(out, title, ap);
|
||||
va_end(ap);
|
||||
fputs("</TITLE>\n", out);
|
||||
|
||||
if (stylesheet)
|
||||
fprintf(out, "\t<LINK REL=\"STYLESHEET\" TYPE=\"text/css\" HREF=\"%s\">\n",
|
||||
stylesheet);
|
||||
if (author)
|
||||
fprintf(out, "\t<META NAME=\"AUTHOR\" CONTENT=\"%s\">\n", author);
|
||||
if (keywords)
|
||||
fprintf(out, "\t<META NAME=\"KEYWORDS\" CONTENT=\"%s\">\n", keywords);
|
||||
if (description)
|
||||
fprintf(out, "\t<META NAME=\"DESCRIPTION\" CONTENT=\"%s\">\n", description);
|
||||
|
||||
fputs("</HEAD>\n", out);
|
||||
fputs("<BODY>\n", out);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiEndHTML()' - End an HTML document stream.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiEndHTML(FILE *out) /* I - Output file to use */
|
||||
{
|
||||
fputs("</BODY>\n", out);
|
||||
fputs("</HTML>\n", out);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -1,299 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* IPP variable routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* ippGetTemplateDir() - Get the templates directory...
|
||||
* ippSetServerVersion() - Set the server name and CUPS version...
|
||||
* ippSetCGIVars() - Set CGI variables from an IPP response.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "ipp-var.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'ippGetTemplateDir()' - Get the templates directory...
|
||||
*/
|
||||
|
||||
char * /* O - Template directory */
|
||||
ippGetTemplateDir(void)
|
||||
{
|
||||
const char *datadir; /* CUPS_DATADIR env var */
|
||||
static char templates[1024] = ""; /* Template directory */
|
||||
|
||||
|
||||
if (!templates[0])
|
||||
{
|
||||
/*
|
||||
* Build the template directory pathname...
|
||||
*/
|
||||
|
||||
if ((datadir = getenv("CUPS_DATADIR")) == NULL)
|
||||
datadir = CUPS_DATADIR;
|
||||
|
||||
snprintf(templates, sizeof(templates), "%s/templates", datadir);
|
||||
}
|
||||
|
||||
return (templates);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippSetServerVersion()' - Set the server name and CUPS version...
|
||||
*/
|
||||
|
||||
void
|
||||
ippSetServerVersion(void)
|
||||
{
|
||||
cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME"));
|
||||
cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER"));
|
||||
cgiSetVariable("CUPS_VERSION", CUPS_SVERSION);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ippSetCGIVars()' - Set CGI variables from an IPP response.
|
||||
*/
|
||||
|
||||
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 */
|
||||
{
|
||||
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 */
|
||||
value[16384], /* Value(s) */
|
||||
*valptr; /* Pointer into value */
|
||||
char method[HTTP_MAX_URI],
|
||||
username[HTTP_MAX_URI],
|
||||
hostname[HTTP_MAX_URI],
|
||||
resource[HTTP_MAX_URI],
|
||||
uri[HTTP_MAX_URI];
|
||||
int port; /* URI data */
|
||||
int ishttps; /* Using encryption? */
|
||||
const char *server; /* Name of server */
|
||||
struct tm *date; /* Date information */
|
||||
|
||||
|
||||
ippSetServerVersion();
|
||||
|
||||
server = getenv("SERVER_NAME");
|
||||
ishttps = getenv("HTTPS") != NULL;
|
||||
|
||||
for (attr = response->attrs;
|
||||
attr && attr->group_tag == IPP_TAG_OPERATION;
|
||||
attr = attr->next);
|
||||
|
||||
for (element = 0; attr != NULL; attr = attr->next, element ++)
|
||||
{
|
||||
/*
|
||||
* Copy attributes to a separator...
|
||||
*/
|
||||
|
||||
if (filter_name)
|
||||
{
|
||||
for (filter = attr;
|
||||
filter != NULL && filter->group_tag != IPP_TAG_ZERO;
|
||||
filter = filter->next)
|
||||
if (filter->name && strcmp(filter->name, filter_name) == 0 &&
|
||||
(filter->value_tag == IPP_TAG_STRING ||
|
||||
(filter->value_tag >= IPP_TAG_TEXTLANG &&
|
||||
filter->value_tag <= IPP_TAG_MIMETYPE)) &&
|
||||
filter->values[0].string.text != NULL &&
|
||||
strcasecmp(filter->values[0].string.text, filter_value) == 0)
|
||||
break;
|
||||
|
||||
if (!filter)
|
||||
return;
|
||||
|
||||
if (filter->group_tag == IPP_TAG_ZERO)
|
||||
{
|
||||
attr = filter;
|
||||
element --;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (; attr != NULL && attr->group_tag != IPP_TAG_ZERO; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Copy the attribute name, substituting "_" for "-"...
|
||||
*/
|
||||
|
||||
if (attr->name == NULL)
|
||||
continue;
|
||||
|
||||
for (i = 0; attr->name[i]; i ++)
|
||||
if (attr->name[i] == '-')
|
||||
name[i] = '_';
|
||||
else
|
||||
name[i] = attr->name[i];
|
||||
|
||||
name[i] = '\0';
|
||||
|
||||
/*
|
||||
* Add "job_printer_name" variable if we have a "job_printer_uri"
|
||||
* attribute...
|
||||
*/
|
||||
|
||||
if (strcmp(name, "job_printer_uri") == 0)
|
||||
{
|
||||
if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL)
|
||||
valptr = "unknown";
|
||||
else
|
||||
valptr ++;
|
||||
|
||||
cgiSetArray("job_printer_name", element, valptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
if (i)
|
||||
strncat(valptr, ",", sizeof(value) - (valptr - value) - 1);
|
||||
|
||||
valptr += strlen(valptr);
|
||||
|
||||
switch (attr->value_tag)
|
||||
{
|
||||
case IPP_TAG_INTEGER :
|
||||
case IPP_TAG_ENUM :
|
||||
if (strncmp(name, "time_at_", 8) == 0)
|
||||
{
|
||||
date = localtime((time_t *)&(attr->values[i].integer));
|
||||
strftime(valptr, sizeof(value) - (valptr - value),
|
||||
CUPS_STRFTIME_FORMAT, date);
|
||||
}
|
||||
else
|
||||
snprintf(valptr, sizeof(value) - (valptr - value),
|
||||
"%d", attr->values[i].integer);
|
||||
break;
|
||||
|
||||
case IPP_TAG_BOOLEAN :
|
||||
snprintf(valptr, sizeof(value) - (valptr - value),
|
||||
"%d", attr->values[i].boolean);
|
||||
break;
|
||||
|
||||
case IPP_TAG_NOVALUE :
|
||||
strncat(valptr, "novalue", sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
snprintf(valptr, sizeof(value) - (valptr - value),
|
||||
"%d-%d", attr->values[i].range.lower,
|
||||
attr->values[i].range.upper);
|
||||
break;
|
||||
|
||||
case IPP_TAG_RESOLUTION :
|
||||
snprintf(valptr, sizeof(value) - (valptr - value),
|
||||
"%dx%d%s", attr->values[i].resolution.xres,
|
||||
attr->values[i].resolution.yres,
|
||||
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
|
||||
"dpi" : "dpc");
|
||||
break;
|
||||
|
||||
case IPP_TAG_URI :
|
||||
if (strchr(attr->values[i].string.text, ':') != NULL)
|
||||
{
|
||||
httpSeparate(attr->values[i].string.text, method, username,
|
||||
hostname, &port, resource);
|
||||
|
||||
if (strcmp(method, "ipp") == 0 ||
|
||||
strcmp(method, "http") == 0)
|
||||
{
|
||||
/*
|
||||
* Map localhost access to localhost and local port...
|
||||
*/
|
||||
|
||||
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))
|
||||
{
|
||||
strcpy(hostname, "localhost");
|
||||
port = atoi(getenv("SERVER_PORT"));
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
strncat(valptr, uri, sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case IPP_TAG_STRING :
|
||||
case IPP_TAG_TEXT :
|
||||
case IPP_TAG_NAME :
|
||||
case IPP_TAG_KEYWORD :
|
||||
case IPP_TAG_CHARSET :
|
||||
case IPP_TAG_LANGUAGE :
|
||||
strncat(valptr, attr->values[i].string.text,
|
||||
sizeof(value) - (valptr - value) - 1);
|
||||
break;
|
||||
|
||||
default :
|
||||
break; /* anti-compiler-warning-code */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the element...
|
||||
*/
|
||||
|
||||
cgiSetArray(name, element, value);
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* IPP variable definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/debug.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/string.h>
|
||||
#include "cgi.h"
|
||||
|
||||
|
||||
/*
|
||||
* Definitions...
|
||||
*/
|
||||
|
||||
#define TEMPLATES ippGetTemplateDir()
|
||||
|
||||
|
||||
/*
|
||||
* Prototype...
|
||||
*/
|
||||
|
||||
extern char *ippGetTemplateDir(void);
|
||||
extern void ippSetServerVersion(void);
|
||||
extern void ippSetCGIVars(ipp_t *, const char *, const char *);
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+495
-50
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Job status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,14 +23,30 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* main() - Main entry for CGI.
|
||||
* show_job_list() - Show a list of jobs...
|
||||
* show_job_info() - Show job information.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "ipp-var.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void show_job_list(http_t *http, cups_lang_t *language);
|
||||
static void show_job_info(http_t *http, cups_lang_t *language,
|
||||
char *name);
|
||||
|
||||
|
||||
/*
|
||||
@@ -42,17 +58,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
cups_lang_t *language; /* Language information */
|
||||
char *job; /* Job name */
|
||||
http_t *http; /* Connection to the server */
|
||||
const char *which_jobs; /* Which jobs to show */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
|
||||
|
||||
/*
|
||||
* Get any form variables...
|
||||
*/
|
||||
|
||||
cgiInitialize();
|
||||
|
||||
/*
|
||||
* Get the request language...
|
||||
@@ -64,7 +72,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Connect to the HTTP server...
|
||||
*/
|
||||
|
||||
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
/*
|
||||
* Tell the client to expect HTML...
|
||||
@@ -72,52 +80,75 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
|
||||
|
||||
cgiSetVariable("TITLE", "Jobs");
|
||||
|
||||
ippSetServerVersion();
|
||||
|
||||
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
|
||||
* See if we need to show a list of jobs or the status of a
|
||||
* single job...
|
||||
*/
|
||||
|
||||
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);
|
||||
job = argv[0];
|
||||
if (strcmp(job, "/") == 0 || strcmp(job, "jobs.cgi") == 0)
|
||||
job = NULL;
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
* Print the standard header...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
puts("<HTML>");
|
||||
puts("<HEAD>");
|
||||
if (job)
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
|
||||
else
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
|
||||
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
|
||||
job == NULL ? "Jobs" : job, getenv("SERVER_NAME"));
|
||||
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
|
||||
puts("<MAP NAME=\"navbar\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"505,10,585,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
|
||||
#endif /* ESPPRINTPRO */
|
||||
puts("</MAP>");
|
||||
puts("</HEAD>");
|
||||
puts("<BODY>");
|
||||
puts("<P ALIGN=CENTER>");
|
||||
puts("<A HREF=\"http://www.easysw.com\" ALT=\"Easy Software Products Home Page\">");
|
||||
puts("<IMG SRC=\"/images/logo.gif\" WIDTH=\"71\" HEIGHT=\"40\" BORDER=0 ALT=\"Easy Software Products Home Page\"></A>");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"600\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#else
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"540\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#endif /* ESPPRINTPRO */
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
fflush(stdout);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
|
||||
/*
|
||||
* Show the information...
|
||||
*/
|
||||
|
||||
if (job == NULL)
|
||||
show_job_list(http, language);
|
||||
else
|
||||
show_job_info(http, language, job);
|
||||
|
||||
/*
|
||||
* Write a standard trailer...
|
||||
*/
|
||||
|
||||
puts("<HR>");
|
||||
|
||||
puts("<P>The Common UNIX Printing System, CUPS, and the CUPS logo are the");
|
||||
puts("trademark property of <A HREF=\"http://www.easysw.com\">Easy Software");
|
||||
puts("Products</A>. CUPS is copyright 1997-1999 by Easy Software Products,");
|
||||
puts("All Rights Reserved.");
|
||||
|
||||
puts("</BODY>");
|
||||
puts("</HTML>");
|
||||
|
||||
/*
|
||||
* Close the HTTP server connection...
|
||||
@@ -134,6 +165,420 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_job_list()' - Show a list of jobs...
|
||||
*/
|
||||
|
||||
static void
|
||||
show_job_list(http_t *http, /* I - HTTP connection */
|
||||
cups_lang_t *language) /* I - Client's language */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
char *job_uri, /* job-uri */
|
||||
*printer_uri, /* job-printer-uri */
|
||||
*job_name, /* job-name */
|
||||
*job_user; /* job-originating-user-name */
|
||||
int job_id, /* job-id */
|
||||
job_priority, /* job-priority */
|
||||
job_k_octets, /* job-k-octets */
|
||||
copies; /* copies */
|
||||
ipp_jstate_t job_state; /* job-state */
|
||||
|
||||
|
||||
printf("<H1>Jobs on %s</H1>\n", getenv("SERVER_NAME"));
|
||||
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
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, "ipp://localhost/jobs/");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/jobs/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Do a table for the jobs...
|
||||
*/
|
||||
|
||||
puts("<CENTER>");
|
||||
puts("<TABLE WIDTH=\"90%\" BORDER=\"1\">");
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_PRINT_JOBS));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_JOB_STATE));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_JOB_NAME));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_USER_NAME));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_PRIORITY));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_COPIES));
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_FILE_SIZE));
|
||||
puts("</TR>");
|
||||
|
||||
/*
|
||||
* Loop through the jobs returned in the list and display
|
||||
* their devices...
|
||||
*/
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Show the job status for each job...
|
||||
*/
|
||||
|
||||
job_uri = NULL;
|
||||
printer_uri = NULL;
|
||||
job_name = "unknown";
|
||||
job_user = "unknown";
|
||||
job_id = 0;
|
||||
job_priority = 50;
|
||||
job_k_octets = 0;
|
||||
copies = 1;
|
||||
job_state = IPP_JOB_PENDING;
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
|
||||
{
|
||||
if (strcmp(attr->name, "job-uri") == 0 &&
|
||||
attr->value_tag == IPP_TAG_URI)
|
||||
job_uri = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-printer-uri") == 0 &&
|
||||
attr->value_tag == IPP_TAG_URI)
|
||||
printer_uri = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
job_name = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
job_user = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-id") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
job_id = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-priority") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
job_priority = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-k-octets") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
job_k_octets = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "copies") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
copies = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-state") == 0 &&
|
||||
attr->value_tag == IPP_TAG_ENUM)
|
||||
job_state = (ipp_jstate_t)attr->values[0].integer;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have everything needed...
|
||||
*/
|
||||
|
||||
if (job_id && job_uri != NULL && printer_uri != NULL)
|
||||
{
|
||||
puts("<TR>");
|
||||
printf("<TD><A HREF=\"http://%s:%s/jobs/%d\">%s-%d</A></TD>\n",
|
||||
getenv("SERVER_NAME"), getenv("SERVER_PORT"), job_id,
|
||||
strrchr(printer_uri, '/') + 1, job_id);
|
||||
printf("<TD>%s</TD>\n", job_state == IPP_JOB_PROCESSING ?
|
||||
cupsLangString(language, CUPS_MSG_PROCESSING) :
|
||||
cupsLangString(language, CUPS_MSG_PENDING));
|
||||
printf("<TD>%s</TD>\n", job_name);
|
||||
printf("<TD>%s</TD>\n", job_user);
|
||||
printf("<TD>%d</TD>\n", job_priority);
|
||||
printf("<TD>%d</TD>\n", copies);
|
||||
printf("<TD>%dk</TD>\n", job_k_octets);
|
||||
puts("</TR>");
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
|
||||
puts("</TABLE>");
|
||||
puts("</CENTER>");
|
||||
}
|
||||
else
|
||||
puts("<P>No jobs found.");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_job_info()' - Show job information.
|
||||
*/
|
||||
|
||||
static void
|
||||
show_job_info(http_t *http, /* I - Server connection */
|
||||
cups_lang_t *language, /* I - Language */
|
||||
char *name) /* I - Job "name" */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
char uri[HTTP_MAX_URI];/* Real URI */
|
||||
char *job_uri, /* job-uri */
|
||||
*printer_uri, /* job-printer-uri */
|
||||
*job_name, /* job-name */
|
||||
*job_user; /* job-originating-user-name */
|
||||
int job_id, /* job-id */
|
||||
job_priority, /* job-priority */
|
||||
job_k_octets; /* job-k-octets */
|
||||
ipp_jstate_t job_state; /* job-state */
|
||||
|
||||
|
||||
/*
|
||||
* Build an IPP_GET_JOB_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOB_ATTRIBUTES;
|
||||
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);
|
||||
|
||||
sprintf(uri, "ipp://localhost/jobs/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, uri + 15)) == NULL)
|
||||
{
|
||||
puts("<P>Unable to communicate with CUPS server!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (response->request.status.status_code == IPP_NOT_FOUND)
|
||||
{
|
||||
puts("<P>Job does not exist or has completed.");
|
||||
ippDelete(response);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the job status for this job...
|
||||
*/
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL)
|
||||
job_uri = attr->values[0].string.text;
|
||||
else
|
||||
{
|
||||
puts("<P>Missing job-uri attribute!");
|
||||
ippDelete(request);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-printer-uri", IPP_TAG_URI)) != NULL)
|
||||
printer_uri = attr->values[0].string.text;
|
||||
else
|
||||
{
|
||||
puts("<P>Missing job-printer-uri attribute!");
|
||||
ippDelete(request);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-name", IPP_TAG_NAME)) != NULL)
|
||||
job_name = attr->values[0].string.text;
|
||||
else
|
||||
job_name = "unknown";
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-originating-user-name",
|
||||
IPP_TAG_NAME)) != NULL)
|
||||
job_user = attr->values[0].string.text;
|
||||
else
|
||||
job_user = "unknown";
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL)
|
||||
job_id = attr->values[0].integer;
|
||||
else
|
||||
{
|
||||
puts("<P>Missing job-id attribute!");
|
||||
ippDelete(request);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-priority", IPP_TAG_INTEGER)) != NULL)
|
||||
job_priority = attr->values[0].integer;
|
||||
else
|
||||
job_priority = 50;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
|
||||
job_k_octets = attr->values[0].integer;
|
||||
else
|
||||
job_k_octets = 0;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM)) != NULL)
|
||||
job_state = (ipp_jstate_t)attr->values[0].integer;
|
||||
else
|
||||
job_state = IPP_JOB_PENDING;
|
||||
|
||||
/*
|
||||
* Do a table for the job...
|
||||
*/
|
||||
|
||||
printf("<H1><A HREF=\"http://%s:%s/printers/%s\">%s-%d</A></H1>\n",
|
||||
getenv("SERVER_NAME"), getenv("SERVER_PORT"),
|
||||
strrchr(printer_uri, '/') + 1, strrchr(printer_uri, '/') + 1, job_id);
|
||||
|
||||
puts("<CENTER>");
|
||||
puts("<TABLE WIDTH=\"90%\" BORDER=\"1\">");
|
||||
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_JOB_STATE));
|
||||
printf("<TD>%s</TD>\n", job_state == IPP_JOB_PROCESSING ?
|
||||
cupsLangString(language, CUPS_MSG_PROCESSING) :
|
||||
cupsLangString(language, CUPS_MSG_PENDING));
|
||||
puts("</TR>");
|
||||
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_JOB_NAME));
|
||||
printf("<TD>%s</TD>\n", job_name);
|
||||
puts("</TR>");
|
||||
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_USER_NAME));
|
||||
printf("<TD>%s</TD>\n", job_user);
|
||||
puts("</TR>");
|
||||
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_PRIORITY));
|
||||
printf("<TD>%d</TD>\n", job_priority);
|
||||
puts("</TR>");
|
||||
|
||||
puts("<TR>");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_FILE_SIZE));
|
||||
printf("<TD>%dk</TD>\n", job_k_octets);
|
||||
puts("</TR>");
|
||||
|
||||
puts("<TR VALIGN=\"TOP\">");
|
||||
printf("<TH>%s</TH>\n", cupsLangString(language, CUPS_MSG_OPTIONS));
|
||||
puts("<TD>");
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
if (attr->group_tag != IPP_TAG_JOB &&
|
||||
attr->group_tag != IPP_TAG_EXTENSION)
|
||||
continue;
|
||||
|
||||
if (strcmp(attr->name, "job-uri") == 0 ||
|
||||
strcmp(attr->name, "job-printer-uri") == 0 ||
|
||||
strcmp(attr->name, "job-name") == 0 ||
|
||||
strcmp(attr->name, "job-originating-user-name") == 0 ||
|
||||
strcmp(attr->name, "job-id") == 0 ||
|
||||
strcmp(attr->name, "job-priority") == 0 ||
|
||||
strcmp(attr->name, "job-k-octets") == 0 ||
|
||||
strcmp(attr->name, "job-state") == 0)
|
||||
continue;
|
||||
|
||||
if (attr->value_tag != IPP_TAG_BOOLEAN)
|
||||
printf("%s=", attr->name);
|
||||
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
if (i)
|
||||
putchar(',');
|
||||
|
||||
switch (attr->value_tag)
|
||||
{
|
||||
case IPP_TAG_INTEGER :
|
||||
case IPP_TAG_ENUM :
|
||||
printf("%d", attr->values[i].integer);
|
||||
break;
|
||||
|
||||
case IPP_TAG_BOOLEAN :
|
||||
if (!attr->values[i].boolean)
|
||||
printf("no");
|
||||
|
||||
case IPP_TAG_NOVALUE :
|
||||
fputs(attr->name, stdout);
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
printf("%d-%d", attr->values[i].range.lower,
|
||||
attr->values[i].range.upper);
|
||||
break;
|
||||
|
||||
case IPP_TAG_RESOLUTION :
|
||||
printf("%dx%d%s", attr->values[i].resolution.xres,
|
||||
attr->values[i].resolution.yres,
|
||||
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
|
||||
"dpi" : "dpc");
|
||||
break;
|
||||
|
||||
case IPP_TAG_STRING :
|
||||
case IPP_TAG_TEXT :
|
||||
case IPP_TAG_NAME :
|
||||
case IPP_TAG_KEYWORD :
|
||||
case IPP_TAG_CHARSET :
|
||||
case IPP_TAG_LANGUAGE :
|
||||
case IPP_TAG_MIMETYPE :
|
||||
case IPP_TAG_URI :
|
||||
printf("\"%s\"", attr->values[i].string.text);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
puts("<BR>");
|
||||
}
|
||||
|
||||
puts("</TD>");
|
||||
puts("</TR>");
|
||||
puts("</TABLE></CENTER>");
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+386
-260
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Printer status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -23,14 +23,30 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* main() - Main entry for CGI.
|
||||
* show_printer_list() - Show a list of printers...
|
||||
* show_printer_info() - Show printer information.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "ipp-var.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void show_printer_list(http_t *http, cups_lang_t *language);
|
||||
static void show_printer_info(http_t *http, cups_lang_t *language,
|
||||
char *name);
|
||||
|
||||
|
||||
/*
|
||||
@@ -44,22 +60,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
cups_lang_t *language; /* Language information */
|
||||
char *printer; /* Printer name */
|
||||
http_t *http; /* Connection to the server */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
ipp_status_t status; /* Operation status... */
|
||||
char uri[HTTP_MAX_URI];
|
||||
/* Printer URI */
|
||||
const char *which_jobs; /* Which jobs to show */
|
||||
const char *op; /* Operation to perform, if any */
|
||||
|
||||
|
||||
/*
|
||||
* Get any form variables...
|
||||
*/
|
||||
|
||||
cgiInitialize();
|
||||
op = cgiGetVariable("OP");
|
||||
|
||||
/*
|
||||
* Get the request language...
|
||||
@@ -71,7 +72,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Connect to the HTTP server...
|
||||
*/
|
||||
|
||||
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
/*
|
||||
* Tell the client to expect HTML...
|
||||
@@ -84,261 +85,83 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* single printer...
|
||||
*/
|
||||
|
||||
ippSetServerVersion();
|
||||
|
||||
printer = argv[0];
|
||||
if (strcmp(printer, "/") == 0 || strcmp(printer, "printers.cgi") == 0)
|
||||
{
|
||||
printer = NULL;
|
||||
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_PRINTER));
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the standard header...
|
||||
*/
|
||||
|
||||
puts("<HTML>");
|
||||
puts("<HEAD>");
|
||||
if (printer)
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
|
||||
else
|
||||
cgiSetVariable("TITLE", printer);
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
|
||||
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
|
||||
printer == NULL ? "Printers" : printer, getenv("SERVER_NAME"));
|
||||
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
|
||||
puts("<MAP NAME=\"navbar\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"505,10,585,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
|
||||
#endif /* ESPPRINTPRO */
|
||||
puts("</MAP>");
|
||||
puts("</HEAD>");
|
||||
puts("<BODY>");
|
||||
puts("<P ALIGN=CENTER>");
|
||||
puts("<A HREF=\"http://www.easysw.com\" ALT=\"Easy Software Products Home Page\">");
|
||||
puts("<IMG SRC=\"/images/logo.gif\" WIDTH=\"71\" HEIGHT=\"40\" BORDER=0 ALT=\"Easy Software Products Home Page\"></A>");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"600\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#else
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"540\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
#endif /* ESPPRINTPRO */
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
|
||||
printf("<H1>%s on %s</H1>\n", printer == NULL ? "Printers" : printer,
|
||||
getenv("SERVER_NAME"));
|
||||
fflush(stdout);
|
||||
|
||||
if (op == NULL || strcasecmp(op, "print-test-page") != 0)
|
||||
{
|
||||
/*
|
||||
* Get the default destination...
|
||||
*/
|
||||
puts("<CENTER>");
|
||||
puts("<TABLE WIDTH=\"90%\" BORDER=\"1\">");
|
||||
puts("<TR>");
|
||||
puts("<TH>Name</TH>");
|
||||
puts("<TH WIDTH=\"50%\">Status</TH>");
|
||||
puts("<TH WIDTH=\"25%\">Jobs</TH>");
|
||||
puts("</TR>");
|
||||
|
||||
request = ippNew();
|
||||
request->request.op.operation_id = CUPS_GET_DEFAULT;
|
||||
request->request.op.request_id = 1;
|
||||
/*
|
||||
* Show the information...
|
||||
*/
|
||||
|
||||
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 ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
|
||||
cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text);
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
char method[HTTP_MAX_URI],
|
||||
username[HTTP_MAX_URI],
|
||||
hostname[HTTP_MAX_URI],
|
||||
resource[HTTP_MAX_URI],
|
||||
uri[HTTP_MAX_URI];
|
||||
int port; /* URI data */
|
||||
const char *server; /* Name of server */
|
||||
|
||||
|
||||
/*
|
||||
* Map localhost access to localhost...
|
||||
*/
|
||||
|
||||
server = getenv("SERVER_NAME");
|
||||
|
||||
httpSeparate(attr->values[0].string.text, method, username,
|
||||
hostname, &port, resource);
|
||||
|
||||
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))
|
||||
strcpy(hostname, "localhost");
|
||||
|
||||
/*
|
||||
* Rewrite URI with HTTP address...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "http://%s:%d%s", hostname, port,
|
||||
resource);
|
||||
|
||||
cgiSetVariable("DEFAULT_URI", uri);
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the printer info...
|
||||
*/
|
||||
|
||||
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);
|
||||
|
||||
if (printer == NULL)
|
||||
{
|
||||
/*
|
||||
* Build a CUPS_GET_PRINTERS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
*/
|
||||
|
||||
request->request.op.operation_id = CUPS_GET_PRINTERS;
|
||||
request->request.op.request_id = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s/printers/%s", getenv("SERVER_NAME"),
|
||||
printer);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
|
||||
uri);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write the report...
|
||||
*/
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "printers.tmpl", getenv("LANG"));
|
||||
|
||||
/*
|
||||
* Get jobs for the specified printer if a printer has been chosen...
|
||||
*/
|
||||
|
||||
if (printer != NULL)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s/printers/%s", getenv("SERVER_NAME"),
|
||||
printer);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
|
||||
uri);
|
||||
|
||||
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
|
||||
NULL, which_jobs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
ippDelete(response);
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (printer == NULL)
|
||||
show_printer_list(http, language);
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Print a test page...
|
||||
*/
|
||||
show_printer_info(http, language, printer);
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", printer);
|
||||
/*
|
||||
* Write a standard trailer...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Build an IPP_PRINT_JOB request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
* requesting-user-name
|
||||
* document-format
|
||||
*/
|
||||
puts("</TABLE>");
|
||||
puts("</CENTER>");
|
||||
|
||||
request = ippNew();
|
||||
puts("<HR>");
|
||||
|
||||
request->request.op.operation_id = IPP_PRINT_JOB;
|
||||
request->request.op.request_id = 1;
|
||||
puts("<P>The Common UNIX Printing System, CUPS, and the CUPS logo are the");
|
||||
puts("trademark property of <A HREF=\"http://www.easysw.com\">Easy Software");
|
||||
puts("Products</A>. CUPS is copyright 1997-1999 by Easy Software Products,");
|
||||
puts("All Rights Reserved.");
|
||||
|
||||
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, "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");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
|
||||
NULL, "Test Page");
|
||||
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/postscript");
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoFileRequest(http, request, uri + 15,
|
||||
CUPS_DATADIR "/data/testprint.ps")) != NULL)
|
||||
{
|
||||
status = response->request.status.status_code;
|
||||
ippSetCGIVars(response, NULL, NULL);
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
status = IPP_GONE;
|
||||
|
||||
cgiSetVariable("PRINTER_NAME", printer);
|
||||
|
||||
if (status > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiSetVariable("ERROR", ippErrorString(status));
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
|
||||
}
|
||||
else
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "test-page.tmpl", getenv("LANG"));
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
|
||||
puts("</BODY>");
|
||||
puts("</HTML>");
|
||||
|
||||
/*
|
||||
* Close the HTTP server connection...
|
||||
@@ -355,6 +178,309 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_printer_list()' - Show a list of printers...
|
||||
*/
|
||||
|
||||
static void
|
||||
show_printer_list(http_t *http, /* I - HTTP connection */
|
||||
cups_lang_t *language)/* I - Client's language */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
|
||||
|
||||
/*
|
||||
* Build a CUPS_GET_PRINTERS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = CUPS_GET_PRINTERS;
|
||||
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);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/printers/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Loop through the printers returned in the list and display
|
||||
* their devices...
|
||||
*/
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Show the printer status for each printer...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
|
||||
{
|
||||
if (strcmp(attr->name, "printer-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
show_printer_info(http, language, attr->values[0].string.text);
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_printer_info()' - Show printer information.
|
||||
*/
|
||||
|
||||
static void
|
||||
show_printer_info(http_t *http,
|
||||
cups_lang_t *language,
|
||||
char *name)
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response, /* IPP response */
|
||||
*jobs; /* IPP Get Jobs response */
|
||||
int jobcount; /* Number of jobs */
|
||||
ipp_attribute_t *attr; /* IPP attribute */
|
||||
char *message; /* Printer state message */
|
||||
int accepting; /* Accepting requests? */
|
||||
ipp_pstate_t pstate; /* Printer state */
|
||||
char uri[HTTP_MAX_URI];/* Printer URI */
|
||||
|
||||
|
||||
/*
|
||||
* Build a IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
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);
|
||||
|
||||
sprintf(uri, "ipp://localhost/printers/%s", name);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, uri + 15)) == NULL)
|
||||
{
|
||||
puts("<P>Unable to communicate with CUPS server!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (response->request.status.status_code == IPP_NOT_FOUND)
|
||||
{
|
||||
puts("<P>Printer does not exist.");
|
||||
ippDelete(response);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Grab the needed printer attributes...
|
||||
*/
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
|
||||
pstate = (ipp_pstate_t)attr->values[0].integer;
|
||||
else
|
||||
pstate = IPP_PRINTER_IDLE;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT)) != NULL)
|
||||
message = attr->values[0].string.text;
|
||||
else
|
||||
message = NULL;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs",
|
||||
IPP_TAG_BOOLEAN)) != NULL)
|
||||
accepting = attr->values[0].boolean;
|
||||
else
|
||||
accepting = 1;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
strcpy(uri, "http:");
|
||||
strcpy(uri + 5, strchr(attr->values[0].string.text, '/'));
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the printer entry...
|
||||
*/
|
||||
|
||||
puts("<TR>");
|
||||
|
||||
printf("<TD VALIGN=TOP><A HREF=\"%s\">%s</A></TD>\n", uri, name);
|
||||
|
||||
printf("<TD VALIGN=TOP><IMG SRC=\"/images/printer-%s.gif\" ALIGN=\"LEFT\">\n",
|
||||
pstate == IPP_PRINTER_IDLE ? "idle" :
|
||||
pstate == IPP_PRINTER_PROCESSING ? "processing" : "stopped");
|
||||
|
||||
printf("%s: %s, %s<BR>\n",
|
||||
cupsLangString(language, CUPS_MSG_PRINTER_STATE),
|
||||
cupsLangString(language, pstate == IPP_PRINTER_IDLE ? CUPS_MSG_IDLE :
|
||||
pstate == IPP_PRINTER_PROCESSING ?
|
||||
CUPS_MSG_PROCESSING : CUPS_MSG_STOPPED),
|
||||
cupsLangString(language, accepting ? CUPS_MSG_ACCEPTING_JOBS :
|
||||
CUPS_MSG_NOT_ACCEPTING_JOBS));
|
||||
|
||||
if (message)
|
||||
printf("<BR CLEAR=ALL><I>\"%s\"</I>\n", message);
|
||||
else if (!accepting || pstate == IPP_PRINTER_STOPPED)
|
||||
puts("<BR CLEAR=ALL><I>\"Reason Unknown\"</I>");
|
||||
|
||||
puts("</TD>");
|
||||
|
||||
/*
|
||||
* Show a list of jobs as needed...
|
||||
*/
|
||||
|
||||
if (pstate != IPP_PRINTER_IDLE)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
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);
|
||||
|
||||
sprintf(uri, "ipp://localhost/printers/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
|
||||
jobs = cupsDoRequest(http, request, uri + 15);
|
||||
}
|
||||
else
|
||||
jobs = NULL;
|
||||
|
||||
puts("<TD VALIGN=\"TOP\">");
|
||||
jobcount = 0;
|
||||
|
||||
if (jobs != NULL)
|
||||
{
|
||||
char *username; /* Pointer to job-originating-user-name */
|
||||
int jobid, /* job-id */
|
||||
size; /* job-k-octets */
|
||||
|
||||
|
||||
for (attr = jobs->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Pull the needed attributes from this job...
|
||||
*/
|
||||
|
||||
jobid = 0;
|
||||
size = 0;
|
||||
username = NULL;
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
|
||||
{
|
||||
if (strcmp(attr->name, "job-id") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobid = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-k-octets") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
size = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
username = attr->values[0].string.text;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the job if it matches the current printer...
|
||||
*/
|
||||
|
||||
if (username != NULL)
|
||||
{
|
||||
jobcount ++;
|
||||
printf("<A HREF=\"/jobs/%d\">%s-%d %s %dk</A><BR>\n", jobid, name,
|
||||
jobid, username, size);
|
||||
}
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(jobs);
|
||||
}
|
||||
|
||||
if (jobcount == 0)
|
||||
puts("None");
|
||||
puts("</TD>");
|
||||
puts("</TR>");
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -1,499 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* CGI template function.
|
||||
*
|
||||
* Copyright 1997-2001 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
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cgiCopyTemplateFile() - Copy a template file and replace all the
|
||||
* '{variable}' strings with the variable value.
|
||||
* cgiCopyTemplateLang() - Copy a template file using a language...
|
||||
* cgi_copy() - Copy the template file, substituting as needed...
|
||||
* cgi_puts() - Put a string to the output file, quoting as
|
||||
* needed...
|
||||
*/
|
||||
|
||||
#include "cgi.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void cgi_copy(FILE *out, FILE *in, int element, char term);
|
||||
static void cgi_puts(const char *s, FILE *out);
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiCopyTemplateFile()' - Copy a template file and replace all the
|
||||
* '{variable}' strings with the variable value.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiCopyTemplateFile(FILE *out, /* I - Output file */
|
||||
const char *tmpl) /* I - Template file to read */
|
||||
{
|
||||
FILE *in; /* Input file */
|
||||
|
||||
|
||||
/*
|
||||
* Open the template file...
|
||||
*/
|
||||
|
||||
if ((in = fopen(tmpl, "r")) == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Parse the file to the end...
|
||||
*/
|
||||
|
||||
cgi_copy(out, in, 0, 0);
|
||||
|
||||
/*
|
||||
* Close the template file and return...
|
||||
*/
|
||||
|
||||
fclose(in);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiCopyTemplateLang()' - Copy a template file using a language...
|
||||
*/
|
||||
|
||||
void
|
||||
cgiCopyTemplateLang(FILE *out, /* I - Output file */
|
||||
const char *directory, /* I - Directory */
|
||||
const char *tmpl, /* I - Base filename */
|
||||
const char *lang) /* I - Language */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char filename[1024], /* Filename */
|
||||
locale[16]; /* Locale name */
|
||||
FILE *in; /* Input file */
|
||||
|
||||
|
||||
/*
|
||||
* Convert the language to a locale name...
|
||||
*/
|
||||
|
||||
if (lang != NULL)
|
||||
{
|
||||
for (i = 0; lang[i] && i < 15; i ++)
|
||||
if (isalnum(lang[i]))
|
||||
locale[i] = tolower(lang[i]);
|
||||
else
|
||||
locale[i] = '_';
|
||||
|
||||
locale[i] = '\0';
|
||||
}
|
||||
else
|
||||
locale[0] = '\0';
|
||||
|
||||
/*
|
||||
* See if we have a template file for this language...
|
||||
*/
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
|
||||
if (access(filename, 0))
|
||||
{
|
||||
locale[2] = '\0';
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
|
||||
if (access(filename, 0))
|
||||
snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl);
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the template file...
|
||||
*/
|
||||
|
||||
if ((in = fopen(filename, "r")) == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Parse the file to the end...
|
||||
*/
|
||||
|
||||
cgi_copy(out, in, 0, 0);
|
||||
|
||||
/*
|
||||
* Close the template file and return...
|
||||
*/
|
||||
|
||||
fclose(in);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_copy()' - Copy the template file, substituting as needed...
|
||||
*/
|
||||
|
||||
static void
|
||||
cgi_copy(FILE *out, /* I - Output file */
|
||||
FILE *in, /* I - Input file */
|
||||
int element, /* I - Element number (0 to N) */
|
||||
char term) /* I - Terminating character */
|
||||
{
|
||||
int ch; /* Character from file */
|
||||
char op; /* Operation */
|
||||
char name[255], /* Name of variable */
|
||||
*nameptr, /* Pointer into name */
|
||||
innername[255], /* Inner comparison name */
|
||||
*innerptr, /* Pointer into inner name */
|
||||
*s; /* String pointer */
|
||||
const char *value; /* Value of variable */
|
||||
const char *innerval; /* Inner value */
|
||||
const char *outptr; /* Output string pointer */
|
||||
char outval[1024], /* Formatted output string */
|
||||
compare[1024]; /* Comparison string */
|
||||
int result; /* Result of comparison */
|
||||
|
||||
|
||||
/*
|
||||
* Parse the file to the end...
|
||||
*/
|
||||
|
||||
while ((ch = getc(in)) != EOF)
|
||||
if (ch == term)
|
||||
break;
|
||||
else if (ch == '{')
|
||||
{
|
||||
/*
|
||||
* Get a variable name...
|
||||
*/
|
||||
|
||||
for (s = name; (ch = getc(in)) != EOF;)
|
||||
if (strchr("}]<>=! \t\n", ch))
|
||||
break;
|
||||
else if (s > name && ch == '?')
|
||||
break;
|
||||
else if (s < (name + sizeof(name) - 1))
|
||||
*s++ = ch;
|
||||
|
||||
*s = '\0';
|
||||
|
||||
if (s == name && isspace(ch))
|
||||
{
|
||||
if (out)
|
||||
{
|
||||
putc('{', out);
|
||||
putc(ch, out);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if it has a value...
|
||||
*/
|
||||
|
||||
if (name[0] == '?')
|
||||
{
|
||||
/*
|
||||
* Insert value only if it exists...
|
||||
*/
|
||||
|
||||
if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1]))
|
||||
{
|
||||
*nameptr++ = '\0';
|
||||
|
||||
if ((value = cgiGetArray(name + 1, atoi(nameptr) - 1)) != NULL)
|
||||
outptr = value;
|
||||
else
|
||||
{
|
||||
outval[0] = '\0';
|
||||
outptr = outval;
|
||||
}
|
||||
}
|
||||
if ((value = cgiGetArray(name + 1, element)) != NULL)
|
||||
outptr = value;
|
||||
else
|
||||
{
|
||||
outval[0] = '\0';
|
||||
outptr = outval;
|
||||
}
|
||||
}
|
||||
else if (name[0] == '#')
|
||||
{
|
||||
/*
|
||||
* Insert count...
|
||||
*/
|
||||
|
||||
if (name[1])
|
||||
sprintf(outval, "%d", cgiGetSize(name + 1));
|
||||
else
|
||||
sprintf(outval, "%d", element + 1);
|
||||
|
||||
outptr = outval;
|
||||
}
|
||||
else if (name[0] == '[')
|
||||
{
|
||||
/*
|
||||
* Loop for # of elements...
|
||||
*/
|
||||
|
||||
int i; /* Looping var */
|
||||
long pos; /* File position */
|
||||
int count; /* Number of elements */
|
||||
|
||||
|
||||
if (isdigit(name[1]))
|
||||
count = atoi(name + 1);
|
||||
else
|
||||
count = cgiGetSize(name + 1);
|
||||
|
||||
pos = ftell(in);
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
for (i = 0; i < count; i ++)
|
||||
{
|
||||
fseek(in, pos, SEEK_SET);
|
||||
cgi_copy(out, in, i, '}');
|
||||
}
|
||||
}
|
||||
else
|
||||
cgi_copy(NULL, in, 0, '}');
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Insert variable or variable name (if element is NULL)...
|
||||
*/
|
||||
|
||||
if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1]))
|
||||
{
|
||||
*nameptr++ = '\0';
|
||||
if ((value = cgiGetArray(name, atoi(nameptr) - 1)) == NULL)
|
||||
{
|
||||
snprintf(outval, sizeof(outval), "{%s}", name);
|
||||
outptr = outval;
|
||||
}
|
||||
else
|
||||
outptr = value;
|
||||
}
|
||||
else if ((value = cgiGetArray(name, element)) == NULL)
|
||||
{
|
||||
snprintf(outval, sizeof(outval), "{%s}", name);
|
||||
outptr = outval;
|
||||
}
|
||||
else
|
||||
outptr = value;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if the terminating character requires another test...
|
||||
*/
|
||||
|
||||
if (ch == '}')
|
||||
{
|
||||
/*
|
||||
* End of substitution...
|
||||
*/
|
||||
|
||||
if (out)
|
||||
cgi_puts(outptr, out);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* OK, process one of the following checks:
|
||||
*
|
||||
* {name?exist:not-exist} Exists?
|
||||
* {name=value?true:false} Equal
|
||||
* {name<value?true:false} Less than
|
||||
* {name>value?true:false} Greater than
|
||||
* {name!value?true:false} Not equal
|
||||
*/
|
||||
|
||||
if (ch == '?')
|
||||
{
|
||||
/*
|
||||
* Test for existance...
|
||||
*/
|
||||
|
||||
result = cgiGetArray(name, element) != NULL && outval[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Compare to a string...
|
||||
*/
|
||||
|
||||
op = ch;
|
||||
|
||||
for (s = compare; (ch = getc(in)) != EOF;)
|
||||
if (ch == '?')
|
||||
break;
|
||||
else if (s >= (compare + sizeof(compare) - 1))
|
||||
continue;
|
||||
else if (ch == '#')
|
||||
{
|
||||
sprintf(s, "%d", element + 1);
|
||||
s += strlen(s);
|
||||
}
|
||||
else if (ch == '{')
|
||||
{
|
||||
/*
|
||||
* Grab the value of a variable...
|
||||
*/
|
||||
|
||||
innerptr = innername;
|
||||
while ((ch = getc(in)) != EOF && ch != '}')
|
||||
if (innerptr < (innername + sizeof(innername) - 1))
|
||||
*innerptr++ = ch;
|
||||
*innerptr = '\0';
|
||||
|
||||
if (innername[0] == '#')
|
||||
sprintf(s, "%d", cgiGetSize(innername + 1));
|
||||
else if ((innerptr = strrchr(innername, '-')) != NULL &&
|
||||
isdigit(innerptr[1]))
|
||||
{
|
||||
*innerptr++ = '\0';
|
||||
if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else if (innername[0] == '?')
|
||||
{
|
||||
if ((innerval = cgiGetArray(innername + 1, element)) == NULL)
|
||||
*s = '\0';
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else if ((innerval = cgiGetArray(innername, element)) == NULL)
|
||||
snprintf(s, sizeof(s), "{%s}", innername);
|
||||
else
|
||||
{
|
||||
strncpy(s, innerval, sizeof(compare) - (s - compare) - 1);
|
||||
compare[sizeof(compare) - 1] = '\0';
|
||||
}
|
||||
|
||||
s += strlen(s);
|
||||
}
|
||||
else if (ch == '\\')
|
||||
*s++ = getc(in);
|
||||
else
|
||||
*s++ = ch;
|
||||
|
||||
*s = '\0';
|
||||
|
||||
if (ch != '?')
|
||||
return;
|
||||
|
||||
/*
|
||||
* Do the comparison...
|
||||
*/
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case '<' :
|
||||
result = strcasecmp(outptr, compare) < 0;
|
||||
break;
|
||||
case '>' :
|
||||
result = strcasecmp(outptr, compare) > 0;
|
||||
break;
|
||||
case '=' :
|
||||
result = strcasecmp(outptr, compare) == 0;
|
||||
break;
|
||||
case '!' :
|
||||
result = strcasecmp(outptr, compare) != 0;
|
||||
break;
|
||||
default :
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (result)
|
||||
{
|
||||
/*
|
||||
* Comparison true; output first part and ignore second...
|
||||
*/
|
||||
|
||||
cgi_copy(out, in, element, ':');
|
||||
cgi_copy(NULL, in, element, '}');
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Comparison false; ignore first part and output second...
|
||||
*/
|
||||
|
||||
cgi_copy(NULL, in, element, ':');
|
||||
cgi_copy(out, in, element, '}');
|
||||
}
|
||||
}
|
||||
else if (ch == '\\') /* Quoted char */
|
||||
{
|
||||
if (out)
|
||||
putc(getc(in), out);
|
||||
else
|
||||
getc(in);
|
||||
}
|
||||
else if (out)
|
||||
putc(ch, out);
|
||||
|
||||
/*
|
||||
* Flush any pending output...
|
||||
*/
|
||||
|
||||
if (out)
|
||||
fflush(out);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_puts()' - Put a string to the output file, quoting as needed...
|
||||
*/
|
||||
|
||||
static void
|
||||
cgi_puts(const char *s,
|
||||
FILE *out)
|
||||
{
|
||||
while (*s)
|
||||
{
|
||||
if (s[0] == '<' && s[1] != '/' && !isalpha(s[1]))
|
||||
fputs("<", out);
|
||||
else if (*s == '\"')
|
||||
fputs(""", out);
|
||||
else if (s[0] == '&' && isspace(s[1]))
|
||||
fputs("&", out);
|
||||
else
|
||||
putc(*s, out);
|
||||
|
||||
s ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
-672
@@ -1,672 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* CGI form variable and array functions.
|
||||
*
|
||||
* Copyright 1997-2001 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
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cgiInitialize() - Initialize the CGI variable "database"...
|
||||
* cgiCheckVariables() - Check for the presence of "required" variables.
|
||||
* cgiGetArray() - Get an element from a form array...
|
||||
* cgiGetSize() - Get the size of a form array value.
|
||||
* cgiGetVariable() - Get a CGI variable from the database...
|
||||
* cgiSetArray() - Set array element N to the specified string.
|
||||
* cgiSetVariable() - Set a CGI variable in the database...
|
||||
* cgi_add_variable() - Add a form variable.
|
||||
* cgi_compare_variables() - Compare two variables.
|
||||
* cgi_find_variable() - Find a variable...
|
||||
* cgi_initialize_get() - Initialize form variables using the GET method.
|
||||
* cgi_initialize_post() - Initialize variables using the POST method.
|
||||
* cgi_initialize_string() - Initialize form variables from a string.
|
||||
* cgi_sort_variables() - Sort all form variables for faster lookup.
|
||||
*/
|
||||
|
||||
/*#define DEBUG*/
|
||||
#include "cgi.h"
|
||||
#include <errno.h>
|
||||
#include <syslog.h>
|
||||
|
||||
|
||||
/*
|
||||
* Data structure to hold all the CGI form variables and arrays...
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name; /* Name of variable */
|
||||
int nvalues, /* Number of values */
|
||||
avalues; /* Number of values allocated */
|
||||
const char **values; /* Value(s) of variable */
|
||||
} var_t;
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static int form_count = 0, /* Form variable count */
|
||||
form_alloc = 0; /* Number of variables allocated */
|
||||
static var_t *form_vars = NULL; /* Form variables */
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void cgi_add_variable(const char *name, int element,
|
||||
const char *value);
|
||||
static int cgi_compare_variables(const var_t *v1, const var_t *v2);
|
||||
static var_t *cgi_find_variable(const char *name);
|
||||
static int cgi_initialize_get(void);
|
||||
static int cgi_initialize_post(void);
|
||||
static int cgi_initialize_string(const char *data);
|
||||
static void cgi_sort_variables(void);
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiInitialize()' - Initialize the CGI variable "database"...
|
||||
*/
|
||||
|
||||
int /* O - Non-zero if there was form data */
|
||||
cgiInitialize(void)
|
||||
{
|
||||
char *method; /* Form posting method */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
setbuf(stdout, NULL);
|
||||
puts("Content-type: text/plain\n");
|
||||
#endif /* DEBUG */
|
||||
|
||||
method = getenv("REQUEST_METHOD");
|
||||
|
||||
if (method == NULL)
|
||||
return (0);
|
||||
|
||||
if (strcasecmp(method, "GET") == 0)
|
||||
return (cgi_initialize_get());
|
||||
else if (strcasecmp(method, "POST") == 0)
|
||||
return (cgi_initialize_post());
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiCheckVariables()' - Check for the presence of "required" variables.
|
||||
*
|
||||
* Names may be separated by spaces and/or commas.
|
||||
*/
|
||||
|
||||
int /* O - 1 if all variables present, 0 otherwise */
|
||||
cgiCheckVariables(const char *names) /* I - Variables to look for */
|
||||
{
|
||||
char name[255], /* Current variable name */
|
||||
*s; /* Pointer in string */
|
||||
const char *val; /* Value of variable */
|
||||
int element; /* Array element number */
|
||||
|
||||
|
||||
if (names == NULL)
|
||||
return (1);
|
||||
|
||||
while (*names != '\0')
|
||||
{
|
||||
while (*names == ' ' || *names == ',')
|
||||
names ++;
|
||||
|
||||
for (s = name; *names != '\0' && *names != ' ' && *names != ','; s ++, names ++)
|
||||
*s = *names;
|
||||
|
||||
*s = 0;
|
||||
if (name[0] == '\0')
|
||||
break;
|
||||
|
||||
if ((s = strrchr(name, '-')) != NULL)
|
||||
{
|
||||
*s = '\0';
|
||||
element = atoi(s + 1) - 1;
|
||||
val = cgiGetArray(name, element);
|
||||
}
|
||||
else
|
||||
val = cgiGetVariable(name);
|
||||
|
||||
if (val == NULL)
|
||||
return (0);
|
||||
|
||||
if (*val == '\0')
|
||||
return (0); /* Can't be blank, either! */
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiGetArray()' - Get an element from a form array...
|
||||
*/
|
||||
|
||||
const char * /* O - Element value or NULL */
|
||||
cgiGetArray(const char *name, /* I - Name of array variable */
|
||||
int element) /* I - Element number (0 to N) */
|
||||
{
|
||||
var_t *var; /* Pointer to variable */
|
||||
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
if (var->nvalues == 1)
|
||||
return (var->values[0]);
|
||||
|
||||
if (element < 0 || element >= var->nvalues)
|
||||
return (NULL);
|
||||
|
||||
return (var->values[element]);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiGetSize()' - Get the size of a form array value.
|
||||
*/
|
||||
|
||||
int /* O - Number of elements */
|
||||
cgiGetSize(const char *name) /* I - Name of variable */
|
||||
{
|
||||
var_t *var; /* Pointer to variable */
|
||||
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
return (0);
|
||||
|
||||
return (var->nvalues);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiGetVariable()' - Get a CGI variable from the database...
|
||||
*
|
||||
* Returns NULL if the variable doesn't exist... If the variable is an
|
||||
* array of values, returns the last element...
|
||||
*/
|
||||
|
||||
const char * /* O - Value of variable */
|
||||
cgiGetVariable(const char *name)/* I - Name of variable */
|
||||
{
|
||||
const var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
var = cgi_find_variable(name);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (var == NULL)
|
||||
printf("cgiGetVariable(\"%s\") is returning NULL...\n", name);
|
||||
else
|
||||
printf("cgiGetVariable(\"%s\") is returning \"%s\"...\n", name,
|
||||
var->values[var->nvalues - 1]);
|
||||
#endif /* DEBUG */
|
||||
|
||||
return ((var == NULL) ? NULL : var->values[var->nvalues - 1]);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiSetArray()' - Set array element N to the specified string.
|
||||
*
|
||||
* If the variable array is smaller than (element + 1), the intervening
|
||||
* elements are set to NULL.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiSetArray(const char *name, /* I - Name of variable */
|
||||
int element, /* I - Element number (0 to N) */
|
||||
const char *value) /* I - Value of variable */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
if (name == NULL || value == NULL || element < 0)
|
||||
return;
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
{
|
||||
cgi_add_variable(name, element, value);
|
||||
cgi_sort_variables();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (element >= var->avalues)
|
||||
{
|
||||
var->avalues = element + 16;
|
||||
var->values = (const char **)realloc((void *)(var->values),
|
||||
sizeof(char *) * var->avalues);
|
||||
}
|
||||
|
||||
if (element >= var->nvalues)
|
||||
{
|
||||
for (i = var->nvalues; i < element; i ++)
|
||||
var->values[i] = NULL;
|
||||
|
||||
var->nvalues = element + 1;
|
||||
}
|
||||
else if (var->values[element])
|
||||
free((char *)var->values[element]);
|
||||
|
||||
var->values[element] = strdup(value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiSetSize()' - Set the array size.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiSetSize(const char *name, /* I - Name of variable */
|
||||
int size) /* I - Number of elements (0 to N) */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
if (name == NULL || size < 0)
|
||||
return;
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
return;
|
||||
|
||||
if (size >= var->avalues)
|
||||
{
|
||||
var->avalues = size + 16;
|
||||
var->values = (const char **)realloc((void *)(var->values),
|
||||
sizeof(char *) * var->avalues);
|
||||
}
|
||||
|
||||
if (size > var->nvalues)
|
||||
{
|
||||
for (i = var->nvalues; i < size; i ++)
|
||||
var->values[i] = NULL;
|
||||
}
|
||||
else if (size < var->nvalues)
|
||||
{
|
||||
for (i = size; i < var->nvalues; i ++)
|
||||
if (var->values[i])
|
||||
free((void *)(var->values[i]));
|
||||
}
|
||||
|
||||
var->nvalues = size;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiSetVariable()' - Set a CGI variable in the database...
|
||||
*
|
||||
* If the variable is an array, this truncates the array to a single element.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiSetVariable(const char *name, /* I - Name of variable */
|
||||
const char *value) /* I - Value of variable */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
var_t *var; /* Returned variable */
|
||||
|
||||
|
||||
if (name == NULL || value == NULL)
|
||||
return;
|
||||
|
||||
if ((var = cgi_find_variable(name)) == NULL)
|
||||
{
|
||||
cgi_add_variable(name, 0, value);
|
||||
cgi_sort_variables();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < var->nvalues; i ++)
|
||||
if (var->values[i])
|
||||
free((char *)var->values[i]);
|
||||
|
||||
var->values[0] = strdup(value);
|
||||
var->nvalues = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_add_variable()' - Add a form variable.
|
||||
*/
|
||||
|
||||
static void
|
||||
cgi_add_variable(const char *name, /* I - Variable name */
|
||||
int element, /* I - Array element number */
|
||||
const char *value) /* I - Variable value */
|
||||
{
|
||||
var_t *var; /* New variable */
|
||||
|
||||
|
||||
if (name == NULL || value == NULL)
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("Adding variable \'%s\' with value \'%s\'...\n", name, value);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (form_count >= form_alloc)
|
||||
{
|
||||
if (form_alloc == 0)
|
||||
form_vars = malloc(sizeof(var_t) * 16);
|
||||
else
|
||||
form_vars = realloc(form_vars, (form_alloc + 16) * sizeof(var_t));
|
||||
|
||||
form_alloc += 16;
|
||||
}
|
||||
|
||||
var = form_vars + form_count;
|
||||
var->name = strdup(name);
|
||||
var->nvalues = element + 1;
|
||||
var->avalues = element + 1;
|
||||
var->values = calloc(element + 1, sizeof(char *));
|
||||
var->values[element] = strdup(value);
|
||||
|
||||
form_count ++;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_compare_variables()' - Compare two variables.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
cgi_compare_variables(const var_t *v1, /* I - First variable */
|
||||
const var_t *v2) /* I - Second variable */
|
||||
{
|
||||
return (strcasecmp(v1->name, v2->name));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_find_variable()' - Find a variable...
|
||||
*/
|
||||
|
||||
static var_t * /* O - Variable pointer or NULL */
|
||||
cgi_find_variable(const char *name) /* I - Name of variable */
|
||||
{
|
||||
var_t key; /* Search key */
|
||||
|
||||
|
||||
if (form_count < 1 || name == NULL)
|
||||
return (NULL);
|
||||
|
||||
key.name = name;
|
||||
|
||||
return ((var_t *)bsearch(&key, form_vars, form_count, sizeof(var_t),
|
||||
(int (*)(const void *, const void *))cgi_compare_variables));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_initialize_get()' - Initialize form variables using the GET method.
|
||||
*/
|
||||
|
||||
static int /* O - 1 if form data read */
|
||||
cgi_initialize_get(void)
|
||||
{
|
||||
char *data; /* Pointer to form data string */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
puts("Initializing variables using GET method...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Check to see if there is anything for us to read...
|
||||
*/
|
||||
|
||||
data = getenv("QUERY_STRING");
|
||||
if (data == NULL || strlen(data) == 0)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Parse it out and return...
|
||||
*/
|
||||
|
||||
return (cgi_initialize_string(data));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_initialize_post()' - Initialize variables using the POST method.
|
||||
*/
|
||||
|
||||
static int /* O - 1 if form data was read */
|
||||
cgi_initialize_post(void)
|
||||
{
|
||||
char *content_length, /* Length of input data (string) */
|
||||
*data; /* Pointer to form data string */
|
||||
int length, /* Length of input data */
|
||||
nbytes, /* Number of bytes read this read() */
|
||||
tbytes, /* Total number of bytes read */
|
||||
status; /* Return status */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
puts("Initializing variables using POST method...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Check to see if there is anything for us to read...
|
||||
*/
|
||||
|
||||
content_length = getenv("CONTENT_LENGTH");
|
||||
if (content_length == NULL || atoi(content_length) <= 0)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Get the length of the input stream and allocate a buffer for it...
|
||||
*/
|
||||
|
||||
length = atoi(content_length);
|
||||
data = malloc(length + 1);
|
||||
|
||||
if (data == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Read the data into the buffer...
|
||||
*/
|
||||
|
||||
for (tbytes = 0; tbytes < length; tbytes += nbytes)
|
||||
if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
|
||||
if (errno != EAGAIN)
|
||||
{
|
||||
free(data);
|
||||
return (0);
|
||||
}
|
||||
|
||||
data[length] = '\0';
|
||||
|
||||
/*
|
||||
* Parse it out...
|
||||
*/
|
||||
|
||||
status = cgi_initialize_string(data);
|
||||
|
||||
/*
|
||||
* Free the data and return...
|
||||
*/
|
||||
|
||||
free(data);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_initialize_string()' - Initialize form variables from a string.
|
||||
*/
|
||||
|
||||
static int
|
||||
cgi_initialize_string(const char *data) /* I - Form data string */
|
||||
{
|
||||
int done; /* True if we're done reading a form variable */
|
||||
char *s, /* Pointer to current form string */
|
||||
ch, /* Temporary character */
|
||||
name[255], /* Name of form variable */
|
||||
value[65536]; /* Variable value... */
|
||||
|
||||
|
||||
/*
|
||||
* Check input...
|
||||
*/
|
||||
|
||||
if (data == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Loop until we've read all the form data...
|
||||
*/
|
||||
|
||||
while (*data != '\0')
|
||||
{
|
||||
/*
|
||||
* Get the variable name...
|
||||
*/
|
||||
|
||||
for (s = name; *data != '\0'; data ++)
|
||||
if (*data == '=')
|
||||
break;
|
||||
else if (*data >= ' ' && s < (name + sizeof(name) - 1))
|
||||
*s++ = *data;
|
||||
|
||||
*s = '\0';
|
||||
if (*data == '=')
|
||||
data ++;
|
||||
else
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Read the variable value...
|
||||
*/
|
||||
|
||||
for (s = value, done = 0; !done && *data != '\0'; data ++)
|
||||
switch (*data)
|
||||
{
|
||||
case '&' : /* End of data... */
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
case '+' : /* Escaped space character */
|
||||
if (s < (value + sizeof(value) - 1))
|
||||
*s++ = ' ';
|
||||
break;
|
||||
|
||||
case '%' : /* Escaped control character */
|
||||
/*
|
||||
* Read the hex code...
|
||||
*/
|
||||
|
||||
if (s < (value + sizeof(value) - 1))
|
||||
{
|
||||
data ++;
|
||||
ch = *data - '0';
|
||||
if (ch > 9)
|
||||
ch -= 7;
|
||||
*s = ch << 4;
|
||||
|
||||
data ++;
|
||||
ch = *data - '0';
|
||||
if (ch > 9)
|
||||
ch -= 7;
|
||||
*s++ |= ch;
|
||||
}
|
||||
else
|
||||
data += 2;
|
||||
break;
|
||||
|
||||
default : /* Other characters come straight through */
|
||||
if (*data >= ' ' && s < (value + sizeof(value) - 1))
|
||||
*s++ = *data;
|
||||
break;
|
||||
}
|
||||
|
||||
*s = '\0'; /* nul terminate the string */
|
||||
|
||||
/*
|
||||
* Remove trailing whitespace...
|
||||
*/
|
||||
|
||||
if (s > value)
|
||||
s --;
|
||||
|
||||
while (s >= value && *s == ' ')
|
||||
*s-- = '\0';
|
||||
|
||||
/*
|
||||
* Add the string to the variable "database"...
|
||||
*/
|
||||
|
||||
if ((s = strrchr(name, '-')) != NULL && isdigit(s[1]))
|
||||
{
|
||||
*s++ = '\0';
|
||||
if (value[0])
|
||||
cgiSetArray(name, atoi(s) - 1, value);
|
||||
}
|
||||
else if (cgiGetVariable(name) != NULL)
|
||||
cgiSetArray(name, cgiGetSize(name), value);
|
||||
else
|
||||
cgiSetVariable(name, value);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgi_sort_variables()' - Sort all form variables for faster lookup.
|
||||
*/
|
||||
|
||||
static void
|
||||
cgi_sort_variables(void)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
|
||||
|
||||
puts("Sorting variables...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (form_count < 2)
|
||||
return;
|
||||
|
||||
qsort(form_vars, form_count, sizeof(var_t),
|
||||
(int (*)(const void *, const void *))cgi_compare_variables);
|
||||
|
||||
#ifdef DEBUG
|
||||
puts("Sorted variable list is:");
|
||||
for (i = 0; i < form_count; i ++)
|
||||
printf("%d: %s (%d) = \"%s\" ...\n", i, form_vars[i].name,
|
||||
form_vars[i].nvalues, form_vars[i].values[0]);
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+9
-13
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Configuration file makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1993-2001 by Easy Software Products.
|
||||
# Copyright 1993-1999 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -28,45 +28,41 @@ include ../Makedefs
|
||||
# Config files...
|
||||
#
|
||||
|
||||
KEEP = classes.conf client.conf cupsd.conf printers.conf
|
||||
KEEP = classes.conf cupsd.conf printers.conf
|
||||
REPLACE = mime.convs mime.types
|
||||
|
||||
|
||||
#
|
||||
# Make everything...
|
||||
#
|
||||
|
||||
all:
|
||||
|
||||
|
||||
#
|
||||
# Clean all config and object files...
|
||||
#
|
||||
|
||||
clean:
|
||||
|
||||
|
||||
#
|
||||
# Install files...
|
||||
#
|
||||
|
||||
install:
|
||||
$(INSTALL_DIR) $(SERVERROOT)
|
||||
-$(MKDIR) $(SERVERROOT)/conf
|
||||
for file in $(KEEP); do \
|
||||
if test -r $(SERVERROOT)/$$file ; then \
|
||||
$(INSTALL_DATA) $$file $(SERVERROOT)/$$file.N ; \
|
||||
if test -e $(SERVERROOT)/conf/$$file ; then \
|
||||
$(CP) $$file $(SERVERROOT)/conf/$$file.N ; \
|
||||
else \
|
||||
$(INSTALL_DATA) $$file $(SERVERROOT) ; \
|
||||
$(CP) $$file $(SERVERROOT)/conf ; \
|
||||
fi ; \
|
||||
done
|
||||
for file in $(REPLACE); do \
|
||||
if test -r $(SERVERROOT)/$$file ; then \
|
||||
$(MV) $(SERVERROOT)/$$file $(SERVERROOT)/$$file.O ; \
|
||||
if test -e $(SERVERROOT)/conf/$$file ; then \
|
||||
$(MV) $(SERVERROOT)/conf/$$file $(SERVERROOT)/conf/$$file.O ; \
|
||||
fi ; \
|
||||
$(INSTALL_DATA) $$file $(SERVERROOT) ; \
|
||||
$(CP) $$file $(SERVERROOT)/conf ; \
|
||||
done
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
|
||||
+10
-27
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: classes.conf 1605 2001-03-02 22:34:21Z andy $"
|
||||
# "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $"
|
||||
#
|
||||
# Sample class configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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
|
||||
@@ -15,7 +15,7 @@
|
||||
#
|
||||
# Attn: CUPS Licensing Information
|
||||
# Easy Software Products
|
||||
# 44141 Airport View Drive, Suite 204
|
||||
# 44145 Airport View Drive, Suite 204
|
||||
# Hollywood, Maryland 20636-3111 USA
|
||||
#
|
||||
# Voice: (301) 373-9603
|
||||
@@ -47,35 +47,18 @@
|
||||
|
||||
#Info Acme LaserPrint 1000 Printers
|
||||
|
||||
#
|
||||
# MoreInfo: a URL for more information on the printer.
|
||||
#
|
||||
|
||||
#MoreInfo http://www.acme.com/lp1000.html
|
||||
|
||||
#
|
||||
# Location: the location of the printer.
|
||||
#
|
||||
|
||||
#Location Room 101 in the activities building
|
||||
|
||||
#
|
||||
# State: sets the initial state of the class. Can be one of the
|
||||
# following:
|
||||
#
|
||||
# Idle - Class is available to print new jobs.
|
||||
# Stopped - Class is disabled but accepting new jobs.
|
||||
#
|
||||
|
||||
#State Idle
|
||||
|
||||
#
|
||||
# StateMessage: sets the printer-state-message attribute for the class.
|
||||
#
|
||||
|
||||
#StateMessage Class is idle.
|
||||
|
||||
#
|
||||
# Accepting: is the class accepting jobs?
|
||||
#
|
||||
#Accepting Yes
|
||||
#Accepting No
|
||||
#
|
||||
|
||||
#
|
||||
# Printer: adds a printer to the class.
|
||||
#
|
||||
@@ -85,5 +68,5 @@
|
||||
#</Class>
|
||||
|
||||
#
|
||||
# End of "$Id: classes.conf 1605 2001-03-02 22:34:21Z andy $".
|
||||
# End of "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
#
|
||||
# "$Id: client.conf 1605 2001-03-02 22:34:21Z andy $"
|
||||
#
|
||||
# Sample client configuration file for the Common UNIX Printing System
|
||||
# (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
# 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 is the CUPS client configuration file. This file is used to #
|
||||
# define client-specific parameters, such as the default server or #
|
||||
# default encryption settings. #
|
||||
# #
|
||||
########################################################################
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#ServerName myhost.domain.com
|
||||
|
||||
#
|
||||
# Encryption: whether or not to use encryption; this depends on having
|
||||
# the OpenSSL library linked into the CUPS library.
|
||||
#
|
||||
# Possible values:
|
||||
#
|
||||
# Always - Always use encryption (SSL)
|
||||
# Never - Never use encryption
|
||||
# Required - Use TLS encryption upgrade
|
||||
# IfRequested - Use encryption if the server requests it
|
||||
#
|
||||
# The default value is "IfRequested". This parameter can also be set
|
||||
# using the CUPS_ENCRYPTION environment variable.
|
||||
#
|
||||
|
||||
#Encryption Always
|
||||
#Encryption Never
|
||||
#Encryption Required
|
||||
#Encryption IfRequested
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id: client.conf 1605 2001-03-02 22:34:21Z andy $".
|
||||
#
|
||||
+154
-485
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: cupsd.conf 1871 2001-07-25 21:03:36Z mike $"
|
||||
# "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $"
|
||||
#
|
||||
# Sample configuration file for the Common UNIX Printing System (CUPS)
|
||||
# scheduler.
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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
|
||||
@@ -15,7 +15,7 @@
|
||||
#
|
||||
# Attn: CUPS Licensing Information
|
||||
# Easy Software Products
|
||||
# 44141 Airport View Drive, Suite 204
|
||||
# 44145 Airport View Drive, Suite 204
|
||||
# Hollywood, Maryland 20636-3111 USA
|
||||
#
|
||||
# Voice: (301) 373-9603
|
||||
@@ -34,16 +34,60 @@
|
||||
# #
|
||||
########################################################################
|
||||
|
||||
#
|
||||
# Ports/addresses that we listen to. The default port 631 is reserved
|
||||
# for the Internet Printing Protocol (IPP) and is what we use here.
|
||||
#
|
||||
# You can have multiple Port/Listen lines to listen to more than one
|
||||
# port or address, or to restrict access:
|
||||
#
|
||||
# Port 80
|
||||
# Port 631
|
||||
# Listen hostname
|
||||
# Listen hostname:80
|
||||
# Listen hostname:631
|
||||
# Listen 1.2.3.4
|
||||
# Listen 1.2.3.4:631
|
||||
#
|
||||
|
||||
########
|
||||
######## Server Identity
|
||||
########
|
||||
#Port 80
|
||||
Port 631
|
||||
|
||||
#
|
||||
# MaxClients: controls the maximum number of simultaneous clients that
|
||||
# will be handled. Defaults to 100.
|
||||
#
|
||||
|
||||
#MaxClients 100
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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...
|
||||
#
|
||||
|
||||
#User lp
|
||||
#Group sys
|
||||
|
||||
#
|
||||
# SystemGroup: the group name for "System" (printer administration)
|
||||
# access. The default varies depending on the operating system, but
|
||||
# will be "sys", "system", or "root" (checked for in that order.)
|
||||
#
|
||||
|
||||
#SystemGroup sys
|
||||
|
||||
#
|
||||
# ServerName: the hostname of your server, as advertised to the world.
|
||||
# By default CUPS will use the hostname of the system.
|
||||
#
|
||||
# To set the default server used by clients, see the client.conf file.
|
||||
# This is also the name used by clients when connecting to the local
|
||||
# server, so you can use this to configure a client machine without
|
||||
# a local server running.
|
||||
#
|
||||
|
||||
#ServerName myhost.domain.com
|
||||
@@ -55,98 +99,42 @@
|
||||
|
||||
#ServerAdmin root@your.domain.com
|
||||
|
||||
#
|
||||
# ServerRoot: the root directory for the scheduler.
|
||||
# By default the compiled-in value.
|
||||
#
|
||||
|
||||
########
|
||||
######## Server Options
|
||||
########
|
||||
#ServerRoot /var/cups
|
||||
|
||||
#
|
||||
# AccessLog: the access log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "/var/log/cups/access_log"
|
||||
#
|
||||
# You can also use the special name "syslog" to send the output to the
|
||||
# syslog file or daemon.
|
||||
# "logs/access_log"
|
||||
#
|
||||
|
||||
#AccessLog /var/log/cups/access_log
|
||||
|
||||
#
|
||||
# Classification: the classification level of the server. If set, this
|
||||
# classification is displayed on all pages, and raw printing is disabled.
|
||||
# The default is the empty string.
|
||||
#
|
||||
|
||||
#Classification classified
|
||||
#Classification confidential
|
||||
#Classification secret
|
||||
#Classification topsecret
|
||||
#Classification unclassified
|
||||
|
||||
#
|
||||
# ClassifyOverride: whether to allow users to override the classification
|
||||
# on printouts. If enabled, users can limit banner pages to before or
|
||||
# after the job, and can change the classification of a job, but cannot
|
||||
# completely eliminate the classification or banners.
|
||||
#
|
||||
# The default is off.
|
||||
#
|
||||
|
||||
#ClassifyOverride off
|
||||
|
||||
#
|
||||
# DataDir: the root directory for the CUPS data files.
|
||||
# By default /usr/share/cups.
|
||||
#
|
||||
|
||||
#DataDir /usr/share/cups
|
||||
|
||||
#
|
||||
# DefaultCharset: the default character set to use. If not specified,
|
||||
# defaults to utf-8. Note that this can also be overridden in
|
||||
# HTML documents...
|
||||
#
|
||||
|
||||
#DefaultCharset utf-8
|
||||
|
||||
#
|
||||
# DefaultLanguage: the default language if not specified by the browser.
|
||||
# If not specified, the current locale is used.
|
||||
#
|
||||
|
||||
#DefaultLanguage en
|
||||
|
||||
#
|
||||
# DocumentRoot: the root directory for HTTP documents that are served.
|
||||
# By default the compiled in directory.
|
||||
#
|
||||
|
||||
#DocumentRoot /usr/share/doc/cups
|
||||
#AccessLog logs/access_log
|
||||
|
||||
#
|
||||
# ErrorLog: the error log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "/var/log/cups/error_log"
|
||||
#
|
||||
# You can also use the special name "syslog" to send the output to the
|
||||
# syslog file or daemon.
|
||||
# "logs/error_log"
|
||||
#
|
||||
|
||||
#ErrorLog /var/log/cups/error_log
|
||||
#ErrorLog logs/error_log
|
||||
|
||||
#
|
||||
# FontPath: the path to locate all font files (currently only for pstoraster)
|
||||
# By default /usr/share/cups/fonts.
|
||||
# PageLog: the page log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/page_log"
|
||||
#
|
||||
|
||||
#FontPath /usr/share/cups/fonts
|
||||
#PageLog logs/page_log
|
||||
|
||||
#
|
||||
# LogLevel: controls the number of messages logged to the ErrorLog
|
||||
# file and can be one of the following:
|
||||
#
|
||||
# debug2 Log everything.
|
||||
# debug Log almost everything.
|
||||
# debug Log everything.
|
||||
# info Log all requests and state changes.
|
||||
# warn Log errors and warnings.
|
||||
# error Log only errors.
|
||||
@@ -163,171 +151,11 @@ LogLevel info
|
||||
#MaxLogSize 0
|
||||
|
||||
#
|
||||
# PageLog: the page log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "/var/log/cups/page_log"
|
||||
#
|
||||
# You can also use the special name "syslog" to send the output to the
|
||||
# syslog file or daemon.
|
||||
# MaxRequestSize: controls the maximum size of print files. Set to 0 to
|
||||
# disable this feature (defaults to 0.)
|
||||
#
|
||||
|
||||
#PageLog /var/log/cups/page_log
|
||||
|
||||
#
|
||||
# PreserveJobHistory: whether or not to preserve the job history after a
|
||||
# job is completed, cancelled, or stopped. Default is Yes.
|
||||
#
|
||||
|
||||
#PreserveJobHistory Yes
|
||||
|
||||
#
|
||||
# PreserveJobFiles: whether or not to preserve the job files after a
|
||||
# job is completed, cancelled, or stopped. Default is No.
|
||||
#
|
||||
|
||||
#PreserveJobFiles No
|
||||
|
||||
#
|
||||
# AutoPurgeJobs: automatically purge jobs when not needed for quotas.
|
||||
# Default is No.
|
||||
#
|
||||
|
||||
#AutoPurgeJobs No
|
||||
|
||||
#
|
||||
# MaxJobs: maximum number of jobs to keep in memory (active and completed.)
|
||||
# Default is 0 (no limit.)
|
||||
#
|
||||
|
||||
#MaxJobs 0
|
||||
|
||||
#
|
||||
# Printcap: the name of the printcap file. Default is /etc/printcap.
|
||||
# Leave blank to disable printcap file generation.
|
||||
#
|
||||
|
||||
#Printcap /etc/printcap
|
||||
|
||||
#
|
||||
# RequestRoot: the directory where request files are stored.
|
||||
# By default /var/spool/cups.
|
||||
#
|
||||
|
||||
#RequestRoot /var/spool/cups
|
||||
|
||||
#
|
||||
# RemoteRoot: the name of the user assigned to unauthenticated accesses
|
||||
# from remote systems. By default "remroot".
|
||||
#
|
||||
|
||||
#RemoteRoot remroot
|
||||
|
||||
#
|
||||
# ServerBin: the root directory for the scheduler executables.
|
||||
# By default /usr/lib/cups or /usr/lib32/cups (IRIX 6.5).
|
||||
#
|
||||
|
||||
#ServerBin /usr/lib/cups
|
||||
|
||||
#
|
||||
# ServerRoot: the root directory for the scheduler.
|
||||
# By default /etc/cups.
|
||||
#
|
||||
|
||||
#ServerRoot /etc/cups
|
||||
|
||||
|
||||
########
|
||||
######## Encryption Support
|
||||
########
|
||||
|
||||
#
|
||||
# ServerCertificate: the file to read containing the server's certificate.
|
||||
# Defaults to "/etc/cups/ssl/server.crt".
|
||||
#
|
||||
|
||||
#ServerCertificate /etc/cups/ssl/server.crt
|
||||
|
||||
#
|
||||
# ServerKey: the file to read containing the server's key.
|
||||
# Defaults to "/etc/cups/ssl/server.key".
|
||||
#
|
||||
|
||||
#ServerKey /etc/cups/ssl/server.key
|
||||
|
||||
|
||||
########
|
||||
######## Filter Options
|
||||
########
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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...
|
||||
#
|
||||
|
||||
#User lp
|
||||
#Group sys
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
# bitmaps. The value can be any real number followed by "k" for
|
||||
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
|
||||
# (1 tile = 256x256 pixels.) Defaults to "8m" (8 megabytes).
|
||||
#
|
||||
|
||||
#RIPCache 8m
|
||||
|
||||
#
|
||||
# TempDir: the directory to put temporary files in. This directory must be
|
||||
# writable by the user defined above! Defaults to "/var/spool/cups/tmp" or
|
||||
# the value of the TMPDIR environment variable.
|
||||
#
|
||||
|
||||
#TempDir /var/spool/cups/tmp
|
||||
|
||||
#
|
||||
# FilterLimit: sets the maximum cost of all job filters that can be run
|
||||
# at the same time. A limit of 0 means no limit. A typical job may need
|
||||
# a filter limit of at least 200; limits less than the minimum required
|
||||
# by a job force a single job to be printed at any time.
|
||||
#
|
||||
# The default limit is 0 (unlimited).
|
||||
#
|
||||
|
||||
#FilterLimit 0
|
||||
|
||||
########
|
||||
######## Network Options
|
||||
########
|
||||
|
||||
#
|
||||
# Ports/addresses that we listen to. The default port 631 is reserved
|
||||
# for the Internet Printing Protocol (IPP) and is what we use here.
|
||||
#
|
||||
# You can have multiple Port/Listen lines to listen to more than one
|
||||
# port or address, or to restrict access:
|
||||
#
|
||||
# Port 80
|
||||
# Port 631
|
||||
# Listen hostname
|
||||
# Listen hostname:80
|
||||
# Listen hostname:631
|
||||
# Listen 1.2.3.4
|
||||
# Listen 1.2.3.4:631
|
||||
#
|
||||
# NOTE: Unfortunately, most web browsers don't support TLS or HTTP Upgrades
|
||||
# for encryption. If you want to support web-based encryption you'll
|
||||
# probably need to listen on port 443 (the "https" port...)
|
||||
#
|
||||
|
||||
#Port 80
|
||||
#Port 443
|
||||
Port 631
|
||||
#MaxRequestSize 0
|
||||
|
||||
#
|
||||
# HostNameLookups: whether or not to do lookups on IP addresses to get a
|
||||
@@ -336,6 +164,12 @@ Port 631
|
||||
|
||||
#HostNameLookups On
|
||||
|
||||
#
|
||||
# Timeout: the timeout before requests time out. Default is 300 seconds.
|
||||
#
|
||||
|
||||
#Timeout 300
|
||||
|
||||
#
|
||||
# KeepAlive: whether or not to support the Keep-Alive connection
|
||||
# option. Default is on.
|
||||
@@ -350,162 +184,6 @@ Port 631
|
||||
|
||||
#KeepAliveTimeout 60
|
||||
|
||||
#
|
||||
# MaxClients: controls the maximum number of simultaneous clients that
|
||||
# will be handled. Defaults to 100.
|
||||
#
|
||||
|
||||
#MaxClients 100
|
||||
|
||||
#
|
||||
# MaxRequestSize: controls the maximum size of HTTP requests and print files.
|
||||
# Set to 0 to disable this feature (defaults to 0.)
|
||||
#
|
||||
|
||||
#MaxRequestSize 0
|
||||
|
||||
#
|
||||
# Timeout: the timeout before requests time out. Default is 300 seconds.
|
||||
#
|
||||
|
||||
#Timeout 300
|
||||
|
||||
|
||||
########
|
||||
######## Browsing Options
|
||||
########
|
||||
|
||||
#
|
||||
# Browsing: whether or not to broadcast and/or listen for CUPS printer
|
||||
# information on the network. Enabled by default.
|
||||
#
|
||||
|
||||
#Browsing On
|
||||
|
||||
#
|
||||
# BrowseProtocols: which protocols to use for browsing. Can be
|
||||
# any of the following separated by whitespace and/or commas:
|
||||
#
|
||||
# all - Use all supported protocols.
|
||||
# cups - Use the CUPS browse protocol.
|
||||
# slp - Use the SLPv2 protocol.
|
||||
#
|
||||
# The default is "cups".
|
||||
#
|
||||
# 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
|
||||
# requests.
|
||||
#
|
||||
|
||||
#BrowseProtocols cups
|
||||
|
||||
#
|
||||
# BrowseAddress: specifies a broadcast address to be used. By
|
||||
# default browsing information is not sent!
|
||||
#
|
||||
# Note: HP-UX does not properly handle broadcast unless you have a
|
||||
# Class A, B, C, or D netmask (i.e. no CIDR support).
|
||||
#
|
||||
# Note: Using the "global" broadcast address (255.255.255.255) will
|
||||
# activate a Linux demand-dial link with the default configuration.
|
||||
# If you have a LAN as well as the dial-up link, use the LAN's
|
||||
# broadcast address.
|
||||
#
|
||||
|
||||
#BrowseAddress x.y.z.255
|
||||
#BrowseAddress x.y.255.255
|
||||
#BrowseAddress x.255.255.255
|
||||
#BrowseAddress 255.255.255.255
|
||||
|
||||
#
|
||||
# BrowseShortNames: whether or not to use "short" names for remote printers
|
||||
# when possible (e.g. "printer" instead of "printer@host".) Enabled by
|
||||
# default.
|
||||
#
|
||||
|
||||
#BrowseShortNames Yes
|
||||
|
||||
#
|
||||
# BrowseAllow: specifies an address mask to allow for incoming browser
|
||||
# packets. The default is to allow packets from all addresses.
|
||||
#
|
||||
# BrowseDeny: specifies an address mask to deny for incoming browser
|
||||
# packets. The default is to deny packets from no addresses.
|
||||
#
|
||||
# Both "BrowseAllow" and "BrowseDeny" accept the following notations for
|
||||
# addresses:
|
||||
#
|
||||
# All
|
||||
# None
|
||||
# *.domain.com
|
||||
# .domain.com
|
||||
# host.domain.com
|
||||
# nnn.*
|
||||
# nnn.nnn.*
|
||||
# nnn.nnn.nnn.*
|
||||
# nnn.nnn.nnn.nnn
|
||||
# nnn.nnn.nnn.nnn/mm
|
||||
# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
#
|
||||
# The hostname/domainname restrictions only work if you have turned hostname
|
||||
# lookups on!
|
||||
#
|
||||
|
||||
#BrowseAllow address
|
||||
#BrowseDeny address
|
||||
|
||||
#
|
||||
# BrowseInterval: the time between browsing updates in seconds. Default
|
||||
# is 30 seconds.
|
||||
#
|
||||
# Note that browsing information is sent whenever a printer's state changes
|
||||
# as well, so this represents the maximum time between updates.
|
||||
#
|
||||
# Set this to 0 to disable outgoing broadcasts so your local printers are
|
||||
# not advertised but you can still see printers on other hosts.
|
||||
#
|
||||
|
||||
#BrowseInterval 30
|
||||
|
||||
#
|
||||
# BrowseOrder: specifies the order of BrowseAllow/BrowseDeny comparisons.
|
||||
#
|
||||
|
||||
#BrowseOrder allow,deny
|
||||
#BrowseOrder deny,allow
|
||||
|
||||
#
|
||||
# BrowsePoll: poll the named server(s) for printers
|
||||
#
|
||||
|
||||
#BrowsePoll address:port
|
||||
|
||||
#
|
||||
# BrowsePort: the port used for UDP broadcasts. By default this is
|
||||
# the IPP port; if you change this you need to do it on all servers.
|
||||
# Only one BrowsePort is recognized.
|
||||
#
|
||||
|
||||
#BrowsePort 631
|
||||
|
||||
#
|
||||
# BrowseRelay: relay browser packets from one address/network to another.
|
||||
#
|
||||
|
||||
#BrowseRelay source-address destination-address
|
||||
|
||||
#
|
||||
# BrowseTimeout: the timeout for network printers - if we don't
|
||||
# get an update within this time the printer will be removed
|
||||
# from the printer list. This number definitely should not be
|
||||
# less the BrowseInterval value for obvious reasons. Defaults
|
||||
# to 300 seconds.
|
||||
#
|
||||
|
||||
#BrowseTimeout 300
|
||||
|
||||
#
|
||||
# ImplicitClasses: whether or not to use implicit classes.
|
||||
#
|
||||
@@ -526,61 +204,97 @@ Port 631
|
||||
#ImplicitClasses On
|
||||
|
||||
#
|
||||
# ImplicitAnyClasses: whether or not to create "AnyPrinter" implicit
|
||||
# classes.
|
||||
#
|
||||
# When ImplicitAnyClasses is On and a local queue of the same name
|
||||
# exists, e.g. "printer", "printer@server1", "printer@server1", then
|
||||
# an implicit class called "Anyprinter" is created instead.
|
||||
#
|
||||
# When ImplicitAnyClasses is Off, implicit classes are not created
|
||||
# when there is a local queue of the same name.
|
||||
#
|
||||
# Disabled by default.
|
||||
# Browsing: whether or not to broadcast printer information to
|
||||
# other CUPS servers. Enabled by default.
|
||||
#
|
||||
|
||||
#ImplicitAnyCLasses Off
|
||||
#Browsing On
|
||||
|
||||
#
|
||||
# HideImplicitMembers: whether or not to show the members of an
|
||||
# implicit class.
|
||||
# BrowseInterval: the time between browsing updates in seconds. Default
|
||||
# is 30 seconds.
|
||||
#
|
||||
# When HideImplicitMembers is On, any remote printers that are
|
||||
# part of an implicit class are hidden from the user, who will
|
||||
# then only see a single queue even though many queues will be
|
||||
# supporting the implicit class.
|
||||
#
|
||||
# Enabled by default.
|
||||
# Note that browsing information is sent whenever a printer's state changes
|
||||
# as well, so this represents the maximum time between updates.
|
||||
#
|
||||
|
||||
#HideImplicitMembers On
|
||||
|
||||
|
||||
########
|
||||
######## Security Options
|
||||
########
|
||||
#BrowseInterval 30
|
||||
|
||||
#
|
||||
# SystemGroup: the group name for "System" (printer administration)
|
||||
# access. The default varies depending on the operating system, but
|
||||
# will be "sys", "system", or "root" (checked for in that order.)
|
||||
# BrowseTimeout: the timeout for network printers - if we don't
|
||||
# get an update within this time the printer will be removed
|
||||
# from the printer list. This number definitely should not be
|
||||
# less the BrowseInterval value for obvious reasons. Defaults
|
||||
# to 300 seconds.
|
||||
#
|
||||
|
||||
#SystemGroup sys
|
||||
#BrowseTimeout 300
|
||||
|
||||
#
|
||||
# BrowsePort: the port used for UDP broadcasts. By default this is
|
||||
# the IPP port; if you change this you need to do it on all servers.
|
||||
# Only one BrowsePort is recognized.
|
||||
#
|
||||
|
||||
#BrowsePort 631
|
||||
|
||||
#
|
||||
# BrowseAddress: specifies a broadcast address to be used. By
|
||||
# default browsing information is broadcast to all active interfaces.
|
||||
#
|
||||
# Note: HP-UX 10.20 and earlier do not properly handle broadcast unless
|
||||
# you have a Class A, B, C, or D netmask (i.e. no CIDR support).
|
||||
#
|
||||
|
||||
#BrowseAddress x.y.z.255
|
||||
#BrowseAddress x.y.255.255
|
||||
#BrowseAddress x.255.255.255
|
||||
|
||||
#
|
||||
# DocumentRoot: the root directory for HTTP documents that are served.
|
||||
# By default the compiled in directory.
|
||||
#
|
||||
|
||||
#DocumentRoot /usr/share/cups/doc
|
||||
|
||||
#
|
||||
# DefaultLanguage: the default language if not specified by the browser.
|
||||
# If not specified, the current locale is used.
|
||||
#
|
||||
|
||||
#DefaultLanguage en
|
||||
|
||||
#
|
||||
# DefaultCharset: the default character set to use. If not specified,
|
||||
# defaults to iso-8859-1. Note that this can also be overridden in
|
||||
# HTML documents...
|
||||
#
|
||||
|
||||
#DefaultCharset iso-8859-1
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
# bitmaps. The value can be any real number followed by "k" for
|
||||
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
|
||||
# (1 tile = 256x256 pixels.) Defaults to "8m" (8 megabytes).
|
||||
#
|
||||
|
||||
#RIPCache 8m
|
||||
|
||||
#
|
||||
# TempDir: the directory to put temporary files in. This directory must be
|
||||
# writable by the user defined above! Defaults to "/var/tmp" or the value
|
||||
# of the TMPDIR environment variable.
|
||||
#
|
||||
|
||||
#TempDir /var/tmp
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
# Locations are relative to DocumentRoot...
|
||||
#
|
||||
# AuthType: the authorization to use:
|
||||
#
|
||||
# None - Perform no authentication
|
||||
# Basic - Perform authentication using the HTTP Basic method.
|
||||
# Digest - Perform authentication using the HTTP Digest method.
|
||||
#
|
||||
# (Note: local certificate authentication can be substituted by
|
||||
# the client for Basic or Digest when connecting to the
|
||||
# localhost interface)
|
||||
# AuthType: the authorization to use; currently only "Basic" authorization is
|
||||
# supported.
|
||||
#
|
||||
# AuthClass: the authorization class; currently only "Anonymous", "User",
|
||||
# "System" (valid user belonging to group SystemGroup), and "Group"
|
||||
@@ -613,72 +327,29 @@ Port 631
|
||||
# The host and domain address require that you enable hostname lookups
|
||||
# with "HostNameLookups On" above.
|
||||
#
|
||||
# Encryption: whether or not to use encryption; this depends on having
|
||||
# the OpenSSL library linked into the CUPS library and scheduler.
|
||||
#
|
||||
# Possible values:
|
||||
#
|
||||
# Always - Always use encryption (SSL)
|
||||
# Never - Never use encryption
|
||||
# Required - Use TLS encryption upgrade
|
||||
# IfRequested - Use encryption if the server requests it
|
||||
#
|
||||
# The default value is "IfRequested".
|
||||
#
|
||||
|
||||
<Location />
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
</Location>
|
||||
|
||||
#<Location /classes>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, either with Allow
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
#</Location>
|
||||
|
||||
#<Location /classes/name>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, 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
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
#</Location>
|
||||
|
||||
#<Location /printers/name>
|
||||
<Location /printers>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, either with Allow
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
|
||||
## Anonymous access (default)
|
||||
#AuthType None
|
||||
|
||||
## Require a username and password (Basic authentication)
|
||||
## Require a username and password
|
||||
#AuthType Basic
|
||||
#AuthClass User
|
||||
|
||||
## Require a username and password (Digest/MD5 authentication)
|
||||
#AuthType Digest
|
||||
#AuthClass User
|
||||
|
||||
## Restrict access to local domain
|
||||
#Order Deny,Allow
|
||||
#Deny From All
|
||||
#Allow From .mydomain.com
|
||||
#</Location>
|
||||
</Location>
|
||||
|
||||
<Location /admin>
|
||||
#
|
||||
# You definitely will want to limit access to the administration functions.
|
||||
# You definitely will want to limit access to the administration tools.
|
||||
# The default configuration requires a local connection from a user who
|
||||
# is a member of the system group to do any admin tasks. You can change
|
||||
# the group name using the SystemGroup directive.
|
||||
@@ -691,10 +362,8 @@ AuthClass System
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
|
||||
#Encryption Required
|
||||
</Location>
|
||||
|
||||
#
|
||||
# End of "$Id: cupsd.conf 1871 2001-07-25 21:03:36Z mike $".
|
||||
# End of "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $".
|
||||
#
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
#
|
||||
# "$Id: cupsd.conf-personal 407 1999-06-17 20:02:43Z mike $"
|
||||
#
|
||||
# Scheduler configuration file for ESP Print Personal.
|
||||
#
|
||||
|
||||
########################################################################
|
||||
# #
|
||||
# This is the CUPS configuration file. If you are familiar with #
|
||||
# Apache or any of the other popular web servers, we've followed the #
|
||||
# same format. Any configuration variable used here has the same #
|
||||
# semantics as the corresponding variable in Apache. If we need #
|
||||
# different functionality then a different name is used to avoid #
|
||||
# confusion... #
|
||||
# #
|
||||
########################################################################
|
||||
|
||||
#
|
||||
# Ports/addresses that we listen to. The default port 631 is reserved
|
||||
# for the Internet Printing Protocol (IPP) and is what we use here.
|
||||
#
|
||||
# You can have multiple Listen lines to listen to more than one
|
||||
# port:
|
||||
#
|
||||
# Listen 127.0.0.1:80
|
||||
# Listen 127.0.0.1:631
|
||||
#
|
||||
# For ESP Print Personal, we can only listen on the local host...
|
||||
#
|
||||
|
||||
#Listen 127.0.0.1:80
|
||||
Listen 127.0.0.1:631
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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...
|
||||
#
|
||||
|
||||
User lp
|
||||
Group sys
|
||||
|
||||
#
|
||||
# SystemGroup: the group name for "System" (printer administration)
|
||||
# access.
|
||||
#
|
||||
|
||||
SystemGroup sys
|
||||
|
||||
#
|
||||
# ServerName: the hostname of your server, as advertised to the world.
|
||||
# By default CUPS will use the hostname of the system.
|
||||
#
|
||||
|
||||
#ServerName myhost.domain.com
|
||||
|
||||
#
|
||||
# ServerAdmin: the email address to send all complaints/problems to.
|
||||
# By default CUPS will use "root@hostname".
|
||||
#
|
||||
|
||||
#ServerAdmin root@your.domain.com
|
||||
|
||||
#
|
||||
# ServerRoot: the root directory for the scheduler.
|
||||
# By default the compiled-in value.
|
||||
#
|
||||
|
||||
#ServerRoot /var/cups
|
||||
|
||||
#
|
||||
# AccessLog: the access log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/access_log"
|
||||
#
|
||||
|
||||
#AccessLog logs/access_log
|
||||
|
||||
#
|
||||
# ErrorLog: the error log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/error_log"
|
||||
#
|
||||
|
||||
#ErrorLog logs/error_log
|
||||
|
||||
#
|
||||
# PageLog: the page log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/page_log"
|
||||
#
|
||||
|
||||
#PageLog logs/page_log
|
||||
|
||||
#
|
||||
# LogLevel: controls the number of messages logged to the ErrorLog
|
||||
# file and can be one of the following:
|
||||
#
|
||||
# debug Log everything.
|
||||
# info Log all requests and state changes.
|
||||
# warn Log errors and warnings.
|
||||
# error Log only errors.
|
||||
# none Log nothing.
|
||||
#
|
||||
|
||||
LogLevel info
|
||||
|
||||
#
|
||||
# MaxLogSize: controls the maximum size of each log file before they are
|
||||
# rotated. Defaults to 1048576 (1MB). Set to 0 to disable log rotating.
|
||||
#
|
||||
|
||||
#MaxLogSize 0
|
||||
|
||||
#
|
||||
# MaxRequestSize: controls the maximum size of print files. Set to 0 to
|
||||
# disable this feature (defaults to 0.)
|
||||
#
|
||||
|
||||
#MaxRequestSize 0
|
||||
|
||||
#
|
||||
# HostNameLookups: whether or not to do lookups on IP addresses to get a
|
||||
# fully-qualified hostname. This defaults to Off for performance reasons...
|
||||
#
|
||||
|
||||
#HostNameLookups On
|
||||
|
||||
#
|
||||
# Timeout: the timeout before requests time out. Default is 300 seconds.
|
||||
#
|
||||
|
||||
#Timeout 300
|
||||
|
||||
#
|
||||
# KeepAlive: whether or not to support the Keep-Alive connection
|
||||
# option. Default is on.
|
||||
#
|
||||
|
||||
#KeepAlive On
|
||||
|
||||
#
|
||||
# KeepAliveTimeout: the timeout before Keep-Alive connections are
|
||||
# automatically closed. Default is 60 seconds.
|
||||
#
|
||||
|
||||
#KeepAliveTimeout 60
|
||||
|
||||
#
|
||||
# Browsing: not available in ESP Print Personal.
|
||||
#
|
||||
|
||||
Browsing Off
|
||||
|
||||
#
|
||||
# DocumentRoot: the root directory for HTTP documents that are served.
|
||||
# By default the compiled in directory.
|
||||
#
|
||||
|
||||
#DocumentRoot /usr/share/cups/doc
|
||||
|
||||
#
|
||||
# DefaultLanguage: the default language if not specified by the browser.
|
||||
# If not specified, the current locale is used.
|
||||
#
|
||||
|
||||
#DefaultLanguage en
|
||||
|
||||
#
|
||||
# DefaultCharset: the default character set to use. If not specified,
|
||||
# defaults to iso-8859-1. Note that this can also be overridden in
|
||||
# HTML documents...
|
||||
#
|
||||
|
||||
#DefaultCharset iso-8859-1
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
# bitmaps. The value can be any real number followed by "k" for
|
||||
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
|
||||
# (1 tile = 256x256 pixels.) Defaults to "32m" (32 megabytes).
|
||||
#
|
||||
|
||||
#RIPCache: 32m
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
# Locations are relative to DocumentRoot...
|
||||
#
|
||||
# AuthType: the authorization to use; currently only "Basic" authorization is
|
||||
# supported.
|
||||
#
|
||||
# AuthClass: the authorization class; currently only "Anonymous", "User",
|
||||
# "System" (valid user belonging to group SystemGroup), and "Group"
|
||||
# (valid user belonging to the specified group) are supported.
|
||||
#
|
||||
# AuthGroupName: the group name for "Group" authorization.
|
||||
#
|
||||
# Order: the order of Allow/Deny processing.
|
||||
#
|
||||
# Allow: allows access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
# Deny: denies access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
|
||||
<Location />
|
||||
</Location>
|
||||
|
||||
<Location /printers>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, either with Allow
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
|
||||
## Require a username and password
|
||||
#AuthType Basic
|
||||
#AuthClass User
|
||||
|
||||
## Restrict access to local domain
|
||||
#Order Deny,Allow
|
||||
#Deny From All
|
||||
#Allow From .mydomain.com
|
||||
</Location>
|
||||
|
||||
<Location /admin>
|
||||
#
|
||||
# You definitely will want to limit access to the administration tools.
|
||||
# The default configuration requires a local connection from a user who
|
||||
# is a member of group "sys" to do any admin tasks. You can change the
|
||||
# group name using the SystemGroup directive.
|
||||
#
|
||||
|
||||
AuthType Basic
|
||||
AuthClass System
|
||||
|
||||
## Restrict access to local domain
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
</Location>
|
||||
|
||||
#
|
||||
# End of "$Id: cupsd.conf-personal 407 1999-06-17 20:02:43Z mike $".
|
||||
#
|
||||
@@ -0,0 +1,313 @@
|
||||
#
|
||||
# "$Id: cupsd.conf-professional 407 1999-06-17 20:02:43Z mike $"
|
||||
#
|
||||
# Scheduler configuration file for ESP Print Professional.
|
||||
#
|
||||
|
||||
########################################################################
|
||||
# #
|
||||
# This is the CUPS configuration file. If you are familiar with #
|
||||
# Apache or any of the other popular web servers, we've followed the #
|
||||
# same format. Any configuration variable used here has the same #
|
||||
# semantics as the corresponding variable in Apache. If we need #
|
||||
# different functionality then a different name is used to avoid #
|
||||
# confusion... #
|
||||
# #
|
||||
########################################################################
|
||||
|
||||
#
|
||||
# Ports/addresses that we listen to. The default port 631 is reserved
|
||||
# for the Internet Printing Protocol (IPP) and is what we use here.
|
||||
#
|
||||
# You can have multiple Port/Listen lines to listen to more than one
|
||||
# port or address, or to restrict access:
|
||||
#
|
||||
# Port 80
|
||||
# Port 631
|
||||
# Listen hostname
|
||||
# Listen hostname:80
|
||||
# Listen hostname:631
|
||||
# Listen 1.2.3.4
|
||||
# Listen 1.2.3.4:631
|
||||
#
|
||||
|
||||
#Port 80
|
||||
Port 631
|
||||
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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...
|
||||
#
|
||||
|
||||
User lp
|
||||
Group sys
|
||||
|
||||
#
|
||||
# SystemGroup: the group name for "System" (printer administration)
|
||||
# access.
|
||||
#
|
||||
|
||||
SystemGroup sys
|
||||
|
||||
#
|
||||
# ServerName: the hostname of your server, as advertised to the world.
|
||||
# By default CUPS will use the hostname of the system.
|
||||
#
|
||||
|
||||
#ServerName myhost.domain.com
|
||||
|
||||
#
|
||||
# ServerAdmin: the email address to send all complaints/problems to.
|
||||
# By default CUPS will use "root@hostname".
|
||||
#
|
||||
|
||||
#ServerAdmin root@your.domain.com
|
||||
|
||||
#
|
||||
# ServerRoot: the root directory for the scheduler.
|
||||
# By default the compiled-in value.
|
||||
#
|
||||
|
||||
#ServerRoot /var/cups
|
||||
|
||||
#
|
||||
# AccessLog: the access log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/access_log"
|
||||
#
|
||||
|
||||
#AccessLog logs/access_log
|
||||
|
||||
#
|
||||
# ErrorLog: the error log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/error_log"
|
||||
#
|
||||
|
||||
#ErrorLog logs/error_log
|
||||
|
||||
#
|
||||
# PageLog: the page log file; if this does not start with a leading /
|
||||
# then it is assumed to be relative to ServerRoot. By default set to
|
||||
# "logs/page_log"
|
||||
#
|
||||
|
||||
#PageLog logs/page_log
|
||||
|
||||
#
|
||||
# LogLevel: controls the number of messages logged to the ErrorLog
|
||||
# file and can be one of the following:
|
||||
#
|
||||
# debug Log everything.
|
||||
# info Log all requests and state changes.
|
||||
# warn Log errors and warnings.
|
||||
# error Log only errors.
|
||||
# none Log nothing.
|
||||
#
|
||||
|
||||
LogLevel info
|
||||
|
||||
#
|
||||
# MaxLogSize: controls the maximum size of each log file before they are
|
||||
# rotated. Defaults to 1048576 (1MB). Set to 0 to disable log rotating.
|
||||
#
|
||||
|
||||
#MaxLogSize 0
|
||||
|
||||
#
|
||||
# MaxRequestSize: controls the maximum size of print files. Set to 0 to
|
||||
# disable this feature (defaults to 0.)
|
||||
#
|
||||
|
||||
#MaxRequestSize 0
|
||||
|
||||
#
|
||||
# HostNameLookups: whether or not to do lookups on IP addresses to get a
|
||||
# fully-qualified hostname. This defaults to Off for performance reasons...
|
||||
#
|
||||
|
||||
#HostNameLookups On
|
||||
|
||||
#
|
||||
# Timeout: the timeout before requests time out. Default is 300 seconds.
|
||||
#
|
||||
|
||||
#Timeout 300
|
||||
|
||||
#
|
||||
# KeepAlive: whether or not to support the Keep-Alive connection
|
||||
# option. Default is on.
|
||||
#
|
||||
|
||||
#KeepAlive On
|
||||
|
||||
#
|
||||
# KeepAliveTimeout: the timeout before Keep-Alive connections are
|
||||
# automatically closed. Default is 60 seconds.
|
||||
#
|
||||
|
||||
#KeepAliveTimeout 60
|
||||
|
||||
#
|
||||
# ImplicitClasses: whether or not to use implicit classes.
|
||||
#
|
||||
# Printer classes can be specified explicitly in the classes.conf
|
||||
# file, implicitly based upon the printers available on the LAN, or
|
||||
# both.
|
||||
#
|
||||
# When ImplicitClasses is On, printers on the LAN with the same name
|
||||
# (e.g. Acme-LaserPrint-1000) will be put into a class with the same
|
||||
# name. This allows you to setup multiple redundant queues on a LAN
|
||||
# without a lot of administrative difficulties. If a user sends a
|
||||
# job to Acme-LaserPrint-1000, the job will go to the first available
|
||||
# queue.
|
||||
#
|
||||
# Enabled by default.
|
||||
#
|
||||
|
||||
#ImplicitClasses On
|
||||
|
||||
#
|
||||
# Browsing: whether or not to broadcast printer information to
|
||||
# other CUPS servers. Enabled by default.
|
||||
#
|
||||
|
||||
#Browsing On
|
||||
|
||||
#
|
||||
# BrowseInterval: the time between browsing updates in seconds. Default
|
||||
# is 30 seconds.
|
||||
#
|
||||
# Note that browsing information is sent whenever a printer's state changes
|
||||
# as well, so this represents the maximum time between updates.
|
||||
#
|
||||
|
||||
#BrowseInterval 30
|
||||
|
||||
#
|
||||
# BrowseTimeout: the timeout for network printers - if we don't
|
||||
# get an update within this time the printer will be removed
|
||||
# from the printer list. This number definitely should not be
|
||||
# less the BrowseInterval value for obvious reasons. Defaults
|
||||
# to 300 seconds.
|
||||
#
|
||||
|
||||
#BrowseTimeout 300
|
||||
|
||||
#
|
||||
# BrowsePort: the port used for UDP broadcasts. By default this is
|
||||
# the IPP port; if you change this you need to do it on all servers.
|
||||
# Only one BrowsePort is recognized.
|
||||
#
|
||||
|
||||
#BrowsePort 631
|
||||
|
||||
#
|
||||
# BrowseAddress: specifies a broadcast address to be used. By
|
||||
# default browsing information is broadcast to all active interfaces.
|
||||
#
|
||||
# Note: HP-UX 10.20 and earlier do not properly handle broadcast unless
|
||||
# you have a Class A, B, C, or D netmask (i.e. no CIDR support).
|
||||
#
|
||||
|
||||
#BrowseAddress x.y.z.255
|
||||
#BrowseAddress x.y.255.255
|
||||
#BrowseAddress x.255.255.255
|
||||
|
||||
#
|
||||
# DocumentRoot: the root directory for HTTP documents that are served.
|
||||
# By default the compiled in directory.
|
||||
#
|
||||
|
||||
#DocumentRoot /usr/share/cups/doc
|
||||
|
||||
#
|
||||
# DefaultLanguage: the default language if not specified by the browser.
|
||||
# If not specified, the current locale is used.
|
||||
#
|
||||
|
||||
#DefaultLanguage en
|
||||
|
||||
#
|
||||
# DefaultCharset: the default character set to use. If not specified,
|
||||
# defaults to iso-8859-1. Note that this can also be overridden in
|
||||
# HTML documents...
|
||||
#
|
||||
|
||||
#DefaultCharset iso-8859-1
|
||||
|
||||
#
|
||||
# RIPCache: the amount of memory that each RIP should use to cache
|
||||
# bitmaps. The value can be any real number followed by "k" for
|
||||
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
|
||||
# (1 tile = 256x256 pixels.) Defaults to "32m" (32 megabytes).
|
||||
#
|
||||
|
||||
#RIPCache: 32m
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
# Locations are relative to DocumentRoot...
|
||||
#
|
||||
# AuthType: the authorization to use; currently only "Basic" authorization is
|
||||
# supported.
|
||||
#
|
||||
# AuthClass: the authorization class; currently only "Anonymous", "User",
|
||||
# "System" (valid user belonging to group SystemGroup), and "Group"
|
||||
# (valid user belonging to the specified group) are supported.
|
||||
#
|
||||
# AuthGroupName: the group name for "Group" authorization.
|
||||
#
|
||||
# Order: the order of Allow/Deny processing.
|
||||
#
|
||||
# Allow: allows access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
# Deny: denies access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
|
||||
<Location />
|
||||
</Location>
|
||||
|
||||
<Location /printers>
|
||||
#
|
||||
# You may wish to limit access to printers and classes, either with Allow
|
||||
# and Deny lines, or by requiring a username and password.
|
||||
#
|
||||
|
||||
## Require a username and password
|
||||
#AuthType Basic
|
||||
#AuthClass User
|
||||
|
||||
## Restrict access to local domain
|
||||
#Order Deny,Allow
|
||||
#Deny From All
|
||||
#Allow From .mydomain.com
|
||||
</Location>
|
||||
|
||||
<Location /admin>
|
||||
#
|
||||
# You definitely will want to limit access to the administration tools.
|
||||
# The default configuration requires a local connection from a user who
|
||||
# is a member of group "sys" to do any admin tasks. You can change the
|
||||
# group name using the SystemGroup directive.
|
||||
#
|
||||
|
||||
AuthType Basic
|
||||
AuthClass System
|
||||
|
||||
## Restrict access to local domain
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
</Location>
|
||||
|
||||
#
|
||||
# End of "$Id: cupsd.conf-professional 407 1999-06-17 20:02:43Z mike $".
|
||||
#
|
||||
+12
-28
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.convs 1605 2001-03-02 22:34:21Z andy $"
|
||||
# "$Id: mime.convs 575 1999-07-30 13:57:16Z mike $"
|
||||
#
|
||||
# MIME converts file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products.
|
||||
# Copyright 1997-1999 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -41,38 +41,22 @@
|
||||
# PostScript filters
|
||||
#
|
||||
|
||||
#application/msword application/postscript 33 mswordtops
|
||||
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
|
||||
#text/html application/postscript 33 htmltops
|
||||
application/x-cshell application/postscript 33 texttops
|
||||
application/x-perl application/postscript 33 texttops
|
||||
application/x-shell application/postscript 33 texttops
|
||||
text/html application/postscript 33 texttops
|
||||
text/plain application/postscript 33 texttops
|
||||
application/vnd.cups-form application/vnd.cups-postscript 33 formtops
|
||||
#application/msword application/postscript 50 mswordtops
|
||||
application/pdf application/postscript 50 pdftops
|
||||
application/postscript application/vnd.cups-postscript 50 pstops
|
||||
application/vnd.hp-HPGL application/postscript 50 hpgltops
|
||||
image/* application/vnd.cups-postscript 50 imagetops
|
||||
#text/html application/postscript 50 htmltops
|
||||
text/plain application/postscript 50 texttops
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Raster filters...
|
||||
#
|
||||
|
||||
image/* application/vnd.cups-raster 100 imagetoraster
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Raw filter...
|
||||
#
|
||||
# Uncomment the following filter and the application/octet-stream type
|
||||
# in mime.types to allow printing of arbitrary files without the -oraw
|
||||
# option.
|
||||
#
|
||||
|
||||
#*/* application/vnd.cups-raw 0 -
|
||||
image/* application/vnd.cups-raster 50 imagetoraster
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
|
||||
|
||||
#
|
||||
# End of "$Id: mime.convs 1605 2001-03-02 22:34:21Z andy $".
|
||||
# End of "$Id: mime.convs 575 1999-07-30 13:57:16Z mike $".
|
||||
#
|
||||
|
||||
+17
-51
@@ -1,9 +1,9 @@
|
||||
#
|
||||
# "$Id: mime.types 1806 2001-06-28 18:01:17Z mike $"
|
||||
# "$Id: mime.types 575 1999-07-30 13:57:16Z mike $"
|
||||
#
|
||||
# MIME types file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products.
|
||||
# Copyright 1997-1999 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
@@ -39,13 +39,12 @@
|
||||
# ascii(offset,length) True if bytes are valid printable ASCII
|
||||
# (CR, NL, TAB, BS, 32-126)
|
||||
# printable(offset,length) True if bytes are printable 8-bit chars
|
||||
# (CR, NL, TAB, BS, 32-126, 128-254)
|
||||
# (CR, NL, TAB, BS, 32-126, 160-254)
|
||||
# string(offset,"string") True if bytes are identical to 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
|
||||
# locale("string") True if current locale matches string
|
||||
# contains(offset,range,"string") True if the range contains the string
|
||||
#
|
||||
# General Notes:
|
||||
#
|
||||
@@ -57,10 +56,10 @@
|
||||
# type in the sorted list.
|
||||
#
|
||||
# The "printable" rule differs from the "ascii" rule in that it also
|
||||
# accepts 8-bit characters in the range 128-255.
|
||||
# accepts 8-bit characters in the range 160-254.
|
||||
#
|
||||
# String constants must be surrounded by "" if they contain whitespace.
|
||||
# To insert binary data into a string, use the <hex> notation.
|
||||
# To instead binary data into a string, use the <hex> notation.
|
||||
#
|
||||
|
||||
########################################################################
|
||||
@@ -71,13 +70,9 @@
|
||||
application/msword doc string(0,<D0CF11E0A1B11AE1>)
|
||||
application/pdf pdf string(0,%PDF)
|
||||
application/postscript ai eps ps string(0,%!) string(0,<04>%!)
|
||||
application/vnd.hp-HPGL hpgl string(0,<1B>&)\
|
||||
string(0,<1B>E<1B>%0B) string(0,<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")))
|
||||
application/vnd.hp-HPGL hpgl string(0,<1b>%) string(0,<1b>&)\
|
||||
string(0,<1b>E) string(0,<201b>)\
|
||||
string(0,BP;) string(0,IN;) string(0,DF;)
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -86,11 +81,7 @@ application/vnd.hp-HPGL hpgl string(0,<1B>&)\
|
||||
|
||||
image/gif gif string(0,GIF87a) string(0,GIF89a)
|
||||
image/png png string(0,<89>PNG)
|
||||
image/jpeg jpeg jpg jpe string(0,<FFD8FF>) &&\
|
||||
(char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
|
||||
char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
|
||||
char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
|
||||
char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
|
||||
image/jpeg jpeg jpg jpe string(6,JFIF)
|
||||
image/tiff tiff tif string(0,MM) string(0,II)
|
||||
image/x-photocd pcd string(2048,PCD_IPI)
|
||||
image/x-portable-anymap pnm
|
||||
@@ -101,11 +92,12 @@ 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-sun-raster ras string(0,<59a66a95>)
|
||||
image/x-sun-raster ras
|
||||
|
||||
#image/fpx fpx
|
||||
image/x-alias pix short(8,8) short(8,24)
|
||||
image/x-bitmap bmp string(0,BM) && !printable(2,14)
|
||||
# TODO: Add Alias, SoftImage, GIMP??? files
|
||||
#image/x-alias pix
|
||||
#image/x-softimage
|
||||
#image/x-gimp-xcf xcf xcf.gz
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -114,13 +106,6 @@ image/x-bitmap bmp string(0,BM) && !printable(2,14)
|
||||
|
||||
text/html html htm printable(0,1024) +\
|
||||
(string(0,"<HTML>") string(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,#!) +\
|
||||
contains(2,80,/perl)
|
||||
application/x-shell sh printable(0,1024) + string(0,#!) +\
|
||||
(contains(2,80,/bash) contains(2,80,/ksh)\
|
||||
contains(2,80,/sh) contains(2,80,/zsh))
|
||||
text/plain txt printable(0,1024)
|
||||
|
||||
########################################################################
|
||||
@@ -128,29 +113,10 @@ text/plain txt printable(0,1024)
|
||||
# CUPS-specific types...
|
||||
#
|
||||
|
||||
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 string(0,<1B>%-12345X)
|
||||
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")))
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Raw print file support...
|
||||
#
|
||||
# Uncomment the following type and the application/octet-stream
|
||||
# filter line in mime.convs to allow raw file printing without the
|
||||
# -oraw option.
|
||||
#
|
||||
|
||||
#application/octet-stream
|
||||
application/vnd.cups-raw
|
||||
|
||||
#
|
||||
# End of "$Id: mime.types 1806 2001-06-28 18:01:17Z mike $".
|
||||
# End of "$Id: mime.types 575 1999-07-30 13:57:16Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# This is a dummy printcap file that is automatically generated by the
|
||||
# CUPS software for old applications that rely on it.
|
||||
+11
-18
@@ -1,10 +1,10 @@
|
||||
#
|
||||
# "$Id: printers.conf 1605 2001-03-02 22:34:21Z andy $"
|
||||
# "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $"
|
||||
#
|
||||
# Sample printer configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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
|
||||
@@ -15,7 +15,7 @@
|
||||
#
|
||||
# Attn: CUPS Licensing Information
|
||||
# Easy Software Products
|
||||
# 44141 Airport View Drive, Suite 204
|
||||
# 44145 Airport View Drive, Suite 204
|
||||
# Hollywood, Maryland 20636-3111 USA
|
||||
#
|
||||
# Voice: (301) 373-9603
|
||||
@@ -47,6 +47,12 @@
|
||||
|
||||
#Info Acme LaserPrint 1000
|
||||
|
||||
#
|
||||
# MoreInfo: a URL for more information on the printer.
|
||||
#
|
||||
|
||||
#MoreInfo http://www.acme.com/lp1000.html
|
||||
|
||||
#
|
||||
# Location: the location of the printer.
|
||||
#
|
||||
@@ -71,26 +77,13 @@
|
||||
# State: sets the initial state of the printer. Can be one of the
|
||||
# following:
|
||||
#
|
||||
# Idle - Printer is available to print new jobs.
|
||||
# Idle - Printer is available to accept new jobs.
|
||||
# Stopped - Printer is disabled but accepting new jobs.
|
||||
#
|
||||
|
||||
#State Idle
|
||||
|
||||
#
|
||||
# StateMessage: sets the printer-state-message attribute for the printer.
|
||||
#
|
||||
|
||||
#StateMessage Printer is idle.
|
||||
|
||||
#
|
||||
# Accepting: is the printer accepting jobs?
|
||||
#
|
||||
#Accepting Yes
|
||||
#Accepting No
|
||||
|
||||
#</Printer>
|
||||
|
||||
#
|
||||
# End of "$Id: printers.conf 1605 2001-03-02 22:34:21Z andy $".
|
||||
# End of "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 1842 2001-07-17 22:35:52Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Default compiler flags...
|
||||
CFLAGS="${CFLAGS:=}"
|
||||
CXXFLAGS="${CXXFLAGS:=}"
|
||||
LDFLAGS="${LDFLAGS:=}"
|
||||
|
||||
dnl Checks for programs...
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
if test "$INSTALL" = "$ac_install_sh"; then
|
||||
# Use full path to install-sh script...
|
||||
INSTALL="`pwd`/install-sh -c"
|
||||
fi
|
||||
AC_PROG_RANLIB
|
||||
AC_PATH_PROG(AR,ar)
|
||||
AC_PATH_PROG(HTMLDOC,htmldoc)
|
||||
AC_PATH_PROG(MV,mv)
|
||||
AC_PATH_PROG(NROFF,nroff)
|
||||
if test "$NROFF" = ""; then
|
||||
AC_PATH_PROG(GROFF,groff)
|
||||
if test "$GROFF" = ""; then
|
||||
NROFF="echo"
|
||||
else
|
||||
NROFF="$GROFF -T ascii"
|
||||
fi
|
||||
fi
|
||||
AC_PATH_PROG(RM,rm)
|
||||
AC_PATH_PROG(SED,sed)
|
||||
|
||||
dnl Architecture checks...
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
dnl Check for libraries...
|
||||
AC_CHECK_LIB(c,crypt,LIBS="$LIBS")
|
||||
if test "$ac_cv_lib_c_crypt" = "no"; then
|
||||
AC_CHECK_LIB(crypt,crypt)
|
||||
fi
|
||||
AC_CHECK_LIB(sec,getspent)
|
||||
AC_CHECK_LIB(gen,getspent)
|
||||
|
||||
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")
|
||||
fi
|
||||
AC_SUBST(LIBMALLOC)
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_CHECK_HEADER(crypt.h,AC_DEFINE(HAVE_CRYPT_H))
|
||||
AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H))
|
||||
AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H))
|
||||
AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H))
|
||||
AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H))
|
||||
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_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)
|
||||
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
|
||||
echo Forcing snprintf emulation for HP-UX.
|
||||
else
|
||||
AC_CHECK_FUNCS(snprintf vsnprintf)
|
||||
fi
|
||||
|
||||
dnl Check OS version and use appropriate format string for strftime...
|
||||
AC_MSG_CHECKING(for correct format string to use with strftime)
|
||||
|
||||
case "$uname" in
|
||||
IRIX* | SunOS*)
|
||||
# IRIX and SunOS
|
||||
AC_MSG_RESULT(NULL)
|
||||
AC_DEFINE(CUPS_STRFTIME_FORMAT, NULL)
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
AC_MSG_RESULT("%c")
|
||||
AC_DEFINE(CUPS_STRFTIME_FORMAT, "%c")
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Checks for mkstemp function.
|
||||
AC_CHECK_FUNCS(mkstemp)
|
||||
|
||||
dnl Checks for vsyslog function.
|
||||
AC_CHECK_FUNCS(vsyslog)
|
||||
|
||||
dnl Checks for signal functions.
|
||||
if test "$uname" != "Linux"; then
|
||||
AC_CHECK_FUNCS(sigset)
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
|
||||
dnl Checks for wait functions.
|
||||
AC_CHECK_FUNCS(waitpid)
|
||||
AC_CHECK_FUNCS(wait3)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 1842 2001-07-17 22:35:52Z mike $".
|
||||
dnl
|
||||
@@ -1,118 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-compiler.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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 Clear the debugging and non-shared library options unless the user asks
|
||||
dnl for them...
|
||||
|
||||
OPTIM=""
|
||||
AC_SUBST(OPTIM)
|
||||
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],
|
||||
[if test x$enable_debug = xyes; then
|
||||
OPTIM="-g"
|
||||
fi])
|
||||
|
||||
dnl Update compiler options...
|
||||
if test -n "$GCC"; then
|
||||
CXX="$CC"
|
||||
|
||||
if test -z "$OPTIM"; then
|
||||
if test $uname = HP-UX; then
|
||||
# GCC under HP-UX has bugs with -O2
|
||||
OPTIM="-O1"
|
||||
else
|
||||
OPTIM="-O2"
|
||||
fi
|
||||
fi
|
||||
if test $PICFLAG = 1 -a $uname != AIX; then
|
||||
OPTIM="-fPIC $OPTIM"
|
||||
fi
|
||||
OPTIM="-Wall $OPTIM"
|
||||
else
|
||||
case $uname in
|
||||
AIX*)
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O2 -qmaxmem=6000"
|
||||
fi
|
||||
;;
|
||||
HP-UX*)
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="+O2"
|
||||
fi
|
||||
|
||||
CFLAGS="-Ae $CFLAGS"
|
||||
|
||||
OPTIM="+DAportable $OPTIM"
|
||||
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="+z $OPTIM"
|
||||
fi
|
||||
;;
|
||||
IRIX*)
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O2"
|
||||
fi
|
||||
|
||||
if test $uversion -ge 62; then
|
||||
OPTIM="$OPTIM -n32 -mips3"
|
||||
fi
|
||||
|
||||
OPTIM="-fullwarn $OPTIM"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-xO4"
|
||||
fi
|
||||
|
||||
OPTIM="$OPTIM -xarch=generic"
|
||||
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="-KPIC $OPTIM"
|
||||
fi
|
||||
;;
|
||||
UNIX_SVR*)
|
||||
# UnixWare
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O"
|
||||
fi
|
||||
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="-KPIC $OPTIM"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Running some other operating system; inform the user they
|
||||
# should contribute the necessary options to
|
||||
# cups-support@cups.org...
|
||||
echo "Building CUPS with default compiler optimizations; contact"
|
||||
echo "cups-bugs@cups.org with uname and compiler options needed"
|
||||
echo "for your platform, or set the CFLAGS and CXXFLAGS"
|
||||
echo "environment variable before running configure."
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-compiler.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
@@ -1,230 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-directories.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl Directory stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
AC_PREFIX_DEFAULT(/)
|
||||
|
||||
AC_ARG_WITH(fontpath, [ --with-fontpath set font path for pstoraster],fontpath="$withval",fontpath="")
|
||||
AC_ARG_WITH(docdir, [ --with-docdir set path for documentation],docdir="$withval",docdir="")
|
||||
AC_ARG_WITH(logdir, [ --with-logdir set path for log files],logdir="$withval",logdir="")
|
||||
AC_ARG_WITH(rcdir, [ --with-rcdir set path for rc scripts],rcdir="$withval",rcdir="")
|
||||
|
||||
dnl Fix "prefix" variable if it hasn't been specified...
|
||||
if test "$prefix" = "NONE"; then
|
||||
prefix="/"
|
||||
fi
|
||||
|
||||
dnl Fix "exec_prefix" variable if it hasn't been specified...
|
||||
if test "$exec_prefix" = "NONE"; then
|
||||
if test "$prefix" = "/"; then
|
||||
exec_prefix="/usr"
|
||||
else
|
||||
exec_prefix="$prefix"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Fix "sharedstatedir" variable if it hasn't been specified...
|
||||
if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then
|
||||
sharedstatedir="/usr/com"
|
||||
fi
|
||||
|
||||
dnl Fix "datadir" variable if it hasn't been specified...
|
||||
if test "$datadir" = "\${prefix}/share"; then
|
||||
if test "$prefix" = "/"; then
|
||||
datadir="/usr/share"
|
||||
else
|
||||
datadir="$prefix/share"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Fix "includedir" variable if it hasn't been specified...
|
||||
if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then
|
||||
includedir="/usr/include"
|
||||
fi
|
||||
|
||||
dnl Fix "localstatedir" variable if it hasn't been specified...
|
||||
if test "$localstatedir" = "\${prefix}/var"; then
|
||||
if test "$prefix" = "/"; then
|
||||
localstatedir="/var"
|
||||
else
|
||||
localstatedir="$prefix/var"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Fix "sysconfdir" variable if it hasn't been specified...
|
||||
if test "$sysconfdir" = "\${prefix}/etc"; then
|
||||
if test "$prefix" = "/"; then
|
||||
sysconfdir="/etc"
|
||||
else
|
||||
sysconfdir="$prefix/etc"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Fix "libdir" variable for IRIX 6.x...
|
||||
if test "$uname" = "IRIX" -a $uversion -ge 62; then
|
||||
libdir="$exec_prefix/lib32"
|
||||
fi
|
||||
|
||||
dnl Fix "fontpath" variable...
|
||||
if test "x$fontpath" = "x"; then
|
||||
fontpath="$datadir/cups/fonts"
|
||||
fi
|
||||
|
||||
dnl Setup init.d locations...
|
||||
if test x$rcdir = x; then
|
||||
case "$uname" in
|
||||
FreeBSD* | OpenBSD*)
|
||||
# FreeBSD and OpenBSD
|
||||
INITDIR=""
|
||||
INITDDIR=""
|
||||
;;
|
||||
|
||||
NetBSD*)
|
||||
# NetBSD
|
||||
INITDIR=""
|
||||
INITDDIR="/etc/rc.d"
|
||||
;;
|
||||
|
||||
Linux*)
|
||||
# Linux seems to choose an init.d directory at random...
|
||||
if test -d /sbin/init.d; then
|
||||
# SuSE
|
||||
INITDIR="/sbin/init.d"
|
||||
INITDDIR=".."
|
||||
else
|
||||
if test -d /etc/rc.d; then
|
||||
# RedHat
|
||||
INITDIR="/etc/rc.d"
|
||||
INITDDIR="../init.d"
|
||||
else
|
||||
# Others
|
||||
INITDIR="/etc"
|
||||
INITDDIR="../init.d"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
OSF1* | HP-UX*)
|
||||
INITDIR="/sbin"
|
||||
INITDDIR="../init.d"
|
||||
;;
|
||||
|
||||
AIX*)
|
||||
INITDIR="/etc/rc.d"
|
||||
INITDDIR=".."
|
||||
;;
|
||||
|
||||
*)
|
||||
INITDIR="/etc"
|
||||
INITDDIR="../init.d"
|
||||
;;
|
||||
|
||||
esac
|
||||
else
|
||||
INITDIR=""
|
||||
INITDDIR="$rcdir"
|
||||
fi
|
||||
|
||||
AC_SUBST(INITDIR)
|
||||
AC_SUBST(INITDDIR)
|
||||
|
||||
dnl Setup default locations...
|
||||
CUPS_SERVERROOT='${sysconfdir}/cups'
|
||||
CUPS_REQUESTS='${localstatedir}/spool/cups'
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups")
|
||||
AC_DEFINE_UNQUOTED(CUPS_REQUESTS, "$localstatedir/spool/cups")
|
||||
|
||||
if test x$logdir = x; then
|
||||
CUPS_LOGDIR='${localstatedir}/log/cups'
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$localstatedir/log/cups")
|
||||
else
|
||||
CUPS_LOGDIR="$logdir"
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$logdir")
|
||||
fi
|
||||
|
||||
dnl See what directory to put server executables...
|
||||
case "$uname" in
|
||||
FreeBSD* | NetBSD* | OpenBSD*)
|
||||
# *BSD
|
||||
INSTALL_SYSV=""
|
||||
CUPS_SERVERBIN='${exec_prefix}/libexec/cups'
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$exec_prefix/libexec/cups")
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
INSTALL_SYSV="install-sysv"
|
||||
CUPS_SERVERBIN='${exec_prefix}/lib/cups'
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$exec_prefix/lib/cups")
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(INSTALL_SYSV)
|
||||
AC_SUBST(CUPS_SERVERROOT)
|
||||
AC_SUBST(CUPS_SERVERBIN)
|
||||
AC_SUBST(CUPS_LOGDIR)
|
||||
AC_SUBST(CUPS_REQUESTS)
|
||||
|
||||
dnl Set the CUPS_LOCALE directory...
|
||||
case "$uname" in
|
||||
Linux* | FreeBSD* | NetBSD* | OpenBSD*)
|
||||
CUPS_LOCALEDIR='${datadir}/locale'
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$datadir/locale")
|
||||
;;
|
||||
|
||||
OSF1* | AIX*)
|
||||
CUPS_LOCALEDIR='${exec_prefix}/lib/nls/msg'
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$exec_prefix/lib/nls/msg")
|
||||
;;
|
||||
|
||||
*)
|
||||
# This is the standard System V location...
|
||||
CUPS_LOCALEDIR='${exec_prefix}/lib/locale'
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$exec_prefix/lib/locale")
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(CUPS_LOCALEDIR)
|
||||
|
||||
dnl Set the CUPS_DATADIR directory...
|
||||
CUPS_DATADIR='${datadir}/cups'
|
||||
AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$datadir/cups")
|
||||
AC_SUBST(CUPS_DATADIR)
|
||||
|
||||
dnl Set the CUPS_DOCROOT directory...
|
||||
if test x$docdir = x; then
|
||||
CUPS_DOCROOT='${datadir}/doc/cups'
|
||||
docdir="$datadir/doc/cups"
|
||||
else
|
||||
CUPS_DOCROOT="$docdir"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_DOCROOT, "$docdir")
|
||||
AC_SUBST(CUPS_DOCROOT)
|
||||
|
||||
dnl Set the CUPS_FONTPATH directory...
|
||||
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$fontpath")
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-directories.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
@@ -1,70 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-image.m4 1794 2001-06-27 19:06:46Z mike $"
|
||||
dnl
|
||||
dnl Image library stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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 Save the current libraries since we don't want the image libraries
|
||||
dnl included with every program...
|
||||
SAVELIBS="$LIBS"
|
||||
|
||||
dnl Check for image libraries...
|
||||
LIBJPEG=""
|
||||
LIBPNG=""
|
||||
LIBTIFF=""
|
||||
LIBZ=""
|
||||
|
||||
AC_SUBST(LIBJPEG)
|
||||
AC_SUBST(LIBPNG)
|
||||
AC_SUBST(LIBTIFF)
|
||||
AC_SUBST(LIBZ)
|
||||
|
||||
AC_CHECK_HEADER(jpeglib.h,
|
||||
AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
|
||||
AC_DEFINE(HAVE_LIBJPEG)
|
||||
LIBJPEG="-ljpeg"
|
||||
LIBS="$LIBS -ljpeg"))
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
AC_CHECK_LIB(z, gzgets,
|
||||
AC_DEFINE(HAVE_LIBZ)
|
||||
LIBZ="-lz"
|
||||
LIBS="$LIBS -lz"))
|
||||
|
||||
dnl PNG library uses math library functions...
|
||||
AC_CHECK_LIB(m, pow)
|
||||
|
||||
AC_CHECK_HEADER(png.h,
|
||||
AC_CHECK_LIB(png, png_set_tRNS_to_alpha,
|
||||
AC_DEFINE(HAVE_LIBPNG)
|
||||
LIBPNG="-lpng -lm"))
|
||||
|
||||
AC_CHECK_HEADER(tiff.h,
|
||||
AC_CHECK_LIB(tiff, TIFFReadScanline,
|
||||
AC_DEFINE(HAVE_LIBTIFF)
|
||||
LIBTIFF="-ltiff"))
|
||||
|
||||
dnl Restore original LIBS settings...
|
||||
LIBS="$SAVELIBS"
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-image.m4 1794 2001-06-27 19:06:46Z mike $".
|
||||
dnl
|
||||
@@ -1,49 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-libtool.m4 1880 2001-08-06 19:37:10Z mike $"
|
||||
dnl
|
||||
dnl Libtool stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported=LIBTOOL_PATH
|
||||
turn on building with libtool (UNSUPPORTED!) [default=no]],
|
||||
[if test x$enable_libtool_unsupported != xno; then
|
||||
LIBTOOL="$enable_libtool_unsupported"
|
||||
enable_shared=no
|
||||
echo "WARNING: libtool is not supported or endorsed by Easy Software Products."
|
||||
echo " WE DO NOT PROVIDE TECHNICAL SUPPORT FOR LIBTOOL PROBLEMS."
|
||||
echo " (even if you have a support contract)"
|
||||
else
|
||||
LIBTOOL=""
|
||||
fi])
|
||||
|
||||
AC_SUBST(LIBTOOL)
|
||||
|
||||
if test x$LIBTOOL != x; then
|
||||
LIBCUPS="libcups.la"
|
||||
LIBCUPSIMAGE="libcupsimage.la"
|
||||
LINKCUPS="../cups/\$(LIBCUPS)"
|
||||
LINKCUPSIMAGE="../filter/\$(LIBCUPSIMAGE)"
|
||||
DSO="\$(CC)"
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-libtool.m4 1880 2001-08-06 19:37:10Z mike $".
|
||||
dnl
|
||||
@@ -1,94 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-manpages.m4 1813 2001-06-29 19:14:56Z mike $"
|
||||
dnl
|
||||
dnl Manpage stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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 Fix "mandir" variable...
|
||||
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
|
||||
case "$uname" in
|
||||
FreeBSD* | NetBSD* | OpenBSD* | AIX*)
|
||||
# *BSD + AIX
|
||||
mandir="/usr/share/man"
|
||||
AMANDIR="/usr/share/man"
|
||||
;;
|
||||
IRIX*)
|
||||
# SGI IRIX
|
||||
mandir="/usr/share/catman/u_man"
|
||||
AMANDIR="/usr/share/catman/a_man"
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
mandir="/usr/man"
|
||||
AMANDIR="/usr/man"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
AMANDIR="$mandir"
|
||||
fi
|
||||
|
||||
AC_SUBST(AMANDIR)
|
||||
|
||||
dnl Setup manpage extensions...
|
||||
case "$uname" in
|
||||
FreeBSD* | NetBSD* | OpenBSD*)
|
||||
# *BSD
|
||||
CAT1EXT=0
|
||||
CAT5EXT=0
|
||||
CAT8EXT=0
|
||||
MAN8EXT=8
|
||||
MAN8DIR=8
|
||||
;;
|
||||
IRIX*)
|
||||
# SGI IRIX
|
||||
CAT1EXT=z
|
||||
CAT5EXT=z
|
||||
CAT8EXT=z
|
||||
MAN8EXT=1m
|
||||
MAN8DIR=1
|
||||
;;
|
||||
SunOS* | HP-UX*)
|
||||
# Solaris and HP-UX
|
||||
CAT1EXT=1
|
||||
CAT5EXT=5
|
||||
CAT8EXT=1m
|
||||
MAN8EXT=1m
|
||||
MAN8DIR=1m
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
CAT1EXT=1
|
||||
CAT5EXT=5
|
||||
CAT8EXT=8
|
||||
MAN8EXT=8
|
||||
MAN8DIR=8
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(CAT1EXT)
|
||||
AC_SUBST(CAT5EXT)
|
||||
AC_SUBST(CAT8EXT)
|
||||
AC_SUBST(MAN8EXT)
|
||||
AC_SUBST(MAN8DIR)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-manpages.m4 1813 2001-06-29 19:14:56Z mike $".
|
||||
dnl
|
||||
@@ -1,36 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-network.m4 1794 2001-06-27 19:06:46Z mike $"
|
||||
dnl
|
||||
dnl Networking stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
NETLIBS=""
|
||||
|
||||
if test "$uname" != "IRIX"; then
|
||||
AC_CHECK_LIB(socket,socket,NETLIBS="-lsocket")
|
||||
AC_CHECK_LIB(nsl,gethostbyaddr,NETLIBS="$NETLIBS -lnsl")
|
||||
fi
|
||||
|
||||
AC_SUBST(NETLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-network.m4 1794 2001-06-27 19:06:46Z mike $".
|
||||
dnl
|
||||
@@ -1,47 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openslp.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl OpenSLP configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
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",)
|
||||
|
||||
LIBSLP=""
|
||||
|
||||
if test x$enable_slp != xno; then
|
||||
AC_CHECK_HEADER(slp.h,
|
||||
AC_CHECK_LIB(slp, SLPOpen,
|
||||
AC_DEFINE(HAVE_LIBSLP)
|
||||
LIBSLP="-lslp"))
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBSLP)
|
||||
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openslp.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
@@ -1,69 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-openssl.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl OpenSSL stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
AC_ARG_ENABLE(ssl, [ --enable-ssl turn on SSL/TLS support [default=yes]])
|
||||
AC_ARG_WITH(openssl-libs, [ --with-openssl-libs set directory for OpenSSL library],
|
||||
LDFLAGS="-L$withval $LDFLAGS"
|
||||
DSOFLAGS="-L$withval $DSOFLAGS",)
|
||||
AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenSSL includes],
|
||||
CFLAGS="-I$withval $CFLAGS"
|
||||
CXXFLAGS="-I$withval $CXXFLAGS",)
|
||||
|
||||
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 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)
|
||||
|
||||
if test "x${SSLLIBS}" != "x"; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
LIBS="$SAVELIBS")
|
||||
fi
|
||||
|
||||
AC_SUBST(SSLLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-openssl.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
@@ -1,85 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-opsys.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl Operating system stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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 Get the operating system and version number...
|
||||
uname=`uname`
|
||||
uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'`
|
||||
if test x$uname = xIRIX64; then
|
||||
uname="IRIX"
|
||||
fi
|
||||
|
||||
dnl Determine the correct username and group for this OS...
|
||||
AC_ARG_WITH(cups-user, [ --with-cups-user set default user for CUPS],
|
||||
CUPS_USER="$withval",
|
||||
AC_MSG_CHECKING(for default print user)
|
||||
if test -f /etc/passwd; then
|
||||
CUPS_USER=""
|
||||
for user in lp lpd guest daemon nobody; do
|
||||
if test "`grep \^${user}: /etc/passwd`" != ""; then
|
||||
CUPS_USER="$user"
|
||||
AC_MSG_RESULT($user)
|
||||
break;
|
||||
fi
|
||||
done
|
||||
|
||||
if test x$CUPS_USER = x; then
|
||||
CUPS_USER="${USER:=nobody}"
|
||||
AC_MSG_RESULT(not found, using "$CUPS_USER")
|
||||
fi
|
||||
else
|
||||
CUPS_USER="${USER:=nobody}"
|
||||
AC_MSG_RESULT(no password file, using "$CUPS_USER")
|
||||
fi)
|
||||
|
||||
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 -f /etc/group; then
|
||||
CUPS_GROUP=""
|
||||
for group in sys system root; do
|
||||
if test "`grep \^${group}: /etc/group`" != ""; then
|
||||
CUPS_GROUP="$group"
|
||||
AC_MSG_RESULT($group)
|
||||
break;
|
||||
fi
|
||||
done
|
||||
|
||||
if test x$CUPS_GROUP = x; then
|
||||
CUPS_GROUP="${GROUP:=nobody}"
|
||||
AC_MSG_RESULT(not found, using "$CUPS_GROUP")
|
||||
fi
|
||||
else
|
||||
CUPS_GROUP="${GROUP:=nobody}"
|
||||
AC_MSG_RESULT(no group file, using "$CUPS_GROUP")
|
||||
fi)
|
||||
|
||||
AC_SUBST(CUPS_USER)
|
||||
AC_SUBST(CUPS_GROUP)
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USER, "$CUPS_USER")
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GROUP, "$CUPS_GROUP")
|
||||
|
||||
dnl
|
||||
dnl "$Id: cups-opsys.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
@@ -1,59 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-pam.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl PAM stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
AC_ARG_ENABLE(pam, [ --enable-pam turn on PAM support [default=yes]])
|
||||
|
||||
dnl Don't use PAM with AIX...
|
||||
if test $uname = AIX; then
|
||||
enable_pam=no
|
||||
fi
|
||||
|
||||
PAMDIR=""
|
||||
PAMLIBS=""
|
||||
|
||||
if test x$enable_pam != xno; then
|
||||
SAVELIBS="$LIBS"
|
||||
AC_CHECK_LIB(dl,dlopen)
|
||||
AC_CHECK_LIB(pam,pam_start)
|
||||
|
||||
if test x$ac_cv_lib_pam_pam_start != xno; then
|
||||
if test x$ac_cv_lib_dl_dlopen != xno; then
|
||||
PAMLIBS="-lpam -ldl"
|
||||
else
|
||||
PAMLIBS="-lpam"
|
||||
fi
|
||||
if test -d /etc/pam.d; then
|
||||
PAMDIR="/etc/pam.d"
|
||||
fi
|
||||
fi
|
||||
|
||||
LIBS="$SAVELIBS"
|
||||
fi
|
||||
|
||||
AC_SUBST(PAMDIR)
|
||||
AC_SUBST(PAMLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-pam.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
@@ -1,136 +0,0 @@
|
||||
dnl
|
||||
dnl "$Id: cups-sharedlibs.m4 1870 2001-07-24 20:23:03Z mike $"
|
||||
dnl
|
||||
dnl Shared library support for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 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
|
||||
|
||||
PICFLAG=1
|
||||
DSOFLAGS="${DSOFLAGS:=}"
|
||||
|
||||
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries [default=yes]])
|
||||
|
||||
if test x$enable_shared != xno; then
|
||||
case "$uname" in
|
||||
SunOS* | UNIX_S*)
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-h,\$@ -G \$(OPTIM)"
|
||||
;;
|
||||
HP-UX*)
|
||||
LIBCUPS="libcups.sl.2"
|
||||
LIBCUPSIMAGE="libcupsimage.sl.2"
|
||||
DSO="ld"
|
||||
DSOFLAGS="$DSOFLAGS -b -z +h \$@"
|
||||
;;
|
||||
OSF1* | Linux* | IRIX* | FreeBSD* | NetBSD* | OpenBSD*)
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
AIX*)
|
||||
LIBCUPS="libcups_s.a"
|
||||
LIBCUPSIMAGE="libcupsimage_s.a"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry"
|
||||
;;
|
||||
*)
|
||||
echo "Warning: shared libraries may not be supported. Trying -shared"
|
||||
echo " option with compiler."
|
||||
LIBCUPS="libcups.so.2"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
PICFLAG=0
|
||||
LIBCUPS="libcups.a"
|
||||
LIBCUPSIMAGE="libcupsimage.a"
|
||||
DSO=":"
|
||||
fi
|
||||
|
||||
AC_SUBST(DSO)
|
||||
AC_SUBST(DSOFLAGS)
|
||||
AC_SUBST(LIBCUPS)
|
||||
AC_SUBST(LIBCUPSIMAGE)
|
||||
|
||||
LDFLAGS="-L../cups -L../filter $LDFLAGS"
|
||||
|
||||
if test x$enable_shared = xno; then
|
||||
LINKCUPS="-lcups"
|
||||
LINKCUPSIMAGE="-lcupsimage"
|
||||
LINKCUPS="$LINKCUPS \$(SSLLIBS)"
|
||||
else
|
||||
if test $uname = AIX; then
|
||||
|
||||
LINKCUPS="-lcups_s"
|
||||
LINKCUPSIMAGE="-lcupsimage_s"
|
||||
else
|
||||
LINKCUPS="-lcups"
|
||||
LINKCUPSIMAGE="-lcupsimage"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(LINKCUPS)
|
||||
AC_SUBST(LINKCUPSIMAGE)
|
||||
|
||||
dnl Update libraries for DSOs...
|
||||
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
|
||||
# are using any static libraries, and it also allows us to distribute
|
||||
# a single DSO rather than a bunch...
|
||||
DSOLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
|
||||
IMGLIBS=""
|
||||
|
||||
# The *BSD, HP-UX, and Solaris run-time linkers need help when
|
||||
# deciding where to find a DSO. Add linker options to tell them
|
||||
# where to find the DSO (usually in /usr/lib... duh!)
|
||||
case $uname in
|
||||
HP-UX*)
|
||||
# HP-UX
|
||||
DSOFLAGS="+b $libdir +fb $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,+b,$libdir,+fb"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
DSOFLAGS="-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -R$libdir"
|
||||
;;
|
||||
FreeBSD* | NetBSD* | OpenBSD*)
|
||||
# *BSD
|
||||
DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,-R$libdir"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
DSOLIBS=""
|
||||
IMGLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
|
||||
fi
|
||||
|
||||
AC_SUBST(DSOLIBS)
|
||||
AC_SUBST(IMGLIBS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-sharedlibs.m4 1870 2001-07-24 20:23:03Z mike $".
|
||||
dnl
|
||||
+6
-104
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* @configure_input@
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -19,7 +19,7 @@
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9600
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*/
|
||||
@@ -28,37 +28,15 @@
|
||||
* Version of software...
|
||||
*/
|
||||
|
||||
#define CUPS_SVERSION "CUPS v1.1.10"
|
||||
|
||||
|
||||
/*
|
||||
* Default user and group...
|
||||
*/
|
||||
|
||||
#define CUPS_DEFAULT_USER "lp"
|
||||
#define CUPS_DEFAULT_GROUP "sys"
|
||||
|
||||
#define CUPS_SVERSION "CUPS v1.0"
|
||||
|
||||
/*
|
||||
* Where are files stored?
|
||||
*/
|
||||
|
||||
#define CUPS_LOCALEDIR "/usr/share/locale"
|
||||
#define CUPS_SERVERROOT "/etc/cups"
|
||||
#define CUPS_SERVERBIN "/usr/lib/cups"
|
||||
#define CUPS_DOCROOT "/usr/share/doc/cups"
|
||||
#define CUPS_REQUESTS "/var/spool/cups"
|
||||
#define CUPS_LOGDIR "/var/logs/cups"
|
||||
#define CUPS_DATADIR "/usr/share/cups"
|
||||
#define CUPS_FONTPATH "/usr/share/cups/fonts"
|
||||
|
||||
|
||||
/*
|
||||
* What is the format string for strftime?
|
||||
*/
|
||||
|
||||
#define CUPS_STRFTIME_FORMAT NULL
|
||||
|
||||
#define CUPS_LOCALEDIR "/usr/lib/locale"
|
||||
#define CUPS_SERVERROOT "/var/cups"
|
||||
#define CUPS_DATADIR "/usr/share/cups"
|
||||
|
||||
/*
|
||||
* Do we have various image libraries?
|
||||
@@ -69,14 +47,12 @@
|
||||
#undef HAVE_LIBJPEG
|
||||
#undef HAVE_LIBTIFF
|
||||
|
||||
|
||||
/*
|
||||
* Does this machine store words in big-endian (MSB-first) order?
|
||||
*/
|
||||
|
||||
#undef WORDS_BIGENDIAN
|
||||
|
||||
|
||||
/*
|
||||
* Which directory functions and headers do we use?
|
||||
*/
|
||||
@@ -86,38 +62,18 @@
|
||||
#undef HAVE_SYS_NDIR_H
|
||||
#undef HAVE_NDIR_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have PAM stuff?
|
||||
*/
|
||||
|
||||
#ifndef HAVE_LIBPAM
|
||||
#define HAVE_LIBPAM 0
|
||||
#endif /* !HAVE_LIBPAM */
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <shadow.h>?
|
||||
*/
|
||||
|
||||
#undef HAVE_SHADOW_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <crypt.h>?
|
||||
*/
|
||||
|
||||
#undef HAVE_CRYPT_H
|
||||
|
||||
|
||||
/*
|
||||
* Use <string.h>, <strings.h>, or both?
|
||||
*/
|
||||
|
||||
#undef HAVE_STRING_H
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the strXXX() functions?
|
||||
*/
|
||||
@@ -126,22 +82,6 @@
|
||||
#undef HAVE_STRCASECMP
|
||||
#undef HAVE_STRNCASECMP
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the vsyslog() function?
|
||||
*/
|
||||
|
||||
#undef HAVE_VSYSLOG
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the (v)snprintf() functions?
|
||||
*/
|
||||
|
||||
#undef HAVE_SNPRINTF
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
|
||||
/*
|
||||
* What signal functions to use?
|
||||
*/
|
||||
@@ -149,7 +89,6 @@
|
||||
#undef HAVE_SIGSET
|
||||
#undef HAVE_SIGACTION
|
||||
|
||||
|
||||
/*
|
||||
* What wait functions to use?
|
||||
*/
|
||||
@@ -157,43 +96,6 @@
|
||||
#undef HAVE_WAITPID
|
||||
#undef HAVE_WAIT3
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the mallinfo function and malloc.h?
|
||||
*/
|
||||
|
||||
#undef HAVE_MALLINFO
|
||||
#undef HAVE_MALLOC_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the OpenSSL library?
|
||||
*/
|
||||
|
||||
#undef HAVE_LIBSSL
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the OpenSLP library?
|
||||
*/
|
||||
|
||||
#undef HAVE_LIBSLP
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <sys/ioctl.h>?
|
||||
*/
|
||||
|
||||
#undef HAVE_SYS_IOCTL_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have mkstemp()?
|
||||
*/
|
||||
|
||||
#undef HAVE_MKSTEMP
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+284
-14
@@ -3,7 +3,7 @@ dnl "$Id$"
|
||||
dnl
|
||||
dnl Configuration script for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
dnl Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
dnl Copyright 1997-1999 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,23 +23,293 @@ dnl WWW: http://www.cups.org
|
||||
dnl
|
||||
|
||||
AC_INIT(cups/cups.h)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PREFIX_DEFAULT(/usr)
|
||||
|
||||
sinclude(config-scripts/cups-opsys.m4)
|
||||
sinclude(config-scripts/cups-common.m4)
|
||||
sinclude(config-scripts/cups-directories.m4)
|
||||
sinclude(config-scripts/cups-manpages.m4)
|
||||
dnl Get the operating system and version number...
|
||||
|
||||
sinclude(config-scripts/cups-sharedlibs.m4)
|
||||
sinclude(config-scripts/cups-libtool.m4)
|
||||
sinclude(config-scripts/cups-compiler.m4)
|
||||
uname=`uname`
|
||||
uversion=`uname -r | sed -e '1,$s/\.//g'`
|
||||
if test "$uname" = "IRIX64"; then
|
||||
uname="IRIX"
|
||||
fi
|
||||
|
||||
sinclude(config-scripts/cups-image.m4)
|
||||
sinclude(config-scripts/cups-network.m4)
|
||||
sinclude(config-scripts/cups-openslp.m4)
|
||||
sinclude(config-scripts/cups-openssl.m4)
|
||||
sinclude(config-scripts/cups-pam.m4)
|
||||
dnl Clear the debugging and non-shared library options unless the user asks
|
||||
dnl for them...
|
||||
|
||||
AC_OUTPUT(Makedefs cups.list cups.sh)
|
||||
OPTIM=""
|
||||
AC_SUBST(OPTIM)
|
||||
PICFLAG=1
|
||||
CFLAGS="${CFLAGS:=}"
|
||||
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],[if eval "test x$enable_debug = xyes"; then
|
||||
OPTIM="-g "
|
||||
fi])
|
||||
AC_ARG_ENABLE(shared, [ --disable-shared turn off shared libraries [default=no]])
|
||||
if test "$disable_shared" != "yes"; then
|
||||
case "$uname" in
|
||||
SunOS* | UNIX_S*)
|
||||
LIBCUPS="libcups.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.1"
|
||||
DSO="\$(CC) -Wl,-h,\$@ -G \$(OPTIM) -o"
|
||||
;;
|
||||
HP-UX*)
|
||||
LIBCUPS="libcups.sl.1"
|
||||
LIBCUPSIMAGE="libcupsimage.sl.1"
|
||||
DSO="ld -b -z +h \$@ -o"
|
||||
;;
|
||||
OSF1* | Linux* | FreeBSD*)
|
||||
LIBCUPS="libcups.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.1"
|
||||
DSO="\$(CC) -Wl,-soname,\$@ -shared \$(OPTIM) -o"
|
||||
;;
|
||||
IRIX*)
|
||||
LIBCUPS="libcups.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.1"
|
||||
DSO="\$(CC) -soname \$@ -shared \$(OPTIM) -o"
|
||||
;;
|
||||
*)
|
||||
echo "Warning: shared libraries may not be supported. Trying -shared"
|
||||
echo " option with compiler."
|
||||
LIBCUPS="libcups.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.1"
|
||||
DSO="\$(CC) -Wl,-soname,\$@ -shared \$(OPTIM) -o"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
PICFLAG=0
|
||||
LIBCUPS="libcups.a"
|
||||
LIBCUPSIMAGE="libcupsimage.a"
|
||||
DSO=":"
|
||||
fi
|
||||
|
||||
dnl Checks for programs...
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CC
|
||||
AC_PROG_CPP
|
||||
AC_PROG_RANLIB
|
||||
AC_PATH_PROG(AR,ar)
|
||||
AC_PATH_PROG(CHMOD,chmod)
|
||||
AC_PATH_PROG(CP,cp)
|
||||
AC_PATH_PROG(NROFF,nroff)
|
||||
if test "$NROFF" = ""; then
|
||||
AC_PATH_PROG(GROFF,groff)
|
||||
if test "$GROFF" = ""; then
|
||||
NROFF="echo"
|
||||
else
|
||||
NROFF="$GROFF -T ascii"
|
||||
fi
|
||||
fi
|
||||
AC_PATH_PROG(HTMLDOC,htmldoc)
|
||||
AC_PATH_PROG(MKDIR,mkdir)
|
||||
AC_PATH_PROG(PACK,pack)
|
||||
if test "$PACK" = ""; then
|
||||
AC_PATH_PROG(PACK,gzip)
|
||||
if test "$PACK" = ""; then
|
||||
PACK="echo"
|
||||
CAT="dummy"
|
||||
else
|
||||
PACK="$PACK -fv9"
|
||||
CAT="gz"
|
||||
fi
|
||||
else
|
||||
PACK="$PACK -f"
|
||||
CAT="z"
|
||||
fi
|
||||
AC_SUBST(CAT)
|
||||
AC_PATH_PROG(RM,rm)
|
||||
AC_PATH_PROG(SED,sed)
|
||||
AC_PATH_PROG(SMBCLIENT,smbclient)
|
||||
if test "$SMBCLIENT" = ""; then
|
||||
echo "Looking for smbclient in standard locations..."
|
||||
AC_PATH_PROG(SMBCLIENT,smbclient,samba_not_detected,
|
||||
/usr/samba/bin:/usr/local/samba/bin:/usr/freeware/samba/bin:/opt/samba/bin)
|
||||
fi
|
||||
|
||||
dnl Architecture checks...
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
dnl Check for libraries...
|
||||
AC_CHECK_LIB(c,crypt,LIBS="$LIBS",AC_CHECK_LIB(crypt,crypt))
|
||||
AC_CHECK_HEADER(crypt.h, AC_DEFINE(HAVE_CRYPT_H))
|
||||
AC_CHECK_LIB(sec,getspent)
|
||||
|
||||
NETLIBS=""
|
||||
AC_SUBST(NETLIBS)
|
||||
AC_CHECK_LIB(socket,socket,
|
||||
if test "$uname" != "IRIX"; then
|
||||
NETLIBS="-lsocket"
|
||||
else
|
||||
echo "Not using -lsocket since you are running IRIX."
|
||||
fi)
|
||||
AC_CHECK_LIB(nsl,gethostbyaddr,
|
||||
if test "$uname" != "IRIX"; then
|
||||
NETLIBS="$NETLIBS -lnsl"
|
||||
else
|
||||
echo "Not using -lnsl since you are running IRIX."
|
||||
fi)
|
||||
|
||||
LIBJPEG=""
|
||||
LIBPNG=""
|
||||
LIBTIFF=""
|
||||
LIBZ=""
|
||||
|
||||
AC_SUBST(LIBJPEG)
|
||||
AC_SUBST(LIBPNG)
|
||||
AC_SUBST(LIBTIFF)
|
||||
AC_SUBST(LIBZ)
|
||||
|
||||
AC_CHECK_HEADER(jpeglib.h,
|
||||
AC_DEFINE(HAVE_LIBJPEG)
|
||||
LIBJPEG="-ljpeg")
|
||||
AC_CHECK_HEADER(png.h,
|
||||
AC_DEFINE(HAVE_LIBPNG)
|
||||
LIBPNG="-lpng")
|
||||
AC_CHECK_HEADER(tiff.h,
|
||||
AC_DEFINE(HAVE_LIBTIFF)
|
||||
LIBTIFF="-ltiff")
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
AC_DEFINE(HAVE_LIBZ)
|
||||
LIBZ="-lz")
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H))
|
||||
|
||||
dnl Checks for string functions.
|
||||
AC_CHECK_FUNCS(strdup)
|
||||
AC_CHECK_FUNCS(strcasecmp)
|
||||
AC_CHECK_FUNCS(strncasecmp)
|
||||
|
||||
dnl Checks for signal functions.
|
||||
AC_CHECK_FUNCS(sigset)
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
|
||||
dnl Checks for wait functions.
|
||||
AC_CHECK_FUNCS(waitpid)
|
||||
AC_CHECK_FUNCS(wait3)
|
||||
|
||||
dnl Update compiler options...
|
||||
if test -n "$GXX"; then
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O2"
|
||||
fi
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="-fPIC $OPTIM"
|
||||
fi
|
||||
else
|
||||
case $uname in
|
||||
IRIX*)
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O2"
|
||||
fi
|
||||
if test $uversion -ge 62; then
|
||||
OPTIM="$OPTIM -n32 -mips3"
|
||||
fi
|
||||
;;
|
||||
HP-UX*)
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="+O2"
|
||||
fi
|
||||
OPTIM="-Ae $OPTIM"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
if test -z "$OPTIM"; then
|
||||
OPTIM="-O"
|
||||
fi
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="-KPIC $OPTIM"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Running some other operating system; inform the user they
|
||||
# should contribute the necessary options to
|
||||
# cups-support@cups.org...
|
||||
echo "Building CUPS with default compiler optimizations; contact"
|
||||
echo "cups-support@cups.org with uname and compiler options needed"
|
||||
echo "for your platform, or set the CFLAGS environment variable"
|
||||
echo "before running configure."
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
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
|
||||
# are using any static libraries, and it also allows us to distribute
|
||||
# a single DSO rather than a bunch...
|
||||
DSOLIBS="\$(LIBJPEG) \$(LIBPNG) \$(LIBTIFF) \$(LIBZ)"
|
||||
IMGLIBS=""
|
||||
|
||||
# The HP-UX and Solaris run-time linkers are EXTREMELY stupid when
|
||||
# it comes to deciding where to find a DSO. Add linker options to
|
||||
# tell them where to find the DSO (usually in /usr/lib... duh!)
|
||||
case $uname in
|
||||
HP-UX*)
|
||||
LDFLAGS="$LDFLAGS -Wl,+b,$libdir,+fb"
|
||||
;;
|
||||
SunOS*)
|
||||
# Solaris
|
||||
LDFLAGS="-R$libdir"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
DSOLIBS=""
|
||||
IMGLIBS="\$(LIBJPEG) \$(LIBPNG) \$(LIBTIFF) \$(LIBZ)"
|
||||
fi
|
||||
|
||||
AC_SUBST(DSO)
|
||||
AC_SUBST(DSOLIBS)
|
||||
AC_SUBST(IMGLIBS)
|
||||
AC_SUBST(LIBCUPS)
|
||||
AC_SUBST(LIBCUPSIMAGE)
|
||||
|
||||
dnl Fix "prefix" variable if it hasn't been specified...
|
||||
if test "$prefix" = "NONE"; then
|
||||
prefix="/usr"
|
||||
fi
|
||||
|
||||
dnl Fix "libdir" variable for IRIX 6.x...
|
||||
if test "$uname" = "IRIX" -a $uversion -ge 62; then
|
||||
libdir="/usr/lib32"
|
||||
fi
|
||||
|
||||
dnl CUPS_SERVERROOT needs special attention for the default location...
|
||||
if test "$prefix" = "/usr"; then
|
||||
CUPS_SERVERROOT="/var/cups"
|
||||
else
|
||||
CUPS_SERVERROOT="$prefix/var/cups"
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$CUPS_SERVERROOT")
|
||||
AC_SUBST(CUPS_SERVERROOT)
|
||||
|
||||
dnl Set the CUPS_LOCALE directory...
|
||||
case "$uname" in
|
||||
Linux)
|
||||
CUPS_LOCALEDIR="$prefix/share/locale"
|
||||
;;
|
||||
|
||||
OSF1)
|
||||
CUPS_LOCALEDIR="$prefix/lib/nls/msg"
|
||||
;;
|
||||
|
||||
*)
|
||||
# This is the standard System V location...
|
||||
CUPS_LOCALEDIR="$prefix/lib/locale"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR")
|
||||
AC_SUBST(CUPS_LOCALEDIR)
|
||||
|
||||
dnl Set the CUPS_DATAFILE directory...
|
||||
CUPS_DATADIR="$prefix/share/cups"
|
||||
AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$CUPS_DATADIR")
|
||||
AC_SUBST(CUPS_DATADIR)
|
||||
|
||||
AC_OUTPUT(Makedefs)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id$".
|
||||
|
||||
+84
@@ -15,6 +15,90 @@ Package=<4>
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "hpgltops"=.\filter\hpgltops.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "image"=.\filter\image.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pstops"=.\filter\pstops.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "testmime"=.\cups\testmime.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "testppd"=.\cups\testppd.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "texttops"=.\filter\texttops.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
|
||||
-357
@@ -1,357 +0,0 @@
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# ESP Package Manager (EPM) file list for the Common UNIX Printing
|
||||
# System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
# 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
|
||||
#
|
||||
|
||||
# Product information
|
||||
%product Common UNIX Printing System
|
||||
%copyright 1993-2001 by Easy Software Products, All Rights Reserved.
|
||||
%vendor Easy Software Products
|
||||
%license LICENSE.txt
|
||||
%readme README.txt
|
||||
%version 1.1.10-0
|
||||
%incompat printpro
|
||||
%provides cups
|
||||
%provides cupsys
|
||||
%provides cups-devel
|
||||
%provides cupsys-devel
|
||||
%provides cups-pstoraster
|
||||
%provides libcups1
|
||||
%provides libcups.so.2
|
||||
|
||||
#
|
||||
# GNU variables...
|
||||
#
|
||||
|
||||
$prefix=@prefix@
|
||||
$exec_prefix=@exec_prefix@
|
||||
$bindir=@bindir@
|
||||
$datadir=@datadir@
|
||||
$includedir=@includedir@
|
||||
$infodir=@infodir@
|
||||
$libdir=@libdir@
|
||||
$libexecdir=@libexecdir@
|
||||
$localstatedir=@localstatedir@
|
||||
$mandir=@mandir@
|
||||
$oldincludedir=@oldincludedir@
|
||||
$sbindir=@sbindir@
|
||||
$sharedstatedir=@sharedstatedir@
|
||||
$srcdir=@srcdir@
|
||||
$sysconfdir=@sysconfdir@
|
||||
$top_srcdir=@top_srcdir@
|
||||
|
||||
#
|
||||
# ESP variables...
|
||||
#
|
||||
|
||||
$AMANDIR=@AMANDIR@
|
||||
$BINDIR=@bindir@
|
||||
$DATADIR=@CUPS_DATADIR@
|
||||
$DOCDIR=@CUPS_DOCROOT@
|
||||
$INCLUDEDIR=${includedir}
|
||||
$INITDIR=@INITDIR@
|
||||
$INITDDIR=@INITDDIR@
|
||||
$LIBDIR=${libdir}
|
||||
$LOCALEDIR=@CUPS_LOCALEDIR@
|
||||
$LOGDIR=@CUPS_LOGDIR@
|
||||
$MANDIR=@mandir@
|
||||
$PAMDIR=@PAMDIR@
|
||||
$REQUESTS=@CUPS_REQUESTS@
|
||||
$SBINDIR=@sbindir@
|
||||
$SERVERBIN=@CUPS_SERVERBIN@
|
||||
$SERVERROOT=@CUPS_SERVERROOT@
|
||||
|
||||
$CUPS_USER=@CUPS_USER@
|
||||
|
||||
$CAT1EXT=@CAT1EXT@
|
||||
$CAT5EXT=@CAT5EXT@
|
||||
$CAT8EXT=@CAT8EXT@
|
||||
$MAN8EXT=@MAN8EXT@
|
||||
$MAN8DIR=@MAN8DIR@
|
||||
|
||||
# Make sure the MD5 password file is now owned by CUPS_USER...
|
||||
%postinstall if test -f $SERVERROOT/passwd.md5; then
|
||||
%postinstall chown $CUPS_USER $SERVERROOT/passwd.md5
|
||||
%postinstall fi
|
||||
|
||||
# Server programs
|
||||
%system all
|
||||
# Server files
|
||||
f 0555 root sys $SBINDIR/cupsd scheduler/cupsd
|
||||
|
||||
d 0555 root sys $SERVERBIN -
|
||||
d 0555 root sys $SERVERBIN/backend -
|
||||
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/serial backend/serial
|
||||
f 0555 root sys $SERVERBIN/backend/socket backend/socket
|
||||
f 0555 root sys $SERVERBIN/backend/usb backend/usb
|
||||
d 0555 root sys $SERVERBIN/cgi-bin -
|
||||
f 0555 root sys $SERVERBIN/cgi-bin/admin.cgi cgi-bin/admin.cgi
|
||||
f 0555 root sys $SERVERBIN/cgi-bin/classes.cgi cgi-bin/classes.cgi
|
||||
f 0555 root sys $SERVERBIN/cgi-bin/jobs.cgi cgi-bin/jobs.cgi
|
||||
f 0555 root sys $SERVERBIN/cgi-bin/printers.cgi cgi-bin/printers.cgi
|
||||
d 0555 root sys $SERVERBIN/daemon -
|
||||
f 0555 root sys $SERVERBIN/daemon/cups-lpd scheduler/cups-lpd
|
||||
f 0555 root sys $SERVERBIN/daemon/cups-polld scheduler/cups-polld
|
||||
d 0555 root sys $SERVERBIN/filter -
|
||||
f 0555 root sys $SERVERBIN/filter/pstoraster pstoraster/pstoraster
|
||||
f 0555 root sys $SERVERBIN/filter/pdftops pdftops/pdftops
|
||||
f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops
|
||||
f 0555 root sys $SERVERBIN/filter/pstops filter/pstops
|
||||
f 0555 root sys $SERVERBIN/filter/texttops filter/texttops
|
||||
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
|
||||
|
||||
# Admin commands
|
||||
l 0555 root sys $BINDIR/disable $SBINDIR/accept
|
||||
l 0555 root sys $BINDIR/enable $SBINDIR/accept
|
||||
l 0555 root sys $LIBDIR/accept $SBINDIR/accept
|
||||
l 0555 root sys $LIBDIR/lpadmin $SBINDIR/lpadmin
|
||||
l 0555 root sys $LIBDIR/reject accept
|
||||
f 0555 root sys $SBINDIR/accept systemv/accept
|
||||
f 0555 root sys $SBINDIR/lpadmin systemv/lpadmin
|
||||
f 0555 root sys $SBINDIR/lpc berkeley/lpc
|
||||
f 0555 root sys $SBINDIR/lpinfo systemv/lpinfo
|
||||
f 0555 root sys $SBINDIR/lpmove systemv/lpmove
|
||||
l 0555 root sys $SBINDIR/reject accept
|
||||
|
||||
%system irix
|
||||
l 0555 root sys /usr/etc/lpc $SBINDIR/lpc
|
||||
%system all
|
||||
|
||||
# User commands
|
||||
f 0555 root sys $BINDIR/cancel systemv/cancel
|
||||
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
|
||||
f 0555 root sys $BINDIR/lpq berkeley/lpq
|
||||
f 0555 root sys $BINDIR/lpr berkeley/lpr
|
||||
f 0555 root sys $BINDIR/lprm berkeley/lprm
|
||||
f 0555 root sys $BINDIR/lpstat systemv/lpstat
|
||||
|
||||
%system irix
|
||||
l 0555 root sys /usr/bsd/lpq $BINDIR/lpq
|
||||
l 0555 root sys /usr/bsd/lpr $BINDIR/lpr
|
||||
l 0555 root sys /usr/bsd/lprm $BINDIR/lprm
|
||||
%system all
|
||||
|
||||
# DSOs
|
||||
%system hpux
|
||||
f 0555 root sys $LIBDIR/libcups.sl.2 cups/libcups.sl.2
|
||||
l 0555 root sys $LIBDIR/libcups.sl libcups.sl.2
|
||||
f 0555 root sys $LIBDIR/libcupsimage.sl.2 filter/libcupsimage.sl.2
|
||||
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
|
||||
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
|
||||
l 0555 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2
|
||||
%system all
|
||||
|
||||
# Directories
|
||||
d 0755 root sys $LOGDIR -
|
||||
d 0700 $CUPS_USER sys $REQUESTS -
|
||||
d 1700 $CUPS_USER sys $REQUESTS/tmp -
|
||||
|
||||
# Data files
|
||||
f 0444 root sys $LOCALEDIR/C/cups_C locale/C/cups_C
|
||||
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/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
|
||||
|
||||
d 0555 root sys $DATADIR -
|
||||
|
||||
d 0555 root sys $DATADIR/banners -
|
||||
f 0444 root sys $DATADIR/banners/classified data/classified
|
||||
f 0444 root sys $DATADIR/banners/confidential data/confidential
|
||||
f 0444 root sys $DATADIR/banners/secret data/secret
|
||||
f 0444 root sys $DATADIR/banners/standard data/standard
|
||||
f 0444 root sys $DATADIR/banners/topsecret data/topsecret
|
||||
f 0444 root sys $DATADIR/banners/unclassified data/unclassified
|
||||
|
||||
d 0555 root sys $DATADIR/charsets -
|
||||
f 0444 root sys $DATADIR/charsets/windows-874 data/windows-874
|
||||
f 0444 root sys $DATADIR/charsets/windows-1250 data/windows-1250
|
||||
f 0444 root sys $DATADIR/charsets/windows-1251 data/windows-1251
|
||||
f 0444 root sys $DATADIR/charsets/windows-1252 data/windows-1252
|
||||
f 0444 root sys $DATADIR/charsets/windows-1253 data/windows-1253
|
||||
f 0444 root sys $DATADIR/charsets/windows-1254 data/windows-1254
|
||||
f 0444 root sys $DATADIR/charsets/windows-1255 data/windows-1255
|
||||
f 0444 root sys $DATADIR/charsets/windows-1256 data/windows-1256
|
||||
f 0444 root sys $DATADIR/charsets/windows-1257 data/windows-1257
|
||||
f 0444 root sys $DATADIR/charsets/windows-1258 data/windows-1258
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-1 data/iso-8859-1
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-14 data/iso-8859-14
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-15 data/iso-8859-15
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-2 data/iso-8859-2
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-3 data/iso-8859-3
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-4 data/iso-8859-4
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-5 data/iso-8859-5
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-6 data/iso-8859-6
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-7 data/iso-8859-7
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-8 data/iso-8859-8
|
||||
f 0444 root sys $DATADIR/charsets/iso-8859-9 data/iso-8859-9
|
||||
f 0444 root sys $DATADIR/charsets/utf-8 data/utf-8
|
||||
|
||||
d 0555 root sys $DATADIR/data -
|
||||
f 0444 root sys $DATADIR/data/HPGLprolog data/HPGLprolog
|
||||
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/*
|
||||
|
||||
d 0555 root sys $DATADIR/pstoraster -
|
||||
f 0444 root sys $DATADIR/pstoraster/Fontmap pstoraster/Fontmap
|
||||
f 0444 root sys $DATADIR/pstoraster pstoraster/gs*.ps
|
||||
|
||||
d 0555 root sys $DATADIR/model -
|
||||
f 0444 root sys $DATADIR/model ppd/*.ppd
|
||||
|
||||
d 0555 root sys $DATADIR/templates -
|
||||
f 0444 root sys $DATADIR/templates templates/*.tmpl
|
||||
|
||||
# Config files
|
||||
d 0555 root sys $SERVERROOT -
|
||||
d 0711 root sys $SERVERROOT/certs -
|
||||
d 0755 root sys $SERVERROOT/interfaces -
|
||||
d 0755 root sys $SERVERROOT/ppd -
|
||||
c 0644 root sys $SERVERROOT conf/*.conf
|
||||
f 0644 root sys $SERVERROOT/mime.convs conf/mime.convs
|
||||
f 0644 root sys $SERVERROOT/mime.types conf/mime.types
|
||||
|
||||
%system linux
|
||||
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 all
|
||||
|
||||
# Developer files
|
||||
d 0555 root sys $INCLUDEDIR/cups -
|
||||
f 0444 root sys $INCLUDEDIR/cups/cups.h cups/cups.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/http.h cups/http.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/image.h filter/image.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/ipp.h cups/ipp.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/language.h cups/language.h
|
||||
f 0444 root sys $INCLUDEDIR/cups/md5.h cups/md5.h
|
||||
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
|
||||
|
||||
# Documentation files
|
||||
d 0555 root sys $DOCDIR -
|
||||
f 0444 root sys $DOCDIR/cups.css doc/cups.css
|
||||
f 0444 root sys $DOCDIR doc/*.html
|
||||
f 0444 root sys $DOCDIR doc/*.pdf
|
||||
d 0555 root sys $DOCDIR/images -
|
||||
f 0444 root sys $DOCDIR/images doc/images/*.gif
|
||||
|
||||
# Man pages
|
||||
d 0555 root sys $AMANDIR -
|
||||
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 $MANDIR/cat5 -
|
||||
d 0555 root sys $MANDIR/man1 -
|
||||
d 0555 root sys $MANDIR/man5 -
|
||||
|
||||
f 0444 root sys $MANDIR/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lpoptions.$CAT1EXT man/lpoptions.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lppasswd.$CAT1EXT man/lppasswd.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lpq.$CAT1EXT man/lpq.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lprm.$CAT1EXT man/lprm.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lpr.$CAT1EXT man/lpr.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lpstat.$CAT1EXT man/lpstat.$CAT1EXT
|
||||
f 0444 root sys $MANDIR/cat1/lp.$CAT1EXT man/lp.$CAT1EXT
|
||||
l 0444 root sys $MANDIR/cat1/cancel.$CAT1EXT lp.$CAT1EXT
|
||||
|
||||
f 0444 root sys $MANDIR/cat5/classes.conf.$CAT5EXT man/classes.conf.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/cat5/cupsd.conf.$CAT5EXT man/cupsd.conf.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/cat5/mime.convs.$CAT5EXT man/mime.convs.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/cat5/mime.types.$CAT5EXT man/mime.types.$CAT5EXT
|
||||
f 0444 root sys $MANDIR/cat5/printers.conf.$CAT5EXT man/printers.conf.$CAT5EXT
|
||||
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/accept.$CAT8EXT man/accept.$CAT8EXT
|
||||
l 0444 root sys $AMANDIR/cat$MAN8DIR/reject.$CAT8EXT accept.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/cups-lpd.$CAT8EXT man/cups-lpd.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/cups-polld.$CAT8EXT man/cups-polld.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/cupsd.$CAT8EXT man/cupsd.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/enable.$CAT8EXT man/enable.$CAT8EXT
|
||||
l 0444 root sys $AMANDIR/cat$MAN8DIR/disable.$CAT8EXT enable.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpadmin.$CAT8EXT man/lpadmin.$CAT8EXT
|
||||
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpc.$CAT8EXT man/lpc.$CAT8EXT
|
||||
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/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
|
||||
f 0444 root sys $MANDIR/man1/lpq.$MAN1EXT man/lpq.man
|
||||
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
|
||||
|
||||
f 0444 root sys $MANDIR/man5/classes.conf.$MAN5EXT man/classes.conf.man
|
||||
f 0444 root sys $MANDIR/man5/cupsd.conf.$MAN5EXT man/cupsd.conf.man
|
||||
f 0444 root sys $MANDIR/man5/mime.convs.$MAN5EXT man/mime.convs.man
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
# Startup script
|
||||
%system all
|
||||
i 0555 root sys cups cups.sh
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
+22
-57
@@ -4,7 +4,13 @@
|
||||
#
|
||||
# Startup/shutdown script for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Linux chkconfig stuff:
|
||||
#
|
||||
# chkconfig: 2345 60 60
|
||||
# description: Startup/shutdown script for the Common UNIX \
|
||||
# Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-1999 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,70 +29,34 @@
|
||||
# WWW: http://www.cups.org
|
||||
#
|
||||
|
||||
#### OS-Dependent Information
|
||||
|
||||
#
|
||||
# Linux chkconfig stuff:
|
||||
#
|
||||
# chkconfig: 235 99 00
|
||||
# description: Startup/shutdown script for the Common UNIX \
|
||||
# Printing System (CUPS).
|
||||
#
|
||||
|
||||
#
|
||||
# NetBSD 1.5+ rcorder script lines. The format of the following two
|
||||
# lines is very strict -- please don't add additional spaces!
|
||||
#
|
||||
# PROVIDE: cups
|
||||
# REQUIRE: DAEMON
|
||||
#
|
||||
|
||||
|
||||
#### OS-Dependent Configuration
|
||||
# See what program to use for configuration stuff...
|
||||
case "`uname`" in
|
||||
IRIX*)
|
||||
IS_ON=/sbin/chkconfig
|
||||
;;
|
||||
|
||||
NetBSD*)
|
||||
IS_ON=:
|
||||
;;
|
||||
|
||||
*)
|
||||
IS_ON=/bin/true
|
||||
;;
|
||||
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.
|
||||
#
|
||||
|
||||
# daemons as they are started.
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
fi
|
||||
|
||||
#
|
||||
# See if the CUPS server (cupsd) is running...
|
||||
#
|
||||
|
||||
# See if the CUPS server is running...
|
||||
case "`uname`" in
|
||||
IRIX* | HP-UX* | SunOS* | AIX* | SINIX*)
|
||||
IRIX* | HP-UX | SunOS)
|
||||
pid=`ps -e | awk '{print $1,$4}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
UnixWare*)
|
||||
pid=`ps -e | awk '{print $1,$6}' | grep cupsd | awk '{print $1}'`
|
||||
. /etc/TIMEZONE
|
||||
;;
|
||||
OSF1*)
|
||||
OSF1)
|
||||
pid=`ps -e | awk '{print $1,$5}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
Linux* | NetBSD*)
|
||||
Linux)
|
||||
pid=`ps ax | awk '{print $1,$5}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
*)
|
||||
@@ -94,23 +64,22 @@ case "`uname`" in
|
||||
;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Start or stop the CUPS server based upon the first argument to the script.
|
||||
#
|
||||
|
||||
case $1 in
|
||||
start | restart | reload)
|
||||
if $IS_ON cups; then
|
||||
if test "$pid" != ""; then
|
||||
if test "$pid" != ""; then
|
||||
if $IS_ON cups; then
|
||||
kill -HUP $pid
|
||||
$ECHO "cups: scheduler restarted."
|
||||
else
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
@sbindir@/cupsd
|
||||
kill $pid
|
||||
$ECHO "cups: scheduler stopped."
|
||||
fi
|
||||
$ECHO "cups: scheduler ${1}ed."
|
||||
else
|
||||
$ECHO "cups: scheduler stopped."
|
||||
if $IS_ON cups; then
|
||||
/usr/sbin/cupsd 2>&1 >/dev/null &
|
||||
$ECHO "cups: scheduler started."
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
@@ -135,10 +104,6 @@ case $1 in
|
||||
;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Exit with no errors.
|
||||
#
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
-220
@@ -1,220 +0,0 @@
|
||||
#
|
||||
# "$Id: cups.spec 1879 2001-08-03 21:15:40Z mike $"
|
||||
#
|
||||
# RPM "spec" file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Original version by Jason McMullan <jmcc@ontv.com>.
|
||||
#
|
||||
# Copyright 1999-2001 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Easy Software Products and are protected by Federal
|
||||
# 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
|
||||
#
|
||||
|
||||
Summary: Common Unix Printing System
|
||||
Name: cups
|
||||
Version: 1.1.10
|
||||
Release: 0
|
||||
Copyright: GPL
|
||||
Group: System Environment/Daemons
|
||||
Source: ftp://ftp.easysw.com/pub/cups/%{version}/cups-%{version}-source.tar.gz
|
||||
Url: http://www.cups.org
|
||||
Packager: Michael Sweet <mike@easysw.com>
|
||||
Vendor: Easy Software Products
|
||||
# use buildroot so as not to disturb the version already installed
|
||||
BuildRoot: /var/tmp/%{name}-root
|
||||
Conflicts: lpr, LPRng
|
||||
Provides: libcups.so.2
|
||||
Provides: libcupsimage.so.2
|
||||
Provides: cups
|
||||
|
||||
%package devel
|
||||
Summary: Common Unix Printing System - development environment
|
||||
Group: Development/Libraries
|
||||
Provides: libcups1
|
||||
|
||||
%package pstoraster
|
||||
Summary: Common Unix Printing System - PostScript RIP
|
||||
Group: System Environment/Daemons
|
||||
Provides: pstoraster
|
||||
|
||||
%description
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. It has been developed by Easy Software Products
|
||||
to promote a standard printing solution for all UNIX vendors and users.
|
||||
CUPS provides the System V and Berkeley command-line interfaces.
|
||||
|
||||
%description devel
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This is the development package for creating
|
||||
additional printer drivers, and other CUPS services.
|
||||
|
||||
%description pstoraster
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This is the PostScript RIP package for
|
||||
supporting non-PostScript printer drivers.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
|
||||
%build
|
||||
./configure
|
||||
|
||||
# If we got this far, all prerequisite libraries must be here.
|
||||
make
|
||||
|
||||
%install
|
||||
# Make sure the RPM_BUILD_ROOT directory exists.
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
make prefix=$RPM_BUILD_ROOT \
|
||||
exec_prefix=$RPM_BUILD_ROOT/usr \
|
||||
AMANDIR=$RPM_BUILD_ROOT/usr/man \
|
||||
BINDIR=$RPM_BUILD_ROOT/usr/bin \
|
||||
DATADIR=$RPM_BUILD_ROOT/usr/share/cups \
|
||||
DOCDIR=$RPM_BUILD_ROOT/usr/share/doc/cups \
|
||||
INCLUDEDIR=$RPM_BUILD_ROOT/usr/include \
|
||||
LIBDIR=$RPM_BUILD_ROOT/usr/lib \
|
||||
LOGDIR=$RPM_BUILD_ROOT/var/log/cups \
|
||||
LOCALEDIR=$RPM_BUILD_ROOT/usr/share/locale \
|
||||
MANDIR=$RPM_BUILD_ROOT/usr/man \
|
||||
PAMDIR=$RPM_BUILD_ROOT/etc/pam.d \
|
||||
REQUESTS=$RPM_BUILD_ROOT/var/spool/cups \
|
||||
SBINDIR=$RPM_BUILD_ROOT/usr/sbin \
|
||||
SERVERBIN=$RPM_BUILD_ROOT/usr/lib/cups \
|
||||
SERVERROOT=$RPM_BUILD_ROOT/etc/cups \
|
||||
install
|
||||
|
||||
%post
|
||||
if test -x /sbin/chkconfig; then
|
||||
/sbin/chkconfig --add cups
|
||||
/sbin/chkconfig cups on
|
||||
fi
|
||||
|
||||
# these lines automatically start cupsd after installation; commented out
|
||||
# by request...
|
||||
#if test -f /sbin/init.d/cups; then
|
||||
# /sbin/init.d/cups start
|
||||
#fi
|
||||
#if test -f /etc/rc.d/init.d/cups; then
|
||||
# /etc/rc.d/init.d/cups start
|
||||
#fi
|
||||
#if test -f /etc/init.d/cups; then
|
||||
# /etc/init.d/cups start
|
||||
#fi
|
||||
|
||||
%preun
|
||||
if test -f /sbin/init.d/cups; then
|
||||
/sbin/init.d/cups stop
|
||||
fi
|
||||
if test -f /etc/rc.d/init.d/cups; then
|
||||
/etc/rc.d/init.d/cups stop
|
||||
fi
|
||||
if test -f /etc/init.d/cups; then
|
||||
/etc/init.d/cups stop
|
||||
fi
|
||||
|
||||
if test -x /sbin/chkconfig; then
|
||||
/sbin/chkconfig --del cups
|
||||
fi
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%dir /etc/cups
|
||||
%config(noreplace) /etc/cups/*.conf
|
||||
%dir /etc/cups/certs
|
||||
%dir /etc/cups/interfaces
|
||||
/etc/cups/mime.types
|
||||
/etc/cups/mime.convs
|
||||
%dir /etc/cups/ppd
|
||||
%dir /etc/pam.d
|
||||
/etc/pam.d/*
|
||||
|
||||
# RC dirs are a pain under Linux... Uncomment the appropriate ones if you
|
||||
# don't use Red Hat or 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/*
|
||||
|
||||
/usr/bin/*
|
||||
/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/man/*
|
||||
/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/*
|
||||
%dir /usr/share/doc/cups
|
||||
/usr/share/doc/cups/*
|
||||
%dir /usr/share/locale
|
||||
/usr/share/locale/*
|
||||
%attr(0700,lp,root) %dir /var/spool/cups
|
||||
%attr(1700,lp,root) %dir /var/spool/cups/tmp
|
||||
|
||||
%files devel
|
||||
%dir /usr/include/cups
|
||||
/usr/include/cups/*
|
||||
/usr/lib/*.a
|
||||
|
||||
%files pstoraster
|
||||
%dir /usr/lib/cups/filter
|
||||
/usr/lib/cups/filter/pstoraster
|
||||
%dir /usr/share/cups/fonts
|
||||
/usr/share/cups/fonts/*
|
||||
%dir /usr/share/cups/pstoraster
|
||||
/usr/share/cups/pstoraster/*
|
||||
|
||||
#
|
||||
# End of "$Id: cups.spec 1879 2001-08-03 21:15:40Z mike $".
|
||||
#
|
||||
+47
-85
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Support library Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
# Copyright 1997-1999 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,25 +28,22 @@ 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 = emit.o filter.o http.o ipp.o language.o mark.o mime.o \
|
||||
options.o page.o ppd.o raster.o string.o type.o usersys.o \
|
||||
util.o
|
||||
OBJS = $(LIBOBJS) testhttp.o testmime.o testppd.o
|
||||
|
||||
#
|
||||
# Header files to install...
|
||||
#
|
||||
|
||||
HEADERS = cups.h http.h ipp.h language.h md5.h ppd.h
|
||||
|
||||
HEADERS = cups.h http.h ipp.h language.h mime.h ppd.h raster.h
|
||||
|
||||
#
|
||||
# Targets in this directory...
|
||||
#
|
||||
|
||||
TARGETS = $(LIBCUPS) libcups.a
|
||||
|
||||
TARGETS = $(LIBCUPS) testhttp testmime testppd
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -54,69 +51,34 @@ TARGETS = $(LIBCUPS) libcups.a
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Remove object and target files...
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS) `basename $(LIBCUPS) .2`
|
||||
|
||||
rm -f $(OBJS) $(TARGETS)
|
||||
|
||||
#
|
||||
# Install object and target files...
|
||||
#
|
||||
|
||||
install: all
|
||||
$(INSTALL_DIR) $(INCLUDEDIR)/cups
|
||||
for file in $(HEADERS); do \
|
||||
$(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \
|
||||
done
|
||||
$(INSTALL_DIR) $(LIBDIR)
|
||||
$(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
|
||||
if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
$(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
$(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
|
||||
fi
|
||||
if test $(LIBCUPS) = "libcups_s.a"; then \
|
||||
$(INSTALL_LIB) libcups.a $(LIBDIR); \
|
||||
-$(MKDIR) $(INCLUDEDIR)/cups
|
||||
$(CP) $(HEADERS) $(INCLUDEDIR)/cups
|
||||
-$(MKDIR) $(LIBDIR)
|
||||
$(CP) $(LIBCUPS) $(LIBDIR)
|
||||
if test $(LIBCUPS) != "libcups.a"; then \
|
||||
$(LN) $(LIBCUPS) `basename $(LIBCUPS) .1`; \
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# libcups.so.2, libcups.sl.2
|
||||
# libcups.so.1, libcups.sl.1
|
||||
#
|
||||
|
||||
libcups.so.2 libcups.sl.2: $(LIBOBJS) ../Makedefs
|
||||
libcups.so.1 libcups.sl.1: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(SSLLIBS)
|
||||
$(RM) `basename $@ .2`
|
||||
$(LN) $@ `basename $@ .2`
|
||||
|
||||
|
||||
#
|
||||
# libcups_s.a
|
||||
#
|
||||
|
||||
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
|
||||
$(RM) $@
|
||||
$(AR) $(ARFLAGS) $@ libcups_s.o
|
||||
|
||||
|
||||
#
|
||||
# libcups.la
|
||||
#
|
||||
|
||||
libcups.la: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
|
||||
-version-info 2:3 $(SSLLIBS)
|
||||
|
||||
$(DSO) $@ $(LIBOBJS)
|
||||
-$(LN) $@ `basename $@ .1`
|
||||
|
||||
#
|
||||
# libcups.a
|
||||
@@ -128,7 +90,6 @@ libcups.a: $(LIBOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
|
||||
#
|
||||
# cups_C.h - the default POSIX locale that is compiled in.
|
||||
#
|
||||
@@ -138,23 +99,21 @@ 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
|
||||
|
||||
emit.o: ppd.h ../config.h ../Makedefs
|
||||
filter.o: mime.h ../config.h ../Makedefs
|
||||
http.o: http.h ipp.h string.h ../config.h ../Makedefs
|
||||
ipp.o: http.h ipp.h ../config.h ../Makedefs
|
||||
language.o: cups_C.h language.h string.h ../config.h ../Makedefs
|
||||
mark.o: ppd.h ../config.h ../Makedefs
|
||||
mime.o: mime.h ../config.h ../Makedefs
|
||||
options.o: cups.h ../config.h ../Makedefs
|
||||
page.o: ppd.h ../config.h ../Makedefs
|
||||
ppd.o: language.h ppd.h ../config.h ../Makedefs
|
||||
raster.o: raster.h ../config.h ../Makedefs
|
||||
string.o: string.h ../config.h ../Makedefs
|
||||
type.o: mime.h ../config.h ../Makedefs
|
||||
usersys.o: cups.h ../config.h ../Makedefs
|
||||
util.o: cups.h http.h ipp.h ../config.h ../Makedefs
|
||||
|
||||
#
|
||||
# testhttp (dependency on static CUPS library is intentional)
|
||||
@@ -162,26 +121,29 @@ 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)
|
||||
|
||||
testhttp.o: http.h ../Makedefs
|
||||
|
||||
#
|
||||
# testppd
|
||||
# testmime (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testppd: testppd.o ppd-debug.o language.o mark.o page.o
|
||||
testmime: testmime.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o ppd-debug.o language.o mark.o page.o
|
||||
$(CC) $(LDFLAGS) -o $@ testmime.o libcups.a
|
||||
|
||||
testppd.o: ppd.h
|
||||
ppd-debug.o: ppd.c language.h ppd.h
|
||||
echo Compiling $< with debugging...
|
||||
$(CC) $(OPTIM) $(CFLAGS) -DDEBUG -c -o $@ $<
|
||||
testmime.o: mime.h ../Makedefs
|
||||
|
||||
$(OBJS): ../Makedefs ../config.h
|
||||
#
|
||||
# testppd (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testppd: testppd.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o libcups.a $(NETLIBS)
|
||||
|
||||
testppd.o: ppd.h ../Makedefs
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
+8
-20
@@ -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 /MTd /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
|
||||
@@ -85,11 +85,11 @@ LIB32=link.exe -lib
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\dest.c
|
||||
SOURCE=.\emit.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\emit.c
|
||||
SOURCE=.\filter.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -109,11 +109,7 @@ SOURCE=.\mark.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\md5.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\md5passwd.c
|
||||
SOURCE=.\mime.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -129,7 +125,7 @@ SOURCE=.\ppd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\snprintf.c
|
||||
SOURCE=.\raster.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -137,7 +133,7 @@ SOURCE=.\string.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\usersys.c
|
||||
SOURCE=.\type.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -153,14 +149,6 @@ SOURCE=.\cups.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\cups_C.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\debug.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\http.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -173,7 +161,7 @@ SOURCE=.\language.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\md5.h
|
||||
SOURCE=.\mime.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -181,7 +169,7 @@ SOURCE=.\ppd.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\string.h
|
||||
SOURCE=.\raster.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
|
||||
+21
-53
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* API definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -29,8 +29,9 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include "ipp.h"
|
||||
# include "ppd.h"
|
||||
# include <cups/ipp.h>
|
||||
# include <cups/mime.h>
|
||||
# include <cups/ppd.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -46,7 +47,7 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0110
|
||||
# define CUPS_VERSION 1.0
|
||||
# define CUPS_DATE_ANY -1
|
||||
|
||||
|
||||
@@ -75,40 +76,31 @@ enum /* Not a typedef'd enum so we can OR */
|
||||
CUPS_PRINTER_LARGE = 0x4000, /* Can do D/E/A1/A0 */
|
||||
CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */
|
||||
CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class */
|
||||
CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */
|
||||
CUPS_PRINTER_OPTIONS = 0xfffc /* ~(CLASS | REMOTE | IMPLICIT) */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Types & structures...
|
||||
*/
|
||||
|
||||
typedef struct /**** Printer Information ****/
|
||||
{
|
||||
char name[IPP_MAX_NAME], /* Printer or class name */
|
||||
uri[HTTP_MAX_URI]; /* Universal resource identifier */
|
||||
unsigned char info[IPP_MAX_NAME], /* Printer or class info/description */
|
||||
location[IPP_MAX_NAME]; /* Location text */
|
||||
ipp_pstate_t state; /* Printer state */
|
||||
unsigned char message[IPP_MAX_NAME]; /* State text */
|
||||
cups_ptype_t type; /* Printer type/capability codes */
|
||||
} cups_browse_t;
|
||||
|
||||
typedef struct /**** Printer Options ****/
|
||||
{
|
||||
char *name; /* Name of option */
|
||||
char *value; /* Value of option */
|
||||
} cups_option_t;
|
||||
|
||||
typedef struct /**** Destination ****/
|
||||
{
|
||||
char *name, /* Printer or class name */
|
||||
*instance; /* Local instance name or NULL */
|
||||
int is_default; /* Is this printer the default? */
|
||||
int num_options; /* Number of options */
|
||||
cups_option_t *options; /* Options */
|
||||
} cups_dest_t;
|
||||
|
||||
typedef struct /**** Job ****/
|
||||
{
|
||||
int id; /* The job ID */
|
||||
char *dest, /* Printer or class name */
|
||||
*title, /* Title/job name */
|
||||
*user, /* User the submitted the job */
|
||||
*format; /* Document format */
|
||||
ipp_jstate_t state; /* Job state */
|
||||
int size, /* Size in kilobytes */
|
||||
priority; /* Priority (1-100) */
|
||||
time_t completed_time, /* Time the job was completed */
|
||||
creation_time, /* Time the job was created */
|
||||
processing_time; /* Time the job was processed */
|
||||
} cups_job_t;
|
||||
|
||||
|
||||
/*
|
||||
* Functions...
|
||||
@@ -118,36 +110,16 @@ extern int cupsCancelJob(const char *printer, int job);
|
||||
#define cupsDoRequest(http,request,resource) cupsDoFileRequest((http),(request),(resource),NULL)
|
||||
extern ipp_t *cupsDoFileRequest(http_t *http, ipp_t *request,
|
||||
const char *resource, const char *filename);
|
||||
extern http_encryption_t cupsEncryption(void);
|
||||
extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs);
|
||||
extern int cupsGetClasses(char ***classes);
|
||||
extern const char *cupsGetDefault(void);
|
||||
extern int cupsGetJobs(cups_job_t **jobs, const char *dest,
|
||||
int myjobs, int completed);
|
||||
extern const char *cupsGetPPD(const char *printer);
|
||||
extern int cupsGetPrinters(char ***printers);
|
||||
extern ipp_status_t cupsLastError(void);
|
||||
extern int cupsPrintFile(const char *printer, const char *filename,
|
||||
const char *title, int num_options,
|
||||
cups_option_t *options);
|
||||
extern int cupsPrintFiles(const char *printer, int num_files,
|
||||
const char **files, const char *title,
|
||||
int num_options, cups_option_t *options);
|
||||
extern char *cupsTempFile(char *filename, int len);
|
||||
extern int cupsTempFd(char *filename, int len);
|
||||
|
||||
extern int cupsAddDest(const char *name, const char *instance,
|
||||
int num_dests, cups_dest_t **dests);
|
||||
extern void cupsFreeDests(int num_dests, cups_dest_t *dests);
|
||||
extern cups_dest_t *cupsGetDest(const char *name, const char *instance,
|
||||
int num_dests, cups_dest_t *dests);
|
||||
extern int cupsGetDests(cups_dest_t **dests);
|
||||
extern void cupsSetDests(int num_dests, cups_dest_t *dests);
|
||||
|
||||
extern int cupsAddOption(const char *name, const char *value,
|
||||
int num_options, cups_option_t **options);
|
||||
extern void cupsEncodeOptions(ipp_t *ipp, int num_options,
|
||||
cups_option_t *options);
|
||||
extern void cupsFreeOptions(int num_options, cups_option_t *options);
|
||||
extern const char *cupsGetOption(const char *name, int num_options,
|
||||
cups_option_t *options);
|
||||
@@ -158,10 +130,6 @@ extern int cupsMarkOptions(ppd_file_t *ppd, int num_options,
|
||||
|
||||
extern const char *cupsGetPassword(const char *prompt);
|
||||
extern const char *cupsServer(void);
|
||||
extern void cupsSetEncryption(http_encryption_t e);
|
||||
extern void cupsSetPasswordCB(const char *(*cb)(const char *));
|
||||
extern void cupsSetServer(const char *server);
|
||||
extern void cupsSetUser(const char *user);
|
||||
extern const char *cupsUser(void);
|
||||
|
||||
# ifdef __cplusplus
|
||||
|
||||
+5
-15
@@ -1,4 +1,4 @@
|
||||
"iso-8859-1",
|
||||
"us-ascii",
|
||||
"OK",
|
||||
"Cancel",
|
||||
"Help",
|
||||
@@ -18,11 +18,11 @@
|
||||
"Cyan",
|
||||
"Magenta",
|
||||
"Yellow",
|
||||
"Copyright 1993-2001 by Easy Software Products, All Rights Reserved.",
|
||||
"Copyright 1993-1999 by Easy Software Products, All Rights Reserved.",
|
||||
"General",
|
||||
"Printer",
|
||||
"Image",
|
||||
"HP-GL/2",
|
||||
"Image Options",
|
||||
"HP-GL/2 Options",
|
||||
"Extra",
|
||||
"Document",
|
||||
"Other",
|
||||
@@ -82,7 +82,7 @@
|
||||
"Stopped",
|
||||
"All",
|
||||
"Odd",
|
||||
"Even",
|
||||
"Even Pages",
|
||||
"Darker Lighter",
|
||||
"Media Size",
|
||||
"Media Type",
|
||||
@@ -99,15 +99,6 @@
|
||||
"Pending",
|
||||
"Output Mode",
|
||||
"Resolution",
|
||||
"Text",
|
||||
"Pretty Print",
|
||||
"Margins",
|
||||
"Left",
|
||||
"Right",
|
||||
"Bottom",
|
||||
"Top",
|
||||
"Filename(s)",
|
||||
"Print",
|
||||
"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.",
|
||||
@@ -124,7 +115,6 @@
|
||||
"The request is too large for this server to process.",
|
||||
"The request URI is too large for this server to process.",
|
||||
"The request format is not understood by this server.",
|
||||
"426 An upgrade to a secure connection is required. If you are seeing this message in a web browser then it does not support HTTP encryption upgrades.",
|
||||
"500 The server has detected an unrecoverable error and cannot process your request.",
|
||||
"The requested method is not implemented by this server.",
|
||||
"The proxy server received an invalid response from an upstream server.",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Debugging macros for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
|
||||
-726
@@ -1,726 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* User-defined destination (and option) support for the Common UNIX
|
||||
* Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsAddDest() - Add a destination to the list of destinations.
|
||||
* cupsFreeDests() - Free the memory used by the list of destinations.
|
||||
* cupsGetDest() - Get the named destination from the list.
|
||||
* cupsGetDests() - Get the list of destinations.
|
||||
* cupsSetDests() - Set the list of destinations.
|
||||
* cups_get_dests() - Get destinations from a file.
|
||||
* cups_get_sdests() - Get destinations from a server.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include "language.h"
|
||||
#include "string.h"
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static int cups_get_dests(const char *filename, int num_dests,
|
||||
cups_dest_t **dests);
|
||||
static int cups_get_sdests(ipp_op_t op, int num_dests,
|
||||
cups_dest_t **dests);
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsAddDest()' - Add a destination to the list of destinations.
|
||||
*/
|
||||
|
||||
int /* O - New number of destinations */
|
||||
cupsAddDest(const char *name, /* I - Name of destination */
|
||||
const char *instance, /* I - Instance of destination */
|
||||
int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t **dests) /* IO - Destinations */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
cups_dest_t *dest; /* Destination pointer */
|
||||
|
||||
|
||||
if (name == NULL || dests == NULL)
|
||||
return (0);
|
||||
|
||||
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL)
|
||||
return (num_dests);
|
||||
|
||||
/*
|
||||
* Add new destination...
|
||||
*/
|
||||
|
||||
if (num_dests == 0)
|
||||
dest = malloc(sizeof(cups_dest_t));
|
||||
else
|
||||
dest = realloc(*dests, sizeof(cups_dest_t) * (num_dests + 1));
|
||||
|
||||
if (dest == NULL)
|
||||
return (num_dests);
|
||||
|
||||
*dests = dest;
|
||||
|
||||
for (i = num_dests; i > 0; i --, dest ++)
|
||||
if (strcasecmp(name, dest->name) < 0)
|
||||
break;
|
||||
else if (strcasecmp(name, dest->name) == 0 &&
|
||||
instance != NULL && dest->instance != NULL &&
|
||||
strcasecmp(instance, dest->instance) < 0)
|
||||
break;
|
||||
|
||||
if (i > 0)
|
||||
memmove(dest + 1, dest, i * sizeof(cups_dest_t));
|
||||
|
||||
dest->name = strdup(name);
|
||||
dest->is_default = 0;
|
||||
dest->num_options = 0;
|
||||
dest->options = (cups_option_t *)0;
|
||||
|
||||
if (instance == NULL)
|
||||
dest->instance = NULL;
|
||||
else
|
||||
dest->instance = strdup(instance);
|
||||
|
||||
return (num_dests + 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsFreeDests()' - Free the memory used by the list of destinations.
|
||||
*/
|
||||
|
||||
void
|
||||
cupsFreeDests(int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t *dests) /* I - Destinations */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
cups_dest_t *dest; /* Current destination */
|
||||
|
||||
|
||||
if (num_dests == 0 || dests == NULL)
|
||||
return;
|
||||
|
||||
for (i = num_dests, dest = dests; i > 0; i --, dest ++)
|
||||
{
|
||||
free(dest->name);
|
||||
|
||||
if (dest->instance)
|
||||
free(dest->instance);
|
||||
|
||||
cupsFreeOptions(dest->num_options, dest->options);
|
||||
}
|
||||
|
||||
free(dests);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetDest()' - Get the named destination from the list.
|
||||
*/
|
||||
|
||||
cups_dest_t * /* O - Destination pointer or NULL */
|
||||
cupsGetDest(const char *name, /* I - Name of destination */
|
||||
const char *instance, /* I - Instance of destination */
|
||||
int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t *dests) /* I - Destinations */
|
||||
{
|
||||
int comp; /* Result of comparison */
|
||||
|
||||
|
||||
if (num_dests == 0 || dests == NULL)
|
||||
return (NULL);
|
||||
|
||||
if (name == NULL)
|
||||
{
|
||||
/*
|
||||
* NULL name for default printer.
|
||||
*/
|
||||
|
||||
while (num_dests > 0)
|
||||
{
|
||||
if (dests->is_default)
|
||||
return (dests);
|
||||
|
||||
num_dests --;
|
||||
dests ++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Lookup name and optionally the instance...
|
||||
*/
|
||||
|
||||
while (num_dests > 0)
|
||||
{
|
||||
if ((comp = strcasecmp(name, dests->name)) < 0)
|
||||
return (NULL);
|
||||
else if (comp == 0)
|
||||
{
|
||||
if ((instance == NULL && dests->instance == NULL) ||
|
||||
(instance != NULL && dests->instance != NULL &&
|
||||
strcasecmp(instance, dests->instance) == 0))
|
||||
return (dests);
|
||||
}
|
||||
|
||||
num_dests --;
|
||||
dests ++;
|
||||
}
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetDests()' - Get the list of destinations.
|
||||
*/
|
||||
|
||||
int /* O - Number of destinations */
|
||||
cupsGetDests(cups_dest_t **dests) /* O - Destinations */
|
||||
{
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dest; /* Destination pointer */
|
||||
const char *home; /* HOME environment variable */
|
||||
char filename[1024]; /* Local ~/.lpoptions file */
|
||||
const char *defprinter; /* Default printer */
|
||||
char name[1024], /* Copy of printer name */
|
||||
*instance; /* Pointer to instance name */
|
||||
|
||||
|
||||
/*
|
||||
* Initialize destination array...
|
||||
*/
|
||||
|
||||
num_dests = 0;
|
||||
*dests = (cups_dest_t *)0;
|
||||
|
||||
/*
|
||||
* Grab the printers and classes...
|
||||
*/
|
||||
|
||||
num_dests = cups_get_sdests(CUPS_GET_PRINTERS, num_dests, dests);
|
||||
num_dests = cups_get_sdests(CUPS_GET_CLASSES, num_dests, dests);
|
||||
|
||||
/*
|
||||
* Grab the default destination...
|
||||
*/
|
||||
|
||||
if ((defprinter = cupsGetDefault()) != NULL)
|
||||
{
|
||||
/*
|
||||
* Grab printer and instance name...
|
||||
*/
|
||||
|
||||
strncpy(name, defprinter, sizeof(name) - 1);
|
||||
name[sizeof(name) - 1] = '\0';
|
||||
|
||||
if ((instance = strchr(name, '/')) != NULL)
|
||||
*instance++ = '\0';
|
||||
|
||||
/*
|
||||
* Lookup the printer and instance and make it the default...
|
||||
*/
|
||||
|
||||
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL)
|
||||
dest->is_default = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Load the /etc/cups/lpoptions and ~/.lpoptions files...
|
||||
*/
|
||||
|
||||
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
|
||||
{
|
||||
snprintf(filename, sizeof(filename), "%s/lpoptions", home);
|
||||
num_dests = cups_get_dests(filename, num_dests, dests);
|
||||
}
|
||||
else
|
||||
num_dests = cups_get_dests(CUPS_SERVERROOT "/lpoptions", num_dests, dests);
|
||||
|
||||
if ((home = getenv("HOME")) != NULL)
|
||||
{
|
||||
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
|
||||
num_dests = cups_get_dests(filename, num_dests, dests);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the number of destinations...
|
||||
*/
|
||||
|
||||
return (num_dests);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsSetDests()' - Set the list of destinations.
|
||||
*/
|
||||
|
||||
void
|
||||
cupsSetDests(int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t *dests) /* I - Destinations */
|
||||
{
|
||||
int i, j; /* Looping vars */
|
||||
int wrote; /* Wrote definition? */
|
||||
cups_dest_t *dest; /* Current destination */
|
||||
cups_option_t *option; /* Current option */
|
||||
FILE *fp; /* File pointer */
|
||||
const char *home; /* HOME environment variable */
|
||||
char filename[1024]; /* lpoptions file */
|
||||
int num_temps; /* Number of temporary destinations */
|
||||
cups_dest_t *temps, /* Temporary destinations */
|
||||
*temp; /* Current temporary dest */
|
||||
const char *val; /* Value of temporary option */
|
||||
|
||||
|
||||
/*
|
||||
* Get the server destinations...
|
||||
*/
|
||||
|
||||
num_temps = cups_get_sdests(CUPS_GET_PRINTERS, 0, &temps);
|
||||
num_temps = cups_get_sdests(CUPS_GET_CLASSES, num_temps, &temps);
|
||||
|
||||
/*
|
||||
* Figure out which file to write to...
|
||||
*/
|
||||
|
||||
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
|
||||
snprintf(filename, sizeof(filename), "%s/lpoptions", home);
|
||||
else
|
||||
strcpy(filename, CUPS_SERVERROOT "/lpoptions");
|
||||
|
||||
#ifndef WIN32
|
||||
if (getuid())
|
||||
{
|
||||
/*
|
||||
* Merge in server defaults...
|
||||
*/
|
||||
|
||||
num_temps = cups_get_dests(filename, num_temps, &temps);
|
||||
|
||||
/*
|
||||
* Point to user defaults...
|
||||
*/
|
||||
|
||||
if ((home = getenv("HOME")) != NULL)
|
||||
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
|
||||
}
|
||||
#endif /* !WIN32 */
|
||||
|
||||
/*
|
||||
* Try to open the file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(filename, "w")) == NULL)
|
||||
{
|
||||
cupsFreeDests(num_temps, temps);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write each printer; each line looks like:
|
||||
*
|
||||
* Dest name[/instance] options
|
||||
* Default name[/instance] options
|
||||
*/
|
||||
|
||||
for (i = num_dests, dest = dests; i > 0; i --, dest ++)
|
||||
if (dest->instance != NULL || dest->num_options != 0 || dest->is_default)
|
||||
{
|
||||
if (dest->is_default)
|
||||
{
|
||||
fprintf(fp, "Default %s", dest->name);
|
||||
if (dest->instance)
|
||||
fprintf(fp, "/%s", dest->instance);
|
||||
|
||||
wrote = 1;
|
||||
}
|
||||
else
|
||||
wrote = 0;
|
||||
|
||||
if ((temp = cupsGetDest(dest->name, dest->instance, num_temps, temps)) == NULL)
|
||||
temp = cupsGetDest(dest->name, NULL, num_temps, temps);
|
||||
|
||||
for (j = dest->num_options, option = dest->options; j > 0; j --, option ++)
|
||||
{
|
||||
/*
|
||||
* See if the server/global options match these; if so, don't
|
||||
* write 'em.
|
||||
*/
|
||||
|
||||
if (temp && (val = cupsGetOption(option->name, temp->num_options,
|
||||
temp->options)) != NULL)
|
||||
{
|
||||
if (strcasecmp(val, option->value) == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Options don't match, write to the file...
|
||||
*/
|
||||
|
||||
if (!wrote)
|
||||
{
|
||||
fprintf(fp, "Dest %s", dest->name);
|
||||
if (dest->instance)
|
||||
fprintf(fp, "/%s", dest->instance);
|
||||
wrote = 1;
|
||||
}
|
||||
|
||||
if (option->value[0])
|
||||
{
|
||||
if (strchr(option->value, ' ') != NULL)
|
||||
fprintf(fp, " %s=\"%s\"", option->name, option->value);
|
||||
else
|
||||
fprintf(fp, " %s=%s", option->name, option->value);
|
||||
}
|
||||
else
|
||||
fprintf(fp, " %s", option->name);
|
||||
}
|
||||
|
||||
if (wrote)
|
||||
fputs("\n", fp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the temporary destinations...
|
||||
*/
|
||||
|
||||
cupsFreeDests(num_temps, temps);
|
||||
|
||||
/*
|
||||
* Close the file and return...
|
||||
*/
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_get_dests()' - Get destinations from a file.
|
||||
*/
|
||||
|
||||
static int /* O - Number of destinations */
|
||||
cups_get_dests(const char *filename, /* I - File to read from */
|
||||
int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t **dests) /* IO - Destinations */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
cups_dest_t *dest; /* Current destination */
|
||||
FILE *fp; /* File pointer */
|
||||
char line[8192], /* Line from file */
|
||||
*lineptr, /* Pointer into line */
|
||||
*name, /* Name of destination/option */
|
||||
*instance; /* Instance of destination */
|
||||
const char *printer; /* PRINTER or LPDEST */
|
||||
|
||||
|
||||
/*
|
||||
* Check environment variables...
|
||||
*/
|
||||
|
||||
if ((printer = getenv("LPDEST")) == NULL)
|
||||
if ((printer = getenv("PRINTER")) != NULL)
|
||||
if (strcmp(printer, "lp") == 0)
|
||||
printer = NULL;
|
||||
|
||||
/*
|
||||
* Try to open the file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(filename, "r")) == NULL)
|
||||
return (num_dests);
|
||||
|
||||
/*
|
||||
* Read each printer; each line looks like:
|
||||
*
|
||||
* Dest name[/instance] options
|
||||
* Default name[/instance] options
|
||||
*/
|
||||
|
||||
while (fgets(line, sizeof(line), fp) != NULL)
|
||||
{
|
||||
/*
|
||||
* See what type of line it is...
|
||||
*/
|
||||
|
||||
if (strncasecmp(line, "dest", 4) == 0 && isspace(line[4]))
|
||||
lineptr = line + 4;
|
||||
else if (strncasecmp(line, "default", 7) == 0 && isspace(line[7]))
|
||||
lineptr = line + 7;
|
||||
else
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Skip leading whitespace...
|
||||
*/
|
||||
|
||||
while (isspace(*lineptr))
|
||||
lineptr ++;
|
||||
|
||||
if (!*lineptr)
|
||||
continue;
|
||||
|
||||
name = lineptr;
|
||||
|
||||
/*
|
||||
* Search for an instance...
|
||||
*/
|
||||
|
||||
while (!isspace(*lineptr) && *lineptr && *lineptr != '/')
|
||||
lineptr ++;
|
||||
|
||||
if (!*lineptr)
|
||||
continue;
|
||||
|
||||
if (*lineptr == '/')
|
||||
{
|
||||
/*
|
||||
* Found an instance...
|
||||
*/
|
||||
|
||||
*lineptr++ = '\0';
|
||||
instance = lineptr;
|
||||
|
||||
/*
|
||||
* Search for an instance...
|
||||
*/
|
||||
|
||||
while (!isspace(*lineptr) && *lineptr)
|
||||
lineptr ++;
|
||||
}
|
||||
else
|
||||
instance = NULL;
|
||||
|
||||
*lineptr++ = '\0';
|
||||
|
||||
/*
|
||||
* Add the destination...
|
||||
*/
|
||||
|
||||
num_dests = cupsAddDest(name, instance, num_dests, dests);
|
||||
|
||||
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL)
|
||||
{
|
||||
/*
|
||||
* Out of memory!
|
||||
*/
|
||||
|
||||
fclose(fp);
|
||||
return (num_dests);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add options until we hit the end of the line...
|
||||
*/
|
||||
|
||||
if (dest->num_options)
|
||||
{
|
||||
/*
|
||||
* Free old options...
|
||||
*/
|
||||
|
||||
cupsFreeOptions(dest->num_options, dest->options);
|
||||
|
||||
dest->num_options = 0;
|
||||
dest->options = (cups_option_t *)0;
|
||||
}
|
||||
|
||||
dest->num_options = cupsParseOptions(lineptr, dest->num_options,
|
||||
&(dest->options));
|
||||
|
||||
/*
|
||||
* Set this as default if needed...
|
||||
*/
|
||||
|
||||
if (strncasecmp(line, "default", 7) == 0 && printer == NULL)
|
||||
{
|
||||
for (i = 0; i < num_dests; i ++)
|
||||
(*dests)[i].is_default = 0;
|
||||
|
||||
dest->is_default = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the file and return...
|
||||
*/
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return (num_dests);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_get_sdests()' - Get destinations from a server.
|
||||
*/
|
||||
|
||||
static int /* O - Number of destinations */
|
||||
cups_get_sdests(ipp_op_t op, /* I - get-printers or get-classes */
|
||||
int num_dests, /* I - Number of destinations */
|
||||
cups_dest_t **dests) /* IO - Destinations */
|
||||
{
|
||||
cups_dest_t *dest; /* Current destination */
|
||||
http_t *http; /* HTTP connection */
|
||||
ipp_t *request, /* IPP Request */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
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 */
|
||||
{
|
||||
"printer-name",
|
||||
"job-sheets-default"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Connect to the CUPS server...
|
||||
*/
|
||||
|
||||
if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
|
||||
return (num_dests);
|
||||
|
||||
/*
|
||||
* Build a CUPS_GET_PRINTERS or CUPS_GET_CLASSES request, which require
|
||||
* the following attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = op;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
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);
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
||||
"requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
|
||||
NULL, pattrs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
/*
|
||||
* Skip leading attributes until we hit a printer...
|
||||
*/
|
||||
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
|
||||
attr = attr->next;
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Pull the needed attributes from this job...
|
||||
*/
|
||||
|
||||
name = NULL;
|
||||
|
||||
strcpy(job_sheets, "none,none");
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
|
||||
{
|
||||
if (strcmp(attr->name, "printer-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
name = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-sheets-default") == 0 &&
|
||||
(attr->value_tag == IPP_TAG_KEYWORD ||
|
||||
attr->value_tag == IPP_TAG_NAME))
|
||||
{
|
||||
if (attr->num_values == 2)
|
||||
snprintf(job_sheets, sizeof(job_sheets), "%s,%s",
|
||||
attr->values[0].string.text, attr->values[1].string.text);
|
||||
else
|
||||
strcpy(job_sheets, attr->values[0].string.text);
|
||||
}
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have everything needed...
|
||||
*/
|
||||
|
||||
if (!name)
|
||||
{
|
||||
if (attr == NULL)
|
||||
break;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
num_dests = cupsAddDest(name, NULL, num_dests, dests);
|
||||
|
||||
if ((dest = cupsGetDest(name, NULL, num_dests, *dests)) != NULL)
|
||||
dest->num_options = cupsAddOption("job-sheets", job_sheets, 0,
|
||||
&(dest->options));
|
||||
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the server connection...
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
|
||||
/*
|
||||
* Return the count...
|
||||
*/
|
||||
|
||||
return (num_dests);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+172
-296
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD code emission routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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,11 +25,8 @@
|
||||
*
|
||||
* 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...
|
||||
* ppdEmit() - Emit code for marked options to a file.
|
||||
* ppdEmitFd() - Emit code for marked options to a file.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -52,17 +49,180 @@
|
||||
*/
|
||||
|
||||
static int ppd_sort(ppd_choice_t **c1, ppd_choice_t **c2);
|
||||
static int ppd_collect(ppd_file_t *ppd, ppd_section_t section,
|
||||
ppd_choice_t ***choices);
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdCollect()' - Collect all marked options that reside in the specified
|
||||
* section.
|
||||
* 'ppdEmit()' - Emit code for marked options to a file.
|
||||
*/
|
||||
|
||||
int /* O - Number of options marked */
|
||||
ppdCollect(ppd_file_t *ppd, /* I - PPD file data */
|
||||
ppd_section_t section, /* I - Section to collect */
|
||||
ppd_choice_t ***choices) /* O - Pointers to choices */
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
FILE *fp, /* I - File to write to */
|
||||
ppd_section_t section) /* I - Section to write */
|
||||
{
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
ppd_choice_t **choices; /* Choices */
|
||||
ppd_size_t *size; /* Custom page size */
|
||||
|
||||
|
||||
if ((count = ppd_collect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < count; i ++)
|
||||
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
|
||||
{
|
||||
/*
|
||||
* 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 (strcmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
|
||||
strcmp(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...)
|
||||
*/
|
||||
|
||||
size = ppdPageSize(ppd, "Custom");
|
||||
fprintf(fp, "%.0f %.0f 0 0 0\n", size->width, size->length);
|
||||
|
||||
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...
|
||||
*/
|
||||
|
||||
fputs("pop pop pop\n", fp);
|
||||
fputs("<</PageSize[7 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
}
|
||||
}
|
||||
|
||||
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
|
||||
{
|
||||
if (fputs(choices[i]->code, fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (choices[i]->code[strlen(choices[i]->code) - 1] != '\n')
|
||||
putc('\n', fp);
|
||||
}
|
||||
|
||||
if (fputs("%%EndFeature\n", fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if (fputs(choices[i]->code, fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
free(choices);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdEmitFd()' - Emit code for marked options to a file.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
int fd, /* I - File to write to */
|
||||
ppd_section_t section) /* I - Section to write */
|
||||
{
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
ppd_choice_t **choices; /* Choices */
|
||||
char buf[1024]; /* Output buffer for feature */
|
||||
|
||||
|
||||
if ((count = ppd_collect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < count; i ++)
|
||||
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
|
||||
{
|
||||
/*
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
sprintf(buf, "%%%%BeginFeature: %s %s\n",
|
||||
((ppd_option_t *)choices[i]->option)->keyword, choices[i]->choice);
|
||||
|
||||
if (write(fd, buf, strlen(buf)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, "%%EndFeature\n", 13) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
free(choices);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_sort()' - Sort options by ordering numbers...
|
||||
*/
|
||||
|
||||
static int /* O - -1 if c1 < c2, 0 if equal, 1 otherwise */
|
||||
ppd_sort(ppd_choice_t **c1, /* I - First choice */
|
||||
ppd_choice_t **c2) /* I - Second choice */
|
||||
{
|
||||
if (((ppd_option_t *)(*c1)->option)->order < ((ppd_option_t *)(*c2)->option)->order)
|
||||
return (-1);
|
||||
else if (((ppd_option_t *)(*c1)->option)->order > ((ppd_option_t *)(*c2)->option)->order)
|
||||
return (1);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_collect()' - Collect all marked options that reside in the specified
|
||||
* section.
|
||||
*/
|
||||
|
||||
static int /* O - Number of options marked */
|
||||
ppd_collect(ppd_file_t *ppd, /* I - PPD file data */
|
||||
ppd_section_t section, /* I - Section to collect */
|
||||
ppd_choice_t ***choices) /* O - Pointers to choices */
|
||||
{
|
||||
int i, j, k, m; /* Looping vars */
|
||||
ppd_group_t *g, /* Current group */
|
||||
@@ -136,290 +296,6 @@ ppdCollect(ppd_file_t *ppd, /* I - PPD file data */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdEmit()' - Emit code for marked options to a file.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
FILE *fp, /* I - File to write to */
|
||||
ppd_section_t section) /* I - Section to write */
|
||||
{
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
ppd_choice_t **choices; /* Choices */
|
||||
ppd_size_t *size; /* Custom page size */
|
||||
|
||||
|
||||
if ((count = ppdCollect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < count; i ++)
|
||||
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
|
||||
{
|
||||
/*
|
||||
* Send wrapper commands to prevent printer errors for unsupported
|
||||
* options...
|
||||
*/
|
||||
|
||||
if (fputs("[{\n", fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 &&
|
||||
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...)
|
||||
*/
|
||||
|
||||
size = ppdPageSize(ppd, "Custom");
|
||||
fprintf(fp, "%.0f %.0f 0 0 0\n", size->width, size->length);
|
||||
|
||||
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...
|
||||
*/
|
||||
|
||||
fputs("pop pop pop\n", fp);
|
||||
fputs("<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
}
|
||||
}
|
||||
|
||||
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
|
||||
{
|
||||
if (fputs(choices[i]->code, fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (choices[i]->code[strlen(choices[i]->code) - 1] != '\n')
|
||||
putc('\n', fp);
|
||||
}
|
||||
|
||||
if (fputs("%%EndFeature\n", fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (fputs("} stopped cleartomark\n", fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if (fputs(choices[i]->code, fp) < 0)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
free(choices);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdEmitFd()' - Emit code for marked options to a file.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
|
||||
int fd, /* I - File to write to */
|
||||
ppd_section_t section) /* I - Section to write */
|
||||
{
|
||||
int i, /* Looping var */
|
||||
count; /* Number of choices */
|
||||
ppd_choice_t **choices; /* Choices */
|
||||
char buf[1024]; /* Output buffer for feature */
|
||||
|
||||
|
||||
if ((count = ppdCollect(ppd, section, &choices)) == 0)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < count; i ++)
|
||||
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
|
||||
{
|
||||
/*
|
||||
* Send wrapper commands to prevent printer errors for unsupported
|
||||
* options...
|
||||
*/
|
||||
|
||||
if (write(fd, "[{\n", 3) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send DSC comments with option...
|
||||
*/
|
||||
|
||||
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)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, "%%EndFeature\n", 13) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (write(fd, "} stopped cleartomark\n", 22) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
|
||||
{
|
||||
free(choices);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
free(choices);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppdEmitJCL()' - Emit code for JCL options to a file.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */
|
||||
FILE *fp, /* I - File to write to */
|
||||
int job_id, /* I - Job ID */
|
||||
const char *user, /* I - Username */
|
||||
const char *title) /* I - Title */
|
||||
{
|
||||
const char *ptr; /* Pointer into JCL string */
|
||||
|
||||
|
||||
/*
|
||||
* Range check the input...
|
||||
*/
|
||||
|
||||
if (ppd == NULL || ppd->jcl_begin == NULL || ppd->jcl_ps == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* See if the printer supports HP PJL...
|
||||
*/
|
||||
|
||||
if (strncmp(ppd->jcl_begin, "\033%-12345X@", 10) == 0)
|
||||
{
|
||||
/*
|
||||
* This printer uses HP PJL commands for output; filter the output
|
||||
* so that we only have a single "@PJL JOB" command in the header...
|
||||
*/
|
||||
|
||||
fputs("\033%-12345X", fp);
|
||||
for (ptr = ppd->jcl_begin + 9; *ptr;)
|
||||
if (strncmp(ptr, "@PJL JOB", 8) == 0)
|
||||
{
|
||||
/*
|
||||
* Skip job command...
|
||||
*/
|
||||
|
||||
for (;*ptr; ptr ++)
|
||||
if (*ptr == '\n')
|
||||
break;
|
||||
|
||||
if (*ptr)
|
||||
ptr ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Copy line...
|
||||
*/
|
||||
|
||||
for (;*ptr; ptr ++)
|
||||
{
|
||||
putc(*ptr, fp);
|
||||
if (*ptr == '\n')
|
||||
break;
|
||||
}
|
||||
|
||||
if (*ptr)
|
||||
ptr ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Eliminate any path info from the job title...
|
||||
*/
|
||||
|
||||
if ((ptr = strrchr(title, '/')) != NULL)
|
||||
title = ptr + 1;
|
||||
|
||||
/*
|
||||
* Send PJL JOB command before we enter PostScript mode...
|
||||
*/
|
||||
|
||||
fprintf(fp, "@PJL JOB NAME = \"%s\" DISPLAY = \"%d %s %s\"\n", title,
|
||||
job_id, user, title);
|
||||
}
|
||||
else
|
||||
fputs(ppd->jcl_begin, stdout);
|
||||
|
||||
ppdEmit(ppd, stdout, PPD_ORDER_JCL);
|
||||
fputs(ppd->jcl_ps, stdout);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_sort()' - Sort options by ordering numbers...
|
||||
*/
|
||||
|
||||
static int /* O - -1 if c1 < c2, 0 if equal, 1 otherwise */
|
||||
ppd_sort(ppd_choice_t **c1, /* I - First choice */
|
||||
ppd_choice_t **c2) /* I - Second choice */
|
||||
{
|
||||
if (((ppd_option_t *)(*c1)->option)->order < ((ppd_option_t *)(*c2)->option)->order)
|
||||
return (-1);
|
||||
else if (((ppd_option_t *)(*c1)->option)->order > ((ppd_option_t *)(*c2)->option)->order)
|
||||
return (1);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
-311
@@ -1,311 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Option encoding routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsEncodeOptions() - Encode printer options into IPP attributes.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
|
||||
*/
|
||||
|
||||
void
|
||||
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 */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)\n", ipp, num_options, options));
|
||||
|
||||
if (ipp == NULL || num_options < 1 || options == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Handle the document format stuff first...
|
||||
*/
|
||||
|
||||
if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL)
|
||||
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, val);
|
||||
else if (cupsGetOption("raw", num_options, options))
|
||||
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/vnd.cups-raw");
|
||||
else
|
||||
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/octet-stream");
|
||||
|
||||
/*
|
||||
* Then add all other options...
|
||||
*/
|
||||
|
||||
for (i = 0; i < num_options; i ++)
|
||||
{
|
||||
/*
|
||||
* Skip document format options - handled above...
|
||||
*/
|
||||
|
||||
if (strcasecmp(options[i].name, "raw") == 0 ||
|
||||
strcasecmp(options[i].name, "document-format") == 0 ||
|
||||
!options[i].name[0])
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Count the number of values...
|
||||
*/
|
||||
|
||||
for (count = 1, sep = options[i].value;
|
||||
(sep = strchr(sep + 1, ',')) != NULL;
|
||||
count ++);
|
||||
|
||||
DEBUG_printf(("cupsEncodeOptions: option = \'%s\', count = %d\n",
|
||||
options[i].name, count));
|
||||
|
||||
if ((attr = _ipp_add_attr(ipp, count)) == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Ran out of memory for attributes!");
|
||||
return;
|
||||
}
|
||||
|
||||
attr->group_tag = IPP_TAG_JOB;
|
||||
|
||||
if ((attr->name = strdup(options[i].name)) == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Ran out of memory for name!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (count > 1)
|
||||
{
|
||||
/*
|
||||
* Make a copy of the value we can fiddle with...
|
||||
*/
|
||||
|
||||
if ((copy = strdup(options[i].value)) == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Ran out of memory for value copy!");
|
||||
return;
|
||||
}
|
||||
|
||||
val = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Since we have a single value, use the value directly...
|
||||
*/
|
||||
|
||||
val = options[i].value;
|
||||
copy = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
if (*val == '\0')
|
||||
{
|
||||
/*
|
||||
* Old-style System V boolean value...
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
attr->values[0].boolean = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Scan the value string for values...
|
||||
*/
|
||||
|
||||
for (j = 0; *val != '\0'; val = sep, j ++)
|
||||
{
|
||||
/*
|
||||
* Find the end of this value and mark it if needed...
|
||||
*/
|
||||
|
||||
if ((sep = strchr(val, ',')) != NULL)
|
||||
*sep++ = '\0';
|
||||
else
|
||||
sep = val + strlen(val);
|
||||
|
||||
/*
|
||||
* See what kind of value it is...
|
||||
*/
|
||||
|
||||
if (strcasecmp(val, "true") == 0 ||
|
||||
strcasecmp(val, "on") == 0 ||
|
||||
strcasecmp(val, "yes") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - true...
|
||||
*/
|
||||
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
attr->values[j].boolean = 1;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
|
||||
}
|
||||
else if (strcasecmp(val, "false") == 0 ||
|
||||
strcasecmp(val, "off") == 0 ||
|
||||
strcasecmp(val, "no") == 0)
|
||||
{
|
||||
/*
|
||||
* Boolean value - false...
|
||||
*/
|
||||
|
||||
attr->value_tag = IPP_TAG_BOOLEAN;
|
||||
attr->values[j].boolean = 0;
|
||||
|
||||
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Number, range, resolution, or string...
|
||||
*/
|
||||
|
||||
n = strtol(val, &s, 0);
|
||||
|
||||
if (*s != '\0' && *s != '-' && (*s != 'x' || s == val))
|
||||
{
|
||||
/*
|
||||
* String value(s)...
|
||||
*/
|
||||
|
||||
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));
|
||||
}
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* File type conversion routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -37,7 +37,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <cups/string.h>
|
||||
#include "string.h"
|
||||
#include "mime.h"
|
||||
|
||||
|
||||
@@ -88,8 +88,7 @@ mimeAddFilter(mime_t *mime, /* I - MIME database */
|
||||
if (temp->cost > cost)
|
||||
{
|
||||
temp->cost = cost;
|
||||
strncpy(temp->filter, filter, sizeof(temp->filter) - 1);
|
||||
temp->filter[sizeof(temp->filter) - 1] = '\0';
|
||||
strcpy(temp->filter, filter);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -117,8 +116,7 @@ mimeAddFilter(mime_t *mime, /* I - MIME database */
|
||||
temp->src = src;
|
||||
temp->dst = dst;
|
||||
temp->cost = cost;
|
||||
strncpy(temp->filter, filter, sizeof(temp->filter) - 1);
|
||||
temp->filter[sizeof(temp->filter) - 1] = '\0';
|
||||
strcpy(temp->filter, filter);
|
||||
|
||||
if (mime->num_filters > 1)
|
||||
qsort(mime->filters, mime->num_filters, sizeof(mime_filter_t),
|
||||
@@ -186,10 +184,8 @@ mimeFilter(mime_t *mime, /* I - MIME database */
|
||||
* OK, now look for filters from the source type to any other type...
|
||||
*/
|
||||
|
||||
mincost = 9999999;
|
||||
mintemp = NULL;
|
||||
num_mintemp = 0;
|
||||
mincurrent = NULL;
|
||||
mincost = 9999999;
|
||||
mintemp = NULL;
|
||||
|
||||
for (i = mime->num_filters, current = mime->filters; i > 0; i --, current ++)
|
||||
if (current->src == src)
|
||||
+191
-823
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+4
-57
@@ -4,7 +4,7 @@
|
||||
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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,8 +47,6 @@
|
||||
# include <netinet/tcp.h>
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
# include "md5.h"
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
@@ -126,34 +124,6 @@ typedef enum
|
||||
} http_encoding_t;
|
||||
|
||||
|
||||
/*
|
||||
* HTTP encryption values...
|
||||
*/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
HTTP_ENCRYPT_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */
|
||||
HTTP_ENCRYPT_NEVER, /* Never encrypt */
|
||||
HTTP_ENCRYPT_REQUIRED, /* Encryption is required (TLS upgrade) */
|
||||
HTTP_ENCRYPT_ALWAYS /* Always encrypt (SSL) */
|
||||
} http_encryption_t;
|
||||
|
||||
|
||||
/*
|
||||
* HTTP authentication types...
|
||||
*/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
HTTP_AUTH_NONE, /* No authentication in use */
|
||||
HTTP_AUTH_BASIC, /* Basic authentication in use */
|
||||
HTTP_AUTH_MD5, /* Digest authentication in use */
|
||||
HTTP_AUTH_MD5_SESS, /* MD5-session authentication in use */
|
||||
HTTP_AUTH_MD5_INT, /* Digest authentication in use for body */
|
||||
HTTP_AUTH_MD5_SESS_INT /* MD5-session authentication in use for body */
|
||||
} http_auth_t;
|
||||
|
||||
|
||||
/*
|
||||
* HTTP status codes...
|
||||
*/
|
||||
@@ -163,7 +133,6 @@ typedef enum
|
||||
HTTP_ERROR = -1, /* An error response from httpXxxx() */
|
||||
|
||||
HTTP_CONTINUE = 100, /* Everything OK, keep going... */
|
||||
HTTP_SWITCHING_PROTOCOLS, /* HTTP upgrade to TLS/SSL */
|
||||
|
||||
HTTP_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
|
||||
HTTP_CREATED, /* PUT command was successful */
|
||||
@@ -196,7 +165,6 @@ typedef enum
|
||||
HTTP_REQUEST_TOO_LARGE, /* Request entity too large */
|
||||
HTTP_URI_TOO_LONG, /* URI too long */
|
||||
HTTP_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */
|
||||
HTTP_UPGRADE_REQUIRED = 426, /* Upgrade to SSL/TLS required */
|
||||
|
||||
HTTP_SERVER_ERROR = 500, /* Internal server error */
|
||||
HTTP_NOT_IMPLEMENTED, /* Feature not implemented */
|
||||
@@ -253,7 +221,6 @@ typedef struct
|
||||
{
|
||||
int fd; /* File descriptor for this socket */
|
||||
int blocking; /* To block or not to block */
|
||||
int error; /* Last error on read */
|
||||
time_t activity; /* Time since last read/write */
|
||||
http_state_t state; /* State of client */
|
||||
http_status_t status; /* Status of last request */
|
||||
@@ -270,13 +237,6 @@ typedef struct
|
||||
int used; /* Number of bytes used in buffer */
|
||||
char buffer[HTTP_MAX_BUFFER];
|
||||
/* Buffer for messages */
|
||||
int auth_type; /* Authentication in use */
|
||||
md5_state_t md5_state; /* MD5 state */
|
||||
char nonce[HTTP_MAX_VALUE];
|
||||
/* Nonce value */
|
||||
int nonce_count; /* Nonce count */
|
||||
void *tls; /* TLS state information */
|
||||
http_encryption_t encryption; /* Encryption requirements */
|
||||
} http_t;
|
||||
|
||||
|
||||
@@ -290,19 +250,13 @@ extern int httpCheck(http_t *http);
|
||||
httpSetField((http), HTTP_FIELD_HOST, (http)->hostname)
|
||||
extern void httpClose(http_t *http);
|
||||
extern http_t *httpConnect(const char *host, int port);
|
||||
extern http_t *httpConnectEncrypt(const char *host, int port,
|
||||
http_encryption_t encrypt);
|
||||
extern int httpDelete(http_t *http, const char *uri);
|
||||
extern int httpEncryption(http_t *http, http_encryption_t e);
|
||||
# define httpError(http) ((http)->error)
|
||||
extern void httpFlush(http_t *http);
|
||||
extern int httpGet(http_t *http, const char *uri);
|
||||
extern char *httpGets(char *line, int length, http_t *http);
|
||||
extern const char *httpGetDateString(time_t t);
|
||||
extern time_t httpGetDateTime(const char *s);
|
||||
# define httpGetField(http,field) (http)->fields[field]
|
||||
extern char *httpGetSubField(http_t *http, http_field_t field,
|
||||
const char *name, char *value);
|
||||
extern int httpHead(http_t *http, const char *uri);
|
||||
extern void httpInitialize(void);
|
||||
extern int httpOptions(http_t *http, const char *uri);
|
||||
@@ -311,11 +265,9 @@ extern int httpPrintf(http_t *http, const char *format, ...);
|
||||
extern int httpPut(http_t *http, const char *uri);
|
||||
extern int httpRead(http_t *http, char *buffer, int length);
|
||||
extern int httpReconnect(http_t *http);
|
||||
extern void httpSeparate(const char *uri, char *method,
|
||||
char *username, char *host, int *port,
|
||||
char *resource);
|
||||
extern void httpSetField(http_t *http, http_field_t field,
|
||||
const char *value);
|
||||
extern void httpSeparate(const char *uri, char *method, char *username,
|
||||
char *host, int *port, char *resource);
|
||||
extern void httpSetField(http_t *http, http_field_t field, const char *value);
|
||||
extern const char *httpStatus(http_status_t status);
|
||||
extern int httpTrace(http_t *http, const char *uri);
|
||||
extern http_status_t httpUpdate(http_t *http);
|
||||
@@ -323,11 +275,6 @@ extern int httpWrite(http_t *http, const char *buffer, int length);
|
||||
extern char *httpEncode64(char *out, const char *in);
|
||||
extern char *httpDecode64(char *out, const char *in);
|
||||
extern int httpGetLength(http_t *http);
|
||||
extern char *httpMD5(const char *, const char *, const char *,
|
||||
char [33]);
|
||||
extern char *httpMD5Final(const char *, const char *, const char *,
|
||||
char [33]);
|
||||
extern char *httpMD5String(const md5_byte_t *, char [33]);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+131
-592
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+26
-116
@@ -4,7 +4,7 @@
|
||||
* Internet Printing Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -30,7 +30,7 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include "http.h"
|
||||
# include <cups/http.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -75,16 +75,11 @@ typedef enum /**** Format tags for attribute formats... ****/
|
||||
IPP_TAG_JOB,
|
||||
IPP_TAG_END,
|
||||
IPP_TAG_PRINTER,
|
||||
IPP_TAG_UNSUPPORTED_GROUP,
|
||||
IPP_TAG_SUBSCRIPTION,
|
||||
IPP_TAG_EVENT_NOTIFICATION,
|
||||
IPP_TAG_UNSUPPORTED_VALUE = 0x10,
|
||||
IPP_TAG_EXTENSION,
|
||||
IPP_TAG_UNSUPPORTED = 0x10,
|
||||
IPP_TAG_DEFAULT,
|
||||
IPP_TAG_UNKNOWN,
|
||||
IPP_TAG_NOVALUE,
|
||||
IPP_TAG_NOTSETTABLE = 0x15,
|
||||
IPP_TAG_DELETEATTR,
|
||||
IPP_TAG_ADMINDEFINE,
|
||||
IPP_TAG_INTEGER = 0x21,
|
||||
IPP_TAG_BOOLEAN,
|
||||
IPP_TAG_ENUM,
|
||||
@@ -92,10 +87,9 @@ typedef enum /**** Format tags for attribute formats... ****/
|
||||
IPP_TAG_DATE,
|
||||
IPP_TAG_RESOLUTION,
|
||||
IPP_TAG_RANGE,
|
||||
IPP_TAG_BEGIN_COLLECTION,
|
||||
IPP_TAG_COLLECTION,
|
||||
IPP_TAG_TEXTLANG,
|
||||
IPP_TAG_NAMELANG,
|
||||
IPP_TAG_END_COLLECTION,
|
||||
IPP_TAG_TEXT = 0x41,
|
||||
IPP_TAG_NAME,
|
||||
IPP_TAG_KEYWORD = 0x44,
|
||||
@@ -103,10 +97,7 @@ typedef enum /**** Format tags for attribute formats... ****/
|
||||
IPP_TAG_URISCHEME,
|
||||
IPP_TAG_CHARSET,
|
||||
IPP_TAG_LANGUAGE,
|
||||
IPP_TAG_MIMETYPE,
|
||||
IPP_TAG_MEMBERNAME,
|
||||
IPP_TAG_MASK = 0x7fffffff, /* Mask for copied attribute values */
|
||||
IPP_TAG_COPY = -0x7fffffff-1 /* Bitflag for copied attribute values */
|
||||
IPP_TAG_MIMETYPE
|
||||
} ipp_tag_t;
|
||||
|
||||
typedef enum /**** Resolution units... ****/
|
||||
@@ -115,36 +106,21 @@ typedef enum /**** Resolution units... ****/
|
||||
IPP_RES_PER_CM
|
||||
} ipp_res_t;
|
||||
|
||||
typedef enum /**** Multiple Document Handling ****/
|
||||
{
|
||||
IPP_DOC_SINGLE,
|
||||
IPP_DOC_UNCOLLATED,
|
||||
IPP_DOC_COLLATED,
|
||||
IPP_DOC_SEPARATE
|
||||
} ipp_doc_t;
|
||||
|
||||
typedef enum /**** Finishings... ****/
|
||||
{
|
||||
IPP_FINISHINGS_NONE = 3,
|
||||
IPP_FINISHINGS_STAPLE,
|
||||
IPP_FINISHINGS_PUNCH,
|
||||
IPP_FINISHINGS_COVER,
|
||||
IPP_FINISHINGS_BIND,
|
||||
IPP_FINISHINGS_SADDLE_STITCH,
|
||||
IPP_FINISHINGS_EDGE_STITCH,
|
||||
IPP_FINISHINGS_FOLD,
|
||||
IPP_FINISHINGS_TRIM,
|
||||
IPP_FINISHINGS_BALE,
|
||||
IPP_FINISHINGS_BOOKLET_MAKER,
|
||||
IPP_FINISHINGS_JOB_OFFSET,
|
||||
IPP_FINISHINGS_STAPLE_TOP_LEFT = 20,
|
||||
IPP_FINISHINGS_STAPLE_BOTTOM_LEFT,
|
||||
IPP_FINISHINGS_STAPLE_TOP_RIGHT,
|
||||
IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT,
|
||||
IPP_FINISHINGS_EDGE_STITCH_LEFT,
|
||||
IPP_FINISHINGS_EDGE_STITCH_TOP,
|
||||
IPP_FINISHINGS_EDGE_STITCH_RIGHT,
|
||||
IPP_FINISHINGS_EDGE_STITCH_BOTTOM,
|
||||
IPP_FINISHINGS_STAPLE_DUAL_LEFT,
|
||||
IPP_FINISHINGS_STAPLE_DUAL_TOP,
|
||||
IPP_FINISHINGS_STAPLE_DUAL_RIGHT,
|
||||
IPP_FINISHINGS_STAPLE_DUAL_BOTTOM,
|
||||
IPP_FINISHINGS_BIND_LEFT = 50,
|
||||
IPP_FINISHINGS_BIND_TOP,
|
||||
IPP_FINISHINGS_BIND_RIGHT,
|
||||
IPP_FINISHINGS_BIND_BOTTOM
|
||||
IPP_FINISH_NONE = 3,
|
||||
IPP_FINISH_STAPLE,
|
||||
IPP_FINISH_PUNCH,
|
||||
IPP_FINISH_COVER,
|
||||
IPP_FINISH_BIND
|
||||
} ipp_finish_t;
|
||||
|
||||
typedef enum /**** Orientation... ****/
|
||||
@@ -168,7 +144,7 @@ typedef enum /**** Job States.... */
|
||||
IPP_JOB_HELD,
|
||||
IPP_JOB_PROCESSING,
|
||||
IPP_JOB_STOPPED,
|
||||
IPP_JOB_CANCELLED,
|
||||
IPP_JOB_CANCELED,
|
||||
IPP_JOB_ABORTED,
|
||||
IPP_JOB_COMPLETED
|
||||
} ipp_jstate_t;
|
||||
@@ -201,40 +177,12 @@ typedef enum /**** IPP operations... ****/
|
||||
IPP_GET_JOB_ATTRIBUTES,
|
||||
IPP_GET_JOBS,
|
||||
IPP_GET_PRINTER_ATTRIBUTES,
|
||||
IPP_HOLD_JOB,
|
||||
IPP_HOLD_JOB = 0x000c,
|
||||
IPP_RELEASE_JOB,
|
||||
IPP_RESTART_JOB,
|
||||
IPP_PAUSE_PRINTER = 0x0010,
|
||||
IPP_RESUME_PRINTER,
|
||||
IPP_PURGE_JOBS,
|
||||
IPP_SET_PRINTER_ATTRIBUTES,
|
||||
IPP_SET_JOB_ATTRIBUTES,
|
||||
IPP_GET_PRINTER_SUPPORTED_VALUES,
|
||||
IPP_CREATE_PRINTER_SUBSCRIPTION,
|
||||
IPP_CREATE_JOB_SUBSCRIPTION,
|
||||
IPP_GET_SUBSCRIPTION_ATTRIBUTES,
|
||||
IPP_GET_SUBSCRIPTIONS,
|
||||
IPP_RENEW_SUBSCRIPTION,
|
||||
IPP_CANCEL_SUBSCRIPTION,
|
||||
IPP_GET_NOTIFICATIONS,
|
||||
IPP_SEND_NOTIFICATIONS,
|
||||
IPP_GET_PRINT_SUPPORT_FILES = 0x0021,
|
||||
IPP_ENABLE_PRINTER,
|
||||
IPP_DISABLE_PRINTER,
|
||||
IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
|
||||
IPP_HOLD_NEW_JOBS,
|
||||
IPP_RELEASE_HELD_NEW_JOBS,
|
||||
IPP_DEACTIVATE_PRINTER,
|
||||
IPP_ACTIVATE_PRINTER,
|
||||
IPP_RESTART_PRINTER,
|
||||
IPP_SHUTDOWN_PRINTER,
|
||||
IPP_STARTUP_PRINTER,
|
||||
IPP_REPROCESS_JOB,
|
||||
IPP_CANCEL_CURRENT_JOB,
|
||||
IPP_SUSPEND_CURRENT_JOB,
|
||||
IPP_RESUME_JOB,
|
||||
IPP_PROMOTE_JOB,
|
||||
IPP_SCHEDULE_JOB_AFTER,
|
||||
IPP_PRIVATE = 0x4000,
|
||||
CUPS_GET_DEFAULT,
|
||||
CUPS_GET_PRINTERS,
|
||||
@@ -245,12 +193,7 @@ typedef enum /**** IPP operations... ****/
|
||||
CUPS_DELETE_CLASS,
|
||||
CUPS_ACCEPT_JOBS,
|
||||
CUPS_REJECT_JOBS,
|
||||
CUPS_SET_DEFAULT,
|
||||
CUPS_GET_DEVICES,
|
||||
CUPS_GET_PPDS,
|
||||
CUPS_MOVE_JOB,
|
||||
CUPS_ADD_DEVICE,
|
||||
CUPS_DELETE_DEVICE
|
||||
CUPS_SET_DEFAULT
|
||||
} ipp_op_t;
|
||||
|
||||
typedef enum /**** IPP status codes... ****/
|
||||
@@ -258,11 +201,6 @@ typedef enum /**** IPP status codes... ****/
|
||||
IPP_OK = 0x0000,
|
||||
IPP_OK_SUBST,
|
||||
IPP_OK_CONFLICT,
|
||||
IPP_OK_IGNORED_SUBSCRIPTIONS,
|
||||
IPP_OK_IGNORED_NOTIFICATIONS,
|
||||
IPP_OK_TOO_MANY_EVENTS,
|
||||
IPP_OK_BUT_CANCEL_SUBSCRIPTION,
|
||||
IPP_REDIRECTION_OTHER_SITE = 0x300,
|
||||
IPP_BAD_REQUEST = 0x0400,
|
||||
IPP_FORBIDDEN,
|
||||
IPP_NOT_AUTHENTICATED,
|
||||
@@ -278,27 +216,14 @@ typedef enum /**** IPP status codes... ****/
|
||||
IPP_URI_SCHEME,
|
||||
IPP_CHARSET,
|
||||
IPP_CONFLICT,
|
||||
IPP_COMPRESSION_NOT_SUPPORTED,
|
||||
IPP_COMPRESSION_ERROR,
|
||||
IPP_DOCUMENT_FORMAT_ERROR,
|
||||
IPP_DOCUMENT_ACCESS_ERROR,
|
||||
IPP_ATTRIBUTES_NOT_SETTABLE,
|
||||
IPP_IGNORED_ALL_SUBSCRIPTIONS,
|
||||
IPP_TOO_MANY_SUBSCRIPTIONS,
|
||||
IPP_IGNORED_ALL_NOTIFICATIONS,
|
||||
IPP_PRINT_SUPPORT_FILE_NOT_FOUND,
|
||||
|
||||
IPP_INTERNAL_ERROR = 0x0500,
|
||||
IPP_OPERATION_NOT_SUPPORTED,
|
||||
IPP_SERVICE_UNAVAILABLE,
|
||||
IPP_VERSION_NOT_SUPPORTED,
|
||||
IPP_DEVICE_ERROR,
|
||||
IPP_DEVICE_UNAVAILABLE,
|
||||
IPP_TEMPORARY_ERROR,
|
||||
IPP_NOT_ACCEPTING,
|
||||
IPP_PRINTER_BUSY,
|
||||
IPP_ERROR_JOB_CANCELLED,
|
||||
IPP_MULTIPLE_JOBS_NOT_SUPPORTED,
|
||||
IPP_PRINTER_IS_DEACTIVATED
|
||||
IPP_PRINTER_BUSY
|
||||
} ipp_status_t;
|
||||
|
||||
typedef unsigned char ipp_uchar_t;/**** Unsigned 8-bit integer/character ****/
|
||||
@@ -354,12 +279,6 @@ typedef union /**** Attribute Value ****/
|
||||
char *charset; /* Character set */
|
||||
char *text; /* String */
|
||||
} string; /* String with language value */
|
||||
|
||||
struct
|
||||
{
|
||||
int length; /* Length of attribute */
|
||||
void *data; /* Data in attribute */
|
||||
} unknown; /* Unknown attribute type */
|
||||
} ipp_value_t;
|
||||
|
||||
typedef struct ipp_attribute_s /**** Attribute ****/
|
||||
@@ -388,6 +307,7 @@ typedef struct /**** Request State ****/
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
extern time_t ippDateToTime(const ipp_uchar_t *date);
|
||||
extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value);
|
||||
extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values);
|
||||
extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value);
|
||||
@@ -400,24 +320,14 @@ extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const cha
|
||||
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 time_t ippDateToTime(const ipp_uchar_t *date);
|
||||
extern void ippDelete(ipp_t *ipp);
|
||||
extern const char *ippErrorString(ipp_status_t error);
|
||||
extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name,
|
||||
ipp_tag_t type);
|
||||
extern ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name,
|
||||
ipp_tag_t type);
|
||||
extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);
|
||||
extern size_t ippLength(ipp_t *ipp);
|
||||
extern ipp_t *ippNew(void);
|
||||
extern ipp_state_t ippRead(http_t *http, ipp_t *ipp);
|
||||
extern const ipp_uchar_t *ippTimeToDate(time_t t);
|
||||
extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp);
|
||||
extern int ippPort(void);
|
||||
extern void ippSetPort(int p);
|
||||
|
||||
extern ipp_attribute_t *_ipp_add_attr(ipp_t *, int);
|
||||
extern void _ipp_free_attr(ipp_attribute_t *);
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
|
||||
+22
-56
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* I18N/language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -50,30 +50,17 @@ static char *lang_blank = ""; /* Blank constant string */
|
||||
static char *lang_encodings[] = /* Encoding strings */
|
||||
{
|
||||
"us-ascii",
|
||||
"iso-8859-1",
|
||||
"iso-8859-2",
|
||||
"iso-8859-3",
|
||||
"iso-8859-4",
|
||||
"iso-8859-5",
|
||||
"iso-8859-6",
|
||||
"iso-8859-7",
|
||||
"iso-8859-8",
|
||||
"iso-8859-9",
|
||||
"iso-8859-10",
|
||||
"utf-8",
|
||||
"iso-8859-13",
|
||||
"iso-8859-14",
|
||||
"iso-8859-15",
|
||||
"windows-874",
|
||||
"windows-1250",
|
||||
"windows-1251",
|
||||
"windows-1252",
|
||||
"windows-1253",
|
||||
"windows-1254",
|
||||
"windows-1255",
|
||||
"windows-1256",
|
||||
"windows-1257",
|
||||
"windows-1258"
|
||||
"iso8859-1",
|
||||
"iso8859-2",
|
||||
"iso8859-3",
|
||||
"iso8859-4",
|
||||
"iso8859-5",
|
||||
"iso8859-6",
|
||||
"iso8859-7",
|
||||
"iso8859-8",
|
||||
"iso8859-9",
|
||||
"iso8859-10",
|
||||
"utf8"
|
||||
};
|
||||
static char *lang_default[] = /* Default POSIX locale */
|
||||
{
|
||||
@@ -157,31 +144,15 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
/*
|
||||
* 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
|
||||
* 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. Any trailing character set specification is
|
||||
* dropped.
|
||||
* operating systems.
|
||||
*/
|
||||
|
||||
if (language == NULL || language[0] == '\0' ||
|
||||
strcmp(language, "POSIX") == 0)
|
||||
if (language == NULL || language[0] == '\0')
|
||||
strcpy(langname, "C");
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Copy the locale string over safely...
|
||||
*/
|
||||
|
||||
strncpy(langname, language, sizeof(langname) - 1);
|
||||
langname[sizeof(langname) - 1] = '\0';
|
||||
|
||||
/*
|
||||
* Strip charset from "locale.charset"...
|
||||
*/
|
||||
|
||||
if ((text = strchr(langname, '.')) != NULL)
|
||||
*text = '\0';
|
||||
}
|
||||
strcpy(langname, language);
|
||||
|
||||
if (strlen(langname) < 2)
|
||||
strcpy(real, "C");
|
||||
@@ -214,7 +185,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
if ((localedir = getenv("LOCALEDIR")) == NULL)
|
||||
localedir = CUPS_LOCALEDIR;
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir, real, real);
|
||||
sprintf(filename, "%s/%s/cups_%s", localedir, real, real);
|
||||
|
||||
if ((fp = fopen(filename, "r")) == NULL)
|
||||
if (strlen(real) > 2)
|
||||
@@ -224,8 +195,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
real[2] = '\0';
|
||||
snprintf(filename, sizeof(filename), "%s/%s/cups_%s", localedir, real,
|
||||
real);
|
||||
sprintf(filename, "%s/%s/cups_%s", localedir, real, real);
|
||||
fp = fopen(filename, "r");
|
||||
}
|
||||
|
||||
@@ -263,10 +233,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
strncpy(line, lang_default[0], sizeof(line) - 1);
|
||||
line[sizeof(line) - 1] = '\0';
|
||||
}
|
||||
strcpy(line, lang_default[0]);
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
{
|
||||
/*
|
||||
@@ -306,6 +273,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
lang_cache = lang;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Free all old strings as needed...
|
||||
*/
|
||||
@@ -323,8 +291,7 @@ 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';
|
||||
strcpy(lang->language, langname);
|
||||
|
||||
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
|
||||
if (strcmp(lang_encodings[i], line) == 0)
|
||||
@@ -351,8 +318,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... */
|
||||
strcpy(line, lang_default[count]);
|
||||
}
|
||||
else if (fgets(line, sizeof(line), fp) == NULL)
|
||||
break;
|
||||
|
||||
+3
-30
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Multi-language support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -141,15 +141,6 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_PENDING,
|
||||
CUPS_MSG_OUTPUT_MODE,
|
||||
CUPS_MSG_RESOLUTION,
|
||||
CUPS_MSG_TEXT,
|
||||
CUPS_MSG_PRETTYPRINT,
|
||||
CUPS_MSG_MARGINS,
|
||||
CUPS_MSG_LEFT,
|
||||
CUPS_MSG_RIGHT,
|
||||
CUPS_MSG_BOTTOM,
|
||||
CUPS_MSG_TOP,
|
||||
CUPS_MSG_FILENAME,
|
||||
CUPS_MSG_PRINT,
|
||||
CUPS_MSG_HTTP_BASE = 200,
|
||||
CUPS_MSG_HTTP_END = 505,
|
||||
CUPS_MSG_MAX
|
||||
@@ -168,20 +159,7 @@ typedef enum /**** Language Encodings ****/
|
||||
CUPS_ISO8859_8,
|
||||
CUPS_ISO8859_9,
|
||||
CUPS_ISO8859_10,
|
||||
CUPS_UTF8,
|
||||
CUPS_ISO8859_13,
|
||||
CUPS_ISO8859_14,
|
||||
CUPS_ISO8859_15,
|
||||
CUPS_WINDOWS_874,
|
||||
CUPS_WINDOWS_1250,
|
||||
CUPS_WINDOWS_1251,
|
||||
CUPS_WINDOWS_1252,
|
||||
CUPS_WINDOWS_1253,
|
||||
CUPS_WINDOWS_1254,
|
||||
CUPS_WINDOWS_1255,
|
||||
CUPS_WINDOWS_1256,
|
||||
CUPS_WINDOWS_1257,
|
||||
CUPS_WINDOWS_1258
|
||||
CUPS_UTF8
|
||||
} cups_encoding_t;
|
||||
|
||||
typedef struct cups_lang_str /**** Language Cache Structure ****/
|
||||
@@ -199,12 +177,7 @@ typedef struct cups_lang_str /**** Language Cache Structure ****/
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
# ifdef WIN32
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_ALL, ""))
|
||||
# else /* This fix works around bugs in the Linux and HP-UX setlocale() */
|
||||
# define cupsLangDefault() cupsLangGet(getenv("LANG"))
|
||||
# endif /* WIN32 */
|
||||
|
||||
# define cupsLangDefault() cupsLangGet(setlocale(LC_ALL, ""))
|
||||
extern char *cupsLangEncoding(cups_lang_t *lang);
|
||||
extern void cupsLangFlush(void);
|
||||
extern void cupsLangFree(cups_lang_t *lang);
|
||||
|
||||
+20
-49
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option marking routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -41,7 +41,6 @@
|
||||
|
||||
#include "ppd.h"
|
||||
#include "string.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -118,10 +117,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (c1->marked)
|
||||
break;
|
||||
|
||||
if (j == 0 ||
|
||||
strcasecmp(c1->choice, "None") == 0 ||
|
||||
strcasecmp(c1->choice, "Off") == 0 ||
|
||||
strcasecmp(c1->choice, "False") == 0)
|
||||
if (j == 0)
|
||||
c1 = NULL;
|
||||
}
|
||||
|
||||
@@ -151,10 +147,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (c2->marked)
|
||||
break;
|
||||
|
||||
if (j == 0 ||
|
||||
strcasecmp(c2->choice, "None") == 0 ||
|
||||
strcasecmp(c2->choice, "Off") == 0 ||
|
||||
strcasecmp(c2->choice, "False") == 0)
|
||||
if (j == 0)
|
||||
c2 = NULL;
|
||||
}
|
||||
|
||||
@@ -165,9 +158,6 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (c1 != NULL && c1->marked &&
|
||||
c2 != NULL && c2->marked)
|
||||
{
|
||||
DEBUG_printf(("%s->%s conflicts with %s->%s (%s %s %s %s)\n",
|
||||
o1->keyword, c1->choice, o2->keyword, c2->choice,
|
||||
c->option1, c->choice1, c->option2, c->choice2));
|
||||
conflicts ++;
|
||||
o1->conflicted = 1;
|
||||
o2->conflicted = 1;
|
||||
@@ -198,7 +188,7 @@ ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */
|
||||
return (NULL);
|
||||
|
||||
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
|
||||
if (strcasecmp(c->choice, choice) == 0)
|
||||
if (strcmp(c->choice, choice) == 0)
|
||||
return (c);
|
||||
|
||||
return (NULL);
|
||||
@@ -249,12 +239,12 @@ ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */
|
||||
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
|
||||
{
|
||||
for (j = g->num_options, o = g->options; j > 0; j --, o ++)
|
||||
if (strcasecmp(o->keyword, option) == 0)
|
||||
if (strcmp(o->keyword, option) == 0)
|
||||
return (o);
|
||||
|
||||
for (j = g->num_subgroups, sg = g->subgroups; j > 0; j --, sg ++)
|
||||
for (k = sg->num_options, o = sg->options; k > 0; k --, o ++)
|
||||
if (strcasecmp(o->keyword, option) == 0)
|
||||
if (strcmp(o->keyword, option) == 0)
|
||||
return (o);
|
||||
}
|
||||
|
||||
@@ -297,6 +287,7 @@ ppdMarkDefaults(ppd_file_t *ppd)/* I - PPD file record */
|
||||
{
|
||||
int i; /* Looping variables */
|
||||
ppd_group_t *g; /* Current group */
|
||||
ppd_option_t *o; /* PageSize option */
|
||||
|
||||
|
||||
if (ppd == NULL)
|
||||
@@ -329,7 +320,7 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
if (ppd == NULL)
|
||||
return (0);
|
||||
|
||||
if (strcasecmp(option, "PageSize") == 0 && strncasecmp(choice, "Custom.", 7) == 0)
|
||||
if (strcmp(option, "PageSize") == 0 && strncmp(choice, "Custom.", 7) == 0)
|
||||
{
|
||||
/*
|
||||
* Handle variable page sizes...
|
||||
@@ -343,7 +334,7 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
return (0);
|
||||
|
||||
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
|
||||
if (strcasecmp(c->choice, choice) == 0)
|
||||
if (strcmp(c->choice, choice) == 0)
|
||||
break;
|
||||
|
||||
if (i)
|
||||
@@ -356,55 +347,35 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
|
||||
if (o->ui != PPD_UI_PICKMANY)
|
||||
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
|
||||
if (strcasecmp(c->choice, choice) != 0)
|
||||
if (strcmp(c->choice, choice) != 0)
|
||||
c->marked = 0;
|
||||
|
||||
if (strcasecmp(option, "PageSize") == 0 || strcasecmp(option, "PageRegion") == 0)
|
||||
if (strcmp(option, "PageSize") == 0 || strcmp(option, "PageRegion") == 0)
|
||||
{
|
||||
/*
|
||||
* Mark current page size...
|
||||
*/
|
||||
|
||||
for (i = 0; i < ppd->num_sizes; i ++)
|
||||
ppd->sizes[i].marked = strcasecmp(ppd->sizes[i].name, choice) == 0;
|
||||
ppd->sizes[i].marked = strcmp(ppd->sizes[i].name, choice) == 0;
|
||||
|
||||
/*
|
||||
* Unmark the current PageSize or PageRegion setting, as appropriate...
|
||||
*/
|
||||
|
||||
if (strcasecmp(option, "PageSize") == 0)
|
||||
if (strcmp(option, "PageSize") == 0)
|
||||
{
|
||||
if ((o = ppdFindOption(ppd, "PageRegion")) != NULL)
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
o = ppdFindOption(ppd, "PageRegion");
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((o = ppdFindOption(ppd, "PageSize")) != NULL)
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
o = ppdFindOption(ppd, "PageSize");
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(option, "InputSlot") == 0)
|
||||
{
|
||||
/*
|
||||
* Unmark ManualFeed option...
|
||||
*/
|
||||
|
||||
if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL)
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
else if (strcasecmp(option, "ManualFeed") == 0)
|
||||
{
|
||||
/*
|
||||
* Unmark InputSlot option...
|
||||
*/
|
||||
|
||||
if ((o = ppdFindOption(ppd, "InputSlot")) != NULL)
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (ppdConflicts(ppd));
|
||||
@@ -428,7 +399,7 @@ ppd_defaults(ppd_file_t *ppd, /* I - PPD file */
|
||||
return;
|
||||
|
||||
for (i = g->num_options, o = g->options; i > 0; i --, o ++)
|
||||
if (strcasecmp(o->keyword, "PageRegion") != 0)
|
||||
if (strcmp(o->keyword, "PageRegion") != 0)
|
||||
ppdMarkOption(ppd, o->keyword, o->defchoice);
|
||||
|
||||
for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++)
|
||||
|
||||
-392
@@ -1,392 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
L. Peter Deutsch
|
||||
ghost@aladdin.com
|
||||
|
||||
*/
|
||||
/*$Id$ */
|
||||
/*
|
||||
Independent implementation of MD5 (RFC 1321).
|
||||
|
||||
This code implements the MD5 Algorithm defined in RFC 1321.
|
||||
It is derived directly from the text of the RFC and not from the
|
||||
reference implementation.
|
||||
|
||||
The original and principal author of md5.c is L. Peter Deutsch
|
||||
<ghost@aladdin.com>. Other authors are noted in the change history
|
||||
that follows (in reverse chronological order):
|
||||
|
||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
|
||||
1999-05-03 lpd Original version.
|
||||
*/
|
||||
|
||||
#include "md5.h"
|
||||
#include "string.h"
|
||||
|
||||
#ifdef TEST
|
||||
/*
|
||||
* Compile with -DTEST to create a self-contained executable test program.
|
||||
* The test program should print out the same values as given in section
|
||||
* A.5 of RFC 1321, reproduced below.
|
||||
*/
|
||||
main()
|
||||
{
|
||||
static const char *const test[7] = {
|
||||
"", /*d41d8cd98f00b204e9800998ecf8427e*/
|
||||
"a", /*0cc175b9c0f1b6a831c399e269772661*/
|
||||
"abc", /*900150983cd24fb0d6963f7d28e17f72*/
|
||||
"message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/
|
||||
"abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
||||
/*d174ab98d277d9f5a5611c2c9f419d9f*/
|
||||
"12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 7; ++i) {
|
||||
md5_state_t state;
|
||||
md5_byte_t digest[16];
|
||||
int di;
|
||||
|
||||
md5_init(&state);
|
||||
md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i]));
|
||||
md5_finish(&state, digest);
|
||||
printf("MD5 (\"%s\") = ", test[i]);
|
||||
for (di = 0; di < 16; ++di)
|
||||
printf("%02x", digest[di]);
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* TEST */
|
||||
|
||||
|
||||
/*
|
||||
* For reference, here is the program that computed the T values.
|
||||
*/
|
||||
#if 0
|
||||
#include <math.h>
|
||||
main()
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i <= 64; ++i) {
|
||||
unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
|
||||
printf("#define T%d 0x%08lx\n", i, v);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* End of T computation program.
|
||||
*/
|
||||
#define T1 0xd76aa478
|
||||
#define T2 0xe8c7b756
|
||||
#define T3 0x242070db
|
||||
#define T4 0xc1bdceee
|
||||
#define T5 0xf57c0faf
|
||||
#define T6 0x4787c62a
|
||||
#define T7 0xa8304613
|
||||
#define T8 0xfd469501
|
||||
#define T9 0x698098d8
|
||||
#define T10 0x8b44f7af
|
||||
#define T11 0xffff5bb1
|
||||
#define T12 0x895cd7be
|
||||
#define T13 0x6b901122
|
||||
#define T14 0xfd987193
|
||||
#define T15 0xa679438e
|
||||
#define T16 0x49b40821
|
||||
#define T17 0xf61e2562
|
||||
#define T18 0xc040b340
|
||||
#define T19 0x265e5a51
|
||||
#define T20 0xe9b6c7aa
|
||||
#define T21 0xd62f105d
|
||||
#define T22 0x02441453
|
||||
#define T23 0xd8a1e681
|
||||
#define T24 0xe7d3fbc8
|
||||
#define T25 0x21e1cde6
|
||||
#define T26 0xc33707d6
|
||||
#define T27 0xf4d50d87
|
||||
#define T28 0x455a14ed
|
||||
#define T29 0xa9e3e905
|
||||
#define T30 0xfcefa3f8
|
||||
#define T31 0x676f02d9
|
||||
#define T32 0x8d2a4c8a
|
||||
#define T33 0xfffa3942
|
||||
#define T34 0x8771f681
|
||||
#define T35 0x6d9d6122
|
||||
#define T36 0xfde5380c
|
||||
#define T37 0xa4beea44
|
||||
#define T38 0x4bdecfa9
|
||||
#define T39 0xf6bb4b60
|
||||
#define T40 0xbebfbc70
|
||||
#define T41 0x289b7ec6
|
||||
#define T42 0xeaa127fa
|
||||
#define T43 0xd4ef3085
|
||||
#define T44 0x04881d05
|
||||
#define T45 0xd9d4d039
|
||||
#define T46 0xe6db99e5
|
||||
#define T47 0x1fa27cf8
|
||||
#define T48 0xc4ac5665
|
||||
#define T49 0xf4292244
|
||||
#define T50 0x432aff97
|
||||
#define T51 0xab9423a7
|
||||
#define T52 0xfc93a039
|
||||
#define T53 0x655b59c3
|
||||
#define T54 0x8f0ccc92
|
||||
#define T55 0xffeff47d
|
||||
#define T56 0x85845dd1
|
||||
#define T57 0x6fa87e4f
|
||||
#define T58 0xfe2ce6e0
|
||||
#define T59 0xa3014314
|
||||
#define T60 0x4e0811a1
|
||||
#define T61 0xf7537e82
|
||||
#define T62 0xbd3af235
|
||||
#define T63 0x2ad7d2bb
|
||||
#define T64 0xeb86d391
|
||||
|
||||
static void
|
||||
md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
|
||||
{
|
||||
md5_word_t
|
||||
a = pms->abcd[0], b = pms->abcd[1],
|
||||
c = pms->abcd[2], d = pms->abcd[3];
|
||||
md5_word_t t;
|
||||
|
||||
#ifndef ARCH_IS_BIG_ENDIAN
|
||||
# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
|
||||
#endif
|
||||
#if ARCH_IS_BIG_ENDIAN
|
||||
|
||||
/*
|
||||
* On big-endian machines, we must arrange the bytes in the right
|
||||
* order. (This also works on machines of unknown byte order.)
|
||||
*/
|
||||
md5_word_t X[16];
|
||||
const md5_byte_t *xp = data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 16; ++i, xp += 4)
|
||||
X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
|
||||
|
||||
#else /* !ARCH_IS_BIG_ENDIAN */
|
||||
|
||||
/*
|
||||
* On little-endian machines, we can process properly aligned data
|
||||
* without copying it.
|
||||
*/
|
||||
md5_word_t xbuf[16];
|
||||
const md5_word_t *X;
|
||||
|
||||
if (!((data - (const md5_byte_t *)0) & 3)) {
|
||||
/* data are properly aligned */
|
||||
X = (const md5_word_t *)data;
|
||||
} else {
|
||||
/* not aligned */
|
||||
memcpy(xbuf, data, 64);
|
||||
X = xbuf;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
||||
|
||||
/* Round 1. */
|
||||
/* Let [abcd k s i] denote the operation
|
||||
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + F(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
SET(a, b, c, d, 0, 7, T1);
|
||||
SET(d, a, b, c, 1, 12, T2);
|
||||
SET(c, d, a, b, 2, 17, T3);
|
||||
SET(b, c, d, a, 3, 22, T4);
|
||||
SET(a, b, c, d, 4, 7, T5);
|
||||
SET(d, a, b, c, 5, 12, T6);
|
||||
SET(c, d, a, b, 6, 17, T7);
|
||||
SET(b, c, d, a, 7, 22, T8);
|
||||
SET(a, b, c, d, 8, 7, T9);
|
||||
SET(d, a, b, c, 9, 12, T10);
|
||||
SET(c, d, a, b, 10, 17, T11);
|
||||
SET(b, c, d, a, 11, 22, T12);
|
||||
SET(a, b, c, d, 12, 7, T13);
|
||||
SET(d, a, b, c, 13, 12, T14);
|
||||
SET(c, d, a, b, 14, 17, T15);
|
||||
SET(b, c, d, a, 15, 22, T16);
|
||||
#undef SET
|
||||
|
||||
/* Round 2. */
|
||||
/* Let [abcd k s i] denote the operation
|
||||
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + G(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
SET(a, b, c, d, 1, 5, T17);
|
||||
SET(d, a, b, c, 6, 9, T18);
|
||||
SET(c, d, a, b, 11, 14, T19);
|
||||
SET(b, c, d, a, 0, 20, T20);
|
||||
SET(a, b, c, d, 5, 5, T21);
|
||||
SET(d, a, b, c, 10, 9, T22);
|
||||
SET(c, d, a, b, 15, 14, T23);
|
||||
SET(b, c, d, a, 4, 20, T24);
|
||||
SET(a, b, c, d, 9, 5, T25);
|
||||
SET(d, a, b, c, 14, 9, T26);
|
||||
SET(c, d, a, b, 3, 14, T27);
|
||||
SET(b, c, d, a, 8, 20, T28);
|
||||
SET(a, b, c, d, 13, 5, T29);
|
||||
SET(d, a, b, c, 2, 9, T30);
|
||||
SET(c, d, a, b, 7, 14, T31);
|
||||
SET(b, c, d, a, 12, 20, T32);
|
||||
#undef SET
|
||||
|
||||
/* Round 3. */
|
||||
/* Let [abcd k s t] denote the operation
|
||||
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + H(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
SET(a, b, c, d, 5, 4, T33);
|
||||
SET(d, a, b, c, 8, 11, T34);
|
||||
SET(c, d, a, b, 11, 16, T35);
|
||||
SET(b, c, d, a, 14, 23, T36);
|
||||
SET(a, b, c, d, 1, 4, T37);
|
||||
SET(d, a, b, c, 4, 11, T38);
|
||||
SET(c, d, a, b, 7, 16, T39);
|
||||
SET(b, c, d, a, 10, 23, T40);
|
||||
SET(a, b, c, d, 13, 4, T41);
|
||||
SET(d, a, b, c, 0, 11, T42);
|
||||
SET(c, d, a, b, 3, 16, T43);
|
||||
SET(b, c, d, a, 6, 23, T44);
|
||||
SET(a, b, c, d, 9, 4, T45);
|
||||
SET(d, a, b, c, 12, 11, T46);
|
||||
SET(c, d, a, b, 15, 16, T47);
|
||||
SET(b, c, d, a, 2, 23, T48);
|
||||
#undef SET
|
||||
|
||||
/* Round 4. */
|
||||
/* Let [abcd k s t] denote the operation
|
||||
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + I(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
SET(a, b, c, d, 0, 6, T49);
|
||||
SET(d, a, b, c, 7, 10, T50);
|
||||
SET(c, d, a, b, 14, 15, T51);
|
||||
SET(b, c, d, a, 5, 21, T52);
|
||||
SET(a, b, c, d, 12, 6, T53);
|
||||
SET(d, a, b, c, 3, 10, T54);
|
||||
SET(c, d, a, b, 10, 15, T55);
|
||||
SET(b, c, d, a, 1, 21, T56);
|
||||
SET(a, b, c, d, 8, 6, T57);
|
||||
SET(d, a, b, c, 15, 10, T58);
|
||||
SET(c, d, a, b, 6, 15, T59);
|
||||
SET(b, c, d, a, 13, 21, T60);
|
||||
SET(a, b, c, d, 4, 6, T61);
|
||||
SET(d, a, b, c, 11, 10, T62);
|
||||
SET(c, d, a, b, 2, 15, T63);
|
||||
SET(b, c, d, a, 9, 21, T64);
|
||||
#undef SET
|
||||
|
||||
/* Then perform the following additions. (That is increment each
|
||||
of the four registers by the value it had before this block
|
||||
was started.) */
|
||||
pms->abcd[0] += a;
|
||||
pms->abcd[1] += b;
|
||||
pms->abcd[2] += c;
|
||||
pms->abcd[3] += d;
|
||||
}
|
||||
|
||||
void
|
||||
md5_init(md5_state_t *pms)
|
||||
{
|
||||
pms->count[0] = pms->count[1] = 0;
|
||||
pms->abcd[0] = 0x67452301;
|
||||
pms->abcd[1] = 0xefcdab89;
|
||||
pms->abcd[2] = 0x98badcfe;
|
||||
pms->abcd[3] = 0x10325476;
|
||||
}
|
||||
|
||||
void
|
||||
md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
|
||||
{
|
||||
const md5_byte_t *p = data;
|
||||
int left = nbytes;
|
||||
int offset = (pms->count[0] >> 3) & 63;
|
||||
md5_word_t nbits = (md5_word_t)(nbytes << 3);
|
||||
|
||||
if (nbytes <= 0)
|
||||
return;
|
||||
|
||||
/* Update the message length. */
|
||||
pms->count[1] += nbytes >> 29;
|
||||
pms->count[0] += nbits;
|
||||
if (pms->count[0] < nbits)
|
||||
pms->count[1]++;
|
||||
|
||||
/* Process an initial partial block. */
|
||||
if (offset) {
|
||||
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
||||
|
||||
memcpy(pms->buf + offset, p, copy);
|
||||
if (offset + copy < 64)
|
||||
return;
|
||||
p += copy;
|
||||
left -= copy;
|
||||
md5_process(pms, pms->buf);
|
||||
}
|
||||
|
||||
/* Process full blocks. */
|
||||
for (; left >= 64; p += 64, left -= 64)
|
||||
md5_process(pms, p);
|
||||
|
||||
/* Process a final partial block. */
|
||||
if (left)
|
||||
memcpy(pms->buf, p, left);
|
||||
}
|
||||
|
||||
void
|
||||
md5_finish(md5_state_t *pms, md5_byte_t digest[16])
|
||||
{
|
||||
static const md5_byte_t pad[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
md5_byte_t data[8];
|
||||
int i;
|
||||
|
||||
/* Save the length before padding. */
|
||||
for (i = 0; i < 8; ++i)
|
||||
data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
|
||||
/* Pad to 56 bytes mod 64. */
|
||||
md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
|
||||
/* Append the length. */
|
||||
md5_append(pms, data, 8);
|
||||
for (i = 0; i < 16; ++i)
|
||||
digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
L. Peter Deutsch
|
||||
ghost@aladdin.com
|
||||
|
||||
*/
|
||||
/*$Id$ */
|
||||
/*
|
||||
Independent implementation of MD5 (RFC 1321).
|
||||
|
||||
This code implements the MD5 Algorithm defined in RFC 1321.
|
||||
It is derived directly from the text of the RFC and not from the
|
||||
reference implementation.
|
||||
|
||||
The original and principal author of md5.h is L. Peter Deutsch
|
||||
<ghost@aladdin.com>. Other authors are noted in the change history
|
||||
that follows (in reverse chronological order):
|
||||
|
||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
|
||||
added conditionalization for C++ compilation from Martin
|
||||
Purschke <purschke@bnl.gov>.
|
||||
1999-05-03 lpd Original version.
|
||||
*/
|
||||
|
||||
#ifndef md5_INCLUDED
|
||||
# define md5_INCLUDED
|
||||
|
||||
/*
|
||||
* This code has some adaptations for the Ghostscript environment, but it
|
||||
* will compile and run correctly in any environment with 8-bit chars and
|
||||
* 32-bit ints. Specifically, it assumes that if the following are
|
||||
* defined, they have the same meaning as in Ghostscript: P1, P2, P3,
|
||||
* ARCH_IS_BIG_ENDIAN.
|
||||
*/
|
||||
|
||||
typedef unsigned char md5_byte_t; /* 8-bit byte */
|
||||
typedef unsigned int md5_word_t; /* 32-bit word */
|
||||
|
||||
/* Define the state of the MD5 Algorithm. */
|
||||
typedef struct md5_state_s {
|
||||
md5_word_t count[2]; /* message length in bits, lsw first */
|
||||
md5_word_t abcd[4]; /* digest buffer */
|
||||
md5_byte_t buf[64]; /* accumulate block */
|
||||
} md5_state_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/* Initialize the algorithm. */
|
||||
#ifdef P1
|
||||
void md5_init(P1(md5_state_t *pms));
|
||||
#else
|
||||
void md5_init(md5_state_t *pms);
|
||||
#endif
|
||||
|
||||
/* Append a string to the message. */
|
||||
#ifdef P3
|
||||
void md5_append(P3(md5_state_t *pms, const md5_byte_t *data, int nbytes));
|
||||
#else
|
||||
void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
|
||||
#endif
|
||||
|
||||
/* Finish the message and return the digest. */
|
||||
#ifdef P2
|
||||
void md5_finish(P2(md5_state_t *pms, md5_byte_t digest[16]));
|
||||
#else
|
||||
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* end extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* md5_INCLUDED */
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* MD5 password support for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* httpMD5() - Compute the MD5 sum of the username:group:password.
|
||||
* httpMD5Nonce() - Combine the MD5 sum of the username, group, and password
|
||||
* with the server-supplied nonce value.
|
||||
* httpMD5String() - Convert an MD5 sum to a character string.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "http.h"
|
||||
#include "string.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'httpMD5()' - Compute the MD5 sum of the username:group:password.
|
||||
*/
|
||||
|
||||
char * /* O - MD5 sum */
|
||||
httpMD5(const char *username, /* I - User name */
|
||||
const char *realm, /* I - Realm name */
|
||||
const char *passwd, /* I - Password string */
|
||||
char md5[33]) /* O - MD5 string */
|
||||
{
|
||||
md5_state_t state; /* MD5 state info */
|
||||
md5_byte_t sum[16]; /* Sum data */
|
||||
char line[256]; /* Line to sum */
|
||||
|
||||
|
||||
/*
|
||||
* Compute the MD5 sum of the user name, group name, and password.
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s:%s:%s", username, realm, passwd);
|
||||
md5_init(&state);
|
||||
md5_append(&state, (md5_byte_t *)line, strlen(line));
|
||||
md5_finish(&state, sum);
|
||||
|
||||
/*
|
||||
* Return the sum...
|
||||
*/
|
||||
|
||||
return (httpMD5String(sum, md5));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpMD5Final()' - Combine the MD5 sum of the username, group, and password
|
||||
* with the server-supplied nonce value, method, and
|
||||
* request-uri.
|
||||
*/
|
||||
|
||||
char * /* O - New sum */
|
||||
httpMD5Final(const char *nonce, /* I - Server nonce value */
|
||||
const char *method, /* I - METHOD (GET, POST, etc.) */
|
||||
const char *resource, /* I - Resource path */
|
||||
char md5[33]) /* IO - MD5 sum */
|
||||
{
|
||||
md5_state_t state; /* MD5 state info */
|
||||
md5_byte_t sum[16]; /* Sum data */
|
||||
char line[1024]; /* Line of data */
|
||||
char a2[33]; /* Hash of method and resource */
|
||||
|
||||
|
||||
/*
|
||||
* First compute the MD5 sum of the method and resource...
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s:%s", method, resource);
|
||||
md5_init(&state);
|
||||
md5_append(&state, (md5_byte_t *)line, strlen(line));
|
||||
md5_finish(&state, sum);
|
||||
httpMD5String(sum, a2);
|
||||
|
||||
/*
|
||||
* Then combine A1 (MD5 of username, realm, and password) with the nonce
|
||||
* and A2 (method + resource) values to get the final MD5 sum for the
|
||||
* request...
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s%s:%s", md5, nonce, a2);
|
||||
|
||||
md5_init(&state);
|
||||
md5_append(&state, (md5_byte_t *)line, strlen(line));
|
||||
md5_finish(&state, sum);
|
||||
|
||||
return (httpMD5String(sum, md5));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpMD5String()' - Convert an MD5 sum to a character string.
|
||||
*/
|
||||
|
||||
char * /* O - MD5 sum in hex */
|
||||
httpMD5String(const md5_byte_t *sum, /* I - MD5 sum data */
|
||||
char md5[33]) /* O - MD5 sum in hex */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char *md5ptr; /* Pointer into MD5 string */
|
||||
static char *hex = "0123456789abcdef";
|
||||
/* Hex digits */
|
||||
|
||||
|
||||
/*
|
||||
* Convert the MD5 sum to hexadecimal...
|
||||
*/
|
||||
|
||||
for (i = 16, md5ptr = md5; i > 0; i --, sum ++)
|
||||
{
|
||||
*md5ptr++ = hex[*sum >> 4];
|
||||
*md5ptr++ = hex[*sum & 15];
|
||||
}
|
||||
|
||||
*md5ptr = '\0';
|
||||
|
||||
return (md5);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MIME database file routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -29,6 +29,76 @@
|
||||
* load_types() - Load a xyz.types file...
|
||||
* delete_rules() - Free all memory for the given rule tree.
|
||||
* load_convs() - Load a xyz.convs file...
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* $Log: mime.c,v $
|
||||
* Revision 1.14 1999/07/12 16:09:38 mike
|
||||
* Fixed all constant arrays to use "const" modifier.
|
||||
*
|
||||
* Revision 1.13 1999/06/18 18:36:10 mike
|
||||
* Fixed address to 44141 Airport View Drive...
|
||||
*
|
||||
* Revision 1.12 1999/04/21 21:19:33 mike
|
||||
* Changes for HP-UX.
|
||||
*
|
||||
* Revision 1.11 1999/04/21 19:31:29 mike
|
||||
* Changed the directory header stuff to use the autoconf-recommended
|
||||
* sequence of #ifdef's.
|
||||
*
|
||||
* Changed the language routines to look for the LOCALEDIR environment
|
||||
* variable, and if it is not defined to use the LOCALEDIR string defined
|
||||
* in config.h.
|
||||
*
|
||||
* Revision 1.10 1999/03/01 20:51:53 mike
|
||||
* Code cleanup - removed extraneous semi-colons...
|
||||
*
|
||||
* Revision 1.9 1999/02/26 22:00:51 mike
|
||||
* Added more debug statements.
|
||||
*
|
||||
* Fixed bugs in cupsPrintFile() - wasn't setting the IPP_TAG_MIMETYPE
|
||||
* value tag for the file type.
|
||||
*
|
||||
* Updated conversion filter code to handle wildcards for super-type.
|
||||
*
|
||||
* Revision 1.8 1999/02/20 16:04:38 mike
|
||||
* Updated mime.c to scan directories under WIN32.
|
||||
*
|
||||
* Fixed some compiler warnings under WIN32.
|
||||
*
|
||||
* Updated VC++ project files.
|
||||
*
|
||||
* Updated mime.types and mime.convs files for actual registered
|
||||
* MIME type names.
|
||||
*
|
||||
* Revision 1.7 1999/02/05 17:40:53 mike
|
||||
* Added IPP client read/write code.
|
||||
*
|
||||
* Added string functions missing from some UNIXs.
|
||||
*
|
||||
* Added option parsing functions.
|
||||
*
|
||||
* Added IPP convenience functions (not implemented yet).
|
||||
*
|
||||
* Updated source files to use local string.h as needed (for
|
||||
* missing string functions)
|
||||
*
|
||||
* Revision 1.6 1999/02/01 22:08:39 mike
|
||||
* Restored original directory-scanning functionality of mimeLoad().
|
||||
*
|
||||
* Revision 1.4 1999/01/27 18:31:56 mike
|
||||
* Updated PPD routines to handle emulations and patch files.
|
||||
*
|
||||
* Added DSC comments to emit output as appropriate.
|
||||
*
|
||||
* Revision 1.3 1999/01/24 14:18:43 mike
|
||||
* Check-in prior to CVS use.
|
||||
*
|
||||
* Revision 1.2 1998/08/06 14:38:38 mike
|
||||
* Finished coding and testing for CUPS 1.0.
|
||||
*
|
||||
* Revision 1.1 1998/06/11 20:50:53 mike
|
||||
* Initial revision
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -39,7 +109,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <cups/string.h>
|
||||
#include "string.h"
|
||||
#include "mime.h"
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
@@ -128,13 +198,8 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
if (pathname == NULL)
|
||||
return (NULL);
|
||||
|
||||
strncpy(filename, pathname, sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
|
||||
strcpy(filename, pathname);
|
||||
pathsep = filename + strlen(filename);
|
||||
if ((pathsep - filename + 9) > sizeof(filename))
|
||||
return (NULL);
|
||||
|
||||
if (pathsep == filename ||
|
||||
(pathsep[-1] != '/' && pathsep[-1] != '\\'))
|
||||
{
|
||||
@@ -165,9 +230,6 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
* Load a mime.types file...
|
||||
*/
|
||||
|
||||
if ((pathsep - filename + strlen(dent.cFileName)) >= sizeof(filename))
|
||||
continue;
|
||||
|
||||
strcpy(pathsep, dent.cFileName);
|
||||
load_types(mime, filename);
|
||||
}
|
||||
@@ -190,9 +252,6 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
* Load a mime.convs file...
|
||||
*/
|
||||
|
||||
if ((pathsep - filename + strlen(dent.cFileName)) >= sizeof(filename))
|
||||
continue;
|
||||
|
||||
strcpy(pathsep, dent.cFileName);
|
||||
load_convs(mime, filename);
|
||||
}
|
||||
@@ -239,7 +298,7 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
* Load a mime.types file...
|
||||
*/
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->d_name);
|
||||
sprintf(filename, "%s/%s", pathname, dent->d_name);
|
||||
load_types(mime, filename);
|
||||
}
|
||||
}
|
||||
@@ -259,7 +318,7 @@ mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
* Load a mime.convs file...
|
||||
*/
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->d_name);
|
||||
sprintf(filename, "%s/%s", pathname, dent->d_name);
|
||||
load_convs(mime, filename);
|
||||
}
|
||||
}
|
||||
@@ -382,8 +441,6 @@ load_types(mime_t *mime, /* I - MIME database */
|
||||
typeptr = mimeAddType(mime, super, type);
|
||||
mimeAddTypeRule(typeptr, lineptr);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
|
||||
@@ -516,16 +573,6 @@ load_convs(mime_t *mime, /* I - MIME database */
|
||||
|
||||
*temp = '\0';
|
||||
|
||||
if (strcmp(super, "*") == 0 && strcmp(type, "*") == 0)
|
||||
{
|
||||
/*
|
||||
* Force * / * to be "application/octet-stream"...
|
||||
*/
|
||||
|
||||
strcpy(super, "application");
|
||||
strcpy(type, "octet-stream");
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the filter to the MIME database, supporting wildcards as needed...
|
||||
*/
|
||||
@@ -535,8 +582,6 @@ load_convs(mime_t *mime, /* I - MIME database */
|
||||
(type[0] == '*' || strcmp((*temptype)->type, type) == 0))
|
||||
mimeAddFilter(mime, *temptype, dsttype, cost, filter);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MIME type/conversion database definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -60,8 +60,7 @@ typedef enum
|
||||
MIME_MAGIC_CHAR, /* Character/byte matches */
|
||||
MIME_MAGIC_SHORT, /* Short/16-bit word matches */
|
||||
MIME_MAGIC_INT, /* Integer/32-bit word matches */
|
||||
MIME_MAGIC_LOCALE, /* Current locale matches string */
|
||||
MIME_MAGIC_CONTAINS /* File contains a string */
|
||||
MIME_MAGIC_LOCALE /* Current locale matches string */
|
||||
} mime_op_t;
|
||||
|
||||
typedef struct mime_magic_str /**** MIME Magic Data ****/
|
||||
@@ -73,7 +72,6 @@ typedef struct mime_magic_str /**** MIME Magic Data ****/
|
||||
short op, /* Operation code (see above) */
|
||||
invert; /* Invert the result */
|
||||
int offset, /* Offset in file */
|
||||
region, /* Region length */
|
||||
length; /* Length of data */
|
||||
union
|
||||
{
|
||||
+15
-57
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Option routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -38,7 +38,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -55,16 +54,15 @@ cupsAddOption(const char *name, /* I - Name of option */
|
||||
cups_option_t *temp; /* Pointer to new option */
|
||||
|
||||
|
||||
if (name == NULL || !name[0] || value == NULL ||
|
||||
options == NULL || num_options < 0)
|
||||
return (num_options);
|
||||
if (name == NULL || value == NULL || options == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Look for an existing option with the same name...
|
||||
*/
|
||||
|
||||
for (i = 0, temp = *options; i < num_options; i ++, temp ++)
|
||||
if (strcasecmp(temp->name, name) == 0)
|
||||
if (strcmp(temp->name, name) == 0)
|
||||
break;
|
||||
|
||||
if (i >= num_options)
|
||||
@@ -113,7 +111,7 @@ cupsFreeOptions(int num_options, /* I - Number of options */
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
if (num_options <= 0 || options == NULL)
|
||||
if (num_options == 0 || options == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < num_options; i ++)
|
||||
@@ -138,11 +136,11 @@ cupsGetOption(const char *name, /* I - Name of option */
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
if (name == NULL || num_options <= 0 || options == NULL)
|
||||
if (name == NULL || num_options == 0 || options == NULL)
|
||||
return (NULL);
|
||||
|
||||
for (i = 0; i < num_options; i ++)
|
||||
if (strcasecmp(options[i].name, name) == 0)
|
||||
if (strcmp(options[i].name, name) == 0)
|
||||
return (options[i].value);
|
||||
|
||||
return (NULL);
|
||||
@@ -164,7 +162,7 @@ cupsParseOptions(const char *arg, /* I - Argument to parse */
|
||||
*value; /* Pointer to value */
|
||||
|
||||
|
||||
if (arg == NULL || options == NULL || num_options < 0)
|
||||
if (arg == NULL || options == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
@@ -174,17 +172,6 @@ cupsParseOptions(const char *arg, /* I - Argument to parse */
|
||||
copyarg = strdup(arg);
|
||||
ptr = copyarg;
|
||||
|
||||
/*
|
||||
* Skip leading spaces...
|
||||
*/
|
||||
|
||||
while (isspace(*ptr))
|
||||
ptr ++;
|
||||
|
||||
/*
|
||||
* Loop through the string...
|
||||
*/
|
||||
|
||||
while (*ptr != '\0')
|
||||
{
|
||||
/*
|
||||
@@ -195,13 +182,6 @@ cupsParseOptions(const char *arg, /* I - Argument to parse */
|
||||
while (!isspace(*ptr) && *ptr != '=' && *ptr != '\0')
|
||||
ptr ++;
|
||||
|
||||
/*
|
||||
* Avoid an empty name...
|
||||
*/
|
||||
|
||||
if (ptr == name)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Skip trailing spaces...
|
||||
*/
|
||||
@@ -215,12 +195,7 @@ cupsParseOptions(const char *arg, /* I - Argument to parse */
|
||||
* Start of another option...
|
||||
*/
|
||||
|
||||
if (strncasecmp(name, "no", 2) == 0)
|
||||
num_options = cupsAddOption(name + 2, "false", num_options,
|
||||
options);
|
||||
else
|
||||
num_options = cupsAddOption(name, "true", num_options, options);
|
||||
|
||||
num_options = cupsAddOption(name, "", num_options, options);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -309,21 +284,10 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
s[255]; /* Temporary string */
|
||||
|
||||
|
||||
/*
|
||||
* Check arguments...
|
||||
*/
|
||||
|
||||
if (ppd == NULL || num_options <= 0 || options == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Mark options...
|
||||
*/
|
||||
|
||||
conflict = 0;
|
||||
|
||||
for (i = num_options; i > 0; i --, options ++)
|
||||
if (strcasecmp(options->name, "media") == 0)
|
||||
if (strcmp(options->name, "media") == 0)
|
||||
{
|
||||
/*
|
||||
* Loop through the option string, separating it at commas and
|
||||
@@ -360,9 +324,9 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(options->name, "sides") == 0)
|
||||
else if (strcmp(options->name, "sides") == 0)
|
||||
{
|
||||
if (strcasecmp(options->value, "one-sided") == 0)
|
||||
if (strcmp(options->value, "one-sided") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "None"))
|
||||
conflict = 1;
|
||||
@@ -371,7 +335,7 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "None")) /* Kodak */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(options->value, "two-sided-long-edge") == 0)
|
||||
else if (strcmp(options->value, "two-sided-long-edge") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "DuplexNoTumble"))
|
||||
conflict = 1;
|
||||
@@ -380,7 +344,7 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexNoTumble")) /* Kodak */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(options->value, "two-sided-short-edge") == 0)
|
||||
else if (strcmp(options->value, "two-sided-short-edge") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Duplex", "DuplexTumble"))
|
||||
conflict = 1;
|
||||
@@ -390,8 +354,7 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(options->name, "resolution") == 0 ||
|
||||
strcasecmp(options->name, "printer-resolution") == 0)
|
||||
else if (strcmp(options->name, "resolution") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Resolution", options->value))
|
||||
conflict = 1;
|
||||
@@ -403,11 +366,6 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (ppdMarkOption(ppd, "CNRes_PGP", options->value)) /* Canon */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (strcasecmp(options->name, "output-bin") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "OutputBin", options->value))
|
||||
conflict = 1;
|
||||
}
|
||||
else if (ppdMarkOption(ppd, options->name, options->value))
|
||||
conflict = 1;
|
||||
|
||||
|
||||
+14
-14
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Page size functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -80,35 +80,35 @@ ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */
|
||||
*/
|
||||
|
||||
units[0] = '\0';
|
||||
if (sscanf(name + 7, "%fx%f%254s", &w, &l, units) < 2)
|
||||
if (sscanf(name + 7, "%fx%f%s", &w, &l, units) < 2)
|
||||
return (NULL);
|
||||
|
||||
if (strcasecmp(units, "in") == 0)
|
||||
{
|
||||
ppd->sizes[i].width = w * 72.0f;
|
||||
ppd->sizes[i].length = l * 72.0f;
|
||||
ppd->sizes[i].width = w * 72.0;
|
||||
ppd->sizes[i].length = l * 72.0;
|
||||
ppd->sizes[i].left = ppd->custom_margins[0];
|
||||
ppd->sizes[i].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[i].right = w * 72.0f - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l * 72.0f - ppd->custom_margins[3];
|
||||
ppd->sizes[i].right = w * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l * 72.0 - ppd->custom_margins[3];
|
||||
}
|
||||
else if (strcasecmp(units, "cm") == 0)
|
||||
{
|
||||
ppd->sizes[i].width = w / 2.54f * 72.0f;
|
||||
ppd->sizes[i].length = l / 2.54f * 72.0f;
|
||||
ppd->sizes[i].width = w * 2.54 * 72.0;
|
||||
ppd->sizes[i].length = l * 2.54 * 72.0;
|
||||
ppd->sizes[i].left = ppd->custom_margins[0];
|
||||
ppd->sizes[i].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[i].right = w / 2.54f * 72.0f - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l / 2.54f * 72.0f - ppd->custom_margins[3];
|
||||
ppd->sizes[i].right = w * 2.54 * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l * 2.54 * 72.0 - ppd->custom_margins[3];
|
||||
}
|
||||
else if (strcasecmp(units, "mm") == 0)
|
||||
{
|
||||
ppd->sizes[i].width = w / 25.4f * 72.0f;
|
||||
ppd->sizes[i].length = l / 25.4f * 72.0f;
|
||||
ppd->sizes[i].width = w * 25.4 * 72.0;
|
||||
ppd->sizes[i].length = l * 25.4 * 72.0;
|
||||
ppd->sizes[i].left = ppd->custom_margins[0];
|
||||
ppd->sizes[i].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[i].right = w / 25.4f * 72.0f - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l / 25.4f * 72.0f - ppd->custom_margins[3];
|
||||
ppd->sizes[i].right = w * 25.4 * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l * 25.4 * 72.0 - ppd->custom_margins[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+103
-340
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD file routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -108,7 +108,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
ppd_emul_t *emul; /* Current emulation */
|
||||
ppd_group_t *group; /* Current group */
|
||||
char **font; /* Current font */
|
||||
char **filter; /* Current filter */
|
||||
|
||||
|
||||
/*
|
||||
@@ -122,10 +121,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
* Free all strings at the top level...
|
||||
*/
|
||||
|
||||
safe_free(ppd->patches);
|
||||
safe_free(ppd->jcl_begin);
|
||||
safe_free(ppd->jcl_ps);
|
||||
safe_free(ppd->jcl_end);
|
||||
safe_free(ppd->lang_encoding);
|
||||
safe_free(ppd->lang_version);
|
||||
safe_free(ppd->modelname);
|
||||
@@ -176,18 +171,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
if (ppd->num_consts > 0)
|
||||
safe_free(ppd->consts);
|
||||
|
||||
/*
|
||||
* Free any filters...
|
||||
*/
|
||||
|
||||
if (ppd->num_filters > 0)
|
||||
{
|
||||
for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++)
|
||||
safe_free(*filter);
|
||||
|
||||
safe_free(ppd->filters);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free any fonts...
|
||||
*/
|
||||
@@ -284,16 +267,12 @@ ppd_get_group(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd_group_t *group; /* Group */
|
||||
|
||||
|
||||
DEBUG_printf(("ppd_get_group(%p, \"%s\")\n", ppd, name));
|
||||
|
||||
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
|
||||
if (strcmp(group->text, name) == 0)
|
||||
break;
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
DEBUG_printf(("Adding group %s...\n", name));
|
||||
|
||||
if (ppd->num_groups == 0)
|
||||
group = malloc(sizeof(ppd_group_t));
|
||||
else
|
||||
@@ -432,17 +411,12 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd_const_t *constraint; /* Current constraint */
|
||||
ppd_size_t *size; /* Current page size */
|
||||
int mask; /* Line data mask */
|
||||
char keyword[PPD_MAX_NAME],
|
||||
/* Keyword from file */
|
||||
name[PPD_MAX_NAME],
|
||||
/* Option from file */
|
||||
text[PPD_MAX_TEXT],
|
||||
/* Human-readable text from file */
|
||||
char keyword[41], /* Keyword from file */
|
||||
name[41], /* Option from file */
|
||||
text[81], /* Human-readable text from file */
|
||||
*string, /* Code/text from file */
|
||||
*sptr, /* Pointer into string */
|
||||
*nameptr, /* Pointer into name */
|
||||
*temp, /* Temporary string pointer */
|
||||
**tempfonts; /* Temporary fonts pointer */
|
||||
*nameptr; /* Pointer into name */
|
||||
float order; /* Order dependency number */
|
||||
ppd_section_t section; /* Order dependency section */
|
||||
ppd_profile_t *profile; /* Pointer to color profile */
|
||||
@@ -482,8 +456,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
DEBUG_printf(("ppdOpen: keyword = %s, string = %08x\n", keyword, string));
|
||||
|
||||
safe_free(string);
|
||||
|
||||
/*
|
||||
@@ -529,21 +501,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
puts("");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (strcmp(keyword, "CloseUI") != 0 &&
|
||||
strcmp(keyword, "JCLCloseUI") != 0 &&
|
||||
strcmp(keyword, "CloseGroup") != 0 &&
|
||||
strcmp(keyword, "CloseSubGroup") != 0 &&
|
||||
strncmp(keyword, "Default", 7) != 0 &&
|
||||
string == NULL)
|
||||
{
|
||||
/*
|
||||
* Need a string value!
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (strcmp(keyword, "LanguageLevel") == 0)
|
||||
ppd->language_level = atoi(string);
|
||||
else if (strcmp(keyword, "LanguageEncoding") == 0)
|
||||
@@ -625,8 +582,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else
|
||||
ppd->colorspace = PPD_CS_GRAY;
|
||||
}
|
||||
else if (strcmp(keyword, "cupsFlipDuplex") == 0)
|
||||
ppd->flip_duplex = strcmp(string, "True") == 0;
|
||||
else if (strcmp(keyword, "cupsManualCopies") == 0)
|
||||
ppd->manual_copies = strcmp(string, "True") == 0;
|
||||
else if (strcmp(keyword, "cupsModelNumber") == 0)
|
||||
@@ -661,13 +616,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else
|
||||
filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1));
|
||||
|
||||
if (filter == NULL)
|
||||
{
|
||||
safe_free(filter);
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ppd->filters = filter;
|
||||
filter += ppd->num_filters;
|
||||
ppd->num_filters ++;
|
||||
@@ -679,34 +627,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
*filter = string;
|
||||
string = NULL;
|
||||
}
|
||||
else if (strcmp(keyword, "Throughput") == 0)
|
||||
ppd->throughput = atoi(string);
|
||||
else if (strcmp(keyword, "Font") == 0)
|
||||
{
|
||||
/*
|
||||
* Add this font to the list of available fonts...
|
||||
*/
|
||||
|
||||
if (ppd->num_fonts == 0)
|
||||
tempfonts = (char **)malloc(sizeof(char *));
|
||||
else
|
||||
tempfonts = (char **)realloc(ppd->fonts,
|
||||
sizeof(char *) * (ppd->num_fonts + 1));
|
||||
|
||||
if (tempfonts == NULL)
|
||||
{
|
||||
safe_free(string);
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ppd->fonts = tempfonts;
|
||||
ppd->fonts[ppd->num_fonts] = strdup(name);
|
||||
ppd->num_fonts ++;
|
||||
}
|
||||
else if (strcmp(keyword, "VariablePaperSize") == 0 &&
|
||||
strcmp(string, "True") == 0 &&
|
||||
!ppd->variable_sizes)
|
||||
strcmp(string, "True") == 0)
|
||||
{
|
||||
ppd->variable_sizes = 1;
|
||||
|
||||
@@ -720,26 +642,20 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
* Add a "Custom" page size option...
|
||||
*/
|
||||
|
||||
if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
|
||||
if ((group = ppd_get_group(ppd,
|
||||
cupsLangString(language,
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
{
|
||||
ppd_group_t *temp;
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
if ((temp = ppd_get_group(ppd,
|
||||
cupsLangString(language,
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((option = ppd_get_option(temp, "PageSize")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
if ((option = ppd_get_option(group, "PageSize")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
|
||||
@@ -751,12 +667,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
group = NULL;
|
||||
option = NULL;
|
||||
}
|
||||
else if (strcmp(keyword, "MaxMediaWidth") == 0)
|
||||
ppd->custom_max[0] = (float)atof(string);
|
||||
ppd->custom_max[0] = atof(string);
|
||||
else if (strcmp(keyword, "MaxMediaHeight") == 0)
|
||||
ppd->custom_max[1] = (float)atof(string);
|
||||
ppd->custom_max[1] = atof(string);
|
||||
else if (strcmp(keyword, "ParamCustomPageSize") == 0)
|
||||
{
|
||||
if (strcmp(name, "Width") == 0)
|
||||
@@ -771,62 +688,11 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd->custom_margins + 1, ppd->custom_margins + 2,
|
||||
ppd->custom_margins + 3);
|
||||
else if (strcmp(keyword, "CustomPageSize") == 0 &&
|
||||
strcmp(name, "True") == 0)
|
||||
strcmp(name, "True") == 0 &&
|
||||
ppd->variable_sizes)
|
||||
{
|
||||
if (!ppd->variable_sizes)
|
||||
{
|
||||
ppd->variable_sizes = 1;
|
||||
|
||||
/*
|
||||
* Add a "Custom" page size entry...
|
||||
*/
|
||||
|
||||
ppd_add_size(ppd, "Custom");
|
||||
|
||||
/*
|
||||
* Add a "Custom" page size option...
|
||||
*/
|
||||
|
||||
if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
|
||||
{
|
||||
ppd_group_t *temp;
|
||||
|
||||
|
||||
if ((temp = ppd_get_group(ppd,
|
||||
cupsLangString(language,
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to get general group!");
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((option = ppd_get_option(temp, "PageSize")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to get PageSize option!");
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to add Custom choice!");
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
option = NULL;
|
||||
}
|
||||
|
||||
if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to find PageSize option!");
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
@@ -834,7 +700,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if ((choice = ppdFindChoice(option, "Custom")) == NULL)
|
||||
{
|
||||
DEBUG_puts("Unable to find Custom choice!");
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
@@ -866,11 +731,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
for (i = 0, sptr = string; i < count; i ++)
|
||||
{
|
||||
for (nameptr = ppd->emulations[i].name;
|
||||
*sptr != '\0' && *sptr != ' ';
|
||||
sptr ++)
|
||||
if (nameptr < (ppd->emulations[i].name + sizeof(ppd->emulations[i].name) - 1))
|
||||
*nameptr++ = *sptr;
|
||||
for (nameptr = ppd->emulations[i].name; *sptr != '\0' && *sptr != ' ';)
|
||||
*nameptr ++ = *sptr ++;
|
||||
|
||||
*nameptr = '\0';
|
||||
|
||||
@@ -909,16 +771,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = realloc(ppd->patches, strlen(ppd->patches) +
|
||||
strlen(string) + 1);
|
||||
if (temp == NULL)
|
||||
{
|
||||
safe_free(string);
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ppd->patches = temp;
|
||||
ppd->patches = realloc(ppd->patches, strlen(ppd->patches) +
|
||||
strlen(string) + 1);
|
||||
|
||||
strcpy(ppd->patches + strlen(ppd->patches), string);
|
||||
}
|
||||
@@ -930,13 +784,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
*/
|
||||
|
||||
if (name[0] == '*')
|
||||
strcpy(name, name + 1); /* Eliminate leading asterisk */
|
||||
strcpy(name, name + 1);
|
||||
|
||||
for (i = strlen(name) - 1; i > 0 && isspace(name[i]); i --)
|
||||
name[i] = '\0'; /* Eliminate trailing spaces */
|
||||
|
||||
DEBUG_printf(("OpenUI of %s in group %s...\n", name,
|
||||
group ? group->text : "(null)"));
|
||||
if (string == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (subgroup != NULL)
|
||||
option = ppd_get_option(subgroup, name);
|
||||
@@ -965,7 +819,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
DEBUG_printf(("Adding to group %s...\n", group->text));
|
||||
option = ppd_get_option(group, name);
|
||||
group = NULL;
|
||||
}
|
||||
@@ -1090,10 +943,47 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
}
|
||||
else if (strcmp(keyword, "CloseGroup") == 0)
|
||||
group = NULL;
|
||||
else if (strcmp(keyword, "OpenSubGroup") == 0)
|
||||
{
|
||||
/*
|
||||
* Open a new sub-group...
|
||||
*/
|
||||
|
||||
if (group == NULL || subgroup != NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (group->num_subgroups == 0)
|
||||
subgroup = malloc(sizeof(ppd_group_t));
|
||||
else
|
||||
subgroup = realloc(group->subgroups,
|
||||
(group->num_subgroups + 1) * sizeof(ppd_group_t));
|
||||
|
||||
if (subgroup == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
group->subgroups = subgroup;
|
||||
subgroup += group->num_subgroups;
|
||||
group->num_subgroups ++;
|
||||
|
||||
memset(subgroup, 0, sizeof(ppd_group_t));
|
||||
ppd_decode(string);
|
||||
ppd_fix(string);
|
||||
strncpy(subgroup->text, string, sizeof(subgroup->text) - 1);
|
||||
}
|
||||
else if (strcmp(keyword, "CloseSubGroup") == 0)
|
||||
subgroup = NULL;
|
||||
else if (strcmp(keyword, "OrderDependency") == 0 ||
|
||||
strcmp(keyword, "NonUIOrderDependency") == 0)
|
||||
{
|
||||
if (sscanf(string, "%f%40s%40s", &order, name, keyword) != 3)
|
||||
if (sscanf(string, "%f%s%s", &order, name, keyword) != 3)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
@@ -1118,25 +1008,24 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (option == NULL)
|
||||
{
|
||||
ppd_group_t *temp;
|
||||
|
||||
|
||||
/*
|
||||
* Only valid for Non-UI options...
|
||||
*/
|
||||
|
||||
for (i = ppd->num_groups, temp = ppd->groups; i > 0; i --, temp ++)
|
||||
if (temp->text[0] == '\0')
|
||||
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
|
||||
if (group->text[0] == '\0')
|
||||
break;
|
||||
|
||||
if (i > 0)
|
||||
for (i = 0; i < temp->num_options; i ++)
|
||||
if (strcmp(keyword, temp->options[i].keyword) == 0)
|
||||
for (i = 0; i < group->num_options; i ++)
|
||||
if (strcmp(keyword, group->options[i].keyword) == 0)
|
||||
{
|
||||
temp->options[i].section = section;
|
||||
temp->options[i].order = order;
|
||||
group->options[i].section = section;
|
||||
group->options[i].order = order;
|
||||
break;
|
||||
}
|
||||
|
||||
group = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1154,25 +1043,24 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (option == NULL)
|
||||
{
|
||||
ppd_group_t *temp;
|
||||
|
||||
|
||||
/*
|
||||
* Only valid for Non-UI options...
|
||||
*/
|
||||
|
||||
for (i = ppd->num_groups, temp = ppd->groups; i > 0; i --, temp ++)
|
||||
if (temp->text[0] == '\0')
|
||||
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
|
||||
if (group->text[0] == '\0')
|
||||
break;
|
||||
|
||||
if (i > 0)
|
||||
for (i = 0; i < temp->num_options; i ++)
|
||||
if (strcmp(keyword, temp->options[i].keyword) == 0)
|
||||
for (i = 0; i < group->num_options; i ++)
|
||||
if (strcmp(keyword, group->options[i].keyword) == 0)
|
||||
{
|
||||
strncpy(temp->options[i].defchoice, string,
|
||||
sizeof(temp->options[i].defchoice) - 1);
|
||||
strncpy(group->options[i].defchoice, string,
|
||||
sizeof(group->options[i].defchoice) - 1);
|
||||
break;
|
||||
}
|
||||
|
||||
group = NULL;
|
||||
}
|
||||
else
|
||||
strncpy(option->defchoice, string, sizeof(option->defchoice) - 1);
|
||||
@@ -1208,11 +1096,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
break;
|
||||
|
||||
case 2 : /* Two options... */
|
||||
/*
|
||||
* The following strcpy's are safe, as optionN and
|
||||
* choiceN are all the same size (size defined by PPD spec...)
|
||||
*/
|
||||
|
||||
if (constraint->option1[0] == '*')
|
||||
strcpy(constraint->option1, constraint->option1 + 1);
|
||||
|
||||
@@ -1226,11 +1109,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
break;
|
||||
|
||||
case 3 : /* Two options, one choice... */
|
||||
/*
|
||||
* The following strcpy's are safe, as optionN and
|
||||
* choiceN are all the same size (size defined by PPD spec...)
|
||||
*/
|
||||
|
||||
if (constraint->option1[0] == '*')
|
||||
strcpy(constraint->option1, constraint->option1 + 1);
|
||||
|
||||
@@ -1260,55 +1138,26 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
}
|
||||
else if (strcmp(keyword, "PaperDimension") == 0)
|
||||
{
|
||||
if ((size = ppdPageSize(ppd, name)) == NULL)
|
||||
size = ppd_add_size(ppd, name);
|
||||
|
||||
if (size == NULL)
|
||||
{
|
||||
/*
|
||||
* Unable to add or find size!
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
sscanf(string, "%f%f", &(size->width), &(size->length));
|
||||
if ((size = ppdPageSize(ppd, name)) != NULL)
|
||||
sscanf(string, "%f%f", &(size->width), &(size->length));
|
||||
}
|
||||
else if (strcmp(keyword, "ImageableArea") == 0)
|
||||
{
|
||||
if ((size = ppdPageSize(ppd, name)) == NULL)
|
||||
size = ppd_add_size(ppd, name);
|
||||
|
||||
if (size == NULL)
|
||||
{
|
||||
/*
|
||||
* Unable to add or find size!
|
||||
*/
|
||||
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
sscanf(string, "%f%f%f%f", &(size->left), &(size->bottom),
|
||||
&(size->right), &(size->top));
|
||||
if ((size = ppdPageSize(ppd, name)) != NULL)
|
||||
sscanf(string, "%f%f%f%f", &(size->left), &(size->bottom),
|
||||
&(size->right), &(size->top));
|
||||
}
|
||||
else if (option != NULL &&
|
||||
(mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) ==
|
||||
(PPD_KEYWORD | PPD_OPTION | PPD_STRING))
|
||||
{
|
||||
DEBUG_printf(("group = %p, subgroup = %p\n", group, subgroup));
|
||||
|
||||
if (strcmp(keyword, "PageSize") == 0)
|
||||
{
|
||||
/*
|
||||
* Add a page size...
|
||||
*/
|
||||
|
||||
if (ppdPageSize(ppd, name) == NULL)
|
||||
ppd_add_size(ppd, name);
|
||||
ppd_add_size(ppd, name);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1472,7 +1321,7 @@ ppdOpenFile(const char *filename) /* I - File to read from */
|
||||
* 'compare_strings()' - Compare two strings.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
int /* O - Result of comparison */
|
||||
compare_strings(char *s, /* I - First string */
|
||||
char *t) /* I - Second string */
|
||||
{
|
||||
@@ -1626,7 +1475,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
char **string) /* O - Code/string data */
|
||||
{
|
||||
int ch, /* Character from file */
|
||||
colon, /* Colon seen? */
|
||||
endquote, /* Waiting for an end quote */
|
||||
mask; /* Mask to be returned */
|
||||
char *keyptr, /* Keyword pointer */
|
||||
@@ -1634,7 +1482,7 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
*textptr, /* Text pointer */
|
||||
*strptr, /* Pointer into string */
|
||||
*lineptr, /* Current position in line buffer */
|
||||
line[65536]; /* Line buffer (64k) */
|
||||
line[262144]; /* Line buffer (256k) */
|
||||
|
||||
|
||||
/*
|
||||
@@ -1649,8 +1497,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
* Now loop until we have a valid line...
|
||||
*/
|
||||
|
||||
*string = NULL;
|
||||
|
||||
do
|
||||
{
|
||||
/*
|
||||
@@ -1659,7 +1505,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
lineptr = line;
|
||||
endquote = 0;
|
||||
colon = 0;
|
||||
|
||||
while ((ch = getc(fp)) != EOF &&
|
||||
(lineptr - line) < (sizeof(line) - 1))
|
||||
@@ -1685,12 +1530,10 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
ungetc(ch, fp);
|
||||
}
|
||||
|
||||
ch = '\n';
|
||||
*lineptr++ = '\n';
|
||||
|
||||
if (!endquote) /* Continue for multi-line text */
|
||||
break;
|
||||
|
||||
*lineptr++ = '\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1700,83 +1543,16 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
*lineptr++ = ch;
|
||||
|
||||
if (ch == ':')
|
||||
colon = 1;
|
||||
|
||||
if (ch == '\"' && colon)
|
||||
{
|
||||
endquote = !endquote;
|
||||
|
||||
if (!endquote)
|
||||
{
|
||||
/*
|
||||
* End of quoted string; ignore trailing characters...
|
||||
*/
|
||||
|
||||
while ((ch = getc(fp)) != EOF)
|
||||
if (ch == '\n')
|
||||
break;
|
||||
else if (ch == '\r')
|
||||
{
|
||||
ch = getc(fp);
|
||||
if (ch != '\n')
|
||||
ungetc(ch, fp);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ch == '\"')
|
||||
endquote = !endquote;
|
||||
}
|
||||
}
|
||||
|
||||
if (endquote)
|
||||
{
|
||||
/*
|
||||
* Didn't finish this quoted string...
|
||||
*/
|
||||
|
||||
while ((ch = getc(fp)) != EOF)
|
||||
if (ch == '\"')
|
||||
break;
|
||||
}
|
||||
|
||||
if (ch != '\n')
|
||||
{
|
||||
/*
|
||||
* Didn't finish this line...
|
||||
*/
|
||||
|
||||
while ((ch = getc(fp)) != EOF)
|
||||
if (ch == '\r' || ch == '\n')
|
||||
{
|
||||
/*
|
||||
* Line feed or carriage return...
|
||||
*/
|
||||
|
||||
if (ch == '\r')
|
||||
{
|
||||
/*
|
||||
* Check for a trailing line feed...
|
||||
*/
|
||||
|
||||
if ((ch = getc(fp)) == EOF)
|
||||
break;
|
||||
if (ch != 0x0a)
|
||||
ungetc(ch, fp);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (lineptr > line && lineptr[-1] == '\n')
|
||||
lineptr --;
|
||||
|
||||
*lineptr = '\0';
|
||||
|
||||
/* DEBUG_printf(("LINE = \"%s\"\n", line));*/
|
||||
|
||||
if (ch == EOF && lineptr == line)
|
||||
return (0);
|
||||
|
||||
@@ -1795,8 +1571,7 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
if (line[0] != '*') /* All lines start with an asterisk */
|
||||
continue;
|
||||
|
||||
if (strcmp(line, "*") == 0 || /* (Bad) comment line */
|
||||
strncmp(line, "*%", 2) == 0 || /* Comment line */
|
||||
if (strncmp(line, "*%", 2) == 0 || /* Comment line */
|
||||
strncmp(line, "*?", 2) == 0 || /* Query line */
|
||||
strcmp(line, "*End") == 0) /* End of multi-line string */
|
||||
continue;
|
||||
@@ -1808,25 +1583,19 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
keyptr = keyword;
|
||||
|
||||
while (*lineptr != '\0' && *lineptr != ':' && !isspace(*lineptr) &&
|
||||
(keyptr - keyword) < (PPD_MAX_NAME - 1))
|
||||
(keyptr - keyword) < 40)
|
||||
*keyptr++ = *lineptr++;
|
||||
|
||||
*keyptr = '\0';
|
||||
|
||||
if (strcmp(keyword, "End") == 0)
|
||||
continue;
|
||||
|
||||
mask |= PPD_KEYWORD;
|
||||
|
||||
/* DEBUG_printf(("keyword = \"%s\", lineptr = \"%s\"\n", keyword, lineptr));*/
|
||||
|
||||
if (isspace(*lineptr))
|
||||
if (*lineptr == ' ' || *lineptr == '\t')
|
||||
{
|
||||
/*
|
||||
* Get an option name...
|
||||
*/
|
||||
|
||||
while (isspace(*lineptr))
|
||||
while (*lineptr == ' ' || *lineptr == '\t')
|
||||
lineptr ++;
|
||||
|
||||
optptr = option;
|
||||
@@ -1838,8 +1607,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
*optptr = '\0';
|
||||
mask |= PPD_OPTION;
|
||||
|
||||
/* DEBUG_printf(("option = \"%s\", lineptr = \"%s\"\n", option, lineptr));*/
|
||||
|
||||
if (*lineptr == '/')
|
||||
{
|
||||
/*
|
||||
@@ -1851,7 +1618,7 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
textptr = text;
|
||||
|
||||
while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':' &&
|
||||
(textptr - text) < (PPD_MAX_TEXT - 1))
|
||||
(textptr - text) < 80)
|
||||
*textptr++ = *lineptr++;
|
||||
|
||||
*textptr = '\0';
|
||||
@@ -1859,8 +1626,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
mask |= PPD_TEXT;
|
||||
}
|
||||
|
||||
/* DEBUG_printf(("text = \"%s\", lineptr = \"%s\"\n", text, lineptr));*/
|
||||
}
|
||||
|
||||
if (*lineptr == ':')
|
||||
@@ -1886,8 +1651,6 @@ ppd_read(FILE *fp, /* I - File to read from */
|
||||
|
||||
*strptr = '\0';
|
||||
|
||||
/* DEBUG_printf(("string = \"%s\", lineptr = \"%s\"\n", *string, lineptr));*/
|
||||
|
||||
mask |= PPD_STRING;
|
||||
}
|
||||
}
|
||||
|
||||
+16
-45
@@ -4,7 +4,7 @@
|
||||
* PostScript Printer Description definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -58,15 +58,6 @@ extern "C" {
|
||||
# define PPD_VERSION 4.3 /* Kept in sync with Adobe version number */
|
||||
|
||||
|
||||
/*
|
||||
* PPD size limits (defined in Adobe spec)
|
||||
*/
|
||||
|
||||
# define PPD_MAX_NAME 41 /* Maximum size of name + 1 for nul */
|
||||
# define PPD_MAX_TEXT 81 /* Maximum size of text + 1 for nul */
|
||||
# define PPD_MAX_LINE 256 /* Maximum size of line + 1 for nul */
|
||||
|
||||
|
||||
/*
|
||||
* Types and structures...
|
||||
*/
|
||||
@@ -101,10 +92,8 @@ typedef enum /**** Colorspaces ****/
|
||||
typedef struct /**** Option choices ****/
|
||||
{
|
||||
char marked, /* 0 if not selected, 1 otherwise */
|
||||
choice[PPD_MAX_NAME],
|
||||
/* Computer-readable option name */
|
||||
text[PPD_MAX_TEXT],
|
||||
/* Human-readable option name */
|
||||
choice[41], /* Computer-readable option name */
|
||||
text[81], /* Human-readable option name */
|
||||
*code; /* Code to send for this option */
|
||||
void *option; /* Pointer to parent option structure */
|
||||
} ppd_choice_t;
|
||||
@@ -112,12 +101,9 @@ typedef struct /**** Option choices ****/
|
||||
typedef struct /**** Options ****/
|
||||
{
|
||||
char conflicted, /* 0 if no conflicts exist, 1 otherwise */
|
||||
keyword[PPD_MAX_NAME],
|
||||
/* Option keyword name ("PageSize", etc.) */
|
||||
defchoice[PPD_MAX_NAME],
|
||||
/* Default option choice */
|
||||
text[PPD_MAX_TEXT];
|
||||
/* Human-readable text */
|
||||
keyword[41], /* Option keyword name ("PageSize", etc.) */
|
||||
defchoice[41], /* Default option choice */
|
||||
text[81]; /* Human-readable text */
|
||||
ppd_ui_t ui; /* Type of UI option */
|
||||
ppd_section_t section; /* Section for command */
|
||||
float order; /* Order number */
|
||||
@@ -127,8 +113,7 @@ typedef struct /**** Options ****/
|
||||
|
||||
typedef struct ppd_group_str /**** Groups ****/
|
||||
{
|
||||
char text[PPD_MAX_TEXT];
|
||||
/* Human-readable group name */
|
||||
char text[81]; /* Human-readable group name */
|
||||
int num_options; /* Number of options */
|
||||
ppd_option_t *options; /* Options */
|
||||
int num_subgroups; /* Number of sub-groups */
|
||||
@@ -138,21 +123,16 @@ typedef struct ppd_group_str /**** Groups ****/
|
||||
|
||||
typedef struct /**** Constraints ****/
|
||||
{
|
||||
char option1[PPD_MAX_NAME],
|
||||
/* First keyword */
|
||||
choice1[PPD_MAX_NAME],
|
||||
/* First option/choice (blank for all) */
|
||||
option2[PPD_MAX_NAME],
|
||||
/* Second keyword */
|
||||
choice2[PPD_MAX_NAME];
|
||||
/* Second option/choice (blank for all) */
|
||||
char option1[41], /* First keyword */
|
||||
choice1[41], /* First option/choice (blank for all) */
|
||||
option2[41], /* Second keyword */
|
||||
choice2[41]; /* Second option/choice (blank for all) */
|
||||
} ppd_const_t;
|
||||
|
||||
typedef struct /**** Page Sizes ****/
|
||||
{
|
||||
int marked; /* Page size selected? */
|
||||
char name[PPD_MAX_NAME];
|
||||
/* Media size option */
|
||||
char name[41]; /* Media size option */
|
||||
float width, /* Width of media in points */
|
||||
length, /* Length of media in points */
|
||||
left, /* Left printable margin in points */
|
||||
@@ -163,18 +143,15 @@ typedef struct /**** Page Sizes ****/
|
||||
|
||||
typedef struct /**** Emulators ****/
|
||||
{
|
||||
char name[PPD_MAX_NAME],
|
||||
/* Emulator name */
|
||||
char name[41], /* Emulator name */
|
||||
*start, /* Code to switch to this emulation */
|
||||
*stop; /* Code to stop this emulation */
|
||||
} ppd_emul_t;
|
||||
|
||||
typedef struct /**** sRGB Color Profiles ****/
|
||||
{
|
||||
char resolution[PPD_MAX_NAME],
|
||||
/* Resolution or "-" */
|
||||
media_type[PPD_MAX_NAME];
|
||||
/* Media type of "-" */
|
||||
char resolution[41], /* Resolution or "-" */
|
||||
media_type[41]; /* Media type of "-" */
|
||||
float density, /* Ink density to use */
|
||||
gamma, /* Gamma correction to use */
|
||||
matrix[3][3]; /* Transform matrix */
|
||||
@@ -189,8 +166,7 @@ typedef struct /**** Files ****/
|
||||
contone_only, /* 1 = continuous tone only, 0 = not */
|
||||
landscape, /* -90 or 90 */
|
||||
model_number, /* Device-specific model number */
|
||||
manual_copies, /* 1 = Copies done manually, 0 = hardware */
|
||||
throughput; /* Pages per minute */
|
||||
manual_copies; /* 1 = Copies done manually, 0 = hardware */
|
||||
ppd_cs_t colorspace; /* Default colorspace */
|
||||
char *patches; /* Patch commands to be sent to printer */
|
||||
int num_emulations; /* Number of emulations supported */
|
||||
@@ -221,7 +197,6 @@ typedef struct /**** Files ****/
|
||||
ppd_profile_t *profiles; /* sRGB color profiles */
|
||||
int num_filters; /* Number of filters */
|
||||
char **filters; /* Filter strings... */
|
||||
int flip_duplex; /* 1 = Flip page for back sides */
|
||||
} ppd_file_t;
|
||||
|
||||
|
||||
@@ -230,15 +205,11 @@ typedef struct /**** Files ****/
|
||||
*/
|
||||
|
||||
extern void ppdClose(ppd_file_t *ppd);
|
||||
extern int ppdCollect(ppd_file_t *ppd, ppd_section_t section,
|
||||
ppd_choice_t ***choices);
|
||||
extern int ppdConflicts(ppd_file_t *ppd);
|
||||
extern int ppdEmit(ppd_file_t *ppd, FILE *fp,
|
||||
ppd_section_t section);
|
||||
extern int ppdEmitFd(ppd_file_t *ppd, int fd,
|
||||
ppd_section_t section);
|
||||
extern int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id,
|
||||
const char *user, const char *title);
|
||||
extern int ppdIsMarked(ppd_file_t *ppd, const char *keyword,
|
||||
const char *option);
|
||||
extern void ppdMarkDefaults(ppd_file_t *ppd);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Raster file routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Raster file definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -1,287 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* snprintf functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* vsnprintf() - Format a string into a fixed size buffer.
|
||||
* snprintf() - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
|
||||
|
||||
#ifndef HAVE_VSNPRINTF
|
||||
/*
|
||||
* 'vsnprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
vsnprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
char *bufptr, /* Pointer to position in buffer */
|
||||
*bufend, /* Pointer to end of buffer */
|
||||
sign, /* Sign of format width */
|
||||
size, /* Size character (h, l, L) */
|
||||
type; /* Format type character */
|
||||
const char *bufformat; /* Start of format */
|
||||
int width, /* Width of field */
|
||||
prec; /* Number of characters of precision */
|
||||
char tformat[100], /* Temporary format string for sprintf() */
|
||||
temp[1024]; /* Buffer for formatted numbers */
|
||||
int *chars; /* Pointer to integer for %p */
|
||||
char *s; /* Pointer to string */
|
||||
int slen; /* Length of string */
|
||||
|
||||
|
||||
/*
|
||||
* Loop through the format string, formatting as needed...
|
||||
*/
|
||||
|
||||
bufptr = buffer;
|
||||
bufend = buffer + bufsize - 1;
|
||||
|
||||
while (*format && bufptr < bufend)
|
||||
{
|
||||
if (*format == '%')
|
||||
{
|
||||
bufformat = format;
|
||||
format ++;
|
||||
|
||||
if (*format == '%')
|
||||
{
|
||||
*bufptr++ = *format++;
|
||||
continue;
|
||||
}
|
||||
else if (strchr(" -+#\'", *format))
|
||||
sign = *format++;
|
||||
else
|
||||
sign = 0;
|
||||
|
||||
width = 0;
|
||||
while (isdigit(*format))
|
||||
width = width * 10 + *format++ - '0';
|
||||
|
||||
if (*format == '.')
|
||||
{
|
||||
format ++;
|
||||
prec = 0;
|
||||
|
||||
while (isdigit(*format))
|
||||
prec = prec * 10 + *format++ - '0';
|
||||
}
|
||||
else
|
||||
prec = -1;
|
||||
|
||||
if (*format == 'l' && format[1] == 'l')
|
||||
{
|
||||
size = 'L';
|
||||
format += 2;
|
||||
}
|
||||
else if (*format == 'h' || *format == 'l' || *format == 'L')
|
||||
size = *format++;
|
||||
|
||||
if (!*format)
|
||||
break;
|
||||
|
||||
type = *format++;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 'E' : /* Floating point formats */
|
||||
case 'G' :
|
||||
case 'e' :
|
||||
case 'f' :
|
||||
case 'g' :
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, double));
|
||||
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B' : /* Integer formats */
|
||||
case 'X' :
|
||||
case 'b' :
|
||||
case 'd' :
|
||||
case 'i' :
|
||||
case 'o' :
|
||||
case 'u' :
|
||||
case 'x' :
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, int));
|
||||
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'p' : /* Pointer value */
|
||||
if ((chars = va_arg(ap, int *)) != NULL)
|
||||
*chars = bufptr - buffer;
|
||||
break;
|
||||
|
||||
case 'c' : /* Character or character array */
|
||||
if (width <= 1)
|
||||
*bufptr++ = va_arg(ap, int);
|
||||
else
|
||||
{
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
memcpy(bufptr, va_arg(ap, char *), width);
|
||||
bufptr += width;
|
||||
}
|
||||
break;
|
||||
|
||||
case 's' : /* String */
|
||||
if ((s = va_arg(ap, char *)) == NULL)
|
||||
s = "(null)";
|
||||
|
||||
slen = strlen(s);
|
||||
if (slen > width && prec != width)
|
||||
width = slen;
|
||||
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
if (slen > width)
|
||||
slen = width;
|
||||
|
||||
if (sign == '-')
|
||||
{
|
||||
strncpy(bufptr, s, slen);
|
||||
memset(bufptr + slen, ' ', width - slen);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(bufptr, ' ', width - slen);
|
||||
strncpy(bufptr + width - slen, s, slen);
|
||||
}
|
||||
|
||||
bufptr += width;
|
||||
break;
|
||||
|
||||
case 'n' : /* Output number of chars so far */
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, int));
|
||||
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
*bufptr++ = *format++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Nul-terminate the string and return the number of characters in it.
|
||||
*/
|
||||
|
||||
*bufptr = '\0';
|
||||
return (bufptr - buffer);
|
||||
}
|
||||
#endif /* !HAVE_VSNPRINT */
|
||||
|
||||
|
||||
#ifndef HAVE_SNPRINTF
|
||||
/*
|
||||
* 'snprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
snprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
int bytes; /* Number of bytes formatted */
|
||||
va_list ap; /* Pointer to additional arguments */
|
||||
|
||||
|
||||
va_start(ap, format);
|
||||
bytes = vsnprintf(buffer, bufsize, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
#endif /* !HAVE_SNPRINTF */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* String functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
|
||||
+2
-37
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* String definitions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -29,17 +29,8 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdarg.h>
|
||||
# include <config.h>
|
||||
|
||||
# ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
# endif /* HAVE_STRING_H */
|
||||
|
||||
# ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
# endif /* HAVE_STRINGS_H */
|
||||
# include <string.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -52,15 +43,6 @@
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
@@ -77,23 +59,6 @@ extern int strcasecmp(const char *, const char *);
|
||||
extern int strncasecmp(const char *, const char *, size_t n);
|
||||
# endif /* !HAVE_STRNCASECMP */
|
||||
|
||||
# ifndef HAVE_SNPRINTF
|
||||
extern int snprintf(char *, size_t, const char *, ...);
|
||||
# endif /* !HAVE_SNPRINTF */
|
||||
|
||||
# ifndef HAVE_VSNPRINTF
|
||||
extern int vsnprintf(char *, size_t, const char *, va_list);
|
||||
# endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
#endif /* !_CUPS_STRING_H_ */
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Temp file utilities for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
* copyright law. Distribution and use rights are outlined in the file
|
||||
* "LICENSE.txt" which should have been included with this file. If this
|
||||
* file is missing or damaged please contact Easy Software Products
|
||||
* at:
|
||||
*
|
||||
* Attn: CUPS Licensing Information
|
||||
* Easy Software Products
|
||||
* 44141 Airport View Drive, Suite 204
|
||||
* Hollywood, Maryland 20636-3111 USA
|
||||
*
|
||||
* Voice: (301) 373-9603
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsTempFd() - Create a temporary file.
|
||||
* cupsTempFile() - Generate a temporary filename.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include "string.h"
|
||||
#include "debug.h"
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
# include <io.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsTempFd()' - Create a temporary file.
|
||||
*/
|
||||
|
||||
int /* O - New file descriptor */
|
||||
cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
int len) /* I - Size of buffer */
|
||||
{
|
||||
int fd; /* File descriptor for temp file */
|
||||
#ifdef WIN32
|
||||
char tmpdir[1024]; /* Windows temporary directory */
|
||||
DWORD curtime; /* Current time */
|
||||
#else
|
||||
char *tmpdir; /* TMPDIR environment var */
|
||||
struct timeval curtime; /* Current time */
|
||||
#endif /* WIN32 */
|
||||
static char buf[1024] = ""; /* Buffer if you pass in NULL and 0 */
|
||||
|
||||
|
||||
/*
|
||||
* See if a filename was specified...
|
||||
*/
|
||||
|
||||
if (filename == NULL)
|
||||
{
|
||||
filename = buf;
|
||||
len = sizeof(buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* See if TMPDIR is defined...
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
GetTempPath(sizeof(tmpdir), tmpdir);
|
||||
#else
|
||||
if ((tmpdir = getenv("TMPDIR")) == NULL)
|
||||
{
|
||||
/*
|
||||
* Put root temp files in restricted temp directory...
|
||||
*/
|
||||
|
||||
if (getuid() == 0)
|
||||
tmpdir = CUPS_REQUESTS "/tmp";
|
||||
else
|
||||
tmpdir = "/var/tmp";
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*
|
||||
* Make the temporary name using the specified directory...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
#ifdef WIN32
|
||||
/*
|
||||
* Get the current time of day...
|
||||
*/
|
||||
|
||||
curtime = GetTickCount();
|
||||
|
||||
/*
|
||||
* Format a string using the hex time values...
|
||||
*/
|
||||
|
||||
snprintf(filename, len - 1, "%s/%08lx", tmpdir, curtime);
|
||||
#else
|
||||
/*
|
||||
* Get the current time of day...
|
||||
*/
|
||||
|
||||
gettimeofday(&curtime, NULL);
|
||||
|
||||
/*
|
||||
* Format a string using the hex time values...
|
||||
*/
|
||||
|
||||
snprintf(filename, len - 1, "%s/%08lx%05lx", tmpdir,
|
||||
curtime.tv_sec, curtime.tv_usec);
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*
|
||||
* Open the file in "exclusive" mode, making sure that we don't
|
||||
* stomp on an existing file or someone's symlink crack...
|
||||
*/
|
||||
|
||||
#ifdef O_NOFOLLOW
|
||||
fd = open(filename, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
|
||||
#else
|
||||
fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
#endif /* O_NOFOLLOW */
|
||||
|
||||
if (fd < 0 && errno == EPERM)
|
||||
break; /* Stop immediately if permission denied! */
|
||||
}
|
||||
while (fd < 0);
|
||||
|
||||
/*
|
||||
* Return the file descriptor...
|
||||
*/
|
||||
|
||||
return (fd);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsTempFile()' - Generate a temporary filename.
|
||||
*/
|
||||
|
||||
char * /* O - Filename */
|
||||
cupsTempFile(char *filename, /* I - Pointer to buffer */
|
||||
int len) /* I - Size of buffer */
|
||||
{
|
||||
int fd; /* File descriptor for temp file */
|
||||
static char buf[1024] = ""; /* Buffer if you pass in NULL and 0 */
|
||||
|
||||
|
||||
/*
|
||||
* See if a filename was specified...
|
||||
*/
|
||||
|
||||
if (filename == NULL)
|
||||
{
|
||||
filename = buf;
|
||||
len = sizeof(buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the temporary file...
|
||||
*/
|
||||
|
||||
if ((fd = cupsTempFd(filename, len)) < 0)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Close the temp file - it'll be reopened later as needed...
|
||||
*/
|
||||
|
||||
close(fd);
|
||||
|
||||
/*
|
||||
* Return the temp filename...
|
||||
*/
|
||||
|
||||
return (filename);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+20
-35
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* HTTP test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -45,20 +45,25 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
int i; /* Looping var */
|
||||
http_t *http; /* HTTP connection */
|
||||
http_status_t status; /* Status of GET command */
|
||||
char buffer[8192]; /* Input buffer */
|
||||
long bytes; /* Number of bytes read */
|
||||
char buffer[1024]; /* Input buffer */
|
||||
int bytes; /* Number of bytes read */
|
||||
FILE *out; /* Output file */
|
||||
char host[HTTP_MAX_URI],
|
||||
method[HTTP_MAX_URI],
|
||||
username[HTTP_MAX_URI],
|
||||
resource[HTTP_MAX_URI];
|
||||
int port;
|
||||
long length, total;
|
||||
time_t start, current;
|
||||
|
||||
#define HOST "dns.easysw.com"
|
||||
#define PORT 80
|
||||
|
||||
puts("Connecting to " HOST "...");
|
||||
|
||||
httpInitialize();
|
||||
http = httpConnect(HOST, PORT);
|
||||
if (http == NULL)
|
||||
{
|
||||
puts("Unable to connect to " HOST "!");
|
||||
return (1);
|
||||
}
|
||||
|
||||
puts("Connected to " HOST "...");
|
||||
|
||||
http = NULL;
|
||||
out = stdout;
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
@@ -70,42 +75,22 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
continue;
|
||||
}
|
||||
|
||||
httpSeparate(argv[i], method, username, host, &port, resource);
|
||||
|
||||
http = httpConnect(host, port);
|
||||
if (http == NULL)
|
||||
{
|
||||
perror(host);
|
||||
continue;
|
||||
}
|
||||
printf("Requesting file \"%s\"...\n", resource);
|
||||
printf("Requesting file \"%s\"...\n", argv[i]);
|
||||
httpClearFields(http);
|
||||
httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
|
||||
httpGet(http, resource);
|
||||
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
|
||||
httpGet(http, argv[i]);
|
||||
status = httpUpdate(http);
|
||||
|
||||
if (status == HTTP_OK)
|
||||
puts("GET OK:");
|
||||
else
|
||||
printf("GET failed with status %d...\n", status);
|
||||
|
||||
|
||||
start = time(NULL);
|
||||
length = atoi(httpGetField(http, HTTP_FIELD_CONTENT_LENGTH));
|
||||
total = 0;
|
||||
|
||||
while ((bytes = httpRead(http, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
total += bytes;
|
||||
fwrite(buffer, bytes, 1, out);
|
||||
if (out != stdout)
|
||||
{
|
||||
current = time(NULL);
|
||||
if (current == start) current ++;
|
||||
printf("\r%ld/%ld bytes (%ld bytes/sec) ", total, length,
|
||||
total / (current - start));
|
||||
fflush(stdout);
|
||||
}
|
||||
printf("Read %d bytes, %d total...\n", bytes, ftell(out));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MIME test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "mime.h"
|
||||
|
||||
|
||||
@@ -66,7 +65,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
puts("MIME database types:");
|
||||
for (i = 0, types = mime->types; i < mime->num_types; i ++, types ++)
|
||||
{
|
||||
printf("\t%s/%s:\n", (*types)->super, (*types)->type);
|
||||
printf("\t%s/%s: ", (*types)->super, (*types)->type);
|
||||
print_rules((*types)->rules);
|
||||
puts("");
|
||||
}
|
||||
@@ -86,7 +85,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
{
|
||||
default :
|
||||
fputs("Usage: testmime source-file [destination-type]\n", stderr);
|
||||
mimeDelete(mime);
|
||||
return (1);
|
||||
|
||||
case 2 :
|
||||
@@ -95,20 +93,18 @@ main(int argc, /* I - Number of command-line args */
|
||||
if (src != NULL)
|
||||
{
|
||||
printf("%s: %s/%s\n", argv[1], src->super, src->type);
|
||||
mimeDelete(mime);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%s: unknown\n", argv[1]);
|
||||
mimeDelete(mime);
|
||||
return (1);
|
||||
}
|
||||
|
||||
case 3 :
|
||||
src = mimeFileType(mime, argv[1]);
|
||||
|
||||
sscanf(argv[2], "%15[^/]/%31s", super, type);
|
||||
sscanf(argv[2], "%[^/]/%s", super, type);
|
||||
dst = mimeType(mime, super, type);
|
||||
|
||||
filters = mimeFilter(mime, src, dst, &num_filters);
|
||||
@@ -116,7 +112,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
if (filters == NULL)
|
||||
{
|
||||
printf("No filters to convert from %s to %s.\n", argv[1], argv[2]);
|
||||
mimeDelete(mime);
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
@@ -127,7 +122,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
else
|
||||
puts(filters[i].filter);
|
||||
|
||||
mimeDelete(mime);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
@@ -141,19 +135,22 @@ main(int argc, /* I - Number of command-line args */
|
||||
static void
|
||||
print_rules(mime_magic_t *rules) /* I - Rules to print */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
static char indent[255] = "\t"; /* Indentation for rules */
|
||||
char logic; /* Logic separator */
|
||||
|
||||
|
||||
if (rules == NULL)
|
||||
return;
|
||||
|
||||
if (rules->parent == NULL ||
|
||||
rules->parent->op == MIME_MAGIC_OR)
|
||||
logic = ',';
|
||||
else
|
||||
logic = '+';
|
||||
|
||||
while (rules != NULL)
|
||||
{
|
||||
printf("%s[%p] ", indent, rules);
|
||||
|
||||
if (rules->invert)
|
||||
printf("NOT ");
|
||||
if (rules->prev != NULL)
|
||||
putchar(logic);
|
||||
|
||||
switch (rules->op)
|
||||
{
|
||||
@@ -170,14 +167,7 @@ print_rules(mime_magic_t *rules) /* I - Rules to print */
|
||||
printf("printable(%d,%d)", rules->offset, rules->length);
|
||||
break;
|
||||
case MIME_MAGIC_STRING :
|
||||
printf("string(%d,", rules->offset);
|
||||
for (i = 0; i < rules->length; i ++)
|
||||
if (rules->value.stringv[i] < ' ' ||
|
||||
rules->value.stringv[i] > 126)
|
||||
printf("<%02X>", rules->value.stringv[i]);
|
||||
else
|
||||
putchar(rules->value.stringv[i]);
|
||||
putchar(')');
|
||||
printf("string(%d,%s)", rules->offset, rules->value.stringv);
|
||||
break;
|
||||
case MIME_MAGIC_CHAR :
|
||||
printf("char(%d,%d)", rules->offset, rules->value.charv);
|
||||
@@ -188,35 +178,16 @@ print_rules(mime_magic_t *rules) /* I - Rules to print */
|
||||
case MIME_MAGIC_INT :
|
||||
printf("int(%d,%d)", rules->offset, rules->value.intv);
|
||||
break;
|
||||
case MIME_MAGIC_CONTAINS :
|
||||
printf("contains(%d,%d,", rules->offset, rules->region);
|
||||
for (i = 0; i < rules->length; i ++)
|
||||
if (rules->value.stringv[i] < ' ' ||
|
||||
rules->value.stringv[i] > 126)
|
||||
printf("<%02X>", rules->value.stringv[i]);
|
||||
else
|
||||
putchar(rules->value.stringv[i]);
|
||||
putchar(')');
|
||||
break;
|
||||
default :
|
||||
if (rules->child != NULL)
|
||||
{
|
||||
putchar('(');
|
||||
print_rules(rules->child);
|
||||
putchar(')');
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (rules->child != NULL)
|
||||
{
|
||||
if (rules->op == MIME_MAGIC_OR)
|
||||
puts("OR (");
|
||||
else
|
||||
puts("AND (");
|
||||
|
||||
strcat(indent, "\t");
|
||||
print_rules(rules->child);
|
||||
indent[strlen(indent) - 1] = '\0';
|
||||
printf("%s)\n", indent);
|
||||
}
|
||||
else
|
||||
putchar('\n');
|
||||
|
||||
rules = rules->next;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -66,7 +66,7 @@ LINK32=link.exe
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /I "../visualc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
|
||||
+9
-21
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* PPD test program for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 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
|
||||
@@ -44,7 +44,7 @@ int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i, j, k, m; /* Looping vars */
|
||||
int i, j, k, m, n; /* Looping vars */
|
||||
const char *filename; /* File to load */
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
ppd_size_t *size; /* Size record */
|
||||
@@ -56,8 +56,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
"JCL", "PAGE", "PROLOG" };
|
||||
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
/*
|
||||
* Display PPD files for each file listed on the command-line...
|
||||
*/
|
||||
@@ -70,9 +68,14 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
{
|
||||
if ((ppd = ppdOpenFile(argv[i])) == NULL)
|
||||
if (strstr(argv[i], ".ppd"))
|
||||
filename = argv[i];
|
||||
else
|
||||
filename = cupsGetPPD(argv[i]);
|
||||
|
||||
if ((ppd = ppdOpenFile(filename)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", argv[i]);
|
||||
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", filename);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -168,21 +171,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
}
|
||||
|
||||
printf(" num_profiles = %d\n", ppd->num_profiles);
|
||||
for (j = 0; j < ppd->num_profiles; j ++)
|
||||
printf(" profiles[%d] = %s/%s %.3f %.3f [ %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f ]\n",
|
||||
j, ppd->profiles[j].resolution, ppd->profiles[j].media_type,
|
||||
ppd->profiles[j].gamma, ppd->profiles[j].density,
|
||||
ppd->profiles[j].matrix[0][0], ppd->profiles[j].matrix[0][1],
|
||||
ppd->profiles[j].matrix[0][2], ppd->profiles[j].matrix[1][0],
|
||||
ppd->profiles[j].matrix[1][1], ppd->profiles[j].matrix[1][2],
|
||||
ppd->profiles[j].matrix[2][0], ppd->profiles[j].matrix[2][1],
|
||||
ppd->profiles[j].matrix[2][2]);
|
||||
|
||||
printf(" num_fonts = %d\n", ppd->num_fonts);
|
||||
for (j = 0; j < ppd->num_fonts; j ++)
|
||||
printf(" fonts[%d] = %s\n", j, ppd->fonts[j]);
|
||||
|
||||
ppdClose(ppd);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -66,7 +66,7 @@ LINK32=link.exe
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /I "../visualc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* MIME typing routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products, all rights reserved.
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -41,9 +41,8 @@
|
||||
#include <ctype.h>
|
||||
#include <locale.h>
|
||||
|
||||
#include <cups/string.h>
|
||||
#include "string.h"
|
||||
#include "mime.h"
|
||||
#include <cups/debug.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -109,8 +108,8 @@ mimeAddType(mime_t *mime, /* I - MIME database */
|
||||
mime->num_types ++;
|
||||
|
||||
*types = temp;
|
||||
strncpy(temp->super, super, sizeof(temp->super) - 1);
|
||||
strncpy(temp->type, type, sizeof(temp->type) - 1);
|
||||
strcpy(temp->super, super);
|
||||
strcpy(temp->type, type);
|
||||
|
||||
if (mime->num_types > 1)
|
||||
qsort(mime->types, mime->num_types, sizeof(mime_type_t *),
|
||||
@@ -133,10 +132,10 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
logic, /* Logic for next rule */
|
||||
invert; /* Invert following rule? */
|
||||
char name[255], /* Name in rule string */
|
||||
value[3][255], /* Value in rule string */
|
||||
value[2][255], /* Value in rule string */
|
||||
*ptr, /* Position in name or value */
|
||||
quote; /* Quote character */
|
||||
int length[3]; /* Length of each parameter */
|
||||
int length[2]; /* Length of each parameter */
|
||||
mime_magic_t *temp, /* New rule */
|
||||
*current; /* Current rule */
|
||||
|
||||
@@ -167,8 +166,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
logic = MIME_MAGIC_NOP;
|
||||
invert = 0;
|
||||
|
||||
DEBUG_printf(("%s/%s: %s\n", mt->super, mt->type, rule));
|
||||
|
||||
while (*rule != '\0')
|
||||
{
|
||||
while (isspace(*rule))
|
||||
@@ -176,13 +173,11 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
|
||||
if (*rule == '(')
|
||||
{
|
||||
DEBUG_puts("new parenthesis group");
|
||||
logic = MIME_MAGIC_NOP;
|
||||
rule ++;
|
||||
}
|
||||
else if (*rule == ')')
|
||||
{
|
||||
DEBUG_puts("close paren...");
|
||||
if (current == NULL || current->parent == NULL)
|
||||
return (-1);
|
||||
|
||||
@@ -216,14 +211,9 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
|
||||
current->prev = NULL;
|
||||
current->parent = temp;
|
||||
|
||||
DEBUG_printf(("creating new AND group %p...\n", temp));
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_printf(("setting group %p op to AND...\n", current->parent));
|
||||
current->parent->op = MIME_MAGIC_AND;
|
||||
}
|
||||
|
||||
logic = MIME_MAGIC_AND;
|
||||
rule ++;
|
||||
@@ -247,8 +237,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL)
|
||||
return (-1);
|
||||
|
||||
DEBUG_printf(("creating new AND group %p inside OR group\n", temp));
|
||||
|
||||
while (current->prev != NULL)
|
||||
{
|
||||
current->parent = temp;
|
||||
@@ -267,7 +255,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
* This isn't the top rule, so go up one level...
|
||||
*/
|
||||
|
||||
DEBUG_puts("going up one level");
|
||||
current = current->parent;
|
||||
}
|
||||
}
|
||||
@@ -277,7 +264,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
}
|
||||
else if (*rule == '!')
|
||||
{
|
||||
DEBUG_puts("NOT");
|
||||
invert = 1;
|
||||
rule ++;
|
||||
}
|
||||
@@ -300,9 +286,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
*/
|
||||
|
||||
rule ++;
|
||||
for (num_values = 0;
|
||||
num_values < (sizeof(value) / sizeof(value[0]));
|
||||
num_values ++)
|
||||
for (num_values = 0; num_values < 2; num_values ++)
|
||||
{
|
||||
ptr = value[num_values];
|
||||
|
||||
@@ -326,8 +310,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
|
||||
quote = *rule++;
|
||||
|
||||
while (*rule != '\0' && *rule != quote &&
|
||||
(ptr - value[num_values]) < (sizeof(value[0]) - 1))
|
||||
while (*rule != '\0' && *rule != quote)
|
||||
*ptr++ = *rule++;
|
||||
|
||||
if (*rule == quote)
|
||||
@@ -339,8 +322,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
{
|
||||
rule ++;
|
||||
|
||||
while (*rule != '>' && *rule != '\0' &&
|
||||
(ptr - value[num_values]) < (sizeof(value[0]) - 1))
|
||||
while (*rule != '>' && *rule != '\0')
|
||||
{
|
||||
if (isxdigit(rule[0]) && isxdigit(rule[1]))
|
||||
{
|
||||
@@ -401,8 +383,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
op = MIME_MAGIC_INT;
|
||||
else if (strcmp(name, "locale") == 0)
|
||||
op = MIME_MAGIC_LOCALE;
|
||||
else if (strcmp(name, "contains") == 0)
|
||||
op = MIME_MAGIC_CONTAINS;
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
@@ -412,7 +392,7 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
* This is just a filename match on the extension...
|
||||
*/
|
||||
|
||||
snprintf(value[0], sizeof(value[0]), "*.%s", name);
|
||||
sprintf(value[0], "*.%s", name);
|
||||
length[0] = strlen(value[0]);
|
||||
num_values = 1;
|
||||
op = MIME_MAGIC_MATCH;
|
||||
@@ -442,8 +422,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
* Add parenthetical grouping...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("making new OR group %p for parenthesis...\n", temp));
|
||||
|
||||
temp->op = MIME_MAGIC_OR;
|
||||
|
||||
if ((temp->child = calloc(1, sizeof(mime_magic_t))) == NULL)
|
||||
@@ -455,9 +433,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
logic = MIME_MAGIC_OR;
|
||||
}
|
||||
|
||||
DEBUG_printf(("adding %p: %s, op = %d, logic = %d, invert = %d\n",
|
||||
temp, name, op, logic, invert));
|
||||
|
||||
/*
|
||||
* Fill in data for the rule...
|
||||
*/
|
||||
@@ -475,32 +450,32 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
break;
|
||||
case MIME_MAGIC_ASCII :
|
||||
case MIME_MAGIC_PRINTABLE :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->length = strtol(value[1], NULL, 0);
|
||||
temp->offset = atoi(value[0]);
|
||||
temp->length = atoi(value[1]);
|
||||
if (temp->length > MIME_MAX_BUFFER)
|
||||
temp->length = MIME_MAX_BUFFER;
|
||||
break;
|
||||
case MIME_MAGIC_STRING :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->offset = atoi(value[0]);
|
||||
if (length[1] > sizeof(temp->value.stringv))
|
||||
return (-1);
|
||||
temp->length = length[1];
|
||||
memcpy(temp->value.stringv, value[1], length[1]);
|
||||
break;
|
||||
case MIME_MAGIC_CHAR :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->offset = atoi(value[0]);
|
||||
if (length[1] == 1)
|
||||
temp->value.charv = value[1][0];
|
||||
else
|
||||
temp->value.charv = strtol(value[1], NULL, 0);
|
||||
temp->value.charv = atoi(value[1]);
|
||||
break;
|
||||
case MIME_MAGIC_SHORT :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->value.shortv = strtol(value[1], NULL, 0);
|
||||
temp->offset = atoi(value[0]);
|
||||
temp->value.shortv = atoi(value[1]);
|
||||
break;
|
||||
case MIME_MAGIC_INT :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->value.intv = strtol(value[1], NULL, 0);
|
||||
temp->offset = atoi(value[0]);
|
||||
temp->value.intv = atoi(value[1]);
|
||||
break;
|
||||
case MIME_MAGIC_LOCALE :
|
||||
if (length[0] > (sizeof(temp->value.localev) - 1))
|
||||
@@ -508,14 +483,6 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
|
||||
strcpy(temp->value.localev, value[0]);
|
||||
break;
|
||||
case MIME_MAGIC_CONTAINS :
|
||||
temp->offset = strtol(value[0], NULL, 0);
|
||||
temp->region = strtol(value[1], NULL, 0);
|
||||
if (length[2] > sizeof(temp->value.stringv))
|
||||
return (-1);
|
||||
temp->length = length[2];
|
||||
memcpy(temp->value.stringv, value[2], length[2]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -615,11 +582,8 @@ mimeType(mime_t *mime, /* I - MIME database */
|
||||
* Lookup the type in the array...
|
||||
*/
|
||||
|
||||
strncpy(key.super, super, sizeof(key.super) - 1);
|
||||
key.super[sizeof(key.super) - 1] = '\0';
|
||||
strncpy(key.type, type, sizeof(key.type) - 1);
|
||||
key.type[sizeof(key.type) - 1] = '\0';
|
||||
|
||||
strcpy(key.super, super);
|
||||
strcpy(key.type, type);
|
||||
keyptr = &key;
|
||||
|
||||
match = (mime_type_t **)bsearch(&keyptr, mime->types, mime->num_types,
|
||||
@@ -661,7 +625,6 @@ checkrules(const char *filename, /* I - Filename */
|
||||
mime_magic_t *rules) /* I - Rules to check */
|
||||
{
|
||||
int n; /* Looping var */
|
||||
int region; /* Region to look at */
|
||||
int logic, /* Logic to apply */
|
||||
result, /* Result of test */
|
||||
intv; /* Integer value */
|
||||
@@ -681,8 +644,6 @@ checkrules(const char *filename, /* I - Filename */
|
||||
logic = rules->parent->op;
|
||||
|
||||
bufoffset = -1;
|
||||
buflength = 0;
|
||||
result = 0;
|
||||
|
||||
while (rules != NULL)
|
||||
{
|
||||
@@ -755,7 +716,7 @@ checkrules(const char *filename, /* I - Filename */
|
||||
}
|
||||
|
||||
/*
|
||||
* Test for 8-bit printable characters plus standard control chars.
|
||||
* Test for ASCII printable characters plus standard control chars.
|
||||
*/
|
||||
|
||||
if ((rules->offset + rules->length) > (bufoffset + buflength))
|
||||
@@ -766,7 +727,7 @@ checkrules(const char *filename, /* I - Filename */
|
||||
bufptr = buffer + rules->offset - bufoffset;
|
||||
|
||||
while (n > 0)
|
||||
if (*bufptr >= 128 ||
|
||||
if ((*bufptr >= 160 && *bufptr <= 254) ||
|
||||
(*bufptr >= 32 && *bufptr <= 126) ||
|
||||
(*bufptr >= 8 && *bufptr <= 13) ||
|
||||
*bufptr == 26 || *bufptr == 27)
|
||||
@@ -905,44 +866,6 @@ checkrules(const char *filename, /* I - Filename */
|
||||
result = (strcmp(rules->value.localev, setlocale(LC_ALL, NULL)) == 0);
|
||||
break;
|
||||
|
||||
case MIME_MAGIC_CONTAINS :
|
||||
/*
|
||||
* Load the buffer if necessary...
|
||||
*/
|
||||
|
||||
if (bufoffset < 0 || rules->offset < bufoffset ||
|
||||
(rules->offset + rules->region) > (bufoffset + buflength))
|
||||
{
|
||||
/*
|
||||
* Reload file buffer...
|
||||
*/
|
||||
|
||||
fseek(fp, rules->offset, SEEK_SET);
|
||||
buflength = fread(buffer, 1, sizeof(buffer), fp);
|
||||
bufoffset = rules->offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare the buffer against the string. If the file is too
|
||||
* short then don't compare - it can't match...
|
||||
*/
|
||||
|
||||
if ((rules->offset + rules->length) > (bufoffset + buflength))
|
||||
result = 0;
|
||||
else
|
||||
{
|
||||
if (buflength > rules->region)
|
||||
region = rules->region - rules->length;
|
||||
else
|
||||
region = buflength - rules->length;
|
||||
|
||||
for (n = 0; n < region; n ++)
|
||||
if ((result = (memcmp(buffer + rules->offset - bufoffset + n,
|
||||
rules->value.stringv, rules->length) == 0)) != 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
if (rules->child != NULL)
|
||||
result = checkrules(filename, fp, rules->child);
|
||||
@@ -964,8 +887,6 @@ checkrules(const char *filename, /* I - Filename */
|
||||
* the the rule set is false...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("result of test %p is %d\n", rules, result));
|
||||
|
||||
if ((result && logic == MIME_MAGIC_OR) ||
|
||||
(!result && logic == MIME_MAGIC_AND))
|
||||
return (result);
|
||||
+62
-334
@@ -4,7 +4,7 @@
|
||||
* User, system, and password routines for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 1997-2001 by Easy Software Products.
|
||||
* Copyright 1997-1999 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Easy Software Products and are protected by Federal
|
||||
@@ -24,16 +24,6 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* cupsEncryption() - Get the default encryption settings...
|
||||
* cupsGetPassword() - Get a password from the user...
|
||||
* cupsServer() - Return the hostname of the default server...
|
||||
* cupsSetEncryption() - Set the encryption preference.
|
||||
* cupsSetPasswordCB() - Set the password callback for CUPS.
|
||||
* cupsSetServer() - Set the default server name...
|
||||
* cupsSetUser() - Set the default user name...
|
||||
* cupsUser() - Return the current users name.
|
||||
* cups_get_password() - Get a password from the user...
|
||||
* cups_get_line() - Get a line from a file...
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -41,279 +31,11 @@
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include "string.h"
|
||||
#include <config.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static const char *cups_get_password(const char *prompt);
|
||||
static char *cups_get_line(char *buf, int buflen, FILE *fp);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static http_encryption_t cups_encryption = (http_encryption_t)-1;
|
||||
static char cups_user[65] = "",
|
||||
cups_server[256] = "";
|
||||
static const char *(*cups_pwdcb)(const char *) = cups_get_password;
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsEncryption()' - Get the default encryption settings...
|
||||
*/
|
||||
|
||||
http_encryption_t
|
||||
cupsEncryption(void)
|
||||
{
|
||||
FILE *fp; /* client.conf file */
|
||||
char *encryption; /* CUPS_ENCRYPTION variable */
|
||||
const char *home; /* Home directory of user */
|
||||
static char line[1024]; /* Line from file */
|
||||
|
||||
|
||||
/*
|
||||
* First see if we have already set the encryption stuff...
|
||||
*/
|
||||
|
||||
if (cups_encryption == (http_encryption_t)-1)
|
||||
{
|
||||
/*
|
||||
* Then see if the CUPS_ENCRYPTION environment variable is set...
|
||||
*/
|
||||
|
||||
if ((encryption = getenv("CUPS_ENCRYPTION")) == NULL)
|
||||
{
|
||||
/*
|
||||
* Next check to see if we have a $HOME/.cupsrc or client.conf file...
|
||||
*/
|
||||
|
||||
if ((home = getenv("HOME")) != NULL)
|
||||
{
|
||||
snprintf(line, sizeof(line), "%s/.cupsrc", home);
|
||||
fp = fopen(line, "r");
|
||||
}
|
||||
else
|
||||
fp = NULL;
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
|
||||
{
|
||||
snprintf(line, sizeof(line), "%s/client.conf", home);
|
||||
fp = fopen(line, "r");
|
||||
}
|
||||
else
|
||||
fp = fopen(CUPS_SERVERROOT "/client.conf", "r");
|
||||
}
|
||||
|
||||
encryption = "IfRequested";
|
||||
|
||||
if (fp != NULL)
|
||||
{
|
||||
/*
|
||||
* Read the config file and look for a ServerName line...
|
||||
*/
|
||||
|
||||
while (cups_get_line(line, sizeof(line), fp) != NULL)
|
||||
if (strncmp(line, "Encryption ", 11) == 0)
|
||||
{
|
||||
/*
|
||||
* Got it! Drop any trailing newline and find the name...
|
||||
*/
|
||||
|
||||
encryption = line + strlen(line) - 1;
|
||||
if (*encryption == '\n')
|
||||
*encryption = '\0';
|
||||
|
||||
for (encryption = line + 11; isspace(*encryption); encryption ++);
|
||||
break;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the encryption preference...
|
||||
*/
|
||||
|
||||
if (strcasecmp(encryption, "never") == 0)
|
||||
cups_encryption = HTTP_ENCRYPT_NEVER;
|
||||
else if (strcasecmp(encryption, "always") == 0)
|
||||
cups_encryption = HTTP_ENCRYPT_ALWAYS;
|
||||
else if (strcasecmp(encryption, "required") == 0)
|
||||
cups_encryption = HTTP_ENCRYPT_REQUIRED;
|
||||
else
|
||||
cups_encryption = HTTP_ENCRYPT_IF_REQUESTED;
|
||||
}
|
||||
|
||||
return (cups_encryption);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetPassword()' - Get a password from the user...
|
||||
*/
|
||||
|
||||
const char * /* O - Password */
|
||||
cupsGetPassword(const char *prompt) /* I - Prompt string */
|
||||
{
|
||||
return ((*cups_pwdcb)(prompt));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsSetEncryption()' - Set the encryption preference.
|
||||
*/
|
||||
|
||||
void
|
||||
cupsSetEncryption(http_encryption_t e) /* I - New encryption preference */
|
||||
{
|
||||
cups_encryption = e;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsServer()' - Return the hostname of the default server...
|
||||
*/
|
||||
|
||||
const char * /* O - Server name */
|
||||
cupsServer(void)
|
||||
{
|
||||
FILE *fp; /* client.conf file */
|
||||
char *server; /* Pointer to server name */
|
||||
const char *home; /* Home directory of user */
|
||||
static char line[1024]; /* Line from file */
|
||||
|
||||
|
||||
/*
|
||||
* First see if we have already set the server name...
|
||||
*/
|
||||
|
||||
if (!cups_server[0])
|
||||
{
|
||||
/*
|
||||
* Then see if the CUPS_SERVER environment variable is set...
|
||||
*/
|
||||
|
||||
if ((server = getenv("CUPS_SERVER")) == NULL)
|
||||
{
|
||||
/*
|
||||
* Next check to see if we have a $HOME/.cupsrc or client.conf file...
|
||||
*/
|
||||
|
||||
if ((home = getenv("HOME")) != NULL)
|
||||
{
|
||||
snprintf(line, sizeof(line), "%s/.cupsrc", home);
|
||||
fp = fopen(line, "r");
|
||||
}
|
||||
else
|
||||
fp = NULL;
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
|
||||
{
|
||||
snprintf(line, sizeof(line), "%s/client.conf", home);
|
||||
fp = fopen(line, "r");
|
||||
}
|
||||
else
|
||||
fp = fopen(CUPS_SERVERROOT "/client.conf", "r");
|
||||
}
|
||||
|
||||
server = "localhost";
|
||||
|
||||
if (fp != NULL)
|
||||
{
|
||||
/*
|
||||
* Read the config file and look for a ServerName line...
|
||||
*/
|
||||
|
||||
while (cups_get_line(line, sizeof(line), fp) != NULL)
|
||||
if (strncmp(line, "ServerName ", 11) == 0)
|
||||
{
|
||||
/*
|
||||
* Got it! Drop any trailing newline and find the name...
|
||||
*/
|
||||
|
||||
server = line + strlen(line) - 1;
|
||||
if (*server == '\n')
|
||||
*server = '\0';
|
||||
|
||||
for (server = line + 11; isspace(*server); server ++);
|
||||
break;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the server name over...
|
||||
*/
|
||||
|
||||
strncpy(cups_server, server, sizeof(cups_server) - 1);
|
||||
cups_server[sizeof(cups_server) - 1] = '\0';
|
||||
}
|
||||
|
||||
return (cups_server);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsSetPasswordCB()' - Set the password callback for CUPS.
|
||||
*/
|
||||
|
||||
void
|
||||
cupsSetPasswordCB(const char *(*cb)(const char *)) /* I - Callback function */
|
||||
{
|
||||
if (cb == (const char *(*)(const char *))0)
|
||||
cups_pwdcb = cups_get_password;
|
||||
else
|
||||
cups_pwdcb = cb;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsSetServer()' - Set the default server name...
|
||||
*/
|
||||
|
||||
void
|
||||
cupsSetServer(const char *server) /* I - Server name */
|
||||
{
|
||||
if (server)
|
||||
{
|
||||
strncpy(cups_server, server, sizeof(cups_server) - 1);
|
||||
cups_server[sizeof(cups_server) - 1] = '\0';
|
||||
}
|
||||
else
|
||||
cups_server[0] = '\0';
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsSetUser()' - Set the default user name...
|
||||
*/
|
||||
|
||||
void
|
||||
cupsSetUser(const char *user) /* I - User name */
|
||||
{
|
||||
if (user)
|
||||
{
|
||||
strncpy(cups_user, user, sizeof(cups_user) - 1);
|
||||
cups_user[sizeof(cups_user) - 1] = '\0';
|
||||
}
|
||||
else
|
||||
cups_user[0] = '\0';
|
||||
}
|
||||
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
/*
|
||||
* WIN32 and OS/2 username and password stuff...
|
||||
@@ -326,19 +48,16 @@ cupsSetUser(const char *user) /* I - User name */
|
||||
const char * /* O - User name */
|
||||
cupsUser(void)
|
||||
{
|
||||
if (!cups_user[0])
|
||||
strcpy(cups_user, "WindowsUser");
|
||||
|
||||
return (cups_user);
|
||||
return ("WindowsUser");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_get_password()' - Get a password from the user...
|
||||
* 'cupsGetPassword()' - Get a password from the user...
|
||||
*/
|
||||
|
||||
static const char * /* O - Password */
|
||||
cups_get_password(const char *prompt) /* I - Prompt string */
|
||||
const char * /* O - Password */
|
||||
cupsGetPassword(const char *prompt) /* I - Prompt string */
|
||||
{
|
||||
return (NULL);
|
||||
}
|
||||
@@ -359,49 +78,35 @@ cupsUser(void)
|
||||
struct passwd *pwd; /* User/password entry */
|
||||
|
||||
|
||||
if (!cups_user[0])
|
||||
{
|
||||
/*
|
||||
* Rewind the password file...
|
||||
*/
|
||||
/*
|
||||
* Rewind the password file...
|
||||
*/
|
||||
|
||||
setpwent();
|
||||
setpwent();
|
||||
|
||||
/*
|
||||
* Lookup the password entry for the current user.
|
||||
*/
|
||||
/*
|
||||
* Lookup the password entry for the current user.
|
||||
*/
|
||||
|
||||
if ((pwd = getpwuid(getuid())) == NULL)
|
||||
strcpy(cups_user, "unknown"); /* Unknown user! */
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Copy the username...
|
||||
*/
|
||||
if ((pwd = getpwuid(getuid())) == NULL)
|
||||
return ("unknown"); /* Unknown user! */
|
||||
|
||||
setpwent();
|
||||
/*
|
||||
* Rewind the password file again and return the username...
|
||||
*/
|
||||
|
||||
strncpy(cups_user, pwd->pw_name, sizeof(cups_user) - 1);
|
||||
cups_user[sizeof(cups_user) - 1] = '\0';
|
||||
}
|
||||
setpwent();
|
||||
|
||||
/*
|
||||
* Rewind the password file again...
|
||||
*/
|
||||
|
||||
setpwent();
|
||||
}
|
||||
|
||||
return (cups_user);
|
||||
return (pwd->pw_name);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_get_password()' - Get a password from the user...
|
||||
* 'cupsGetPassword()' - Get a password from the user...
|
||||
*/
|
||||
|
||||
static const char * /* O - Password */
|
||||
cups_get_password(const char *prompt) /* I - Prompt string */
|
||||
const char * /* O - Password */
|
||||
cupsGetPassword(const char *prompt) /* I - Prompt string */
|
||||
{
|
||||
return (getpass(prompt));
|
||||
}
|
||||
@@ -409,36 +114,59 @@ cups_get_password(const char *prompt) /* I - Prompt string */
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_get_line()' - Get a line from a file.
|
||||
* 'cupsServer()' - Return the hostname of the default server...
|
||||
*/
|
||||
|
||||
static char * /* O - Line from file */
|
||||
cups_get_line(char *buf, /* I - Line buffer */
|
||||
int buflen, /* I - Size of line buffer */
|
||||
FILE *fp) /* I - File to read from */
|
||||
const char * /* O - Server name */
|
||||
cupsServer(void)
|
||||
{
|
||||
char *bufptr; /* Pointer to end of buffer */
|
||||
FILE *fp; /* cupsd.conf file */
|
||||
char *server; /* Pointer to server name */
|
||||
static char line[1024]; /* Line from file */
|
||||
|
||||
|
||||
/*
|
||||
* Get the line from a file...
|
||||
* First see if the CUPS_SERVER environment variable is set...
|
||||
*/
|
||||
|
||||
if (fgets(buf, buflen, fp) == NULL)
|
||||
return (NULL);
|
||||
if ((server = getenv("CUPS_SERVER")) != NULL)
|
||||
return (server);
|
||||
|
||||
/*
|
||||
* Remove all trailing whitespace...
|
||||
* Next check to see if we have a cupsd.conf file...
|
||||
*/
|
||||
|
||||
bufptr = buf + strlen(buf) - 1;
|
||||
if (bufptr < buf)
|
||||
return (NULL);
|
||||
if ((fp = fopen(CUPS_SERVERROOT "/conf/cupsd.conf", "r")) == NULL)
|
||||
return ("localhost");
|
||||
|
||||
while (isspace(*bufptr) && bufptr >= buf)
|
||||
*bufptr-- = '\0';
|
||||
/*
|
||||
* Read the cupsd.conf file and look for a ServerName line...
|
||||
*/
|
||||
|
||||
return (buf);
|
||||
while (fgets(line, sizeof(line), fp) != NULL)
|
||||
if (strncmp(line, "ServerName ", 11) == 0)
|
||||
{
|
||||
/*
|
||||
* Got it! Drop any trailing newline and find the name...
|
||||
*/
|
||||
|
||||
server = line + strlen(line) - 1;
|
||||
if (*server == '\n')
|
||||
*server = '\0';
|
||||
|
||||
for (server = line + 11; isspace(*server); server ++);
|
||||
|
||||
if (*server)
|
||||
return (server);
|
||||
}
|
||||
|
||||
/*
|
||||
* Didn't see a ServerName line, so return "localhost"...
|
||||
*/
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return ("localhost");
|
||||
}
|
||||
|
||||
|
||||
|
||||
+291
-1045
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
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