Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 45b1118fc2 |
-180
@@ -1,180 +0,0 @@
|
||||
CHANGES.txt - 11/04/1999
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS v1.0.4
|
||||
|
||||
- Documentation updates.
|
||||
- Jobs would get stuck in the queue and wouldn't print
|
||||
until you enabled the queue.
|
||||
- The lp and lpr commands now catch SIGHUP and SIGINTR.
|
||||
- The lp and lpr commands now use sigaction or sigset
|
||||
when available.
|
||||
- CUPS library updates for WIN32/OS-2
|
||||
|
||||
|
||||
CHANGES IN CUPS v1.0.3
|
||||
|
||||
- Documentation updates.
|
||||
- The lpq man page was missing.
|
||||
- The configure script was not properly detecting the
|
||||
image libraries.
|
||||
- The top-level makefile was calling "make" instead of
|
||||
"$(MAKE)".
|
||||
- PostScript filter fixes for number-up, OutputOrder,
|
||||
and %Trailer.
|
||||
- The imagetops filter didn't end the base-85 encoding
|
||||
properly if the image data was not a multiple of 4
|
||||
bytes in length.
|
||||
- The imagetoraster filter didn't generate good banded
|
||||
RGB or CMY data (was dividing the line width by 4
|
||||
instead of 3...)
|
||||
- The imagetoraster filter now records the bounding
|
||||
box of the image on the page.
|
||||
- The CUPS image library cache code wasn't working as
|
||||
designed; images larger than the maximum RIP cache
|
||||
would eventually thrash using the same cache tile.
|
||||
- The CUPS image library TIFF loading code didn't
|
||||
handle unknown resolution units properly; the fixed
|
||||
code uses a default resolution of 128 PPI.
|
||||
- cupsGetClasses() and cupsGetPrinters() did not free
|
||||
existing strings if they ran out of memory.
|
||||
- The scheduler logs incorrectly contained 3 digits for
|
||||
the timezone offset instead of 4.
|
||||
- The scheduler now does a lookup for the default user
|
||||
and group ID; the previous hardcoded values caused
|
||||
problems with the LPD backend.
|
||||
- The cancel-job operation now allows any user in the
|
||||
system group to cancel any job.
|
||||
- The cancel-job operation stopped the print queue if
|
||||
the job was being printed.
|
||||
- Now only stop printers if the backend fails. If the
|
||||
filter fails then the failure is noted in the
|
||||
error_log and printing continues with the next file in
|
||||
the queue.
|
||||
- Now log whether a filter fails because of a signal
|
||||
or because it returned a non-zero exit status.
|
||||
- The root user now always passes the system group test.
|
||||
- Printers with an interface script and remote printers
|
||||
and classes didn't have a printer-make-and-model
|
||||
attribute.
|
||||
- Added logging of lost/timed-out remote printers.
|
||||
- The HP-GL/2 filter was scaling the pen width twice.
|
||||
- Updated the HP-GL/2 filter to use a single SP (Set
|
||||
Pen) procedure. This makes the output smaller and is
|
||||
more appropriate since the filter keeps track of the
|
||||
pen states already.
|
||||
- The scheduler didn't handle passwords with spaces.
|
||||
- The IPP backend now does multiple copies and retries
|
||||
if the destination server requires it (e.g. HP
|
||||
JetDirect.)
|
||||
- The disable command didn't implement the "-c" option
|
||||
(cancel all jobs.)
|
||||
- Changed the CMYK generation function for the image file
|
||||
and PostScript RIPs.
|
||||
- The lp command didn't support the "-h" option as
|
||||
documented.
|
||||
- The AppSocket, IPP, and LPD backends now retry on all
|
||||
network errors. This should prevent stopped queues
|
||||
caused by a printer being disconnected from the
|
||||
network or powered off.
|
||||
- The scheduler now restarts a job if the corresponding
|
||||
printer is modified.
|
||||
- The image RIPs now rotate the image if needed to fit
|
||||
on the page.
|
||||
|
||||
|
||||
CHANGES IN CUPS v1.0.2
|
||||
|
||||
- The HP-GL/2 filter didn't always scale the output
|
||||
correctly.
|
||||
- The HP-GL/2 filter now supports changing the page size
|
||||
automatically when the "fitplot" option is not used.
|
||||
- The cancel-job operation was expecting a resource name
|
||||
of the form "/job/#" instead of "/jobs/#"; this
|
||||
prevented the cancel and lprm commands from working.
|
||||
- The backends didn't log pages when files were printed
|
||||
using the "-oraw" option.
|
||||
- The authorization code did not work with the Slackware
|
||||
long shadow password package because its crypt() can
|
||||
return NULL.
|
||||
- The chunking code didn't work for reading the response
|
||||
of a POST request.
|
||||
- cupsGetPPD() now does authentication as needed.
|
||||
- The N-up code in the PostScript filter didn't work
|
||||
with some printers (grestoreall would restore the
|
||||
default blank page and device settings).
|
||||
- The N-up code in the PostScript filter didn't scale
|
||||
the pages to fit within the imageable area of the
|
||||
page.
|
||||
- Wasn't doing an fchown() on the request files. This
|
||||
caused problems when the default root account group
|
||||
and CUPS group were not the same.
|
||||
|
||||
|
||||
CHANGES IN CUPS v1.0.1
|
||||
|
||||
- Documentation updates.
|
||||
|
||||
- Fixed a bunch of possible buffer-overflow conditions.
|
||||
|
||||
- The scheduler now supports authentication using PAM.
|
||||
|
||||
- Updated the Italian message file.
|
||||
|
||||
- httpEncode64() didn't add an extra "=" if there was
|
||||
only one byte in the last three-byte group.
|
||||
|
||||
- Now drop any trailing character set from the locale
|
||||
string (e.g. "en_US.ISO_8859-1" becomes "en_US")
|
||||
|
||||
- Fixed "timezone" vs "tm_gmtoff" usage for BSD-based
|
||||
operating systems.
|
||||
|
||||
- Updated IPP security so that "get" operations can be
|
||||
done from any resource name; this allows the CGIs to
|
||||
work with printer authentication enabled so long as
|
||||
authentication isn't turned on for the whole "site".
|
||||
|
||||
- The IPP code didn't properly handle the "unsupported"
|
||||
group; this caused problems with the HP JetDirect since
|
||||
it doesn't seem to support the "copies" attribute.
|
||||
|
||||
- The HTTP chunking code was missing a CR LF pair at the
|
||||
end of a 0-length chunk.
|
||||
|
||||
- The httpSeparate() function didn't handle embedded
|
||||
usernames and passwords in the URI properly.
|
||||
|
||||
- Doing "lpadmin -p printer -E" didn't restart printing
|
||||
if there were pending jobs.
|
||||
|
||||
- The cancel-job operation now requires either a
|
||||
requesting-user-name attribute or an authenticated
|
||||
username.
|
||||
|
||||
- The add-printer code did not report errors if the
|
||||
interface script or PPD file could not be renamed.
|
||||
|
||||
- Request files are now created without world read
|
||||
permissions.
|
||||
|
||||
- Added a cupsLastError() function to the CUPS API to
|
||||
retrieve the IPP error code from the last request.
|
||||
|
||||
- Options are now case-insensitive.
|
||||
|
||||
- The lpq command now provides 10 characters for the
|
||||
username instead of the original (Berkeley standard)
|
||||
7.
|
||||
|
||||
- The cancel command needed a local CUPS server to work
|
||||
(or the appropriate ServerName in cupsd.conf)
|
||||
|
||||
- The cancel and lprm commands didn't report the IPP
|
||||
error if the job could not be cancelled.
|
||||
|
||||
- The lp and lpr commands didn't intercept SIGTERM to
|
||||
remove temporary files when printing from stdin.
|
||||
|
||||
- The lp and lpr commands didn't report the IPP error if
|
||||
the job could not be printed.
|
||||
@@ -1,25 +0,0 @@
|
||||
CREDITS.txt - 10/01/1999
|
||||
------------------------
|
||||
|
||||
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.
|
||||
|
||||
If I've missed someone, please let me know by sending an email to
|
||||
"mike@easysw.com".
|
||||
+220
-337
@@ -5,382 +5,265 @@
|
||||
|
||||
<BODY BGCOLOR=#ffffff>
|
||||
|
||||
<H2 ALIGN="CENTER">Common UNIX Printing System License Agreement</H2>
|
||||
<H1 ALIGN=CENTER><FONT FACE="Arial,HELVETICA">Aladdin Free Public License</FONT></H1>
|
||||
|
||||
<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.9603<BR>
|
||||
Email: cups-info@cups.org<BR>
|
||||
WWW: http://www.cups.org
|
||||
<P ALIGN=CENTER>(Version 6, June 17, 1997)</P>
|
||||
|
||||
<H3>Introduction</H3>
|
||||
<P ALIGN=CENTER>Copyright © 1994, 1995, 1997 Aladdin Enterprises,<BR><BR>
|
||||
Menlo Park, California, U.S.A. All rights reserved.</P>
|
||||
|
||||
<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>For those not familiar with the GNU General Public License, the license
|
||||
basically allows you to:
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>Use the CUPS software at no charge.
|
||||
|
||||
<LI>Distribute verbatim copies of the software in source or
|
||||
binary form.
|
||||
|
||||
<LI>Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
|
||||
<LI>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 have to provide source for any new drivers, changes, or
|
||||
additions to the software, and all code must be provided under the GPL.
|
||||
|
||||
<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 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 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>
|
||||
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: info@arsoft.com
|
||||
<BLOCKQUOTE>
|
||||
NOTE: This License is not the same as any of the GNU Licenses published
|
||||
by the Free Software Foundation. Its terms are substantially different
|
||||
from those of the GNU Licenses. If you are familiar with the GNU
|
||||
Licenses, please read this license with extra care.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<H3>Support</H3>
|
||||
<P>Aladdin Enterprises hereby grants to anyone the permission to apply
|
||||
this License to their own work, as long as the entire License
|
||||
(including the above notices and this paragraph) is copied with no
|
||||
changes, additions, or deletions except for changing the first
|
||||
paragraph of Section 0 to include a suitable description of the work to
|
||||
which the license is being applied and of the person or entity that
|
||||
holds the copyright in the work, and, if the License is being applied
|
||||
to a work created in a country other than the United States, replacing
|
||||
the first paragraph of Section 6 with an appropriate reference to the
|
||||
laws of the appropriate country.</P>
|
||||
|
||||
<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.
|
||||
<H2><FONT FACE="Arial,HELVETICA">0. Subject Matter</FONT></H2>
|
||||
|
||||
<H3>Trademarks</H3>
|
||||
This License applies to the Common UNIX Printing System ("PROGRAM").
|
||||
The Common UNIX Printing System is a copyrighted work whose copyright
|
||||
is held by Easy Software Products (the "LICENSOR"). The Common UNIX
|
||||
Printing System, CUPS, and the CUPS logo are the trademark property of
|
||||
Easy Software Products.
|
||||
|
||||
<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>A "work based on the PROGRAM" means either the PROGRAM or any
|
||||
derivative work of the PROGRAM, as defined in the United States
|
||||
Copyright Act of 1976, such as a translation or a modification.
|
||||
|
||||
<H2 ALIGN="CENTER">GNU General Public License</H2>
|
||||
<P>BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE
|
||||
PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND
|
||||
ALL ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE
|
||||
PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS
|
||||
YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE
|
||||
WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE
|
||||
TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM.
|
||||
|
||||
<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
|
||||
<H2><FONT FACE="Arial,HELVETICA">1. Licenses</FONT></H2>
|
||||
|
||||
<P ALIGN="CENTER">Everyone is permitted to copy and distribute verbatim
|
||||
copies of this license document, but changing it is not allowed.
|
||||
LICENSOR hereby grants you the following rights, provided that you comply
|
||||
with all of the restrictions set forth in this License and provided,
|
||||
further, that you distribute an unmodified copy of this License with the
|
||||
PROGRAM:
|
||||
|
||||
<H3>Preamble</H3>
|
||||
<OL TYPE=a>
|
||||
|
||||
<P>The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
<LI>You may copy and distribute literal (i.e., verbatim) copies
|
||||
of the PROGRAM's source code as you receive it throughout the
|
||||
world, in any medium.<BR><BR>
|
||||
|
||||
<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 software, or if you modify it.
|
||||
|
||||
<P>For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
<P>We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
<P>Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, 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 redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. 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>The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
<H3>GNU GENERAL PUBLIC LICENSE<BR>
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H3>
|
||||
|
||||
<OL START="0">
|
||||
|
||||
<LI>This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
<P>Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
<LI>You may copy and distribute verbatim copies of the Program's
|
||||
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 give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
<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.
|
||||
|
||||
<LI>You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, 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>You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
<LI>You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
<LI>if the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
<LI>You may modify the PROGRAM, create works based on the
|
||||
PROGRAM and distribute copies of such throughout the world, in
|
||||
any medium.<BR><BR>
|
||||
|
||||
</OL>
|
||||
|
||||
<P>These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
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 Program, 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.
|
||||
<H2><FONT FACE="Arial,HELVETICA">2. Restrictions</FONT></H2>
|
||||
|
||||
<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 Program.
|
||||
This license is subject to the following restrictions:
|
||||
|
||||
<P>In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
<OL TYPE=a>
|
||||
|
||||
<LI>You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
<LI>Distribution of the PROGRAM or any work based on the
|
||||
PROGRAM by a commercial organization to any third party is
|
||||
prohibited if any payment is made in connection with such
|
||||
distribution, whether directly (as in payment for a copy of the
|
||||
PROGRAM) or indirectly (as in payment for some service related
|
||||
to the PROGRAM, or payment for some product or service that
|
||||
includes a copy of the PROGRAM "without charge"; these are only
|
||||
examples, and not an exhaustive enumeration of prohibited
|
||||
activities). The following methods of distribution involving
|
||||
payment shall not in and of themselves be a violation of this
|
||||
restriction:<BR><BR>
|
||||
|
||||
<OL TYPE="a">
|
||||
<OL TYPE=i>
|
||||
|
||||
<LI>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; or,
|
||||
<LI>Posting the PROGRAM on a public access information
|
||||
storage and retrieval service for which a fee is
|
||||
received for retrieving information (such as an on-line
|
||||
service), provided that the fee is not
|
||||
content-dependent (i.e., the fee would be the same for
|
||||
retrieving the same volume of information consisting of
|
||||
random data) and that access to the service and to the
|
||||
PROGRAM is available independent of any other product
|
||||
or service. An example of a service that does not fall
|
||||
under this section is an on-line service that is
|
||||
operated by a company and that is only available to
|
||||
customers of that company. (This is not an exhaustive
|
||||
enumeration.)<BR><BR>
|
||||
|
||||
<LI>Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
<LI>Distributing the PROGRAM on removable
|
||||
computer-readable media, provided that the files
|
||||
containing the PROGRAM are reproduced entirely and
|
||||
verbatim on such media, that all information on such
|
||||
media be redistributable for non-commercial purposes
|
||||
without charge, and that such media are distributed by
|
||||
themselves (except for accompanying documentation)
|
||||
independent of any other product or service. Examples
|
||||
of such media include CD-ROM, magnetic tape, and
|
||||
optical storage media. (This is not intended to be an
|
||||
exhaustive list.) An example of a distribution that
|
||||
does not fall under this section is a CD-ROM included
|
||||
in a book or magazine. (This is not an exhaustive
|
||||
enumeration.)<BR><BR>
|
||||
|
||||
<LI>Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
</OL>
|
||||
|
||||
<LI>Activities other than copying, distribution and
|
||||
modification of the PROGRAM are not subject to this License and
|
||||
they are outside its scope. Functional use (running) of the
|
||||
PROGRAM is not restricted, and any output produced through the
|
||||
use of the PROGRAM is subject to this license only if its
|
||||
contents constitute a work based on the PROGRAM (independent of
|
||||
having been made by running the PROGRAM).<BR><BR>
|
||||
|
||||
<LI>You must meet all of the following conditions with respect to any work
|
||||
that you distribute or publish that in whole or in part contains or is
|
||||
derived from the PROGRAM or any part thereof ("the Work"):<BR><BR>
|
||||
|
||||
<OL TYPE=i>
|
||||
|
||||
<LI>If you have modified the PROGRAM, you must cause
|
||||
the Work to carry prominent notices stating that you
|
||||
have modified the PROGRAM's files and the date of any
|
||||
change;<BR><BR>
|
||||
|
||||
<LI>You must cause the Work to be licensed as a whole
|
||||
and at no charge to all third parties under the terms
|
||||
of this License;<BR><BR>
|
||||
|
||||
<LI>If the Work normally reads commands interactively
|
||||
when run, you must cause it, at each time the Work
|
||||
commences operation, to print or display an
|
||||
announcement including an appropriate copyright notice
|
||||
and a notice that there is no warranty (or else, saying
|
||||
that you provide a warranty). Such notice must also
|
||||
state that users may redistribute the Work only under
|
||||
the conditions of this License and tell the user how to
|
||||
view the copy of this License included with the Work.
|
||||
(Exceptions: if the PROGRAM is interactive but normally
|
||||
prints or displays such an announcement only at the
|
||||
request of a user, such as in an "About box", the Work
|
||||
is required to print or display the notice only under
|
||||
the same circumstances; if the PROGRAM itself is
|
||||
interactive but does not normally print such an
|
||||
announcement, the Work is not required to print an
|
||||
announcement.);<BR><BR>
|
||||
|
||||
<LI>You must accompany the Work with the complete
|
||||
corresponding machine-readable source code, delivered
|
||||
on a medium customarily used for software interchange.
|
||||
The source code for a work means the preferred form of
|
||||
the work for making modifications to it. For an
|
||||
executable work, 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
|
||||
executable code. If you distribute with the Work any
|
||||
component 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, you must also distribute
|
||||
the source code of that component if you have it and
|
||||
are allowed to do so;<BR><BR>
|
||||
|
||||
<LI>If you distribute any written or printed material
|
||||
at all with the Work, such material must include either
|
||||
a written copy of this License, or a prominent written
|
||||
indication that the Work is covered by this License and
|
||||
written instructions for printing and/or displaying the
|
||||
copy of the License on the distribution medium;<BR><BR>
|
||||
|
||||
<LI>You may not impose any further restrictions on the
|
||||
recipient's exercise of the rights granted herein.<BR><BR>
|
||||
|
||||
</OL>
|
||||
|
||||
</OL>
|
||||
|
||||
<P>The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, 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 executable. 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.
|
||||
If distribution of executable or object code is made by offering the
|
||||
equivalent ability to copy from a designated place, then offering
|
||||
equivalent ability to copy the source code from the same place counts
|
||||
as distribution of the source code, even though third parties are not
|
||||
compelled to copy the source code along with the object code.
|
||||
|
||||
<P>If distribution of executable or 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 counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
<H2><FONT FACE="Arial,HELVETICA">3. Reservation of Rights</FONT></H2>
|
||||
|
||||
<LI>You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program 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.
|
||||
No rights are granted to the PROGRAM except as expressly set forth
|
||||
herein. You may not copy, modify, sublicense, or distribute the PROGRAM
|
||||
except as expressly provided under this License. Any attempt otherwise
|
||||
to copy, modify, sublicense or distribute the PROGRAM 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.
|
||||
|
||||
<LI>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 Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
<H2><FONT FACE="Arial,HELVETICA">4. Other Restrictions</FONT></H2>
|
||||
|
||||
<LI>Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program 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.
|
||||
If the distribution and/or use of the PROGRAM is restricted in certain
|
||||
countries for any reason, LICENSOR 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.
|
||||
|
||||
<LI>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 Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program 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 Program.
|
||||
<H2><FONT FACE="Arial,HELVETICA">5. Limitations</FONT></H2>
|
||||
|
||||
<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.
|
||||
THE PROGRAM IS PROVIDED TO YOU "AS IS", WITHOUT WARRANTY. THERE IS NO
|
||||
WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
|
||||
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS
|
||||
WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
<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>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY
|
||||
OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
|
||||
THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
<P>This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
<H2><FONT FACE="Arial,HELVETICA">6. General</FONT></H2>
|
||||
|
||||
<LI>If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program 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.
|
||||
This License is governed by the laws of the State of Maryland, U.S.A.,
|
||||
excluding choice of law rules.
|
||||
|
||||
<LI>The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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>If any part of this License is found to be in conflict with the law,
|
||||
that part shall be interpreted in its broadest meaning consistent with
|
||||
the law, and no other parts of the License shall be affected.
|
||||
|
||||
<P>Each version is given a distinguishing version number. If the Program
|
||||
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 Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
<P>For United States Government users, the PROGRAM is provided with
|
||||
RESTRICTED RIGHTS. If you are a unit or agency of the United States
|
||||
Government or are acquiring the Software for any such unit or agency,
|
||||
the following apply:
|
||||
|
||||
<LI>If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, 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.
|
||||
|
||||
</OL>
|
||||
|
||||
<H3>NO WARRANTY</H3>
|
||||
|
||||
<OL START="11">
|
||||
|
||||
<LI>BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
<LI>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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
</OL>
|
||||
|
||||
<H3>END OF TERMS AND CONDITIONS</H3>
|
||||
<BLOCKQUOTE>
|
||||
If the unit or agency is the Department of Defense ("DOD"), the
|
||||
Software and its documentation are classified as "commercial computer
|
||||
software" and "commercial computer software documentation" respectively
|
||||
and, pursuant to DFAR Section 227.7202, the Government is acquiring the
|
||||
Software and its documentation in accordance with the terms of this
|
||||
License. If the unit or agency is other than DOD, the Software and its
|
||||
documentation are classified as "commercial computer software" and
|
||||
"commercial computer software documentation" respectively and, pursuant
|
||||
to FAR Section 12.212, the Government is acquiring the Software and its
|
||||
documentation in accordance with the terms of this License.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
+223
@@ -0,0 +1,223 @@
|
||||
Aladdin Free Public License
|
||||
|
||||
(Version 6, June 17, 1997)
|
||||
|
||||
Copyright © 1994, 1995, 1997 Aladdin Enterprises,
|
||||
|
||||
Menlo Park, California, U.S.A. All rights reserved.
|
||||
|
||||
NOTE: This License is not the same as any of the GNU Licenses
|
||||
published by the Free Software Foundation. Its terms are
|
||||
substantially different from those of the GNU Licenses. If you are
|
||||
familiar with the GNU Licenses, please read this license with
|
||||
extra care.
|
||||
|
||||
Aladdin Enterprises hereby grants to anyone the permission to apply this
|
||||
License to their own work, as long as the entire License (including the
|
||||
above notices and this paragraph) is copied with no changes, additions, or
|
||||
deletions except for changing the first paragraph of Section 0 to include a
|
||||
suitable description of the work to which the license is being applied and
|
||||
of the person or entity that holds the copyright in the work, and, if the
|
||||
License is being applied to a work created in a country other than the
|
||||
United States, replacing the first paragraph of Section 6 with an
|
||||
appropriate reference to the laws of the appropriate country.
|
||||
|
||||
0. Subject Matter
|
||||
|
||||
This License applies to the Common UNIX Printing System ("PROGRAM"). The
|
||||
Common UNIX Printing System is a copyrighted work whose copyright is held by
|
||||
Easy Software Products (the "LICENSOR"). The Common UNIX Printing System,
|
||||
CUPS, and the CUPS logo are the trademark property of Easy Software
|
||||
Products.
|
||||
|
||||
A "work based on the PROGRAM" means either the PROGRAM or any derivative
|
||||
work of the PROGRAM, as defined in the United States Copyright Act of 1976,
|
||||
such as a translation or a modification.
|
||||
|
||||
BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM),
|
||||
YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND
|
||||
CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE PROGRAM OR WORKS BASED
|
||||
ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO MODIFY OR
|
||||
DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED
|
||||
BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT MODIFY OR
|
||||
DISTRIBUTE THE PROGRAM.
|
||||
|
||||
1. Licenses
|
||||
|
||||
LICENSOR hereby grants you the following rights, provided that you comply
|
||||
with all of the restrictions set forth in this License and provided,
|
||||
further, that you distribute an unmodified copy of this License with the
|
||||
PROGRAM:
|
||||
|
||||
a. You may copy and distribute literal (i.e., verbatim) copies of the
|
||||
PROGRAM's source code as you receive it throughout the world, in any
|
||||
medium.
|
||||
|
||||
b. You may modify the PROGRAM, create works based on the PROGRAM and
|
||||
distribute copies of such throughout the world, in any medium.
|
||||
|
||||
2. Restrictions
|
||||
|
||||
This license is subject to the following restrictions:
|
||||
|
||||
a. Distribution of the PROGRAM or any work based on the PROGRAM by a
|
||||
commercial organization to any third party is prohibited if any payment
|
||||
is made in connection with such distribution, whether directly (as in
|
||||
payment for a copy of the PROGRAM) or indirectly (as in payment for
|
||||
some service related to the PROGRAM, or payment for some product or
|
||||
service that includes a copy of the PROGRAM "without charge"; these are
|
||||
only examples, and not an exhaustive enumeration of prohibited
|
||||
activities). The following methods of distribution involving payment
|
||||
shall not in and of themselves be a violation of this restriction:
|
||||
|
||||
i. Posting the PROGRAM on a public access information storage and
|
||||
retrieval service for which a fee is received for retrieving
|
||||
information (such as an on-line service), provided that the fee is
|
||||
not content-dependent (i.e., the fee would be the same for
|
||||
retrieving the same volume of information consisting of random
|
||||
data) and that access to the service and to the PROGRAM is
|
||||
available independent of any other product or service. An example
|
||||
of a service that does not fall under this section is an on-line
|
||||
service that is operated by a company and that is only available
|
||||
to customers of that company. (This is not an exhaustive
|
||||
enumeration.)
|
||||
|
||||
ii. Distributing the PROGRAM on removable computer-readable media,
|
||||
provided that the files containing the PROGRAM are reproduced
|
||||
entirely and verbatim on such media, that all information on such
|
||||
media be redistributable for non-commercial purposes without
|
||||
charge, and that such media are distributed by themselves (except
|
||||
for accompanying documentation) independent of any other product
|
||||
or service. Examples of such media include CD-ROM, magnetic tape,
|
||||
and optical storage media. (This is not intended to be an
|
||||
exhaustive list.) An example of a distribution that does not fall
|
||||
under this section is a CD-ROM included in a book or magazine.
|
||||
(This is not an exhaustive enumeration.)
|
||||
|
||||
b. Activities other than copying, distribution and modification of the
|
||||
PROGRAM are not subject to this License and they are outside its scope.
|
||||
Functional use (running) of the PROGRAM is not restricted, and any
|
||||
output produced through the use of the PROGRAM is subject to this
|
||||
license only if its contents constitute a work based on the PROGRAM
|
||||
(independent of having been made by running the PROGRAM).
|
||||
|
||||
c. You must meet all of the following conditions with respect to any work
|
||||
that you distribute or publish that in whole or in part contains or is
|
||||
derived from the PROGRAM or any part thereof ("the Work"):
|
||||
|
||||
i. If you have modified the PROGRAM, you must cause the Work to carry
|
||||
prominent notices stating that you have modified the PROGRAM's
|
||||
files and the date of any change;
|
||||
|
||||
ii. You must cause the Work to be licensed as a whole and at no charge
|
||||
to all third parties under the terms of this License;
|
||||
|
||||
iii. If the Work normally reads commands interactively when run, you
|
||||
must cause it, at each time the Work commences operation, to print
|
||||
or display an announcement including an appropriate copyright
|
||||
notice and a notice that there is no warranty (or else, saying
|
||||
that you provide a warranty). Such notice must also state that
|
||||
users may redistribute the Work only under the conditions of this
|
||||
License and tell the user how to view the copy of this License
|
||||
included with the Work. (Exceptions: if the PROGRAM is interactive
|
||||
but normally prints or displays such an announcement only at the
|
||||
request of a user, such as in an "About box", the Work is required
|
||||
to print or display the notice only under the same circumstances;
|
||||
if the PROGRAM itself is interactive but does not normally print
|
||||
such an announcement, the Work is not required to print an
|
||||
announcement.);
|
||||
|
||||
iv. You must accompany the Work with the complete corresponding
|
||||
machine-readable source code, delivered on a medium customarily
|
||||
used for software interchange. The source code for a work means
|
||||
the preferred form of the work for making modifications to it. For
|
||||
an executable work, 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 executable code. If you distribute with the
|
||||
Work any component 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, you
|
||||
must also distribute the source code of that component if you have
|
||||
it and are allowed to do so;
|
||||
|
||||
v. If you distribute any written or printed material at all with the
|
||||
Work, such material must include either a written copy of this
|
||||
License, or a prominent written indication that the Work is
|
||||
covered by this License and written instructions for printing
|
||||
and/or displaying the copy of the License on the distribution
|
||||
medium;
|
||||
|
||||
vi. You may not impose any further restrictions on the recipient's
|
||||
exercise of the rights granted herein.
|
||||
|
||||
If distribution of executable or object code is made by offering the
|
||||
equivalent ability to copy from a designated place, then offering equivalent
|
||||
ability to copy the source code from the same place counts as distribution
|
||||
of the source code, even though third parties are not compelled to copy the
|
||||
source code along with the object code.
|
||||
|
||||
3. Reservation of Rights
|
||||
|
||||
No rights are granted to the PROGRAM except as expressly set forth herein.
|
||||
You may not copy, modify, sublicense, or distribute the PROGRAM except as
|
||||
expressly provided under this License. Any attempt otherwise to copy,
|
||||
modify, sublicense or distribute the PROGRAM 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.
|
||||
|
||||
4. Other Restrictions
|
||||
|
||||
If the distribution and/or use of the PROGRAM is restricted in certain
|
||||
countries for any reason, LICENSOR 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.
|
||||
|
||||
5. Limitations
|
||||
|
||||
THE PROGRAM IS PROVIDED TO YOU "AS IS", WITHOUT WARRANTY. THERE IS NO
|
||||
WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE
|
||||
RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD
|
||||
THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
|
||||
LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM
|
||||
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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
6. General
|
||||
|
||||
This License is governed by the laws of the State of Maryland, U.S.A.,
|
||||
excluding choice of law rules.
|
||||
|
||||
If any part of this License is found to be in conflict with the law, that
|
||||
part shall be interpreted in its broadest meaning consistent with the law,
|
||||
and no other parts of the License shall be affected.
|
||||
|
||||
For United States Government users, the PROGRAM is provided with RESTRICTED
|
||||
RIGHTS. If you are a unit or agency of the United States Government or are
|
||||
acquiring the Software for any such unit or agency, the following apply:
|
||||
|
||||
If the unit or agency is the Department of Defense ("DOD"), the
|
||||
Software and its documentation are classified as "commercial
|
||||
computer software" and "commercial computer software
|
||||
documentation" respectively and, pursuant to DFAR Section
|
||||
227.7202, the Government is acquiring the Software and its
|
||||
documentation in accordance with the terms of this License. If the
|
||||
unit or agency is other than DOD, the Software and its
|
||||
documentation are classified as "commercial computer software" and
|
||||
"commercial computer software documentation" respectively and,
|
||||
pursuant to FAR Section 12.212, the Government is acquiring the
|
||||
Software and its documentation in accordance with the terms of
|
||||
this License.
|
||||
+9
-36
@@ -16,7 +16,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
|
||||
@@ -31,31 +31,15 @@
|
||||
AR = @AR@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CHMOD = @CHMOD@
|
||||
CP = @CP@
|
||||
DSO = @DSO@
|
||||
HTMLDOC = @HTMLDOC@
|
||||
LN = /bin/ln -sf
|
||||
MKDIR = @MKDIR@ -p
|
||||
MV = @MV@
|
||||
NROFF = @NROFF@
|
||||
PACK = @PACK@
|
||||
NROFF = @GROFF@ -T ascii
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SED = @SED@
|
||||
SHELL = /bin/sh
|
||||
|
||||
#
|
||||
# Libraries...
|
||||
#
|
||||
|
||||
LIBCUPS = @LIBCUPS@
|
||||
LIBCUPSIMAGE = @LIBCUPSIMAGE@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBTIFF = @LIBTIFF@
|
||||
LIBZ = @LIBZ@
|
||||
|
||||
#
|
||||
# Program options...
|
||||
#
|
||||
@@ -66,20 +50,12 @@ LIBZ = @LIBZ@
|
||||
|
||||
ARFLAGS = crvs
|
||||
CFLAGS = @CFLAGS@ $(OPTIM) -I.. $(OPTIONS)
|
||||
DSOLIBS = @DSOLIBS@
|
||||
IMGLIBS = @IMGLIBS@ -lm
|
||||
IMGLIBS = @IMGLIBS@ $(LIBS) -lm
|
||||
LDFLAGS = @LDFLAGS@ $(OPTIM)
|
||||
LIBS = -L../cups -lcups $(NETLIBS) @LIBS@
|
||||
NETLIBS = @NETLIBS@
|
||||
LIBS = @LIBS@ -L../cups -lcups
|
||||
OPTIM = @OPTIM@
|
||||
OPTIONS =
|
||||
|
||||
#
|
||||
# Formatted man page extension...
|
||||
#
|
||||
|
||||
CAT = @CAT@
|
||||
|
||||
#
|
||||
# Directories...
|
||||
#
|
||||
@@ -111,7 +87,7 @@ top_srcdir = @top_srcdir@
|
||||
|
||||
BINDIR = @bindir@
|
||||
DATADIR = @CUPS_DATADIR@
|
||||
INCLUDEDIR = $(includedir)
|
||||
INCLUDEDIR = $(includedir)/cups
|
||||
LIBDIR = $(libdir)
|
||||
LOCALEDIR = @CUPS_LOCALEDIR@
|
||||
MANDIR = @mandir@
|
||||
@@ -122,16 +98,13 @@ SERVERROOT = @CUPS_SERVERROOT@
|
||||
# Rules...
|
||||
#
|
||||
|
||||
.SILENT:
|
||||
.SUFFIXES: .a .c .gz .h .o .z .1 .5 .8
|
||||
.SUFFIXES: .a .c .h .1 .2 .3 .4 .5 .6 .7 .8 .o .z
|
||||
.c.o:
|
||||
echo Compiling $<...
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
.1.z .5.z .8.z .1.gz .5.gz .8.gz:
|
||||
echo Formatting $<...
|
||||
.1.z .2.z .3.z .4.z .5.z .6.z .7.z .8.z:
|
||||
$(NROFF) -man $< >t
|
||||
$(PACK) t
|
||||
-mv t.$(CAT) $@
|
||||
pack -f t
|
||||
mv t.z $@
|
||||
|
||||
#
|
||||
# End of "$Id$"
|
||||
|
||||
+9
-33
@@ -14,7 +14,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
|
||||
@@ -37,8 +37,7 @@ DIRS = cups backend berkeley cgi-bin filter man pstoraster \
|
||||
|
||||
all:
|
||||
for dir in $(DIRS); do\
|
||||
echo Making all in $$dir... ;\
|
||||
(cd $$dir; $(MAKE));\
|
||||
(cd $$dir; make);\
|
||||
done
|
||||
|
||||
#
|
||||
@@ -47,8 +46,7 @@ all:
|
||||
|
||||
clean:
|
||||
for dir in $(DIRS); do\
|
||||
echo Cleaning in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) clean);\
|
||||
(cd $$dir; make clean);\
|
||||
done
|
||||
|
||||
#
|
||||
@@ -57,35 +55,13 @@ clean:
|
||||
|
||||
install:
|
||||
for dir in $(DIRS); do\
|
||||
echo Installing in $$dir... ;\
|
||||
(cd $$dir; $(MAKE) install);\
|
||||
(cd $$dir; make install);\
|
||||
done
|
||||
echo Installing in conf...
|
||||
(cd conf; $(MAKE) install)
|
||||
echo Installing in data...
|
||||
(cd data; $(MAKE) install)
|
||||
echo Installing in doc...
|
||||
(cd doc; $(MAKE) install)
|
||||
echo Installing in fonts...
|
||||
(cd fonts; $(MAKE) install)
|
||||
echo Installing in ppd...
|
||||
(cd ppd; $(MAKE) install)
|
||||
|
||||
#
|
||||
# Make a software distribution...
|
||||
#
|
||||
|
||||
epm:
|
||||
epm -v cups
|
||||
|
||||
rpm:
|
||||
epm -v -f rpm cups
|
||||
|
||||
deb:
|
||||
epm -v -f deb cups
|
||||
|
||||
tardist:
|
||||
epm -v -f tardist cups
|
||||
(cd conf; make install)
|
||||
(cd data; make install)
|
||||
(cd doc; make install)
|
||||
(cd fonts; make install)
|
||||
(cd ppd; make install)
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
+243
@@ -0,0 +1,243 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>README - Common UNIX Printing System</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<H1>README - CUPS v1.0b1</H1>
|
||||
|
||||
<H2>Contents</H2>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="#intro">Introduction</A>
|
||||
<LI><A HREF="#require">Requirements</A>
|
||||
<LI><A HREF="#compile">Compiling CUPS</A>
|
||||
<LI><A HREF="#config">Configuring the Software</A>
|
||||
<LI><A HREF="#run">Running the Software</A>
|
||||
<LI><A HREF="#use">Using the Software</A>
|
||||
<LI><A HREF="#known">Known Problems</A>
|
||||
<LI><A HREF="#report">Reporting Problems</A>
|
||||
<LI><A HREF="#resources">Other Resources</A>
|
||||
<LI><A HREF="#license">Legal Stuff</A>
|
||||
</UL>
|
||||
|
||||
<H2><A NAME="intro">Introduction</A></H2>
|
||||
|
||||
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.
|
||||
|
||||
<P>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.
|
||||
|
||||
<P>CUPS adds network printer browsing and PostScript Printer
|
||||
Description ("PPD")-based printing options to support real
|
||||
world applications under UNIX.
|
||||
|
||||
<P>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.
|
||||
|
||||
<H2><A NAME="require">Requirements</A></H2>
|
||||
|
||||
You'll need an ANSI C compiler to build CUPS on your system. As its name
|
||||
implies, CUPS is designed to run on the UNIX operating system, however
|
||||
the CUPS interface library and most of the filters and backends supplied
|
||||
with CUPS should also run under Microsoft® Windows®.
|
||||
|
||||
<P>For the image file filters you'll need the JPEG, PNG, TIFF, and ZLIB
|
||||
libraries. CUPS will build without these, but with reduced functionality.
|
||||
|
||||
<P>If you make changes to the man pages you'll need GNU groff or another
|
||||
nroff-like package.
|
||||
|
||||
<P>The documentation is formatted using the HTMLDOC software (again, not
|
||||
needed unless you make changes.)
|
||||
|
||||
<H2><A NAME="compile">Compiling CUPS</A></H2>
|
||||
|
||||
CUPS uses GNU autoconf to configure the makefiles and source code for your
|
||||
system. To configure CUPS for your system type:
|
||||
|
||||
<UL><PRE>
|
||||
% ./configure ENTER
|
||||
</PRE></UL>
|
||||
|
||||
The default installation will put the CUPS software in the <CODE>/usr</CODE>
|
||||
and <CODE>/var</CODE> directories on your system, which will overwrite any
|
||||
existing printing commands on your system. To install the CUPS software in
|
||||
another location use the <CODE>--prefix</CODE> option:
|
||||
|
||||
<UL><PRE>
|
||||
% ./configure --prefix=/usr/local ENTER
|
||||
</PRE></UL>
|
||||
|
||||
Once you have configured things, just type:
|
||||
|
||||
<UL><PRE>
|
||||
% make ENTER
|
||||
</PRE></UL>
|
||||
|
||||
to build the software.
|
||||
|
||||
<H2><A NAME="install">Installing the Software</A></H2>
|
||||
|
||||
To install the software type:
|
||||
|
||||
<UL><PRE>
|
||||
% make install ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<H2><A NAME="config">Configuring the Software</A></H2>
|
||||
|
||||
Before you run CUPS for the first time you'll need to edit the CUPS
|
||||
configuration files which are normally located in /var/cups/conf.
|
||||
|
||||
<UL>
|
||||
|
||||
The <CODE>cupsd.conf</CODE> file configures all of the
|
||||
"global" server settings and access control. The default
|
||||
settings are usually appropriate for most environments.
|
||||
|
||||
<P>The <CODE>printers.conf</CODE> file configures each printer
|
||||
queue. You'll need to add a listing for each printer on your
|
||||
system.
|
||||
|
||||
<P>The <CODE>classes.conf</CODE> file configures each printer
|
||||
class. You'll need to add a listing for each printer class you
|
||||
want.
|
||||
|
||||
<P>The <CODE>mime.types</CODE> file defines all of the
|
||||
recognized file types. You don't normally have to edit this
|
||||
file.
|
||||
|
||||
<P>The <CODE>mime.convs</CODE> file defines all of the file
|
||||
conversion filters. You don't normally have to edit this file.
|
||||
|
||||
</UL>
|
||||
|
||||
In addition to the files in the /var/cups/conf directory, you'll also need
|
||||
to copy PPD files for each printer to the /var/cups/ppd directory. If you
|
||||
don't have a PPD file for your printer, the drivers will still work, just
|
||||
with reduced functionality.
|
||||
|
||||
<H2><A NAME="run">Running the Software</A></H2>
|
||||
|
||||
Once you have configured the software you can start the CUPS daemon by
|
||||
typing:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/sbin/cupsd & ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<H2><A NAME="use">Using the Software</A></H2>
|
||||
|
||||
Once you have installed the software, you can use the normal lp or lpr
|
||||
commands to print jobs. If you installed the software under /usr then
|
||||
you shouldn't have to reconfigure any applications to recognize the new
|
||||
printing system.
|
||||
|
||||
<P>One of the advantages of CUPS is that you don't always have to send
|
||||
PostScript or Text files to your printers. If you have a JPEG file, you
|
||||
can just type "lp filename.jpg" and CUPS will handle converting it for
|
||||
you!
|
||||
|
||||
<P>You can monitor the status of jobs via the lpstat command or with your
|
||||
web browser by pointing it at "http://localhost:631".
|
||||
|
||||
<H2><A NAME="known">Known Problems</A></H2>
|
||||
|
||||
The following known problems are being worked on and should be resolved for
|
||||
the second beta release of CUPS:
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>Documentation is not completed.
|
||||
|
||||
<LI>The lpadmin command is currently not provided.
|
||||
|
||||
<LI>The lpq command is currently not provided.
|
||||
|
||||
<LI>The lpc command currently only supports the help and status
|
||||
commands.
|
||||
|
||||
<LI>While both GNU GhostScript and the CUPS image RIP are
|
||||
provided, no sample raster printer driver is provided. The
|
||||
final release of CUPS will include a PCL printer driver.
|
||||
|
||||
<LI>Automatic classing is currently not supported.
|
||||
|
||||
<LI>The CUPS server should disable core dumps by filters, backends,
|
||||
and CGI programs.
|
||||
|
||||
<LI>The CUPS server should increase the FD limit to the maximum
|
||||
allowed on the system.
|
||||
|
||||
<LI>The CUPS server should close stdin, stdout, and stderr and
|
||||
run in the background ("daemon" mode...)
|
||||
|
||||
<LI>The class and job CGIs are currently not provided.
|
||||
|
||||
</UL>
|
||||
|
||||
CUPS has been built and tested on the following operating systems:
|
||||
|
||||
<UL>
|
||||
<LI>Digital UNIX 4.0d
|
||||
<LI>HP-UX 10.20 and 11.0
|
||||
<LI>IRIX 5.3, 6.2, 6.5.3
|
||||
<LI>Linux (RedHat 5.2)
|
||||
<LI>Solaris 2.5.1, 2.6, 2.7 (aka 7)
|
||||
</UL>
|
||||
|
||||
The client libraries and filters have been successfully compiled under
|
||||
Microsoft Windows using Visual C++ 6.0.
|
||||
|
||||
<H2><A NAME="report">Reporting Problems</A></H2>
|
||||
|
||||
If you have problems, please send an email to
|
||||
<A HREF="mailto:cups-support@cups.org">cups-support@cups.org</A>. Include
|
||||
your operating system and version, compiler and version, and any errors
|
||||
or problems you've run into.
|
||||
|
||||
<H2><A NAME="resources">Other Resources</A></H2>
|
||||
|
||||
See the CUPS web site at "http://www.cups.org" for other site links.
|
||||
|
||||
<P>You can subscribe to the CUPS mailing list by sending a message containing
|
||||
"subscribe cups" to <A HREF="mailto:majordomo@cups.org">majordomo@cups.org</A>.
|
||||
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.
|
||||
|
||||
<H2><A NAME="legal">Legal Stuff</A></H2>
|
||||
|
||||
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.
|
||||
|
||||
<P>CUPS is provided under the terms of the
|
||||
<A HREF="LICENSE.html">Aladdin Free Public License</A>
|
||||
which is located in the files "LICENSE.html" and "LICENSE.txt". For commercial
|
||||
licensing information, please contact:
|
||||
|
||||
<UL>
|
||||
Attn: CUPS Licensing Information
|
||||
<BR>Easy Software Products
|
||||
<BR>44141 Airport View Drive, Suite 204
|
||||
<BR>Hollywood, Maryland 20636-3111 USA
|
||||
|
||||
<P>Voice: +1.301.373.9603
|
||||
<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>
|
||||
</UL>
|
||||
|
||||
<P>If you're interested in a complete, commercial printing solution for UNIX,
|
||||
check out our ESP Print software at <A HREF="http://www.easysw.com/print.html">
|
||||
http://www.easysw.com/print.html</A>.
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
+130
-138
@@ -1,200 +1,192 @@
|
||||
README - CUPS v1.0.4 - 12/30/1999
|
||||
---------------------------------
|
||||
README - CUPS v1.0b1
|
||||
|
||||
CONTENTS
|
||||
|
||||
* Introduction
|
||||
* Requirements
|
||||
* Compiling CUPS
|
||||
* Configuring the Software
|
||||
* Running the Software
|
||||
* Using the Software
|
||||
* Known Problems
|
||||
* Reporting Problems
|
||||
* Other Resources
|
||||
* Legal Stuff
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
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.
|
||||
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 (IETF-IPP) as the basis for
|
||||
managing print jobs and queues. The Line Printer Daemon (LPD, RFC1179)
|
||||
and AppSocket protocols are also supported with reduced functionality.
|
||||
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 adds network printer browsing and PostScript Printer Description
|
||||
("PPD")-based printing options to support real world applications under
|
||||
UNIX.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
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.
|
||||
REQUIREMENTS
|
||||
|
||||
You'll need an ANSI C compiler to build CUPS on your system. As its name
|
||||
implies, CUPS is designed to run on the UNIX operating system, however the
|
||||
CUPS interface library and most of the filters and backends supplied with
|
||||
CUPS should also run under Microsoft® Windows®.
|
||||
|
||||
SYSTEM REQUIREMENTS
|
||||
For the image file filters you'll need the JPEG, PNG, TIFF, and ZLIB
|
||||
libraries. CUPS will build without these, but with reduced functionality.
|
||||
|
||||
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 make changes to the man pages you'll need GNU groff or another
|
||||
nroff-like package.
|
||||
|
||||
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".
|
||||
The documentation is formatted using the HTMLDOC software (again, not needed
|
||||
unless you make changes.)
|
||||
|
||||
COMPILING CUPS
|
||||
|
||||
SOFTWARE REQUIREMENTS
|
||||
CUPS uses GNU autoconf to configure the makefiles and source code for your
|
||||
system. To configure CUPS for your system type:
|
||||
|
||||
The following operating system software is required to install one of
|
||||
the binary distributions from Easy Software Products:
|
||||
% ./configure ENTER
|
||||
|
||||
- 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
|
||||
- Solaris 2.5 or higher (SPARC or Intel)
|
||||
The default installation will put the CUPS software in the /usr and /var
|
||||
directories on your system, which will overwrite any existing printing
|
||||
commands on your system. To install the CUPS software in another location
|
||||
use the --prefix option:
|
||||
|
||||
% ./configure --prefix=/usr/local ENTER
|
||||
|
||||
INSTALLING CUPS
|
||||
Once you have configured things, just type:
|
||||
|
||||
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 available from:
|
||||
% make ENTER
|
||||
|
||||
http://www.easysw.com/epm
|
||||
to build the software.
|
||||
|
||||
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.
|
||||
INSTALLING THE SOFTWARE
|
||||
|
||||
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 software type:
|
||||
|
||||
./cups.install ENTER
|
||||
% make install ENTER
|
||||
|
||||
After asking you a few yes/no questions the CUPS software will be
|
||||
installed and the scheduler will be started automatically.
|
||||
CONFIGURING THE SOFTWARE
|
||||
|
||||
Before you run CUPS for the first time you'll need to edit the CUPS
|
||||
configuration files which are normally located in /var/cups/conf.
|
||||
|
||||
READING THE DOCUMENTATION
|
||||
The cupsd.conf file configures all of the "global" server settings and
|
||||
access control. The default settings are usually appropriate for most
|
||||
environments.
|
||||
|
||||
Once you have installed the software you can access the documentation
|
||||
(and a bunch of other stuff) on-line at:
|
||||
The printers.conf file configures each printer queue. You'll need to
|
||||
add a listing for each printer on your system.
|
||||
|
||||
http://localhost:631
|
||||
The classes.conf file configures each printer class. You'll need to add
|
||||
a listing for each printer class you want.
|
||||
|
||||
If you're having trouble getting that far, the documentation is located
|
||||
in the "/usr/share/cups/doc" directory in the binary distributions, and
|
||||
under the "doc" directory in the source archives.
|
||||
The mime.types file defines all of the recognized file types. You don't
|
||||
normally have to edit this file.
|
||||
|
||||
Please read the documentation before asking questions.
|
||||
The mime.convs file defines all of the file conversion filters. You
|
||||
don't normally have to edit this file.
|
||||
|
||||
In addition to the files in the /var/cups/conf directory, you'll also need
|
||||
to copy PPD files for each printer to the /var/cups/ppd directory. If you
|
||||
don't have a PPD file for your printer, the drivers will still work, just
|
||||
with reduced functionality.
|
||||
|
||||
SETTING UP PRINTER QUEUES
|
||||
RUNNING THE SOFTWARE
|
||||
|
||||
CUPS works best with PPD (PostScript Printer Description) files. In a
|
||||
pinch you can also use System V style printer interface scripts.
|
||||
Once you have configured the software you can start the CUPS daemon by
|
||||
typing:
|
||||
|
||||
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:
|
||||
% /usr/sbin/cupsd & ENTER
|
||||
|
||||
Digital UNIX:
|
||||
USING THE SOFTWARE
|
||||
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
|
||||
Once you have installed the software, you can use the normal lp or lpr
|
||||
commands to print jobs. If you installed the software under /usr then you
|
||||
shouldn't have to reconfigure any applications to recognize the new printing
|
||||
system.
|
||||
|
||||
HP-UX:
|
||||
One of the advantages of CUPS is that you don't always have to send
|
||||
PostScript or Text files to your printers. If you have a JPEG file, you can
|
||||
just type "lp filename.jpg" and CUPS will handle converting it for you!
|
||||
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E
|
||||
You can monitor the status of jobs via the lpstat command or with your web
|
||||
browser by pointing it at "http://localhost:631".
|
||||
|
||||
IRIX:
|
||||
KNOWN PROBLEMS
|
||||
|
||||
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E
|
||||
The following known problems are being worked on and should be resolved for
|
||||
the second beta release of CUPS:
|
||||
|
||||
Linux:
|
||||
* Documentation is not completed.
|
||||
* The lpadmin command is currently not provided.
|
||||
* The lpq command is currently not provided.
|
||||
* The lpc command currently only supports the help and status commands.
|
||||
* While both GNU GhostScript and the CUPS image RIP are provided, no
|
||||
sample raster printer driver is provided. The final release of CUPS
|
||||
will include a PCL printer driver.
|
||||
* Automatic classing is currently not supported.
|
||||
* The CUPS server should disable core dumps by filters, backends, and CGI
|
||||
programs.
|
||||
* The CUPS server should increase the FD limit to the maximum allowed on
|
||||
the system.
|
||||
* The CUPS server should close stdin, stdout, and stderr and run in the
|
||||
background ("daemon" mode...)
|
||||
* The class and job CGIs are currently not provided.
|
||||
|
||||
/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
|
||||
CUPS has been built and tested on the following operating systems:
|
||||
|
||||
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 sample LaserJet driver you can use "LaserJet" and
|
||||
"laserjet.ppd".
|
||||
|
||||
For other printers and interfaces see the CUPS System Administator's
|
||||
Manual included with this software.
|
||||
|
||||
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
|
||||
|
||||
|
||||
PRINTING FILES
|
||||
|
||||
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:
|
||||
|
||||
lp -omedia=A4 -oresolution=600dpi filename
|
||||
lpr -omedia=A4 -oresolution=600dpi filename
|
||||
|
||||
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:
|
||||
|
||||
lp -oraw filename
|
||||
lpr -l filename
|
||||
|
||||
This will prevent the filters from misinterpreting your print file.
|
||||
* Digital UNIX 4.0d
|
||||
* HP-UX 10.20 and 11.0
|
||||
* IRIX 5.3, 6.2, 6.5.3
|
||||
* Linux (RedHat 5.2)
|
||||
* Solaris 2.5.1, 2.6, 2.7 (aka 7)
|
||||
|
||||
The client libraries and filters have been successfully compiled under
|
||||
Microsoft Windows using Visual C++ 6.0.
|
||||
|
||||
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. If you are running a version
|
||||
of Linux, be sure to provide the Linux distribution you have, too.
|
||||
|
||||
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.
|
||||
|
||||
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-1999 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.
|
||||
|
||||
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
|
||||
CUPS is provided under the terms of the Aladdin Free Public License which is
|
||||
located in the files "LICENSE.html" and "LICENSE.txt". For commercial
|
||||
licensing information, please contact:
|
||||
|
||||
Attn: CUPS Licensing Information
|
||||
Easy Software Products
|
||||
44141 Airport View Drive, Suite 204
|
||||
Hollywood, Maryland 20636-3111 USA
|
||||
Attn: CUPS Licensing Information
|
||||
Easy Software Products
|
||||
44141 Airport View Drive, Suite 204
|
||||
Hollywood, Maryland 20636-3111 USA
|
||||
|
||||
Voice: +1.301.373.9603
|
||||
Email: cups-info@cups.org
|
||||
WWW: http://www.cups.org
|
||||
Voice: +1.301.373.9603
|
||||
Email: cups-info@cups.org
|
||||
WWW: http://www.cups.org
|
||||
|
||||
If you're interested in a complete, commercial printing solution for UNIX,
|
||||
check out our ESP Print software at http://www.easysw.com/print.html.
|
||||
|
||||
+16
-34
@@ -14,7 +14,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
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
TARGETS = betest ipp lpd parallel serial socket
|
||||
OBJS = betest.o ipp.o lpd.o parallel.o serial.o socket.o
|
||||
TARGETS = lpd parallel serial smb socket
|
||||
OBJS = lpd.o parallel.o serial.o smb.o socket.o
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -47,36 +47,12 @@ clean:
|
||||
install:
|
||||
-$(MKDIR) $(SERVERROOT)/backend
|
||||
$(CP) $(TARGETS) $(SERVERROOT)/backend
|
||||
-$(LN) ipp $(SERVERROOT)/backend/http
|
||||
$(CHMOD) u+s $(SERVERROOT)/backend/lpd
|
||||
|
||||
#
|
||||
# betest
|
||||
#
|
||||
|
||||
betest: betest.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o betest betest.o $(LIBS)
|
||||
|
||||
betest.o: ../cups/string.h ../Makedefs
|
||||
|
||||
#
|
||||
# ipp
|
||||
#
|
||||
|
||||
ipp: ipp.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o ipp ipp.o $(LIBS)
|
||||
-$(LN) ipp http
|
||||
|
||||
ipp.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# lpd
|
||||
#
|
||||
|
||||
lpd: lpd.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
lpd: lpd.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o lpd lpd.o $(LIBS)
|
||||
|
||||
lpd.o: ../cups/cups.h ../Makedefs
|
||||
@@ -85,8 +61,7 @@ lpd.o: ../cups/cups.h ../Makedefs
|
||||
# parallel
|
||||
#
|
||||
|
||||
parallel: parallel.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
parallel: parallel.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS)
|
||||
|
||||
parallel.o: ../cups/cups.h ../Makedefs
|
||||
@@ -95,18 +70,25 @@ parallel.o: ../cups/cups.h ../Makedefs
|
||||
# serial
|
||||
#
|
||||
|
||||
serial: serial.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
serial: serial.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o serial serial.o $(LIBS)
|
||||
|
||||
serial.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# smb
|
||||
#
|
||||
|
||||
smb: smb.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o smb smb.o $(LIBS)
|
||||
|
||||
smb.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# socket
|
||||
#
|
||||
|
||||
socket: socket.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
socket: socket.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o socket socket.o $(LIBS)
|
||||
|
||||
socket.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
-652
@@ -1,652 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* IPP backend 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
|
||||
* 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 printer or server.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/string.h>
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Send a file to the printer or server.
|
||||
*
|
||||
* 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 */
|
||||
{
|
||||
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 */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
filename[1024]; /* File to print */
|
||||
int port; /* Port number (not used) */
|
||||
char password[255], /* Password info */
|
||||
uri[HTTP_MAX_URI];/* Updated URI without user/pass */
|
||||
http_status_t status; /* Status of HTTP job */
|
||||
ipp_status_t ipp_status; /* Status of IPP request */
|
||||
FILE *fp; /* File to print */
|
||||
http_t *http; /* HTTP connection */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *job_id; /* job-id attribute */
|
||||
ipp_attribute_t *copies_sup; /* copies-supported attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
struct stat fileinfo; /* File statistics */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
tbytes; /* Total bytes written */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
int copies; /* Number of copies remaining */
|
||||
|
||||
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
|
||||
argv[0]);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
if (argc == 6)
|
||||
{
|
||||
/*
|
||||
* Copy stdin to a temporary file...
|
||||
*/
|
||||
|
||||
FILE *fp; /* Temporary file */
|
||||
char buffer[8192]; /* Buffer for copying */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
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 (fwrite(buffer, 1, bytes, fp) < bytes)
|
||||
{
|
||||
perror("ERROR: unable to write to temporary file");
|
||||
fclose(fp);
|
||||
unlink(filename);
|
||||
return (1);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(filename, argv[6], sizeof(filename) - 1);
|
||||
filename[sizeof(filename) - 1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the print file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: Unable to open print file");
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
stat(filename, &fileinfo);
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
*/
|
||||
|
||||
httpSeparate(argv[0], method, username, hostname, &port, resource);
|
||||
|
||||
/*
|
||||
* Try connecting to the remote server...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
while (http == NULL);
|
||||
|
||||
/*
|
||||
* Build a URI for the printer and fill the standard IPP attributes for
|
||||
* an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it
|
||||
* might contain username:password information...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "%s://%s:%d%s", method, hostname, port, resource);
|
||||
|
||||
/*
|
||||
* 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...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
copies_sup = NULL;
|
||||
|
||||
do
|
||||
{
|
||||
/*
|
||||
* Build the IPP request...
|
||||
*/
|
||||
|
||||
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 != NULL ? language->language : "C");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
/*
|
||||
* Now fill in the HTTP request stuff...
|
||||
*/
|
||||
|
||||
httpClearFields(http);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
|
||||
if (username[0])
|
||||
{
|
||||
httpEncode64(password, username);
|
||||
httpSetField(http, HTTP_FIELD_AUTHORIZATION, password);
|
||||
}
|
||||
|
||||
sprintf(buffer, "%u", ippLength(request));
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, buffer);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/*
|
||||
* POST the request, retrying as needed...
|
||||
*/
|
||||
|
||||
if (httpPost(http, resource))
|
||||
{
|
||||
fputs("INFO: Unable to POST get-printer-attributes 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, getting 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);
|
||||
|
||||
ipp_status = response->request.status.status_code;
|
||||
|
||||
if (ipp_status > IPP_OK_CONFLICT)
|
||||
{
|
||||
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
|
||||
{
|
||||
fprintf(stderr, "ERROR: Printer will not accept print file (%x)!\n",
|
||||
ipp_status);
|
||||
status = HTTP_ERROR;
|
||||
}
|
||||
}
|
||||
else if ((copies_sup = ippFindAttribute(response, "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 */
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (status == HTTP_ERROR)
|
||||
{
|
||||
fprintf(stderr, "WARNING: Did not receive the IPP response (%d)\n",
|
||||
errno);
|
||||
status = HTTP_OK;
|
||||
ipp_status = IPP_PRINTER_BUSY;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Validate request was not accepted (%d)!\n", status);
|
||||
}
|
||||
|
||||
httpFlush(http);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (status != HTTP_OK)
|
||||
{
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
|
||||
httpClose(http);
|
||||
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
while (ipp_status > IPP_OK_CONFLICT);
|
||||
|
||||
/*
|
||||
* See if the printer supports multiple copies...
|
||||
*/
|
||||
|
||||
if (copies_sup)
|
||||
copies = 1;
|
||||
else
|
||||
copies = atoi(argv[4]);
|
||||
|
||||
/*
|
||||
* Then issue the print-job request...
|
||||
*/
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
/*
|
||||
* Build the IPP request...
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
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, 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);
|
||||
|
||||
fprintf(stderr, "DEBUG: printer-uri = \"%s\"\n", uri);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, argv[2]);
|
||||
|
||||
fprintf(stderr, "DEBUG: requesting-user-name = \"%s\"\n", argv[2]);
|
||||
|
||||
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 (cupsGetOption("raw", num_options, options))
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/vnd.cups-raw");
|
||||
else
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/octet-stream");
|
||||
|
||||
if (copies_sup)
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", atoi(argv[4]));
|
||||
|
||||
for (i = 0; i < num_options; i ++)
|
||||
{
|
||||
/*
|
||||
* Skip the "raw" option - handled above...
|
||||
*/
|
||||
|
||||
if (strcasecmp(options[i].name, "raw") == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
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 (strncasecmp(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)
|
||||
{
|
||||
/*
|
||||
* Numeric value, range, or resolution...
|
||||
*/
|
||||
|
||||
if (*s == '-')
|
||||
{
|
||||
n2 = strtol(s + 1, NULL, 0);
|
||||
ippAddRange(request, IPP_TAG_JOB, option, n, n2);
|
||||
}
|
||||
else if (*s == 'x')
|
||||
{
|
||||
n2 = strtol(s + 1, &s, 0);
|
||||
|
||||
if (strcasecmp(s, "dpc") == 0)
|
||||
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_CM, n, n2);
|
||||
else if (strcasecmp(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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now fill in the HTTP request stuff...
|
||||
*/
|
||||
|
||||
httpClearFields(http);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
|
||||
if (username[0])
|
||||
{
|
||||
httpEncode64(password, username);
|
||||
httpSetField(http, HTTP_FIELD_AUTHORIZATION, password);
|
||||
}
|
||||
|
||||
sprintf(buffer, "%u", ippLength(request) + (size_t)fileinfo.st_size);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, buffer);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/*
|
||||
* POST the request, retrying as needed...
|
||||
*/
|
||||
|
||||
httpReconnect(http);
|
||||
|
||||
if (httpPost(http, resource))
|
||||
{
|
||||
fputs("INFO: Unable to POST print request; retrying...\n", stderr);
|
||||
sleep(10);
|
||||
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...
|
||||
*/
|
||||
|
||||
rewind(fp);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 ((ipp_status = response->request.status.status_code) > 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 (%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;
|
||||
ipp_status = IPP_PRINTER_BUSY;
|
||||
|
||||
if (status == HTTP_ERROR)
|
||||
{
|
||||
fprintf(stderr, "WARNING: Did not receive the IPP response (%d)\n",
|
||||
errno);
|
||||
status = HTTP_OK;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "ERROR: Print request was not accepted (%d)!\n", status);
|
||||
}
|
||||
|
||||
httpFlush(http);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (request != NULL)
|
||||
ippDelete(request);
|
||||
if (response != NULL)
|
||||
ippDelete(response);
|
||||
|
||||
if (ipp_status <= IPP_OK_CONFLICT)
|
||||
{
|
||||
fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
|
||||
copies --;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Free memory...
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
|
||||
/*
|
||||
* Close and remove the temporary file if necessary...
|
||||
*/
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if (argc < 7)
|
||||
unlink(filename);
|
||||
|
||||
/*
|
||||
* Return the queue status...
|
||||
*/
|
||||
|
||||
return (status != HTTP_OK);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+28
-43
@@ -14,7 +14,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
|
||||
@@ -107,16 +107,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
if ((fp = fopen(cupsTempFile(filename, sizeof(filename)), "w")) == NULL)
|
||||
if ((fp = fopen(tmpnam(filename), "w")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to create temporary file");
|
||||
perror("lpd: unable to create temporary file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
if (fwrite(buffer, 1, bytes, fp) < bytes)
|
||||
{
|
||||
perror("ERROR: unable to write to temporary file");
|
||||
perror("lpd: unable to write to temporary file");
|
||||
fclose(fp);
|
||||
unlink(filename);
|
||||
return (1);
|
||||
@@ -125,10 +125,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
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...
|
||||
@@ -140,17 +137,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Queue the job...
|
||||
*/
|
||||
|
||||
if (argc > 6)
|
||||
{
|
||||
status = lpd_queue(hostname, resource + 1, filename,
|
||||
argv[2] /* user */, atoi(argv[4]) /* copies */);
|
||||
|
||||
if (!status)
|
||||
fprintf(stderr, "PAGE: 1 %d\n", atoi(argv[4]));
|
||||
}
|
||||
else
|
||||
status = lpd_queue(hostname, resource + 1, filename,
|
||||
argv[2] /* user */, 1);
|
||||
status = lpd_queue(hostname, resource + 1, filename,
|
||||
argv[2] /* user */, atoi(argv[4]) /* copies */);
|
||||
|
||||
/*
|
||||
* Remove the temporary file if necessary...
|
||||
@@ -187,10 +175,10 @@ 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 %02.2x %s", buf[0], buf + 1);
|
||||
fprintf(stderr, "lpd: lpd_command %02.2x %s", buf[0], buf + 1);
|
||||
|
||||
/*
|
||||
* Send the command...
|
||||
@@ -206,7 +194,7 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
return (-1);
|
||||
|
||||
fprintf(stderr, "DEBUG: lpd_command returning %d\n", status);
|
||||
fprintf(stderr, "lpd: lpd_command returning %d\n", status);
|
||||
|
||||
return (status);
|
||||
}
|
||||
@@ -262,9 +250,8 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
{
|
||||
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)
|
||||
@@ -288,7 +275,7 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
sleep(30);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -301,13 +288,13 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
|
||||
if (stat(filename, &filestats))
|
||||
{
|
||||
perror("ERROR: unable to stat print file");
|
||||
perror("lpd: unable to stat print file");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if ((fp = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
perror("ERROR: unable to open print file for reading");
|
||||
perror("lpd: unable to open print file for reading");
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -319,31 +306,29 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
lpd_command(fd, "\002%s\n", printer); /* Receive print job(s) */
|
||||
|
||||
gethostname(localhost, sizeof(localhost));
|
||||
localhost[31] = '\0'; /* RFC 1179, Section 7.2 - host name < 32 chars */
|
||||
if (strchr(localhost, '.') != NULL)
|
||||
*strchr(localhost, '.') = '\0';
|
||||
|
||||
snprintf(control, sizeof(control), "H%s\nP%s\n", localhost, user);
|
||||
sprintf(control, "H%s\nP%s\n", localhost, user);
|
||||
cptr = control + strlen(control);
|
||||
|
||||
while (copies > 0)
|
||||
{
|
||||
|
||||
snprintf(cptr, sizeof(control) - (cptr - control), "ldfA%03.3d%s\n",
|
||||
getpid() % 1000, localhost);
|
||||
sprintf(cptr, "ldfA%03.3d%s\n", getpid() % 1000, localhost);
|
||||
cptr += strlen(cptr);
|
||||
copies --;
|
||||
}
|
||||
|
||||
snprintf(cptr, sizeof(control) - (cptr - control),
|
||||
"UdfA%03.3d%s\nNdfA%03.3d%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);
|
||||
fprintf(stderr, "lpd: Control file is:\n%s", 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));
|
||||
fprintf(stderr, "lpd: Sending control file (%d bytes)\n", strlen(control));
|
||||
|
||||
if (send(fd, control, strlen(control) + 1, 0) < (strlen(control) + 1))
|
||||
{
|
||||
@@ -359,12 +344,12 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
* Send the print file...
|
||||
*/
|
||||
|
||||
fputs("INFO: Control file sent successfully\n", stderr);
|
||||
fputs("lpd: Control file sent successfully\n", stderr);
|
||||
|
||||
lpd_command(fd, "\003%u dfA%03.3d%s\n", (unsigned)filestats.st_size,
|
||||
lpd_command(fd, "\003%d dfA%03.3d%s\n", filestats.st_size,
|
||||
getpid() % 1000, localhost);
|
||||
|
||||
fprintf(stderr, "INFO: Sending data file (%u bytes)\n",
|
||||
fprintf(stderr, "lpd: Sending data file (%u bytes)\n",
|
||||
(unsigned)filestats.st_size);
|
||||
|
||||
tbytes = 0;
|
||||
@@ -390,7 +375,7 @@ lpd_queue(char *hostname, /* I - Host to connect to */
|
||||
fprintf(stderr, "ERROR: Remote host did not accept data file (%d)\n",
|
||||
status);
|
||||
else
|
||||
fputs("INFO: Data file sent successfully\n", stderr);
|
||||
fputs("lpd: Data file sent successfully\n", stderr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+14
-31
@@ -14,7 +14,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
|
||||
@@ -63,7 +63,6 @@ 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 error; /* Error code (if any) */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
@@ -84,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
|
||||
{
|
||||
/*
|
||||
@@ -99,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]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -149,34 +143,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* 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;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
if (write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+14
-31
@@ -14,7 +14,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
|
||||
@@ -66,7 +66,6 @@ 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 error; /* Error code (if any) */
|
||||
size_t nbytes, /* Number of bytes written */
|
||||
@@ -87,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
|
||||
{
|
||||
/*
|
||||
@@ -102,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]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -267,34 +261,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* 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;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
|
||||
tbytes = 0;
|
||||
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
{
|
||||
/*
|
||||
* Write the print data to the printer...
|
||||
*/
|
||||
|
||||
if (write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
perror("ERROR: Unable to send print file to printer");
|
||||
break;
|
||||
}
|
||||
else
|
||||
tbytes += nbytes;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Backend test program for the Common UNIX Printing System (CUPS).
|
||||
* Server Message Block backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
@@ -14,7 +14,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
|
||||
@@ -23,63 +23,44 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Run the named backend.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <cups/string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Run the named backend.
|
||||
* 'main()' - Send a file to the printer or server.
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* betest device-uri job-id user title copies options [file]
|
||||
* printer-uri job-id user title copies options [file]
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments (7 or 8) */
|
||||
main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
char backend[255]; /* Method in URI */
|
||||
|
||||
|
||||
if (argc < 7 || argc > 8)
|
||||
if (argc < 6 || argc > 7)
|
||||
{
|
||||
fputs("Usage: betest device-uri job-id user title copies options [file]\n",
|
||||
stderr);
|
||||
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
|
||||
argv[0]);
|
||||
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);
|
||||
fputs("ERROR: Backend not implemented yet!\n", stderr);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+72
-94
@@ -66,7 +66,6 @@ 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 fd; /* AppSocket */
|
||||
int error; /* Error code (if any) */
|
||||
@@ -94,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
|
||||
{
|
||||
/*
|
||||
@@ -109,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]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -141,107 +135,91 @@ 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 (;;)
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
perror("ERROR: Unable to create socket");
|
||||
return (1);
|
||||
}
|
||||
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 (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 30 seconds...\n",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("ERROR: Unable to connect to printer");
|
||||
sleep(30);
|
||||
}
|
||||
if (error == ECONNREFUSED)
|
||||
{
|
||||
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...\n",
|
||||
hostname);
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
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...
|
||||
*/
|
||||
|
||||
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);
|
||||
|
||||
|
||||
+7
-20
@@ -14,7 +14,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
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
TARGETS = lpc lpq lpr lprm
|
||||
OBJS = lpc.o lpq.o lpr.o lprm.o
|
||||
TARGETS = lpc lpr lprm
|
||||
OBJS = lpc.o lpr.o lprm.o
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -47,35 +47,23 @@ clean:
|
||||
install:
|
||||
-$(MKDIR) $(BINDIR)
|
||||
-$(MKDIR) $(SBINDIR)
|
||||
$(CP) lpq lpr lprm $(BINDIR)
|
||||
$(CP) lpr lprm $(BINDIR)
|
||||
$(CP) lpc $(SBINDIR)
|
||||
|
||||
#
|
||||
# lpc
|
||||
#
|
||||
|
||||
lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
lpc: lpc.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o lpc lpc.o $(LIBS)
|
||||
|
||||
lpc.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# lpq
|
||||
#
|
||||
|
||||
lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpq lpq.o $(LIBS)
|
||||
|
||||
lpq.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
#
|
||||
# lpr
|
||||
#
|
||||
|
||||
lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
lpr: lpr.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
|
||||
|
||||
lpr.o: ../cups/cups.h ../Makedefs
|
||||
@@ -84,8 +72,7 @@ lpr.o: ../cups/cups.h ../Makedefs
|
||||
# lprm
|
||||
#
|
||||
|
||||
lprm: lprm.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
lprm: lprm.o ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
|
||||
|
||||
lprm.o: ../cups/cups.h ../Makedefs
|
||||
|
||||
+11
-26
@@ -70,7 +70,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* Connect to the scheduler...
|
||||
*/
|
||||
|
||||
http = httpConnect(cupsServer(), ippPort());
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
@@ -87,14 +87,8 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
printf("lpc> ");
|
||||
while (fgets(line, sizeof(line), stdin) != NULL)
|
||||
while (gets(line) != NULL)
|
||||
{
|
||||
/*
|
||||
* Strip the trailing newline...
|
||||
*/
|
||||
|
||||
line[strlen(line) - 1] = '\0';
|
||||
|
||||
/*
|
||||
* Find any options in the string...
|
||||
*/
|
||||
@@ -231,7 +225,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
/* Printer URI */
|
||||
|
||||
|
||||
DEBUG_printf(("show_status(%08x, %08x)\n", http, dests));
|
||||
DEBUG_printf(("show_printers(%08x, %08x)\n", http, dests));
|
||||
|
||||
if (http == NULL)
|
||||
return;
|
||||
@@ -263,7 +257,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/printers/")) != NULL)
|
||||
{
|
||||
DEBUG_puts("show_status: request succeeded...");
|
||||
DEBUG_puts("show_printers: request succeeded...");
|
||||
|
||||
/*
|
||||
* Loop through the printers returned in the list and display
|
||||
@@ -403,16 +397,15 @@ 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);
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language->language);
|
||||
|
||||
snprintf(printer_uri, sizeof(printer_uri),
|
||||
"ipp://localhost/printers/%s", printer);
|
||||
sprintf(printer_uri, "http://localhost/printers/%s", printer);
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, printer_uri);
|
||||
|
||||
@@ -434,15 +427,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");
|
||||
|
||||
@@ -1,369 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* "lpq" command for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* 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
|
||||
* 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:
|
||||
*
|
||||
* main() - Parse options and commands.
|
||||
* show_jobs() - Show jobs.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static int show_jobs(http_t *, const char *, const char *, const int,
|
||||
const int);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Parse options and commands.
|
||||
*/
|
||||
|
||||
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 */
|
||||
const char *dest, /* Desired printer */
|
||||
*user; /* Desired user */
|
||||
int id, /* Desired job ID */
|
||||
interval, /* Reporting interval */
|
||||
longstatus; /* Show file details */
|
||||
|
||||
/*
|
||||
* Connect to the scheduler...
|
||||
*/
|
||||
|
||||
http = httpConnect(cupsServer(), ippPort());
|
||||
|
||||
/*
|
||||
* Check for command-line options...
|
||||
*/
|
||||
|
||||
dest = cupsGetDefault();
|
||||
user = NULL;
|
||||
id = 0;
|
||||
interval = 0;
|
||||
longstatus = 0;
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
if (argv[i][0] == '+')
|
||||
interval = atoi(argv[i] + 1);
|
||||
else if (argv[i][0] == '-')
|
||||
{
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case 'P' : /* Printer */
|
||||
if (argv[i][2])
|
||||
dest = argv[i] + 2;
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
dest = argv[i];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'l' : /* Long status */
|
||||
longstatus = 1;
|
||||
break;
|
||||
|
||||
default :
|
||||
fputs("Usage: lpq [-P dest] [-l] [+interval]\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
else if (isdigit(argv[i][0]))
|
||||
id = atoi(argv[i]);
|
||||
else
|
||||
user = argv[i];
|
||||
|
||||
/*
|
||||
* Show the status in a loop...
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
{
|
||||
i = show_jobs(http, dest, user, id, longstatus);
|
||||
|
||||
if (i && interval)
|
||||
sleep(interval);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the connection to the server and return...
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'show_jobs()' - Show jobs.
|
||||
*/
|
||||
|
||||
static int /* O - Number of jobs in queue */
|
||||
show_jobs(http_t *http, /* I - HTTP connection to server */
|
||||
const char *dest, /* I - Destination */
|
||||
const char *user, /* I - User */
|
||||
const int id, /* I - Job ID */
|
||||
const int longstatus)/* I - 1 if long report desired */
|
||||
{
|
||||
ipp_t *request, /* IPP Request */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
const char *jobdest, /* Pointer into job-printer-uri */
|
||||
*jobuser, /* Pointer to job-originating-user-name */
|
||||
*jobname; /* Pointer to job-name */
|
||||
ipp_jstate_t jobstate; /* job-state */
|
||||
int jobid, /* job-id */
|
||||
jobsize, /* job-k-octets */
|
||||
jobpriority, /* job-priority */
|
||||
jobcount, /* Number of jobs */
|
||||
rank; /* Rank of job */
|
||||
char resource[1024]; /* Resource string */
|
||||
static const char *ranks[10] =/* Ranking strings */
|
||||
{
|
||||
"th",
|
||||
"st",
|
||||
"nd",
|
||||
"rd",
|
||||
"th",
|
||||
"th",
|
||||
"th",
|
||||
"th",
|
||||
"th",
|
||||
"th"
|
||||
};
|
||||
|
||||
|
||||
DEBUG_printf(("show_jobs(%08x, %08x, %08x, %d, %d)\n", http, dest, user, id,
|
||||
longstatus));
|
||||
|
||||
if (http == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Build an IPP_GET_JOBS or IPP_GET_JOB_ATTRIBUTES request, which requires
|
||||
* the following attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri or printer-uri
|
||||
* [
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
if (dest == NULL)
|
||||
{
|
||||
if (id)
|
||||
sprintf(resource, "ipp://localhost/jobs/%d", id);
|
||||
else
|
||||
strcpy(resource, "ipp://localhost/jobs");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
|
||||
NULL, resource);
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(resource, sizeof(resource), "ipp://localhost/printers/%s", dest);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
|
||||
NULL, resource);
|
||||
}
|
||||
|
||||
if (user)
|
||||
{
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
||||
"requesting-user-name", NULL, user);
|
||||
ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, "/jobs/")) != NULL)
|
||||
{
|
||||
rank = 1;
|
||||
|
||||
/*
|
||||
* Loop through the job list and display them...
|
||||
*/
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
* Pull the needed attributes from this job...
|
||||
*/
|
||||
|
||||
jobid = 0;
|
||||
jobsize = 0;
|
||||
jobpriority = 50;
|
||||
jobstate = IPP_JOB_PENDING;
|
||||
jobname = "untitled";
|
||||
jobuser = NULL;
|
||||
jobdest = 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)
|
||||
jobsize = attr->values[0].integer * 1024;
|
||||
|
||||
if (strcmp(attr->name, "job-priority") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobpriority = attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-state") == 0 &&
|
||||
attr->value_tag == IPP_TAG_ENUM)
|
||||
jobstate = (ipp_jstate_t)attr->values[0].integer;
|
||||
|
||||
if (strcmp(attr->name, "job-printer-uri") == 0 &&
|
||||
attr->value_tag == IPP_TAG_URI)
|
||||
if ((jobdest = strrchr(attr->values[0].string.text, '/')) != NULL)
|
||||
jobdest ++;
|
||||
|
||||
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
jobuser = attr->values[0].string.text;
|
||||
|
||||
if (strcmp(attr->name, "job-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
jobname = attr->values[0].string.text;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have everything needed...
|
||||
*/
|
||||
|
||||
if (jobdest == NULL || jobid == 0)
|
||||
{
|
||||
if (attr == NULL)
|
||||
break;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
jobcount ++;
|
||||
|
||||
/*
|
||||
* Display the job...
|
||||
*/
|
||||
|
||||
if (longstatus)
|
||||
{
|
||||
puts("");
|
||||
|
||||
if (jobstate == IPP_JOB_PROCESSING)
|
||||
printf("%s: active\t\t\t\t ", jobuser);
|
||||
else
|
||||
{
|
||||
printf("%s: %d%s\t\t\t\t ", jobuser, rank, ranks[rank % 10]);
|
||||
rank ++;
|
||||
}
|
||||
|
||||
printf("[job %03dlocalhost]\n", jobid);
|
||||
printf("\t%-32.32s %d bytes\n", jobname, jobsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (jobstate == IPP_JOB_PROCESSING)
|
||||
printf("active\t");
|
||||
else
|
||||
{
|
||||
printf("%d%s\t", rank, ranks[rank % 10]);
|
||||
rank ++;
|
||||
}
|
||||
|
||||
printf(" %-4d %-10.10s %-6d %-18.18s %d bytes\n", jobpriority, jobuser,
|
||||
jobid, jobname, jobsize);
|
||||
}
|
||||
if (attr == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
return (jobcount);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+10
-96
@@ -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.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -36,25 +35,6 @@
|
||||
#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,24 +45,20 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int job_id; /* Job ID */
|
||||
const char *dest; /* Destination printer */
|
||||
const char *title; /* Job title */
|
||||
char *dest; /* Destination printer */
|
||||
char *title; /* Job title */
|
||||
int priority; /* Job priority (1-100) */
|
||||
int num_copies; /* Number of copies per file */
|
||||
int num_files; /* Number of files printed */
|
||||
int num_options; /* Number of options */
|
||||
cups_option_t *options; /* Options */
|
||||
int silent, /* Silent or verbose output? */
|
||||
deletefile; /* Delete file after print? */
|
||||
int silent; /* Silent or verbose output? */
|
||||
char tempfile[1024]; /* Temporary file for printing from stdin */
|
||||
char buffer[8192]; /* Copy buffer */
|
||||
FILE *temp; /* Temporary file pointer */
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction action; /* Signal action */
|
||||
#endif /* HAVE_SIGACTION */
|
||||
|
||||
|
||||
silent = 0;
|
||||
deletefile = 0;
|
||||
dest = cupsGetDefault();
|
||||
num_options = 0;
|
||||
options = NULL;
|
||||
@@ -108,16 +84,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
argv[i][1]);
|
||||
break;
|
||||
|
||||
case 'o' : /* Option */
|
||||
if (argv[i][2] != '\0')
|
||||
num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
|
||||
else
|
||||
{
|
||||
i ++;
|
||||
num_options = cupsParseOptions(argv[i], num_options, &options);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'l' : /* Literal/raw */
|
||||
num_options = cupsParseOptions("raw", num_options, &options);
|
||||
break;
|
||||
@@ -130,14 +96,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
case 's' : /* Don't use symlinks */
|
||||
break;
|
||||
|
||||
case 'm' : /* Mail on completion */
|
||||
case 'm' : /* mail on completion */
|
||||
fputs("Warning: email notification is not supported!\n", stderr);
|
||||
break;
|
||||
|
||||
case 'r' : /* Remove file after printing */
|
||||
deletefile = 1;
|
||||
break;
|
||||
|
||||
case 'P' : /* Destination printer or class */
|
||||
if (argv[i][2] != '\0')
|
||||
dest = argv[i] + 2;
|
||||
@@ -212,12 +174,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if (job_id < 1)
|
||||
{
|
||||
fprintf(stderr, "lpr: unable to print file \'%s\' - error code %x.\n",
|
||||
argv[i], cupsLastError());
|
||||
fprintf(stderr, "lpr: unable to print file \'%s\'.\n", argv[i]);
|
||||
return (1);
|
||||
}
|
||||
else if (deletefile)
|
||||
unlink(argv[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -232,26 +191,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
return (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;
|
||||
|
||||
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 */
|
||||
|
||||
temp = fopen(cupsTempFile(tempfile, sizeof(tempfile)), "w");
|
||||
temp = fopen(tmpnam(tempfile), "w");
|
||||
|
||||
if (temp == NULL)
|
||||
{
|
||||
@@ -267,7 +207,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
fputs("lpr: standard input is empty, so no job has been sent.\n", stderr);
|
||||
fputs("lpr: stdin is empty, so no job has been sent.\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -276,12 +216,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
else
|
||||
job_id = cupsPrintFile(dest, tempfile, "(stdin)", num_options, options);
|
||||
|
||||
unlink(tempfile);
|
||||
|
||||
if (job_id < 1)
|
||||
{
|
||||
fprintf(stderr, "lpr: unable to print standard input - error code %x.\n",
|
||||
cupsLastError());
|
||||
fprintf(stderr, "lpr: unable to print file \'%s\'.\n", argv[i]);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -290,29 +227,6 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
|
||||
|
||||
#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$".
|
||||
*/
|
||||
|
||||
+5
-28
@@ -14,7 +14,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
|
||||
@@ -49,7 +49,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
http_t *http; /* HTTP connection to server */
|
||||
int i; /* Looping var */
|
||||
int job_id; /* Job ID */
|
||||
const char *dest; /* Destination printer */
|
||||
char *dest; /* Destination printer */
|
||||
char uri[1024]; /* Printer or job URI */
|
||||
ipp_t *request; /* IPP request */
|
||||
ipp_t *response; /* IPP response */
|
||||
@@ -65,13 +65,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
job_id = 0;
|
||||
dest = cupsGetDefault();
|
||||
response = NULL;
|
||||
http = NULL;
|
||||
|
||||
/*
|
||||
* Open a connection to the server...
|
||||
*/
|
||||
|
||||
if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
|
||||
if ((http = httpConnect("localhost", ippPort())) == NULL)
|
||||
{
|
||||
fputs("lprm: Unable to contact server!\n", stderr);
|
||||
return (1);
|
||||
@@ -147,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, "http://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",
|
||||
@@ -155,14 +154,11 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(uri, "ipp://localhost/jobs/%d", job_id);
|
||||
sprintf(uri, "http://localhost/jobs/%d", job_id);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
|
||||
uri);
|
||||
}
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
||||
"requesting-user-name", NULL, cupsUser());
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
@@ -173,26 +169,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
response = cupsDoRequest(http, request, "/jobs/");
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs("lprm: Unable to cancel job(s)!\n", stderr);
|
||||
|
||||
+4
-24
@@ -14,7 +14,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
|
||||
@@ -24,7 +24,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
TARGETS = classes.cgi jobs.cgi printers.cgi
|
||||
#TARGETS = classes.cgi jobs.cgi printers.cgi
|
||||
TARGETS = printers.cgi
|
||||
OBJS = classes.o jobs.o printers.o
|
||||
|
||||
#
|
||||
@@ -48,32 +49,11 @@ install:
|
||||
-$(MKDIR) $(SERVERROOT)/cgi-bin
|
||||
$(CP) $(TARGETS) $(SERVERROOT)/cgi-bin
|
||||
|
||||
#
|
||||
# classes.cgi
|
||||
#
|
||||
|
||||
classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(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)
|
||||
echo Linking $@...
|
||||
$(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)
|
||||
echo Linking $@...
|
||||
printers.cgi: printers.o ../Makedefs ../cups/libcups.a
|
||||
$(CC) $(LDFLAGS) -o $@ printers.o $(LIBS)
|
||||
|
||||
$(OBJS): ../Makedefs ../cups/cups.h ../cups/ipp.h ../cups/language.h
|
||||
|
||||
@@ -1,486 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Class status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* 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
|
||||
* 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:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* show_class_list() - Show a list of classes...
|
||||
* show_class_info() - Show class information.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
#include <config.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);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Main entry for CGI.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
cups_lang_t *language; /* Language information */
|
||||
char *name; /* Class name */
|
||||
http_t *http; /* Connection to the server */
|
||||
|
||||
|
||||
/*
|
||||
* Get the request language...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
/*
|
||||
* Connect to the HTTP server...
|
||||
*/
|
||||
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
/*
|
||||
* Tell the client to expect HTML...
|
||||
*/
|
||||
|
||||
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
|
||||
|
||||
/*
|
||||
* See if we need to show a list of classes or the status of a
|
||||
* single class...
|
||||
*/
|
||||
|
||||
name = argv[0];
|
||||
if (strcmp(name, "/") == 0 || strcmp(name, "classes.cgi") == 0)
|
||||
name = NULL;
|
||||
|
||||
/*
|
||||
* Print the standard header...
|
||||
*/
|
||||
|
||||
puts("<HTML>");
|
||||
puts("<HEAD>");
|
||||
if (name)
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
|
||||
else
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
|
||||
printf("<TITLE>%s on %s - " CUPS_SVERSION "</TITLE>\n",
|
||||
name == NULL ? "Classes" : name, getenv("SERVER_NAME"));
|
||||
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
|
||||
puts("<MAP NAME=\"navbar\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
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\">");
|
||||
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>");
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"540\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
|
||||
printf("<H1>%s on %s</H1>\n", name == NULL ? "Classes" : name,
|
||||
getenv("SERVER_NAME"));
|
||||
fflush(stdout);
|
||||
|
||||
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>");
|
||||
|
||||
/*
|
||||
* Show the information...
|
||||
*/
|
||||
|
||||
if (name == NULL)
|
||||
show_class_list(http, language);
|
||||
else
|
||||
show_class_info(http, language, name);
|
||||
|
||||
/*
|
||||
* Write a standard trailer...
|
||||
*/
|
||||
|
||||
puts("</TABLE>");
|
||||
puts("</CENTER>");
|
||||
|
||||
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...
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
cupsLangFree(language);
|
||||
|
||||
/*
|
||||
* Return with no errors...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '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, "/")) != 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);
|
||||
|
||||
snprintf(uri, sizeof(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, "/")) == 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:");
|
||||
strncpy(uri + 5, strchr(attr->values[0].string.text, '/'), sizeof(uri) - 6);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
|
||||
jobs = cupsDoRequest(http, request, "/");
|
||||
}
|
||||
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,584 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Job status CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* 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
|
||||
* 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:
|
||||
*
|
||||
* main() - Main entry for CGI.
|
||||
* show_job_list() - Show a list of jobs...
|
||||
* show_job_info() - Show job information.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
#include <config.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);
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Main entry for CGI.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
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 */
|
||||
|
||||
|
||||
/*
|
||||
* Get the request language...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
/*
|
||||
* Connect to the HTTP server...
|
||||
*/
|
||||
|
||||
http = httpConnect("localhost", ippPort());
|
||||
|
||||
/*
|
||||
* Tell the client to expect HTML...
|
||||
*/
|
||||
|
||||
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
|
||||
|
||||
/*
|
||||
* See if we need to show a list of jobs or the status of a
|
||||
* single job...
|
||||
*/
|
||||
|
||||
job = argv[0];
|
||||
if (strcmp(job, "/") == 0 || strcmp(job, "jobs.cgi") == 0)
|
||||
job = NULL;
|
||||
|
||||
/*
|
||||
* Print the standard header...
|
||||
*/
|
||||
|
||||
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 - " CUPS_SVERSION "</TITLE>\n",
|
||||
job == NULL ? "Jobs" : job, getenv("SERVER_NAME"));
|
||||
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
|
||||
puts("<MAP NAME=\"navbar\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
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\">");
|
||||
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>");
|
||||
puts("<IMG SRC=\"/images/navbar.gif\" WIDTH=\"540\" HEIGHT=\"40\" USEMAP=\"#navbar\" BORDER=0>");
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
/*
|
||||
* 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...
|
||||
*/
|
||||
|
||||
httpClose(http);
|
||||
cupsLangFree(language);
|
||||
|
||||
/*
|
||||
* Return with no errors...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '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, "/")) != 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);
|
||||
|
||||
snprintf(uri, sizeof(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, "/")) == 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)
|
||||
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$".
|
||||
*/
|
||||
+148
-175
@@ -38,7 +38,6 @@
|
||||
#include <cups/cups.h>
|
||||
#include <cups/language.h>
|
||||
#include <cups/debug.h>
|
||||
#include <config.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -63,6 +62,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
http_t *http; /* Connection to the server */
|
||||
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
/*
|
||||
* Get the request language...
|
||||
*/
|
||||
@@ -100,24 +100,15 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
|
||||
else
|
||||
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
|
||||
printf("<TITLE>%s on %s - " CUPS_SVERSION "</TITLE>\n",
|
||||
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\">");
|
||||
#ifdef ESPPRINTPRO
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
|
||||
#else
|
||||
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\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
|
||||
#endif /* ESPPRINTPRO */
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,100,35\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"115,10,205,35\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"220,10,280,35\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"295,10,470,35\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
|
||||
puts("<AREA SHAPE=\"RECT\" COORDS=\"485,10,590,35\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
|
||||
puts("</MAP>");
|
||||
puts("</HEAD>");
|
||||
puts("<BODY>");
|
||||
@@ -206,17 +197,17 @@ show_printer_list(http_t *http, /* I - HTTP connection */
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
|
||||
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);
|
||||
attr = 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, "/")) != NULL)
|
||||
if ((response = cupsDoRequest(http, request, "/printers/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Loop through the printers returned in the list and display
|
||||
@@ -274,7 +265,7 @@ show_printer_info(http_t *http,
|
||||
char *message; /* Printer state message */
|
||||
int accepting; /* Accepting requests? */
|
||||
ipp_pstate_t pstate; /* Printer state */
|
||||
char uri[HTTP_MAX_URI];/* Printer URI */
|
||||
char uri[1024]; /* Printer URI */
|
||||
|
||||
|
||||
/*
|
||||
@@ -297,7 +288,7 @@ show_printer_info(http_t *http,
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", name);
|
||||
sprintf(uri, "ipp://localhost/printers/%s", name);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
||||
|
||||
@@ -305,181 +296,163 @@ show_printer_info(http_t *http,
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) == 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:");
|
||||
strncpy(uri + 5, strchr(attr->values[0].string.text, '/'), sizeof(uri) - 6);
|
||||
uri[sizeof(uri) - 1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
if ((response = cupsDoRequest(http, request, uri + 15)) != NULL)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
* Grab the needed printer attributes...
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
|
||||
pstate = (ipp_pstate_t)attr->values[0].integer;
|
||||
else
|
||||
pstate = IPP_PRINTER_IDLE;
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
if ((attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT)) != NULL)
|
||||
message = attr->values[0].string.text;
|
||||
else
|
||||
message = NULL;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL,
|
||||
cupsLangEncoding(language));
|
||||
if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs",
|
||||
IPP_TAG_BOOLEAN)) != NULL)
|
||||
accepting = attr->values[0].boolean;
|
||||
else
|
||||
accepting = 1;
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language->language);
|
||||
/*
|
||||
* Display the printer entry...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
puts("<TR>");
|
||||
|
||||
jobs = cupsDoRequest(http, request, "/");
|
||||
}
|
||||
else
|
||||
jobs = NULL;
|
||||
printf("<TD VALIGN=TOP><A HREF=\"/printers/%s\">%s</A></TD>\n", name, name);
|
||||
|
||||
puts("<TD VALIGN=\"TOP\">");
|
||||
jobcount = 0;
|
||||
printf("<TD VALIGN=TOP><IMG SRC=\"/images/printer-%s.gif\" ALIGN=\"LEFT\">\n",
|
||||
pstate == IPP_PRINTER_IDLE ? "idle" :
|
||||
pstate == IPP_PRINTER_PROCESSING ? "processing" : "stopped");
|
||||
|
||||
if (jobs != NULL)
|
||||
{
|
||||
char *username; /* Pointer to job-originating-user-name */
|
||||
int jobid, /* job-id */
|
||||
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;
|
||||
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL,
|
||||
cupsLangEncoding(language));
|
||||
|
||||
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language->language);
|
||||
|
||||
attr = 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)
|
||||
for (attr = jobs->attrs; attr != NULL; attr = attr->next)
|
||||
{
|
||||
if (strcmp(attr->name, "job-id") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobid = attr->values[0].integer;
|
||||
/*
|
||||
* Skip leading attributes until we hit a job...
|
||||
*/
|
||||
|
||||
if (strcmp(attr->name, "job-k-octets") == 0 &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
size = attr->values[0].integer;
|
||||
while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
|
||||
attr = attr->next;
|
||||
|
||||
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
username = attr->values[0].string.text;
|
||||
if (attr == NULL)
|
||||
break;
|
||||
|
||||
attr = attr->next;
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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(jobs);
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
if (jobcount == 0)
|
||||
puts("None");
|
||||
puts("</TD>");
|
||||
puts("</TR>");
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+3
-13
@@ -28,8 +28,7 @@ include ../Makedefs
|
||||
# Config files...
|
||||
#
|
||||
|
||||
KEEP = classes.conf cupsd.conf printers.conf
|
||||
REPLACE = mime.convs mime.types
|
||||
FILES = classes.conf cupsd.conf mime.convs mime.types printers.conf
|
||||
|
||||
#
|
||||
# Make everything...
|
||||
@@ -49,22 +48,13 @@ clean:
|
||||
|
||||
install:
|
||||
-$(MKDIR) $(SERVERROOT)/conf
|
||||
for file in $(KEEP); do \
|
||||
if test -r $(SERVERROOT)/conf/$$file ; then \
|
||||
for file in $(FILES); do \
|
||||
if test -e $(SERVERROOT)/conf/$$file ; then \
|
||||
$(CP) $$file $(SERVERROOT)/conf/$$file.N ; \
|
||||
else \
|
||||
$(CP) $$file $(SERVERROOT)/conf ; \
|
||||
fi ; \
|
||||
done
|
||||
for file in $(REPLACE); do \
|
||||
if test -r $(SERVERROOT)/conf/$$file ; then \
|
||||
$(MV) $(SERVERROOT)/conf/$$file $(SERVERROOT)/conf/$$file.O ; \
|
||||
fi ; \
|
||||
$(CP) $$file $(SERVERROOT)/conf ; \
|
||||
done
|
||||
if test -r /etc/printcap -a ! -r /etc/printcap.O; then \
|
||||
$(CP) /etc/printcap /etc/printcap.O ; \
|
||||
fi
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
+2
-9
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: classes.conf 678 1999-09-22 18:10:55Z mike $"
|
||||
# "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $"
|
||||
#
|
||||
# Sample class configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
@@ -59,13 +59,6 @@
|
||||
|
||||
#Location Room 101 in the activities building
|
||||
|
||||
#
|
||||
# Accepting: is the class accepting jobs?
|
||||
#
|
||||
#Accepting Yes
|
||||
#Accepting No
|
||||
#
|
||||
|
||||
#
|
||||
# Printer: adds a printer to the class.
|
||||
#
|
||||
@@ -75,5 +68,5 @@
|
||||
#</Class>
|
||||
|
||||
#
|
||||
# End of "$Id: classes.conf 678 1999-09-22 18:10:55Z mike $".
|
||||
# End of "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $".
|
||||
#
|
||||
|
||||
+10
-47
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $"
|
||||
# "$Id: cupsd.conf 349 1999-05-21 20:53:02Z mike $"
|
||||
#
|
||||
# Sample configuration file for the Common UNIX Printing System (CUPS)
|
||||
# scheduler.
|
||||
@@ -53,13 +53,6 @@
|
||||
#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
|
||||
@@ -70,25 +63,20 @@ Port 631
|
||||
# program is run...
|
||||
#
|
||||
|
||||
#User lp
|
||||
#Group sys
|
||||
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.)
|
||||
# access.
|
||||
#
|
||||
|
||||
#SystemGroup sys
|
||||
SystemGroup sys
|
||||
|
||||
#
|
||||
# ServerName: the hostname of your server, as advertised to the world.
|
||||
# By default CUPS will use the hostname of the system.
|
||||
#
|
||||
# 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
|
||||
|
||||
@@ -276,18 +264,10 @@ LogLevel info
|
||||
# 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).
|
||||
# (1 tile = 256x256 pixels.) Defaults to "32m" (32 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
|
||||
#RIPCache: 32m
|
||||
|
||||
#
|
||||
# Access permissions for each directory served by the scheduler.
|
||||
@@ -310,23 +290,6 @@ LogLevel info
|
||||
# Deny: denies access from the specified hostname, domain, IP address, or
|
||||
# network.
|
||||
#
|
||||
# Both "Allow" and "Deny" 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 host and domain address require that you enable hostname lookups
|
||||
# with "HostNameLookups On" above.
|
||||
#
|
||||
|
||||
<Location />
|
||||
</Location>
|
||||
@@ -351,8 +314,8 @@ LogLevel info
|
||||
#
|
||||
# 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.
|
||||
# is a member of group "sys" to do any admin tasks. You can change the
|
||||
# group name using the SystemGroup directive.
|
||||
#
|
||||
|
||||
AuthType Basic
|
||||
@@ -365,5 +328,5 @@ Allow From 127.0.0.1
|
||||
</Location>
|
||||
|
||||
#
|
||||
# End of "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $".
|
||||
# End of "$Id: cupsd.conf 349 1999-05-21 20:53:02Z mike $".
|
||||
#
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: mime.convs 575 1999-07-30 13:57:16Z mike $"
|
||||
# "$Id: mime.convs 237 1999-04-21 19:29:35Z mike $"
|
||||
#
|
||||
# MIME converts file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
@@ -41,12 +41,12 @@
|
||||
# PostScript filters
|
||||
#
|
||||
|
||||
#application/msword application/postscript 50 mswordtops
|
||||
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/html application/postscript 50 htmltops
|
||||
text/plain application/postscript 50 texttops
|
||||
|
||||
########################################################################
|
||||
@@ -58,5 +58,5 @@ image/* application/vnd.cups-raster 50 imagetoraster
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
|
||||
|
||||
#
|
||||
# End of "$Id: mime.convs 575 1999-07-30 13:57:16Z mike $".
|
||||
# End of "$Id: mime.convs 237 1999-04-21 19:29:35Z mike $".
|
||||
#
|
||||
|
||||
+6
-5
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: mime.types 575 1999-07-30 13:57:16Z mike $"
|
||||
# "$Id: mime.types 185 1999-03-24 18:38:50Z mike $"
|
||||
#
|
||||
# MIME types file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
@@ -92,9 +92,10 @@ 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
|
||||
|
||||
# TODO: Add Alias, SoftImage, GIMP??? files
|
||||
# TODO: Add Sun Raster, Alias, SoftImage, GIMP??? files
|
||||
|
||||
image/x-sun-raster ras
|
||||
#image/x-alias pix
|
||||
#image/x-softimage
|
||||
#image/x-gimp-xcf xcf xcf.gz
|
||||
@@ -113,10 +114,10 @@ text/plain txt printable(0,1024)
|
||||
# CUPS-specific types...
|
||||
#
|
||||
|
||||
application/vnd.cups-postscript string(0,<1B>%-12345X)
|
||||
application/vnd.cups-postscript
|
||||
application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR")
|
||||
application/vnd.cups-raw
|
||||
|
||||
#
|
||||
# End of "$Id: mime.types 575 1999-07-30 13:57:16Z mike $".
|
||||
# End of "$Id: mime.types 185 1999-03-24 18:38:50Z 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.
|
||||
+3
-10
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: printers.conf 678 1999-09-22 18:10:55Z mike $"
|
||||
# "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $"
|
||||
#
|
||||
# Sample printer configuration file for the Common UNIX Printing System
|
||||
# (CUPS) scheduler.
|
||||
@@ -77,20 +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
|
||||
|
||||
#
|
||||
# Accepting: is the printer accepting jobs?
|
||||
#
|
||||
#Accepting Yes
|
||||
#Accepting No
|
||||
|
||||
#</Printer>
|
||||
|
||||
#
|
||||
# End of "$Id: printers.conf 678 1999-09-22 18:10:55Z mike $".
|
||||
# End of "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $".
|
||||
#
|
||||
|
||||
+2
-17
@@ -16,7 +16,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
|
||||
@@ -28,7 +28,7 @@
|
||||
* Version of software...
|
||||
*/
|
||||
|
||||
#define CUPS_SVERSION "CUPS v1.0.4"
|
||||
#define CUPS_SVERSION "CUPS v1.0"
|
||||
|
||||
/*
|
||||
* Where are files stored?
|
||||
@@ -62,14 +62,6 @@
|
||||
#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>?
|
||||
*/
|
||||
@@ -90,13 +82,6 @@
|
||||
#undef HAVE_STRCASECMP
|
||||
#undef HAVE_STRNCASECMP
|
||||
|
||||
/*
|
||||
* Do we have the (v)snprintf() functions?
|
||||
*/
|
||||
|
||||
#undef HAVE_SNPRINTF
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
/*
|
||||
* What signal functions to use?
|
||||
*/
|
||||
|
||||
+29
-232
@@ -14,7 +14,7 @@ dnl at:
|
||||
dnl
|
||||
dnl Attn: CUPS Licensing Information
|
||||
dnl Easy Software Products
|
||||
dnl 44141 Airport View Drive, Suite 204
|
||||
dnl 44145 Airport View Drive, Suite 204
|
||||
dnl Hollywood, Maryland 20636-3111 USA
|
||||
dnl
|
||||
dnl Voice: (301) 373-9603
|
||||
@@ -26,69 +26,18 @@ AC_INIT(cups/cups.h)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PREFIX_DEFAULT(/usr)
|
||||
|
||||
dnl Get the operating system and version number...
|
||||
dnl Clear default debugging options and set normal optimization by
|
||||
dnl default unless the user asks for debugging specifically.
|
||||
|
||||
uname=`uname`
|
||||
uversion=`uname -r | sed -e '1,$s/\.//g'`
|
||||
if test "$uname" = "IRIX64"; then
|
||||
uname="IRIX"
|
||||
fi
|
||||
|
||||
dnl Clear the debugging and non-shared library options unless the user asks
|
||||
dnl for them...
|
||||
|
||||
OPTIM=""
|
||||
AC_SUBST(OPTIM)
|
||||
PICFLAG=1
|
||||
CFLAGS="${CFLAGS:=}"
|
||||
CXXFLAGS="${CXXFLAGS:=}"
|
||||
OPTIM="-O"
|
||||
AC_SUBST(OPTIM)
|
||||
|
||||
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, [ --enable-shared turn on shared libraries [default=yes]])
|
||||
if test "$enable_shared" != "no"; 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"
|
||||
;;
|
||||
FreeBSD* | NetBSD* | OpenBSD*)
|
||||
LIBCUPS="libcups.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.1"
|
||||
DSO="\$(CC) -Wl,-soname,\$@ -shared \$(OPTIM) -o"
|
||||
;;
|
||||
OSF1* | Linux*)
|
||||
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
|
||||
|
||||
AC_ARG_ENABLE(pam, [ --enable-pam turn on PAM support [default=yes]])
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],
|
||||
if eval "test x$enable_debug = xyes"; then
|
||||
OPTIM="-g"
|
||||
fi)
|
||||
|
||||
dnl Checks for programs...
|
||||
AC_PROG_AWK
|
||||
@@ -96,105 +45,50 @@ 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(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(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(GROFF,groff)
|
||||
AC_PATH_PROG(HTMLDOC,htmldoc)
|
||||
|
||||
dnl Architecture checks...
|
||||
AC_C_BIGENDIAN
|
||||
uname=`uname`
|
||||
if test "$uname" = "IRIX64"; then
|
||||
uname=IRIX
|
||||
fi
|
||||
|
||||
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)
|
||||
if test "$enable_pam" != "no"; then
|
||||
AC_CHECK_LIB(dl,dlopen)
|
||||
AC_CHECK_LIB(pam,pam_start)
|
||||
fi
|
||||
|
||||
NETLIBS=""
|
||||
AC_SUBST(NETLIBS)
|
||||
AC_CHECK_LIB(socket,socket,
|
||||
if test "$uname" != "IRIX"; then
|
||||
NETLIBS="-lsocket"
|
||||
LIBS="$LIBS -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"
|
||||
LIBS="$LIBS -lnsl"
|
||||
else
|
||||
echo "Not using -lnsl since you are running IRIX."
|
||||
fi)
|
||||
|
||||
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_LIB(jpeg, jpeg_destroy_decompress,
|
||||
IMGLIBS=""
|
||||
AC_SUBST(IMGLIBS)
|
||||
AC_CHECK_HEADER(jpeglib.h,
|
||||
AC_DEFINE(HAVE_LIBJPEG)
|
||||
LIBJPEG="-ljpeg"
|
||||
LIBS="$LIBS -ljpeg")
|
||||
|
||||
AC_CHECK_LIB(z, deflate,
|
||||
IMGLIBS="$IMGLIBS -ljpeg")
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
AC_DEFINE(HAVE_LIBZ)
|
||||
LIBZ="-lz"
|
||||
LIBS="$LIBS -lz")
|
||||
|
||||
dnl PNG library uses math library functions...
|
||||
AC_CHECK_LIB(m, pow)
|
||||
|
||||
dnl AC_CHECK_HEADER(png.h,
|
||||
AC_CHECK_LIB(png, png_read_info,
|
||||
IMGLIBS="$IMGLIBS -lz")
|
||||
AC_CHECK_HEADER(png.h,
|
||||
AC_DEFINE(HAVE_LIBPNG)
|
||||
LIBPNG="-lpng")
|
||||
|
||||
dnl AC_CHECK_HEADER(tiff.h,
|
||||
AC_CHECK_LIB(tiff, TIFFReadScanline,
|
||||
IMGLIBS="$IMGLIBS -lpng")
|
||||
AC_CHECK_HEADER(tiff.h,
|
||||
AC_DEFINE(HAVE_LIBTIFF)
|
||||
LIBTIFF="-ltiff")
|
||||
|
||||
dnl Restore original LIBS settings...
|
||||
LIBS="$SAVELIBS"
|
||||
IMGLIBS="$IMGLIBS -ltiff")
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
@@ -205,8 +99,6 @@ dnl Checks for string functions.
|
||||
AC_CHECK_FUNCS(strdup)
|
||||
AC_CHECK_FUNCS(strcasecmp)
|
||||
AC_CHECK_FUNCS(strncasecmp)
|
||||
AC_CHECK_FUNCS(snprintf)
|
||||
AC_CHECK_FUNCS(vsnprintf)
|
||||
|
||||
dnl Checks for signal functions.
|
||||
AC_CHECK_FUNCS(sigset)
|
||||
@@ -216,92 +108,11 @@ dnl Checks for wait functions.
|
||||
AC_CHECK_FUNCS(waitpid)
|
||||
AC_CHECK_FUNCS(wait3)
|
||||
|
||||
dnl Update compiler options...
|
||||
if test -n "$GXX" -o $uname = Linux; 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 65; then
|
||||
libdir="/usr/lib32"
|
||||
fi
|
||||
|
||||
dnl CUPS_SERVERROOT needs special attention for the default location...
|
||||
if test "$prefix" = "/usr"; then
|
||||
CUPS_SERVERROOT="/var/cups"
|
||||
@@ -312,21 +123,7 @@ 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
|
||||
|
||||
CUPS_LOCALEDIR="$prefix/lib/locale"
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR")
|
||||
AC_SUBST(CUPS_LOCALEDIR)
|
||||
|
||||
|
||||
-15
@@ -15,21 +15,6 @@ Package=<4>
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "cupsd"=.\scheduler\cupsd.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name cups
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "hpgltops"=.\filter\hpgltops.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
|
||||
-319
@@ -1,319 +0,0 @@
|
||||
#
|
||||
# "$Id: cups.list 835 1999-12-29 17:27:56Z $"
|
||||
#
|
||||
# ESP Package Manager (EPM) file list for the Common UNIX Printing
|
||||
# System (CUPS).
|
||||
#
|
||||
# EPM can be found in the "epm" subdirectory of this distribution.
|
||||
# Please report problems and fixes to "epm@easysw.com".
|
||||
#
|
||||
# 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
|
||||
# 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 Common UNIX Printing System
|
||||
%copyright 1993-1999 by Easy Software Products, All Rights Reserved.
|
||||
%vendor Easy Software Products
|
||||
%license LICENSE.cups
|
||||
%readme README.cups
|
||||
%version 1.0.4
|
||||
%incompat printpro
|
||||
|
||||
%system all
|
||||
# Server files
|
||||
f 0555 root sys /var/cups/backend/ipp backend/ipp
|
||||
l 0555 root sys /var/cups/backend/http ipp
|
||||
f 4550 root sys /var/cups/backend/lpd backend/lpd
|
||||
f 0555 root sys /var/cups/backend/parallel backend/parallel
|
||||
f 0555 root sys /var/cups/backend/serial backend/serial
|
||||
f 0555 root sys /var/cups/backend/socket backend/socket
|
||||
f 0500 root sys /usr/sbin/cupsd scheduler/cupsd
|
||||
f 0555 root sys /var/cups/cgi-bin/classes.cgi cgi-bin/classes.cgi
|
||||
f 0555 root sys /var/cups/cgi-bin/jobs.cgi cgi-bin/jobs.cgi
|
||||
f 0555 root sys /var/cups/cgi-bin/printers.cgi cgi-bin/printers.cgi
|
||||
f 0555 root sys /var/cups/filter/pstoraster pstoraster/pstoraster
|
||||
l 0555 root sys /var/cups/filter/pdftops pstoraster
|
||||
f 0555 root sys /var/cups/filter/imagetops filter/imagetops
|
||||
f 0555 root sys /var/cups/filter/pstops filter/pstops
|
||||
f 0555 root sys /var/cups/filter/texttops filter/texttops
|
||||
f 0555 root sys /var/cups/filter/rastertohp filter/rastertohp
|
||||
f 0555 root sys /var/cups/filter/hpgltops filter/hpgltops
|
||||
f 0555 root sys /var/cups/filter/imagetoraster filter/imagetoraster
|
||||
|
||||
# Admin commands
|
||||
l 0555 root sys /usr/bin/disable /usr/sbin/accept
|
||||
l 0555 root sys /usr/bin/enable /usr/sbin/accept
|
||||
l 0555 root sys /usr/lib/accept /usr/sbin/accept
|
||||
l 0555 root sys /usr/lib/lpadmin /usr/sbin/lpadmin
|
||||
l 0555 root sys /usr/lib/reject accept
|
||||
f 0555 root sys /usr/sbin/accept systemv/accept
|
||||
f 0555 root sys /usr/sbin/esplicense license/esplicense
|
||||
f 0555 root sys /usr/sbin/lpadmin systemv/lpadmin
|
||||
f 0555 root sys /usr/sbin/lpc berkeley/lpc
|
||||
l 0555 root sys /usr/sbin/reject accept
|
||||
|
||||
# User commands
|
||||
f 0555 root sys /usr/bin/cancel systemv/cancel
|
||||
f 0555 root sys /usr/bin/lp systemv/lp
|
||||
f 0555 root sys /usr/bin/lpq berkeley/lpq
|
||||
f 0555 root sys /usr/bin/lpr berkeley/lpr
|
||||
f 0555 root sys /usr/bin/lprm berkeley/lprm
|
||||
f 0555 root sys /usr/bin/lpstat systemv/lpstat
|
||||
f 0555 root sys /usr/bin/lpwin gui/lpwin
|
||||
|
||||
# DSOs
|
||||
%system hpux
|
||||
f 0555 root sys /usr/lib/libcups.sl.1 cups/libcups.sl.1
|
||||
l 0555 root sys /usr/lib/libcups.sl libcups.sl.1
|
||||
f 0555 root sys /usr/lib/libcupsimage.sl.1 filter/libcupsimage.sl.1
|
||||
l 0555 root sys /usr/lib/libcupsimage.sl libcupsimage.sl.1
|
||||
%system irix-6.5
|
||||
f 0555 root sys /usr/lib32/libcups.so.1 cups/libcups.so.1
|
||||
l 0555 root sys /usr/lib32/libcups.so libcups.so.1
|
||||
f 0555 root sys /usr/lib32/libcupsimage.so.1 filter/libcupsimage.so.1
|
||||
l 0555 root sys /usr/lib32/libcupsimage.so libcupsimage.so.1
|
||||
%system !irix-6.5 !hpux
|
||||
f 0555 root sys /usr/lib/libcups.so.1 cups/libcups.so.1
|
||||
l 0555 root sys /usr/lib/libcups.so libcups.so.1
|
||||
f 0555 root sys /usr/lib/libcupsimage.so.1 filter/libcupsimage.so.1
|
||||
l 0555 root sys /usr/lib/libcupsimage.so libcupsimage.so.1
|
||||
%system all
|
||||
|
||||
# Directories
|
||||
d 0755 root sys /var/cups/interfaces
|
||||
d 0755 root sys /var/cups/logs
|
||||
d 0755 root sys /var/cups/ppd
|
||||
d 0755 root sys /var/cups/requests
|
||||
|
||||
# Data files
|
||||
f 0444 root sys /usr/lib/locale/C/cups_C locale/C/cups_C
|
||||
f 0444 root sys /usr/lib/locale/de/cups_de locale/de/cups_de
|
||||
f 0444 root sys /usr/lib/locale/en/cups_en locale/en/cups_en
|
||||
f 0444 root sys /usr/lib/locale/es/cups_es locale/es/cups_es
|
||||
f 0444 root sys /usr/lib/locale/fr/cups_fr locale/fr/cups_fr
|
||||
f 0444 root sys /usr/lib/locale/it/cups_it locale/it/cups_it
|
||||
f 0444 root sys /usr/share/cups/data/8859-1 data/8859-1
|
||||
f 0444 root sys /usr/share/cups/data/8859-14 data/8859-14
|
||||
f 0444 root sys /usr/share/cups/data/8859-15 data/8859-15
|
||||
f 0444 root sys /usr/share/cups/data/8859-2 data/8859-2
|
||||
f 0444 root sys /usr/share/cups/data/8859-3 data/8859-3
|
||||
f 0444 root sys /usr/share/cups/data/8859-4 data/8859-4
|
||||
f 0444 root sys /usr/share/cups/data/8859-5 data/8859-5
|
||||
f 0444 root sys /usr/share/cups/data/8859-6 data/8859-6
|
||||
f 0444 root sys /usr/share/cups/data/8859-7 data/8859-7
|
||||
f 0444 root sys /usr/share/cups/data/8859-8 data/8859-8
|
||||
f 0444 root sys /usr/share/cups/data/8859-9 data/8859-9
|
||||
f 0444 root sys /usr/share/cups/data/HPGLprolog data/HPGLprolog
|
||||
f 0444 root sys /usr/share/cups/data/psglyphs data/psglyphs
|
||||
f 0444 root sys /usr/share/cups/fonts/AvantGarde-Book fonts/AvantGarde-Book
|
||||
f 0444 root sys /usr/share/cups/fonts/AvantGarde-BookOblique fonts/AvantGarde-BookOblique
|
||||
f 0444 root sys /usr/share/cups/fonts/AvantGarde-Demi fonts/AvantGarde-Demi
|
||||
f 0444 root sys /usr/share/cups/fonts/AvantGarde-DemiOblique fonts/AvantGarde-DemiOblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Bookman-Demi fonts/Bookman-Demi
|
||||
f 0444 root sys /usr/share/cups/fonts/Bookman-DemiItalic fonts/Bookman-DemiItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/Bookman-Light fonts/Bookman-Light
|
||||
f 0444 root sys /usr/share/cups/fonts/Bookman-LightItalic fonts/Bookman-LightItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/Courier fonts/Courier
|
||||
f 0444 root sys /usr/share/cups/fonts/Courier-Bold fonts/Courier-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Courier-BoldOblique fonts/Courier-BoldOblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Courier-Oblique fonts/Courier-Oblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica fonts/Helvetica
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Bold fonts/Helvetica-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-BoldOblique fonts/Helvetica-BoldOblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Narrow fonts/Helvetica-Narrow
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Narrow-Bold fonts/Helvetica-Narrow-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Narrow-BoldOblique fonts/Helvetica-Narrow-BoldOblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Narrow-Oblique fonts/Helvetica-Narrow-Oblique
|
||||
f 0444 root sys /usr/share/cups/fonts/Helvetica-Oblique fonts/Helvetica-Oblique
|
||||
f 0444 root sys /usr/share/cups/fonts/NewCenturySchlbk-Bold fonts/NewCenturySchlbk-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/NewCenturySchlbk-BoldItalic fonts/NewCenturySchlbk-BoldItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/NewCenturySchlbk-Italic fonts/NewCenturySchlbk-Italic
|
||||
f 0444 root sys /usr/share/cups/fonts/NewCenturySchlbk-Roman fonts/NewCenturySchlbk-Roman
|
||||
f 0444 root sys /usr/share/cups/fonts/Palatino-Bold fonts/Palatino-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Palatino-BoldItalic fonts/Palatino-BoldItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/Palatino-Italic fonts/Palatino-Italic
|
||||
f 0444 root sys /usr/share/cups/fonts/Palatino-Roman fonts/Palatino-Roman
|
||||
f 0444 root sys /usr/share/cups/fonts/Symbol fonts/Symbol
|
||||
f 0444 root sys /usr/share/cups/fonts/Times-Bold fonts/Times-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Times-BoldItalic fonts/Times-BoldItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/Times-Italic fonts/Times-Italic
|
||||
f 0444 root sys /usr/share/cups/fonts/Times-Roman fonts/Times-Roman
|
||||
f 0444 root sys /usr/share/cups/fonts/Utopia-Bold fonts/Utopia-Bold
|
||||
f 0444 root sys /usr/share/cups/fonts/Utopia-BoldItalic fonts/Utopia-BoldItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/Utopia-Italic fonts/Utopia-Italic
|
||||
f 0444 root sys /usr/share/cups/fonts/Utopia-Regular fonts/Utopia-Regular
|
||||
f 0444 root sys /usr/share/cups/fonts/ZapfChancery-MediumItalic fonts/ZapfChancery-MediumItalic
|
||||
f 0444 root sys /usr/share/cups/fonts/ZapfDingbats fonts/ZapfDingbats
|
||||
f 0444 root sys /usr/share/cups/pstoraster/Fontmap pstoraster/Fontmap
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_l2img.ps pstoraster/gs_l2img.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_pfile.ps pstoraster/gs_pfile.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pfbtogs.ps pstoraster/pfbtogs.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_wl1_e.ps pstoraster/gs_wl1_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_wl2_e.ps pstoraster/gs_wl2_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_wl5_e.ps pstoraster/gs_wl5_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_wan_e.ps pstoraster/gs_wan_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_pdf_e.ps pstoraster/gs_pdf_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_sym_e.ps pstoraster/gs_sym_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_std_e.ps pstoraster/gs_std_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_dbt_e.ps pstoraster/gs_dbt_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_mex_e.ps pstoraster/gs_mex_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_mro_e.ps pstoraster/gs_mro_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_iso_e.ps pstoraster/gs_iso_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_ksb_e.ps pstoraster/gs_ksb_e.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_ttf.ps pstoraster/gs_ttf.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_pdf.ps pstoraster/gs_pdf.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_ccfnt.ps pstoraster/gs_ccfnt.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_sec.ps pstoraster/pdf_sec.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_res.ps pstoraster/gs_res.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_base.ps pstoraster/pdf_base.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_btokn.ps pstoraster/gs_btokn.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_diskf.ps pstoraster/gs_diskf.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_2ps.ps pstoraster/pdf_2ps.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_init.ps pstoraster/gs_init.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_kanji.ps pstoraster/gs_kanji.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_draw.ps pstoraster/pdf_draw.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_font.ps pstoraster/pdf_font.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_type1.ps pstoraster/gs_type1.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_fonts.ps pstoraster/gs_fonts.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_statd.ps pstoraster/gs_statd.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_lev2.ps pstoraster/gs_lev2.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_typ42.ps pstoraster/gs_typ42.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_pdfwr.ps pstoraster/gs_pdfwr.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_cidfn.ps pstoraster/gs_cidfn.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_cmdl.ps pstoraster/gs_cmdl.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_dps1.ps pstoraster/gs_dps1.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_setpd.ps pstoraster/gs_setpd.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_cmap.ps pstoraster/gs_cmap.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/gs_fform.ps pstoraster/gs_fform.ps
|
||||
f 0444 root sys /usr/share/cups/pstoraster/pdf_main.ps pstoraster/pdf_main.ps
|
||||
f 0444 root sys /usr/share/cups/model/deskjet.ppd ppd/deskjet.ppd
|
||||
f 0444 root sys /usr/share/cups/model/laserjet.ppd ppd/laserjet.ppd
|
||||
|
||||
# Config files
|
||||
c 0644 root sys /var/cups/conf/classes.conf conf/classes.conf
|
||||
c 0644 root sys /var/cups/conf/cupsd.conf conf/cupsd.conf
|
||||
f 0644 root sys /var/cups/conf/mime.convs conf/mime.convs
|
||||
f 0644 root sys /var/cups/conf/mime.types conf/mime.types
|
||||
c 0644 root sys /var/cups/conf/printers.conf conf/printers.conf
|
||||
|
||||
# Dummy printcap file for Digital UNIX and Linux...
|
||||
%system dunix linux
|
||||
%format !rpm
|
||||
f 0644 root sys /etc/printcap conf/printcap
|
||||
%system all
|
||||
%format all
|
||||
|
||||
# Developer files
|
||||
f 0444 root sys /usr/include/cups/cups.h cups/cups.h
|
||||
f 0444 root sys /usr/include/cups/http.h cups/http.h
|
||||
f 0444 root sys /usr/include/cups/ipp.h cups/ipp.h
|
||||
f 0444 root sys /usr/include/cups/language.h cups/language.h
|
||||
f 0444 root sys /usr/include/cups/mime.h cups/mime.h
|
||||
f 0444 root sys /usr/include/cups/ppd.h cups/ppd.h
|
||||
f 0444 root sys /usr/include/cups/raster.h cups/raster.h
|
||||
|
||||
%system irix-6.5
|
||||
f 0444 root sys /usr/lib32/libcups.a cups/libcups.a
|
||||
%system !irix-6.5
|
||||
f 0444 root sys /usr/lib/libcups.a cups/libcups.a
|
||||
%system all
|
||||
|
||||
# Documentation files
|
||||
f 0444 root sys /usr/share/cups/doc/cmp.html doc/cmp.html
|
||||
f 0444 root sys /usr/share/cups/doc/cmp.pdf doc/cmp.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/cupsdoc.css doc/cupsdoc.css
|
||||
f 0444 root sys /usr/share/cups/doc/cups.css doc/cups.css
|
||||
f 0444 root sys /usr/share/cups/doc/documentation.html doc/documentation.html
|
||||
f 0444 root sys /usr/share/cups/doc/idd.html doc/idd.html
|
||||
f 0444 root sys /usr/share/cups/doc/idd.pdf doc/idd.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/images/classes.gif doc/images/classes.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/cups-bar.gif doc/images/cups-bar.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/cups-block-diagram.gif doc/images/cups-block-diagram.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/cups-large.gif doc/images/cups-large.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/cups-medium.gif doc/images/cups-medium.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/cups-small.gif doc/images/cups-small.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/logo.gif doc/images/logo.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/navbar.gif doc/images/navbar.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/printer-idle.gif doc/images/printer-idle.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/printer-processing.gif doc/images/printer-processing.gif
|
||||
f 0444 root sys /usr/share/cups/doc/images/printer-stopped.gif doc/images/printer-stopped.gif
|
||||
f 0444 root sys /usr/share/cups/doc/index.html doc/index.html
|
||||
f 0444 root sys /usr/share/cups/doc/overview.html doc/overview.html
|
||||
f 0444 root sys /usr/share/cups/doc/overview.pdf doc/overview.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/sam.html doc/sam.html
|
||||
f 0444 root sys /usr/share/cups/doc/sam.pdf doc/sam.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/sdd.html doc/sdd.html
|
||||
f 0444 root sys /usr/share/cups/doc/sdd.pdf doc/sdd.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/spm.html doc/spm.html
|
||||
f 0444 root sys /usr/share/cups/doc/spm.pdf doc/spm.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/ssr.html doc/ssr.html
|
||||
f 0444 root sys /usr/share/cups/doc/ssr.pdf doc/ssr.pdf
|
||||
f 0444 root sys /usr/share/cups/doc/sum.html doc/sum.html
|
||||
f 0444 root sys /usr/share/cups/doc/sum.pdf doc/sum.pdf
|
||||
|
||||
# Man pages
|
||||
%system irix
|
||||
f 0444 root sys /usr/share/catman/a_man/cat1/accept.z man/accept.z
|
||||
l 0444 root sys /usr/share/catman/a_man/cat1/reject.z accept.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/backend.z man/backend.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat5/classes.conf.z man/classes.conf.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat5/cupsd.conf.z man/cupsd.conf.z
|
||||
f 0444 root sys /usr/share/catman/a_man/cat1/cupsd.z man/cupsd.z
|
||||
f 0444 root sys /usr/share/catman/a_man/cat1/enable.z man/enable.z
|
||||
l 0444 root sys /usr/share/catman/a_man/cat1/disable.z enable.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/filter.z man/filter.z
|
||||
f 0444 root sys /usr/share/catman/a_man/cat1/lpadmin.z man/lpadmin.z
|
||||
f 0444 root sys /usr/share/catman/a_man/cat1/lpc.z man/lpc.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/lpq.z man/lpq.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/lprm.z man/lprm.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/lpr.z man/lpr.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/lpstat.z man/lpstat.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat1/lp.z man/lp.z
|
||||
l 0444 root sys /usr/share/catman/u_man/cat1/cancel.z lp.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat5/mime.convs.z man/mime.convs.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat5/mime.types.z man/mime.types.z
|
||||
f 0444 root sys /usr/share/catman/u_man/cat5/printers.conf.z man/printers.conf.z
|
||||
%system !irix
|
||||
f 0444 root sys /usr/man/man8/accept.8 man/accept.8
|
||||
l 0444 root sys /usr/man/man8/reject.8 accept.8
|
||||
f 0444 root sys /usr/man/man1/backend.1 man/backend.1
|
||||
f 0444 root sys /usr/man/man1/classes.conf.5 man/classes.conf.5
|
||||
f 0444 root sys /usr/man/man8/cupsd.8 man/cupsd.8
|
||||
f 0444 root sys /usr/man/man5/cupsd.conf.5 man/cupsd.conf.5
|
||||
f 0444 root sys /usr/man/man8/enable.8 man/enable.8
|
||||
l 0444 root sys /usr/man/man8/disable.8 enable.8
|
||||
f 0444 root sys /usr/man/man1/filter.1 man/filter.1
|
||||
f 0444 root sys /usr/man/man8/lpadmin.8 man/lpadmin.8
|
||||
f 0444 root sys /usr/man/man8/lpc.8 man/lpc.8
|
||||
f 0444 root sys /usr/man/man1/lpq.1 man/lpq.1
|
||||
f 0444 root sys /usr/man/man1/lprm.1 man/lprm.1
|
||||
f 0444 root sys /usr/man/man1/lpr.1 man/lpr.1
|
||||
f 0444 root sys /usr/man/man1/lpstat.1 man/lpstat.1
|
||||
f 0444 root sys /usr/man/man1/lp.1 man/lp.1
|
||||
l 0444 root sys /usr/man/man1/cancel.1 lp.1
|
||||
f 0444 root sys /usr/man/man5/mime.convs.5 man/mime.convs.5
|
||||
f 0444 root sys /usr/man/man5/mime.types.5 man/mime.types.5
|
||||
f 0444 root sys /usr/man/man5/printers.conf.5 man/printers.conf.5
|
||||
|
||||
# Startup script
|
||||
%system all
|
||||
i 0555 root sys cups cups.sh
|
||||
|
||||
#
|
||||
# End of "$Id: cups.list 835 1999-12-29 17:27:56Z $".
|
||||
#
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# Startup/shutdown script for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
#
|
||||
|
||||
# See what program to use for configuration stuff...
|
||||
case "`uname`" in
|
||||
IRIX*)
|
||||
IS_ON=/sbin/chkconfig
|
||||
;;
|
||||
|
||||
*)
|
||||
IS_ON=/bin/true
|
||||
;;
|
||||
esac
|
||||
|
||||
# The verbose flag controls the printing of the names of
|
||||
# daemons as they are started.
|
||||
if $IS_ON verbose; then
|
||||
ECHO=echo
|
||||
else
|
||||
ECHO=:
|
||||
fi
|
||||
|
||||
# See if the CUPS server is running...
|
||||
case "`uname`" in
|
||||
IRIX* | HP-UX | SunOS)
|
||||
pid=`ps -e | awk '{print $1,$4}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
OSF1)
|
||||
pid=`ps -e | awk '{print $1,$5}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
Linux)
|
||||
pid=`ps ax | awk '{print $1,$5}' | grep cupsd | awk '{print $1}'`
|
||||
;;
|
||||
*)
|
||||
pid=""
|
||||
;;
|
||||
esac
|
||||
|
||||
# Change to the root directory first, in case we are being run from a
|
||||
# CD-ROM installation script...
|
||||
|
||||
cd /
|
||||
|
||||
# Start or stop the CUPS server based upon the first argument to the script.
|
||||
case $1 in
|
||||
start | restart | reload)
|
||||
if test "$pid" != ""; then
|
||||
if $IS_ON cups; then
|
||||
kill -HUP $pid
|
||||
$ECHO "cups: scheduler restarted."
|
||||
else
|
||||
kill $pid
|
||||
$ECHO "cups: scheduler stopped."
|
||||
fi
|
||||
else
|
||||
if $IS_ON cups; then
|
||||
/usr/sbin/cupsd 2>&1 >/dev/null &
|
||||
$ECHO "cups: scheduler started."
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
stop)
|
||||
if test "$pid" != ""; then
|
||||
kill $pid
|
||||
$ECHO "cups: scheduler stopped."
|
||||
fi
|
||||
;;
|
||||
|
||||
status)
|
||||
if test "$pid" != ""; then
|
||||
echo "cups: Scheduler is running."
|
||||
else
|
||||
echo "cups: Scheduler is not running."
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: cups {reload|restart|start|status|stop}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
||||
-134
@@ -1,134 +0,0 @@
|
||||
#
|
||||
# "$Id: cups.spec 835 1999-12-29 17:27:56Z $"
|
||||
#
|
||||
# RPM "spec" file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Original version by Jason McMullan <jmcc@ontv.com>.
|
||||
#
|
||||
# Copyright 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
|
||||
# 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.0.4
|
||||
Release: 0
|
||||
Copyright: GPL
|
||||
Group: System Environment/Daemons
|
||||
Source: ftp://ftp.easysw.com/pub/cups/1.0.4/cups-1.0.4-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: /tmp/rpmbuild
|
||||
Conflicts: lpr
|
||||
|
||||
%package devel
|
||||
Summary: Common Unix Printing System - development environment
|
||||
Group: Development/Libraries
|
||||
|
||||
%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.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
|
||||
%build
|
||||
./configure
|
||||
|
||||
# If we got this far, all prerequisite libraries must be here.
|
||||
make
|
||||
|
||||
%install
|
||||
# these lines just make sure the directory structure in the
|
||||
# RPM_BUILD_ROOT exists
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
mkdir -p $RPM_BUILD_ROOT/etc
|
||||
mkdir -p $RPM_BUILD_ROOT/etc/rc.d
|
||||
mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
|
||||
mkdir -p $RPM_BUILD_ROOT/usr
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/bin
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/lib
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/man
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/man/man1
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/man/man5
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/man/man8
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/share/locale
|
||||
mkdir -p $RPM_BUILD_ROOT/var/cups
|
||||
mkdir -p $RPM_BUILD_ROOT/var/cups/conf
|
||||
mkdir -p $RPM_BUILD_ROOT/var/cups/logs
|
||||
mkdir -p $RPM_BUILD_ROOT/var/log
|
||||
|
||||
ln -sf /var/cups/logs $RPM_BUILD_ROOT/var/log/cups
|
||||
ln -sf /var/cups/conf $RPM_BUILD_ROOT/etc/cups
|
||||
|
||||
make prefix=$RPM_BUILD_ROOT/usr DATADIR=$RPM_BUILD_ROOT/usr/share/cups LOCALEDIR=$RPM_BUILD_ROOT/usr/share/locale SERVERROOT=$RPM_BUILD_ROOT/var/cups install
|
||||
|
||||
install -m 755 -o root -g root cups.sh $RPM_BUILD_ROOT/etc/rc.d/init.d/cups
|
||||
|
||||
ln -sf /usr/sbin/accept $RPM_BUILD_ROOT/usr/bin/disable
|
||||
ln -sf /usr/sbin/accept $RPM_BUILD_ROOT/usr/bin/enable
|
||||
ln -sf /usr/sbin/accept $RPM_BUILD_ROOT/usr/lib/accept
|
||||
ln -sf /usr/sbin/accept $RPM_BUILD_ROOT/usr/lib/reject
|
||||
ln -sf /usr/sbin/accept $RPM_BUILD_ROOT/usr/sbin/reject
|
||||
ln -sf /usr/sbin/lpadmin $RPM_BUILD_ROOT/usr/lib/lpadmin
|
||||
|
||||
%post
|
||||
/sbin/chkconfig --add cups
|
||||
|
||||
%preun
|
||||
/sbin/chkconfig --del cups
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
/etc/rc.d/init.d/cups
|
||||
%config /var/cups/conf/*
|
||||
/usr/bin/*
|
||||
/usr/lib/*
|
||||
/usr/man/*
|
||||
/usr/sbin/*
|
||||
%dir /usr/share/cups
|
||||
/usr/share/cups/*
|
||||
%dir /var/cups
|
||||
/var/cups/backend/*
|
||||
/var/cups/cgi-bin/*
|
||||
/var/cups/filter/*
|
||||
%dir /var/cups/interfaces
|
||||
%dir /var/cups/logs
|
||||
%dir /var/cups/ppd
|
||||
%dir /var/cups/requests
|
||||
%dir /etc/cups
|
||||
%dir /var/log/cups
|
||||
|
||||
%files devel
|
||||
%dir /usr/include/cups
|
||||
/usr/include/cups/*
|
||||
|
||||
#
|
||||
# End of "$Id: cups.spec 835 1999-12-29 17:27:56Z $".
|
||||
#
|
||||
+15
-37
@@ -14,7 +14,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
|
||||
@@ -28,10 +28,8 @@ include ../Makedefs
|
||||
# Object files...
|
||||
#
|
||||
|
||||
LIBOBJS = emit.o filter.o http.o ipp.o language.o mark.o mime.o \
|
||||
options.o page.o ppd.o raster.o snprintf.o string.o type.o \
|
||||
usersys.o util.o
|
||||
OBJS = $(LIBOBJS) testhttp.o testmime.o testppd.o
|
||||
OBJS = 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 util.o
|
||||
|
||||
#
|
||||
# Header files to install...
|
||||
@@ -43,7 +41,7 @@ HEADERS = cups.h http.h ipp.h language.h mime.h ppd.h raster.h
|
||||
# Targets in this directory...
|
||||
#
|
||||
|
||||
TARGETS = $(LIBCUPS) testhttp testmime testppd
|
||||
TARGETS = libcups.a testmime testppd testhttp
|
||||
|
||||
#
|
||||
# Make all targets...
|
||||
@@ -63,32 +61,18 @@ clean:
|
||||
#
|
||||
|
||||
install: all
|
||||
-$(MKDIR) $(LIBDIR)
|
||||
$(CP) libcups.a $(LIBDIR)
|
||||
-$(MKDIR) $(INCLUDEDIR)/cups
|
||||
$(CP) $(HEADERS) $(INCLUDEDIR)/cups
|
||||
-$(MKDIR) $(LIBDIR)
|
||||
$(CP) $(LIBCUPS) $(LIBDIR)
|
||||
if test $(LIBCUPS) != "libcups.a"; then \
|
||||
$(RM) `basename $(LIBCUPS) .1`; \
|
||||
$(LN) $(LIBCUPS) `basename $(LIBCUPS) .1`; \
|
||||
fi
|
||||
|
||||
#
|
||||
# libcups.so.1, libcups.sl.1
|
||||
#
|
||||
|
||||
libcups.so.1 libcups.sl.1: $(LIBOBJS) ../Makedefs
|
||||
echo Linking $@...
|
||||
$(DSO) $@ $(LIBOBJS)
|
||||
-$(LN) $@ `basename $@ .1`
|
||||
|
||||
#
|
||||
# libcups.a
|
||||
#
|
||||
|
||||
libcups.a: $(LIBOBJS)
|
||||
echo Archiving $@...
|
||||
libcups.a: $(OBJS)
|
||||
$(RM) $@
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
#
|
||||
@@ -96,7 +80,6 @@ libcups.a: $(LIBOBJS)
|
||||
#
|
||||
|
||||
cups_C.h: ../locale/C/cups_C
|
||||
echo Generating $@...
|
||||
$(RM) cups_C.h
|
||||
$(AWK) '{print "\"" $$0 "\","}' < ../locale/C/cups_C > cups_C.h
|
||||
|
||||
@@ -109,41 +92,36 @@ 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
|
||||
ppd.o: ppd.h ../config.h ../Makedefs
|
||||
raster.o: raster.h ../config.h ../Makedefs
|
||||
snprintf.o: string.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)
|
||||
# testhttp
|
||||
#
|
||||
|
||||
testhttp: testhttp.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS)
|
||||
$(CC) $(LDFLAGS) -o $@ testhttp.o $(LIBS)
|
||||
|
||||
testhttp.o: http.h ../Makedefs
|
||||
|
||||
#
|
||||
# testmime (dependency on static CUPS library is intentional)
|
||||
# testmime
|
||||
#
|
||||
|
||||
testmime: testmime.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testmime.o libcups.a
|
||||
$(CC) $(LDFLAGS) -o $@ testmime.o $(LIBS)
|
||||
|
||||
testmime.o: mime.h ../Makedefs
|
||||
|
||||
#
|
||||
# testppd (dependency on static CUPS library is intentional)
|
||||
# testppd
|
||||
#
|
||||
|
||||
testppd: testppd.o libcups.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o libcups.a $(NETLIBS)
|
||||
$(CC) $(LDFLAGS) -o $@ testppd.o $(LIBS)
|
||||
|
||||
testppd.o: ppd.h ../Makedefs
|
||||
|
||||
|
||||
-180
@@ -1,180 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="cups" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
||||
|
||||
CFG=cups - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "cups.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "cups.mak" CFG="cups - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "cups - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "cups - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "cups - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"cups.lib"
|
||||
|
||||
!ELSEIF "$(CFG)" == "cups - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# 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 BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"cupsd.lib"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "cups - Win32 Release"
|
||||
# Name "cups - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\emit.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\filter.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\http.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ipp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\language.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mark.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mime.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\options.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\page.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ppd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\raster.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\snprintf.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\string.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\type.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\util.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\cups.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\http.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ipp.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\language.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mime.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ppd.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\raster.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
+12
-20
@@ -74,9 +74,7 @@ enum /* Not a typedef'd enum so we can OR */
|
||||
CUPS_PRINTER_SMALL = 0x1000, /* Can do Letter/Legal/A4 */
|
||||
CUPS_PRINTER_MEDIUM = 0x2000, /* Can do Tabloid/B/C/A3/A2 */
|
||||
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_OPTIONS = 0xfffc /* ~(CLASS | REMOTE | IMPLICIT) */
|
||||
CUPS_PRINTER_VARIABLE = 0x8000 /* Can do variable sizes */
|
||||
};
|
||||
|
||||
|
||||
@@ -106,33 +104,27 @@ typedef struct /**** Printer Options ****/
|
||||
* Functions...
|
||||
*/
|
||||
|
||||
extern int cupsCancelJob(const char *printer, int job);
|
||||
extern int cupsCancelJob(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);
|
||||
char *resource, char *filename);
|
||||
extern int cupsGetClasses(char ***classes);
|
||||
extern const char *cupsGetDefault(void);
|
||||
extern const char *cupsGetPPD(const char *printer);
|
||||
extern char *cupsGetPPD(char *printer);
|
||||
extern char *cupsGetDefault(void);
|
||||
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 char *cupsTempFile(char *filename, int len);
|
||||
extern int cupsAddOption(const char *name, const char *value,
|
||||
int num_options, cups_option_t **options);
|
||||
extern int cupsPrintFile(char *printer, char *filename, char *title,
|
||||
int num_options, cups_option_t *options);
|
||||
|
||||
extern int cupsAddOption(char *name, char *value, 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,
|
||||
extern char *cupsGetOption(char *name, int num_options,
|
||||
cups_option_t *options);
|
||||
extern int cupsParseOptions(const char *arg, int num_options,
|
||||
extern int cupsParseOptions(char *arg, int num_options,
|
||||
cups_option_t **options);
|
||||
extern int cupsMarkOptions(ppd_file_t *ppd, int num_options,
|
||||
cups_option_t *options);
|
||||
|
||||
extern const char *cupsGetPassword(const char *prompt);
|
||||
extern const char *cupsServer(void);
|
||||
extern const char *cupsUser(void);
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
-132
@@ -1,132 +0,0 @@
|
||||
"us-ascii",
|
||||
"OK",
|
||||
"Cancel",
|
||||
"Help",
|
||||
"Quit",
|
||||
"Close",
|
||||
"Yes",
|
||||
"No",
|
||||
"On",
|
||||
"Off",
|
||||
"Save",
|
||||
"Discard",
|
||||
"Default",
|
||||
"Options",
|
||||
"More Info",
|
||||
"Black",
|
||||
"Color",
|
||||
"Cyan",
|
||||
"Magenta",
|
||||
"Yellow",
|
||||
"Copyright 1993-1999 by Easy Software Products, All Rights Reserved.",
|
||||
"General",
|
||||
"Printer",
|
||||
"Image",
|
||||
"HP-GL/2",
|
||||
"Extra",
|
||||
"Document",
|
||||
"Other",
|
||||
"Print Pages: ",
|
||||
"Entire Document",
|
||||
"Page Range:",
|
||||
"Reverse Order: ",
|
||||
"Page Format: ",
|
||||
" 1-Up",
|
||||
" 2-Up",
|
||||
" 4-Up",
|
||||
"Image Scaling: ",
|
||||
"Use Natural Image Size",
|
||||
"Zoom by Percent",
|
||||
"Zoom by PPI",
|
||||
"Mirror Image: ",
|
||||
"Color Saturation: ",
|
||||
"Color Hue: ",
|
||||
"Fit to Page: ",
|
||||
"Shading: ",
|
||||
"Pen Width: ",
|
||||
"Gamma Correction: ",
|
||||
"Brightness: ",
|
||||
"Add",
|
||||
"Delete",
|
||||
"Modify",
|
||||
"Printer URI",
|
||||
"Printer Name",
|
||||
"Printer Location",
|
||||
"Printer Info",
|
||||
"Printer Make and Model",
|
||||
"Device URI",
|
||||
"Formatting Page",
|
||||
"Printing Page",
|
||||
"Initializing Printer",
|
||||
"Printer State",
|
||||
"Accepting Jobs",
|
||||
"Not Accepting Jobs",
|
||||
"Print Jobs",
|
||||
"Class",
|
||||
"Local",
|
||||
"Remote",
|
||||
"Duplexing",
|
||||
"Stapling",
|
||||
"Fast Copies",
|
||||
"Collated Copies",
|
||||
"Hole Punching",
|
||||
"Covering",
|
||||
"Binding",
|
||||
"Sorting",
|
||||
"Small (up to 9.5x14in)",
|
||||
"Medium (9.5x14in to 13x19in)",
|
||||
"Large (13x19in and larger)",
|
||||
"Custom Size",
|
||||
"Idle",
|
||||
"Processing",
|
||||
"Stopped",
|
||||
"All",
|
||||
"Odd",
|
||||
"Even",
|
||||
"Darker Lighter",
|
||||
"Media Size",
|
||||
"Media Type",
|
||||
"Media Source",
|
||||
"Orientation: ",
|
||||
"Portrait",
|
||||
"Landscape",
|
||||
"Job State",
|
||||
"Job Name",
|
||||
"User Name",
|
||||
"Priority",
|
||||
"Copies",
|
||||
"File Size",
|
||||
"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.",
|
||||
"You don't have permission to access the resource on this server.",
|
||||
"The requested resource was not found on this server.",
|
||||
"The requested method is not allowed with the resource.",
|
||||
"An appropriate representation for the resource was not found on this server.",
|
||||
"You don't have permission to use this server as a proxy host.",
|
||||
"The request has taken too long to complete and has been aborted.",
|
||||
"The requested resource has more than one value.",
|
||||
"The requested resource is gone and has not been replaced.",
|
||||
"The requested method requires a valid Content-Length.",
|
||||
"The precondition on the request evaluated to false.",
|
||||
"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.",
|
||||
"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.",
|
||||
"The requested resource is currently unavailable on this server.",
|
||||
"The proxy server has taken too long to respond to this server.",
|
||||
"This server does not support the HTTP version required by your browser.",
|
||||
+1
-1
@@ -14,7 +14,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
|
||||
|
||||
+3
-3
@@ -86,8 +86,8 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
|
||||
strcasecmp(choices[i]->choice, "Custom") == 0)
|
||||
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
|
||||
@@ -107,7 +107,7 @@ ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
|
||||
*/
|
||||
|
||||
fputs("pop pop pop\n", fp);
|
||||
fputs("<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
fputs("<</PageSize[7 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-6
@@ -14,7 +14,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
|
||||
@@ -58,7 +58,7 @@ mimeAddFilter(mime_t *mime, /* I - MIME database */
|
||||
mime_type_t *src, /* I - Source type */
|
||||
mime_type_t *dst, /* I - Destination type */
|
||||
int cost, /* I - Relative time/resource cost */
|
||||
const char *filter) /* I - Filter program to run */
|
||||
char *filter) /* I - Filter program to run */
|
||||
{
|
||||
mime_filter_t *temp; /* New filter */
|
||||
|
||||
@@ -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),
|
||||
|
||||
+140
-280
@@ -14,7 +14,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
|
||||
@@ -25,8 +25,6 @@
|
||||
*
|
||||
* httpInitialize() - Initialize the HTTP interface library and set the
|
||||
* default HTTP proxy (if any).
|
||||
* httpCheck() - Check to see if there is a pending response from
|
||||
* the server.
|
||||
* httpClose() - Close an HTTP connection...
|
||||
* httpConnect() - Connect to a HTTP server.
|
||||
* httpReconnect() - Reconnect to a HTTP server...
|
||||
@@ -68,7 +66,6 @@
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "http.h"
|
||||
#include "ipp.h"
|
||||
@@ -92,21 +89,28 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static http_field_t http_field(const char *name);
|
||||
static int http_send(http_t *http, http_state_t request,
|
||||
const char *uri);
|
||||
static http_field_t http_field(char *name);
|
||||
static int http_send(http_t *http, http_state_t request, char *uri);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static const char *http_fields[] =
|
||||
static char *http_fields[] =
|
||||
{
|
||||
"Accept",
|
||||
"Accept-Charset",
|
||||
"Accept-Encoding",
|
||||
"Accept-Language",
|
||||
"Accept-Ranges",
|
||||
"Age",
|
||||
"Allow",
|
||||
"Alternates",
|
||||
"Authorization",
|
||||
"Cache-Control",
|
||||
"Connection",
|
||||
"Content-Base",
|
||||
"Content-Encoding",
|
||||
"Content-Language",
|
||||
"Content-Length",
|
||||
@@ -116,22 +120,41 @@ static const char *http_fields[] =
|
||||
"Content-Type",
|
||||
"Content-Version",
|
||||
"Date",
|
||||
"Derived-From",
|
||||
"Etag",
|
||||
"Expires",
|
||||
"From",
|
||||
"Host",
|
||||
"If-Match",
|
||||
"If-Modified-Since",
|
||||
"If-None-Match",
|
||||
"If-Range",
|
||||
"If-Unmodified-since",
|
||||
"Keep-Alive",
|
||||
"Last-Modified",
|
||||
"Link",
|
||||
"Location",
|
||||
"Max-Forwards",
|
||||
"Message-Id",
|
||||
"MIME-Version",
|
||||
"Pragma",
|
||||
"Proxy-Authenticate",
|
||||
"Proxy-Authorization",
|
||||
"Public",
|
||||
"Range",
|
||||
"Referer",
|
||||
"Retry-After",
|
||||
"Server",
|
||||
"Transfer-Encoding",
|
||||
"Upgrade",
|
||||
"URI",
|
||||
"User-Agent",
|
||||
"Vary",
|
||||
"Via",
|
||||
"Warning",
|
||||
"WWW-Authenticate"
|
||||
};
|
||||
static const char *days[7] =
|
||||
static char *days[7] =
|
||||
{
|
||||
"Sun",
|
||||
"Mon",
|
||||
@@ -141,7 +164,7 @@ static const char *days[7] =
|
||||
"Fri",
|
||||
"Sat"
|
||||
};
|
||||
static const char *months[12] =
|
||||
static char *months[12] =
|
||||
{
|
||||
"Jan",
|
||||
"Feb",
|
||||
@@ -192,41 +215,6 @@ httpInitialize(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpCheck()' - Check to see if there is a pending response from the server.
|
||||
*/
|
||||
|
||||
int /* O - 0 = no data, 1 = data available */
|
||||
httpCheck(http_t *http) /* I - HTTP connection */
|
||||
{
|
||||
fd_set input; /* Input set for select() */
|
||||
struct timeval timeout; /* Timeout */
|
||||
|
||||
|
||||
/*
|
||||
* First see if there is data in the buffer...
|
||||
*/
|
||||
|
||||
if (http == NULL)
|
||||
return (0);
|
||||
|
||||
if (http->used)
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* Then try doing a select() to poll the socket...
|
||||
*/
|
||||
|
||||
FD_ZERO(&input);
|
||||
FD_SET(http->fd, &input);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
return (select(http->fd + 1, &input, NULL, NULL, &timeout) > 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpClose()' - Close an HTTP connection...
|
||||
*/
|
||||
@@ -252,8 +240,8 @@ httpClose(http_t *http) /* I - Connection to close */
|
||||
*/
|
||||
|
||||
http_t * /* O - New HTTP connection */
|
||||
httpConnect(const char *host, /* I - Host to connect to */
|
||||
int port) /* I - Port number */
|
||||
httpConnect(char *host, /* I - Host to connect to */
|
||||
int port) /* I - Port number */
|
||||
{
|
||||
http_t *http; /* New HTTP connection */
|
||||
struct hostent *hostaddr; /* Host address data */
|
||||
@@ -284,7 +272,8 @@ httpConnect(const char *host, /* I - Host to connect to */
|
||||
* Copy the hostname and port and then "reconnect"...
|
||||
*/
|
||||
|
||||
strncpy(http->hostname, host, sizeof(http->hostname) - 1);
|
||||
strcpy(http->hostname, host);
|
||||
memset((char *)&(http->hostaddr), 0, sizeof(http->hostaddr));
|
||||
memcpy((char *)&(http->hostaddr.sin_addr), hostaddr->h_addr, hostaddr->h_length);
|
||||
http->hostaddr.sin_family = hostaddr->h_addrtype;
|
||||
#ifdef WIN32
|
||||
@@ -328,15 +317,7 @@ httpReconnect(http_t *http) /* I - HTTP data */
|
||||
*/
|
||||
|
||||
if ((http->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
http->error = WSAGetLastError();
|
||||
#else
|
||||
http->error = errno;
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
http->status = HTTP_ERROR;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
#ifdef FD_CLOEXEC
|
||||
fcntl(http->fd, F_SETFD, FD_CLOEXEC); /* Close this socket when starting *
|
||||
@@ -358,13 +339,6 @@ httpReconnect(http_t *http) /* I - HTTP data */
|
||||
if (connect(http->fd, (struct sockaddr *)&(http->hostaddr),
|
||||
sizeof(http->hostaddr)) < 0)
|
||||
{
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
http->error = WSAGetLastError();
|
||||
#else
|
||||
http->error = errno;
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
http->status = HTTP_ERROR;
|
||||
|
||||
#ifdef WIN32
|
||||
closesocket(http->fd);
|
||||
#else
|
||||
@@ -374,9 +348,6 @@ httpReconnect(http_t *http) /* I - HTTP data */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
http->error = 0;
|
||||
http->status = HTTP_CONTINUE;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -387,12 +358,12 @@ httpReconnect(http_t *http) /* I - HTTP data */
|
||||
*/
|
||||
|
||||
void
|
||||
httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
char *method, /* O - Method [32] (http, https, etc.) */
|
||||
char *username, /* O - Username [32] */
|
||||
char *host, /* O - Hostname [32] */
|
||||
int *port, /* O - Port number to use */
|
||||
char *resource) /* O - Resource/filename [1024] */
|
||||
httpSeparate(char *uri, /* I - Universal Resource Identifier */
|
||||
char *method, /* O - Method (http, https, etc.) */
|
||||
char *username, /* O - Username */
|
||||
char *host, /* O - Hostname */
|
||||
int *port, /* O - Port number to use */
|
||||
char *resource) /* O - Resource/filename */
|
||||
{
|
||||
char *ptr; /* Pointer into string... */
|
||||
|
||||
@@ -422,8 +393,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
{
|
||||
if ((ptr = strchr(host, '/')) != NULL)
|
||||
{
|
||||
strncpy(resource, ptr, HTTP_MAX_URI - 1);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
strcpy(resource, ptr);
|
||||
*ptr = '\0';
|
||||
}
|
||||
else
|
||||
@@ -435,13 +405,10 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
* OK, we have "hostname:port[/resource]"...
|
||||
*/
|
||||
|
||||
*port = strtol(uri, (char **)&uri, 10);
|
||||
*port = strtol(uri, &uri, 10);
|
||||
|
||||
if (*uri == '/')
|
||||
{
|
||||
strncpy(resource, uri, HTTP_MAX_URI - 1);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
}
|
||||
strcpy(resource, uri);
|
||||
}
|
||||
else
|
||||
*port = 0;
|
||||
@@ -451,10 +418,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(method, host, 31);
|
||||
method[31] = '\0';
|
||||
}
|
||||
strcpy(method, host);
|
||||
|
||||
/*
|
||||
* If the method starts with less than 2 slashes then it is a local resource...
|
||||
@@ -462,9 +426,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
|
||||
if (strncmp(uri, "//", 2) != 0)
|
||||
{
|
||||
strncpy(resource, uri, 1023);
|
||||
resource[1023] = '\0';
|
||||
|
||||
strcpy(resource, uri);
|
||||
username[0] = '\0';
|
||||
host[0] = '\0';
|
||||
*port = 0;
|
||||
@@ -479,7 +441,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
uri ++;
|
||||
|
||||
ptr = host;
|
||||
while (!(*uri == ':' && isdigit(uri[1])) && *uri != '@' && *uri != '/' && *uri != '\0')
|
||||
while (*uri != ':' && *uri != '@' && *uri != '/' && *uri != '\0')
|
||||
*ptr ++ = *uri ++;
|
||||
|
||||
*ptr = '\0';
|
||||
@@ -490,11 +452,9 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
* Got a username...
|
||||
*/
|
||||
|
||||
strncpy(username, host, 31);
|
||||
username[31] = '\0';
|
||||
strcpy(username, host);
|
||||
|
||||
ptr = host;
|
||||
uri ++;
|
||||
while (*uri != ':' && *uri != '/' && *uri != '\0')
|
||||
*ptr ++ = *uri ++;
|
||||
|
||||
@@ -540,8 +500,6 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
*port = 443;
|
||||
else if (strcasecmp(method, "ipp") == 0) /* Not registered yet... */
|
||||
*port = ippPort();
|
||||
else if (strcasecmp(method, "socket") == 0) /* Not registered yet... */
|
||||
*port = 9100;
|
||||
else
|
||||
*port = 0;
|
||||
}
|
||||
@@ -550,8 +508,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
* The remaining portion is the resource string...
|
||||
*/
|
||||
|
||||
strncpy(resource, uri, HTTP_MAX_URI - 1);
|
||||
resource[HTTP_MAX_URI - 1] = '\0';
|
||||
strcpy(resource, uri);
|
||||
}
|
||||
|
||||
|
||||
@@ -562,7 +519,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
void
|
||||
httpSetField(http_t *http, /* I - HTTP data */
|
||||
http_field_t field, /* I - Field index */
|
||||
const char *value) /* I - Value */
|
||||
char *value) /* I - Value */
|
||||
{
|
||||
strncpy(http->fields[field], value, HTTP_MAX_VALUE - 1);
|
||||
http->fields[field][HTTP_MAX_VALUE - 1] = '\0';
|
||||
@@ -574,8 +531,8 @@ httpSetField(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpDelete(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI to delete */
|
||||
httpDelete(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI to delete */
|
||||
{
|
||||
return (http_send(http, HTTP_DELETE, uri));
|
||||
}
|
||||
@@ -586,8 +543,8 @@ httpDelete(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpGet(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI to get */
|
||||
httpGet(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI to get */
|
||||
{
|
||||
return (http_send(http, HTTP_GET, uri));
|
||||
}
|
||||
@@ -598,8 +555,8 @@ httpGet(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpHead(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI for head */
|
||||
httpHead(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI for head */
|
||||
{
|
||||
return (http_send(http, HTTP_HEAD, uri));
|
||||
}
|
||||
@@ -610,8 +567,8 @@ httpHead(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpOptions(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI for options */
|
||||
httpOptions(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI for options */
|
||||
{
|
||||
return (http_send(http, HTTP_OPTIONS, uri));
|
||||
}
|
||||
@@ -622,8 +579,8 @@ httpOptions(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpPost(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI for post */
|
||||
httpPost(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI for post */
|
||||
{
|
||||
httpGetLength(http);
|
||||
|
||||
@@ -636,8 +593,8 @@ httpPost(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpPut(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI to put */
|
||||
httpPut(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI to put */
|
||||
{
|
||||
httpGetLength(http);
|
||||
|
||||
@@ -650,8 +607,8 @@ httpPut(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
httpTrace(http_t *http, /* I - HTTP data */
|
||||
const char *uri) /* I - URI for trace */
|
||||
httpTrace(http_t *http, /* I - HTTP data */
|
||||
char *uri) /* I - URI for trace */
|
||||
{
|
||||
return (http_send(http, HTTP_TRACE, uri));
|
||||
}
|
||||
@@ -695,15 +652,12 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
return (0);
|
||||
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
|
||||
http->data_remaining <= 0)
|
||||
http->data_remaining <= 0 &&
|
||||
(http->state == HTTP_GET_SEND || http->state == HTTP_POST_RECV ||
|
||||
http->state == HTTP_POST_SEND || http->state == HTTP_PUT_RECV))
|
||||
{
|
||||
DEBUG_puts("httpRead: Getting chunk length...");
|
||||
|
||||
if (httpGets(len, sizeof(len), http) == NULL)
|
||||
{
|
||||
DEBUG_puts("httpRead: Could not get length!");
|
||||
return (0);
|
||||
}
|
||||
|
||||
http->data_remaining = strtol(len, NULL, 16);
|
||||
}
|
||||
@@ -717,9 +671,6 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
* data, go idle...
|
||||
*/
|
||||
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED)
|
||||
httpGets(len, sizeof(len), http);
|
||||
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
@@ -754,25 +705,13 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
|
||||
if (bytes > 0)
|
||||
http->data_remaining -= bytes;
|
||||
else if (bytes < 0)
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
http->error = WSAGetLastError();
|
||||
#else
|
||||
http->error = errno;
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
if (http->data_remaining == 0)
|
||||
if (http->data_remaining == 0 && http->data_encoding != HTTP_ENCODE_CHUNKED)
|
||||
{
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED)
|
||||
httpGets(len, sizeof(len), http);
|
||||
|
||||
if (http->data_encoding != HTTP_ENCODE_CHUNKED)
|
||||
{
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
http->state = HTTP_WAITING;
|
||||
}
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
http->state = HTTP_WAITING;
|
||||
}
|
||||
|
||||
return (bytes);
|
||||
@@ -784,12 +723,13 @@ httpRead(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes written */
|
||||
httpWrite(http_t *http, /* I - HTTP data */
|
||||
const char *buffer, /* I - Buffer for data */
|
||||
int length) /* I - Number of bytes to write */
|
||||
httpWrite(http_t *http, /* I - HTTP data */
|
||||
char *buffer, /* I - Buffer for data */
|
||||
int length) /* I - Number of bytes to write */
|
||||
{
|
||||
int tbytes, /* Total bytes sent */
|
||||
bytes; /* Bytes sent */
|
||||
int tbytes, /* Total bytes sent */
|
||||
bytes; /* Bytes sent */
|
||||
char len[32]; /* Length string */
|
||||
|
||||
|
||||
if (http == NULL || buffer == NULL)
|
||||
@@ -797,30 +737,28 @@ httpWrite(http_t *http, /* I - HTTP data */
|
||||
|
||||
http->activity = time(NULL);
|
||||
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED)
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
|
||||
(http->state == HTTP_GET_SEND || http->state == HTTP_POST_RECV ||
|
||||
http->state == HTTP_POST_SEND || http->state == HTTP_PUT_RECV))
|
||||
{
|
||||
if (httpPrintf(http, "%x\r\n", length) < 0)
|
||||
sprintf(len, "%x\r\n", length);
|
||||
if (send(http->fd, len, strlen(len), 0) < 3)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
{
|
||||
/*
|
||||
* A zero-length chunk ends a transfer; unless we are sending POST
|
||||
* data, go idle...
|
||||
*/
|
||||
if (length == 0)
|
||||
{
|
||||
/*
|
||||
* A zero-length chunk ends a transfer; unless we are sending POST
|
||||
* data, go idle...
|
||||
*/
|
||||
|
||||
DEBUG_puts("httpWrite: changing states...");
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
http->state = HTTP_WAITING;
|
||||
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
http->state = HTTP_WAITING;
|
||||
|
||||
if (httpPrintf(http, "\r\n") < 0)
|
||||
return (-1);
|
||||
|
||||
return (0);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
tbytes = 0;
|
||||
@@ -831,7 +769,6 @@ httpWrite(http_t *http, /* I - HTTP data */
|
||||
if (bytes < 0)
|
||||
{
|
||||
DEBUG_puts("httpWrite: error writing data...\n");
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -842,18 +779,12 @@ httpWrite(http_t *http, /* I - HTTP data */
|
||||
http->data_remaining -= bytes;
|
||||
}
|
||||
|
||||
if (http->data_encoding == HTTP_ENCODE_CHUNKED)
|
||||
if (httpPrintf(http, "\r\n") < 0)
|
||||
return (-1);
|
||||
|
||||
if (http->data_remaining == 0 && http->data_encoding == HTTP_ENCODE_LENGTH)
|
||||
{
|
||||
/*
|
||||
* Finished with the transfer; unless we are sending POST data, go idle...
|
||||
*/
|
||||
|
||||
DEBUG_puts("httpWrite: changing states...");
|
||||
|
||||
if (http->state == HTTP_POST_RECV)
|
||||
http->state ++;
|
||||
else
|
||||
@@ -890,12 +821,6 @@ httpGets(char *line, /* I - Line to read into */
|
||||
* Pre-scan the buffer and see if there is a newline in there...
|
||||
*/
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
WSASetLastError(0);
|
||||
#else
|
||||
errno = 0;
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
do
|
||||
{
|
||||
bufptr = http->buffer;
|
||||
@@ -913,46 +838,23 @@ httpGets(char *line, /* I - Line to read into */
|
||||
* No newline; see if there is more data to be read...
|
||||
*/
|
||||
|
||||
if ((bytes = recv(http->fd, bufend, HTTP_MAX_BUFFER - http->used, 0)) < 0)
|
||||
if ((bytes = recv(http->fd, bufend, HTTP_MAX_BUFFER - http->used, 0)) < 1)
|
||||
{
|
||||
/*
|
||||
* Nope, can't get a line this time...
|
||||
*/
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
if (WSAGetLastError() != http->error)
|
||||
{
|
||||
http->error = WSAGetLastError();
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG_printf(("httpGets(): recv() error %d!\n", WSAGetLastError()));
|
||||
#else
|
||||
if (errno != http->error)
|
||||
{
|
||||
http->error = errno;
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG_printf(("httpGets(): recv() error %d!\n", errno));
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
else if (bytes == 0)
|
||||
else
|
||||
{
|
||||
if (http->blocking)
|
||||
http->error = EPIPE;
|
||||
/*
|
||||
* Yup, update the amount used and the end pointer...
|
||||
*/
|
||||
|
||||
return (NULL);
|
||||
http->used += bytes;
|
||||
bufend += bytes;
|
||||
}
|
||||
|
||||
/*
|
||||
* Yup, update the amount used and the end pointer...
|
||||
*/
|
||||
|
||||
http->used += bytes;
|
||||
bufend += bytes;
|
||||
}
|
||||
}
|
||||
while (bufptr >= bufend);
|
||||
@@ -980,7 +882,6 @@ httpGets(char *line, /* I - Line to read into */
|
||||
if (http->used > 0)
|
||||
memcpy(http->buffer, bufptr, http->used);
|
||||
|
||||
DEBUG_printf(("httpGets(): Returning \"%s\"\n", line));
|
||||
return (line);
|
||||
}
|
||||
else if (*bufptr == 0x0d)
|
||||
@@ -989,8 +890,6 @@ httpGets(char *line, /* I - Line to read into */
|
||||
*lineptr++ = *bufptr++;
|
||||
}
|
||||
|
||||
DEBUG_puts("httpGets(): No new line available!");
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1004,25 +903,18 @@ httpPrintf(http_t *http, /* I - HTTP data */
|
||||
const char *format, /* I - printf-style format string */
|
||||
...) /* I - Additional args as needed */
|
||||
{
|
||||
int bytes, /* Number of bytes to write */
|
||||
nbytes, /* Number of bytes written */
|
||||
tbytes; /* Number of bytes all together */
|
||||
char buf[HTTP_MAX_BUFFER], /* Buffer for formatted string */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
int bytes; /* Number of bytes to write */
|
||||
char buf[HTTP_MAX_BUFFER]; /* Buffer for formatted string */
|
||||
va_list ap; /* Variable argument pointer */
|
||||
|
||||
|
||||
va_start(ap, format);
|
||||
bytes = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
bytes = vsprintf(buf, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
DEBUG_printf(("httpPrintf: %s", buf));
|
||||
|
||||
for (tbytes = 0, bufptr = buf; tbytes < bytes; tbytes += nbytes, bufptr += nbytes)
|
||||
if ((nbytes = send(http->fd, bufptr, bytes - tbytes, 0)) < 0)
|
||||
return (-1);
|
||||
|
||||
return (bytes);
|
||||
return (send(http->fd, buf, bytes, 0));
|
||||
}
|
||||
|
||||
|
||||
@@ -1030,7 +922,7 @@ httpPrintf(http_t *http, /* I - HTTP data */
|
||||
* 'httpStatus()' - Return a short string describing a HTTP status code.
|
||||
*/
|
||||
|
||||
const char * /* O - String or NULL */
|
||||
char * /* O - String or NULL */
|
||||
httpStatus(http_status_t status) /* I - HTTP status code */
|
||||
{
|
||||
switch (status)
|
||||
@@ -1071,7 +963,7 @@ httpStatus(http_status_t status) /* I - HTTP status code */
|
||||
* 'httpGetDateString()' - Get a formatted date/time string from a time value.
|
||||
*/
|
||||
|
||||
const char * /* O - Date/time string */
|
||||
char * /* O - Date/time string */
|
||||
httpGetDateString(time_t t) /* I - UNIX time */
|
||||
{
|
||||
struct tm *tdate;
|
||||
@@ -1092,7 +984,7 @@ httpGetDateString(time_t t) /* I - UNIX time */
|
||||
*/
|
||||
|
||||
time_t /* O - UNIX time */
|
||||
httpGetDateTime(const char *s) /* I - Date/time string */
|
||||
httpGetDateTime(char *s) /* I - Date/time string */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
struct tm tdate; /* Time/date structure */
|
||||
@@ -1101,7 +993,7 @@ httpGetDateTime(const char *s) /* I - Date/time string */
|
||||
int hour, min, sec; /* Time */
|
||||
|
||||
|
||||
if (sscanf(s, "%*s%d%15s%d%d:%d:%d", &day, mon, &year, &hour, &min, &sec) < 6)
|
||||
if (sscanf(s, "%*s%d%s%d%d:%d:%d", &day, mon, &year, &hour, &min, &sec) < 6)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < 12; i ++)
|
||||
@@ -1159,15 +1051,8 @@ httpUpdate(http_t *http) /* I - HTTP data */
|
||||
/*
|
||||
* Blank line means the start of the data section (if any). Return
|
||||
* the result code, too...
|
||||
*
|
||||
* If we get status 100 (HTTP_CONTINUE), then we *don't* change states.
|
||||
* Instead, we just return HTTP_CONTINUE to the caller and keep on
|
||||
* tryin'...
|
||||
*/
|
||||
|
||||
if (http->status == HTTP_CONTINUE)
|
||||
return (http->status);
|
||||
|
||||
httpGetLength(http);
|
||||
|
||||
switch (http->state)
|
||||
@@ -1221,20 +1106,7 @@ httpUpdate(http_t *http) /* I - HTTP data */
|
||||
httpSetField(http, field, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
return (HTTP_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* See if there was an error...
|
||||
*/
|
||||
|
||||
if (http->error)
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
return (HTTP_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1250,8 +1122,8 @@ httpUpdate(http_t *http) /* I - HTTP data */
|
||||
*/
|
||||
|
||||
char * /* O - Decoded string */
|
||||
httpDecode64(char *out, /* I - String to write to */
|
||||
const char *in) /* I - String to read from */
|
||||
httpDecode64(char *out, /* I - String to write to */
|
||||
char *in) /* I - String to read from */
|
||||
{
|
||||
int pos, /* Bit position */
|
||||
base64; /* Value of this character */
|
||||
@@ -1321,8 +1193,8 @@ httpDecode64(char *out, /* I - String to write to */
|
||||
*/
|
||||
|
||||
char * /* O - Encoded string */
|
||||
httpEncode64(char *out, /* I - String to write to */
|
||||
const char *in) /* I - String to read from */
|
||||
httpEncode64(char *out, /* I - String to write to */
|
||||
char *in) /* I - String to read from */
|
||||
{
|
||||
char *outptr; /* Output pointer */
|
||||
static char base64[] = /* Base64 characters... */
|
||||
@@ -1345,10 +1217,7 @@ httpEncode64(char *out, /* I - String to write to */
|
||||
|
||||
in ++;
|
||||
if (*in == '\0')
|
||||
{
|
||||
*outptr ++ = '=';
|
||||
break;
|
||||
}
|
||||
|
||||
*outptr ++ = base64[((in[0] << 2) | (in[1] >> 6)) & 63];
|
||||
|
||||
@@ -1375,21 +1244,17 @@ httpEncode64(char *out, /* I - String to write to */
|
||||
* content-length or transfer-encoding fields.
|
||||
*/
|
||||
|
||||
int /* O - Content length */
|
||||
int
|
||||
httpGetLength(http_t *http) /* I - HTTP data */
|
||||
{
|
||||
DEBUG_printf(("httpGetLength(%08x)\n", http));
|
||||
|
||||
if (strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked") == 0)
|
||||
{
|
||||
DEBUG_puts("httpGetLength: chunked request!");
|
||||
|
||||
http->data_encoding = HTTP_ENCODE_CHUNKED;
|
||||
http->data_remaining = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
http->data_encoding = HTTP_ENCODE_LENGTH;
|
||||
http->data_encoding = HTTP_ENCODE_LENGTH;
|
||||
|
||||
/*
|
||||
* The following is a hack for HTTP servers that don't send a
|
||||
@@ -1403,8 +1268,6 @@ httpGetLength(http_t *http) /* I - HTTP data */
|
||||
http->data_remaining = 2147483647;
|
||||
else
|
||||
http->data_remaining = atoi(http->fields[HTTP_FIELD_CONTENT_LENGTH]);
|
||||
|
||||
DEBUG_printf(("httpGetLength: content_length = %d\n", http->data_remaining));
|
||||
}
|
||||
|
||||
return (http->data_remaining);
|
||||
@@ -1416,7 +1279,7 @@ httpGetLength(http_t *http) /* I - HTTP data */
|
||||
*/
|
||||
|
||||
static http_field_t /* O - Field index */
|
||||
http_field(const char *name) /* I - String name */
|
||||
http_field(char *name) /* I - String name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
@@ -1436,12 +1299,12 @@ http_field(const char *name) /* I - String name */
|
||||
static int /* O - 0 on success, non-zero on error */
|
||||
http_send(http_t *http, /* I - HTTP data */
|
||||
http_state_t request, /* I - Request code */
|
||||
const char *uri) /* I - URI */
|
||||
char *uri) /* I - URI */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char *ptr, /* Pointer in buffer */
|
||||
buf[1024]; /* Encoded URI buffer */
|
||||
static const char *codes[] = /* Request code strings */
|
||||
static char *codes[] = /* Request code strings */
|
||||
{
|
||||
NULL,
|
||||
"OPTIONS",
|
||||
@@ -1457,7 +1320,7 @@ http_send(http_t *http, /* I - HTTP data */
|
||||
"TRACE",
|
||||
"CLOSE"
|
||||
};
|
||||
static const char *hex = "0123456789ABCDEF";
|
||||
static char *hex = "0123456789ABCDEF";
|
||||
/* Hex digits */
|
||||
|
||||
|
||||
@@ -1480,13 +1343,6 @@ http_send(http_t *http, /* I - HTTP data */
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
/*
|
||||
* See if we had an error the last time around; if so, reconnect...
|
||||
*/
|
||||
|
||||
if (http->status == HTTP_ERROR || http->status >= HTTP_BAD_REQUEST)
|
||||
httpReconnect(http);
|
||||
|
||||
/*
|
||||
* Send the request header...
|
||||
*/
|
||||
@@ -1495,12 +1351,22 @@ http_send(http_t *http, /* I - HTTP data */
|
||||
if (request == HTTP_POST || request == HTTP_PUT)
|
||||
http->state ++;
|
||||
|
||||
http->status = HTTP_CONTINUE;
|
||||
|
||||
if (httpPrintf(http, "%s %s HTTP/1.1\r\n", codes[request], buf) < 1)
|
||||
if (httpPrintf(http, "%s %s HTTP/1.1\n", codes[request], buf) < 1)
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
return (-1);
|
||||
/*
|
||||
* Might have lost connection; try to reconnect...
|
||||
*/
|
||||
|
||||
if (httpReconnect(http))
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* OK, we've reconnected, send the request again...
|
||||
*/
|
||||
|
||||
if (httpPrintf(http, "%s %s HTTP/%d.%d\n", codes[request], buf,
|
||||
http->version / 100, http->version % 100) < 1)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
for (i = 0; i < HTTP_FIELD_MAX; i ++)
|
||||
@@ -1508,18 +1374,12 @@ http_send(http_t *http, /* I - HTTP data */
|
||||
{
|
||||
DEBUG_printf(("%s: %s\n", http_fields[i], http->fields[i]));
|
||||
|
||||
if (httpPrintf(http, "%s: %s\r\n", http_fields[i], http->fields[i]) < 1)
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
return (-1);
|
||||
}
|
||||
if (httpPrintf(http, "%s: %s\n", http_fields[i], http->fields[i]) < 1)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (httpPrintf(http, "\r\n") < 1)
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
if (httpPrintf(http, "\n") < 1)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
httpClearFields(http);
|
||||
|
||||
|
||||
+46
-23
@@ -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
|
||||
@@ -63,7 +63,7 @@ extern "C" {
|
||||
|
||||
# define HTTP_MAX_URI 1024 /* Max length of URI string */
|
||||
# define HTTP_MAX_HOST 256 /* Max length of hostname string */
|
||||
# define HTTP_MAX_BUFFER 2048 /* Max length of data buffer */
|
||||
# define HTTP_MAX_BUFFER 8192 /* Max length of data buffer */
|
||||
# define HTTP_MAX_VALUE 256 /* Max header field value length */
|
||||
|
||||
|
||||
@@ -131,8 +131,7 @@ typedef enum
|
||||
typedef enum
|
||||
{
|
||||
HTTP_ERROR = -1, /* An error response from httpXxxx() */
|
||||
|
||||
HTTP_CONTINUE = 100, /* Everything OK, keep going... */
|
||||
HTTP_CONTINUE, /* Everything OK, keep going... */
|
||||
|
||||
HTTP_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
|
||||
HTTP_CREATED, /* PUT command was successful */
|
||||
@@ -182,10 +181,18 @@ typedef enum
|
||||
typedef enum
|
||||
{
|
||||
HTTP_FIELD_UNKNOWN = -1,
|
||||
HTTP_FIELD_ACCEPT = 0,
|
||||
HTTP_FIELD_ACCEPT_CHARSET,
|
||||
HTTP_FIELD_ACCEPT_ENCODING,
|
||||
HTTP_FIELD_ACCEPT_LANGUAGE,
|
||||
HTTP_FIELD_ACCEPT_RANGES,
|
||||
HTTP_FIELD_AGE,
|
||||
HTTP_FIELD_ALLOW,
|
||||
HTTP_FIELD_ALTERNATES,
|
||||
HTTP_FIELD_AUTHORIZATION,
|
||||
HTTP_FIELD_CACHE_CONTROL,
|
||||
HTTP_FIELD_CONNECTION,
|
||||
HTTP_FIELD_CONTENT_BASE,
|
||||
HTTP_FIELD_CONTENT_ENCODING,
|
||||
HTTP_FIELD_CONTENT_LANGUAGE,
|
||||
HTTP_FIELD_CONTENT_LENGTH,
|
||||
@@ -195,19 +202,38 @@ typedef enum
|
||||
HTTP_FIELD_CONTENT_TYPE,
|
||||
HTTP_FIELD_CONTENT_VERSION,
|
||||
HTTP_FIELD_DATE,
|
||||
HTTP_FIELD_DERIVED_FROM,
|
||||
HTTP_FIELD_ETAG,
|
||||
HTTP_FIELD_EXPIRES,
|
||||
HTTP_FIELD_FROM,
|
||||
HTTP_FIELD_HOST,
|
||||
HTTP_FIELD_IF_MATCH,
|
||||
HTTP_FIELD_IF_MODIFIED_SINCE,
|
||||
HTTP_FIELD_IF_NONE_MATCH,
|
||||
HTTP_FIELD_IF_RANGE,
|
||||
HTTP_FIELD_IF_UNMODIFIED_SINCE,
|
||||
HTTP_FIELD_KEEP_ALIVE,
|
||||
HTTP_FIELD_LAST_MODIFIED,
|
||||
HTTP_FIELD_LINK,
|
||||
HTTP_FIELD_LOCATION,
|
||||
HTTP_FIELD_MAX_FORWARDS,
|
||||
HTTP_FIELD_MESSAGE_ID,
|
||||
HTTP_FIELD_MIME_VERSION,
|
||||
HTTP_FIELD_PRAGMA,
|
||||
HTTP_FIELD_PROXY_AUTHENTICATE,
|
||||
HTTP_FIELD_PROXY_AUTHORIZATION,
|
||||
HTTP_FIELD_PUBLIC,
|
||||
HTTP_FIELD_RANGE,
|
||||
HTTP_FIELD_REFERER,
|
||||
HTTP_FIELD_RETRY_AFTER,
|
||||
HTTP_FIELD_SERVER,
|
||||
HTTP_FIELD_TRANSFER_ENCODING,
|
||||
HTTP_FIELD_UPGRADE,
|
||||
HTTP_FIELD_URI,
|
||||
HTTP_FIELD_USER_AGENT,
|
||||
HTTP_FIELD_VARY,
|
||||
HTTP_FIELD_VIA,
|
||||
HTTP_FIELD_WARNING,
|
||||
HTTP_FIELD_WWW_AUTHENTICATE,
|
||||
HTTP_FIELD_MAX
|
||||
} http_field_t;
|
||||
@@ -221,7 +247,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 */
|
||||
@@ -246,36 +271,34 @@ typedef struct
|
||||
*/
|
||||
|
||||
# define httpBlocking(http,b) (http)->blocking = (b)
|
||||
extern int httpCheck(http_t *http);
|
||||
# define httpClearFields(http) memset((http)->fields, 0, sizeof((http)->fields)),\
|
||||
httpSetField((http), HTTP_FIELD_HOST, (http)->hostname)
|
||||
extern void httpClose(http_t *http);
|
||||
extern http_t *httpConnect(const char *host, int port);
|
||||
extern int httpDelete(http_t *http, const char *uri);
|
||||
# define httpError(http) ((http)->error)
|
||||
extern http_t *httpConnect(char *host, int port);
|
||||
extern int httpDelete(http_t *http, char *uri);
|
||||
extern void httpFlush(http_t *http);
|
||||
extern int httpGet(http_t *http, const char *uri);
|
||||
extern int httpGet(http_t *http, 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);
|
||||
extern char *httpGetDateString(time_t t);
|
||||
extern time_t httpGetDateTime(char *s);
|
||||
# define httpGetField(http,field) (http)->fields[field]
|
||||
extern int httpHead(http_t *http, const char *uri);
|
||||
extern int httpHead(http_t *http, char *uri);
|
||||
extern void httpInitialize(void);
|
||||
extern int httpOptions(http_t *http, const char *uri);
|
||||
extern int httpPost(http_t *http, const char *uri);
|
||||
extern int httpOptions(http_t *http, char *uri);
|
||||
extern int httpPost(http_t *http, char *uri);
|
||||
extern int httpPrintf(http_t *http, const char *format, ...);
|
||||
extern int httpPut(http_t *http, const char *uri);
|
||||
extern int httpPut(http_t *http, 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,
|
||||
extern void httpSeparate(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 void httpSetField(http_t *http, http_field_t field, char *value);
|
||||
extern char *httpStatus(http_status_t status);
|
||||
extern int httpTrace(http_t *http, char *uri);
|
||||
extern http_status_t httpUpdate(http_t *http);
|
||||
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 httpWrite(http_t *http, char *buffer, int length);
|
||||
extern char *httpEncode64(char *out, char *in);
|
||||
extern char *httpDecode64(char *out, char *in);
|
||||
extern int httpGetLength(http_t *http);
|
||||
|
||||
|
||||
|
||||
+90
-89
@@ -54,7 +54,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "string.h"
|
||||
#include <string.h>
|
||||
|
||||
#include "ipp.h"
|
||||
#include "debug.h"
|
||||
@@ -65,7 +65,7 @@
|
||||
*/
|
||||
|
||||
static ipp_attribute_t *add_attr(ipp_t *ipp, int num_values);
|
||||
static int ipp_read(http_t *http, unsigned char *buffer, int length);
|
||||
static int ipp_read(http_t *http, char *buffer, int length);
|
||||
|
||||
|
||||
/*
|
||||
@@ -73,10 +73,10 @@ static int ipp_read(http_t *http, unsigned char *buffer, int length);
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddBoolean(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
char value) /* I - Value of attribute */
|
||||
ippAddBoolean(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
char value) /* I - Value of attribute */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -103,11 +103,11 @@ ippAddBoolean(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddBooleans(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
const char *values) /* I - Values */
|
||||
ippAddBooleans(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
char *values) /* I - Values */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
@@ -139,10 +139,10 @@ ippAddBooleans(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddDate(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
const ipp_uchar_t *value) /* I - Value */
|
||||
ippAddDate(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
ipp_uchar_t *value) /* I - Value */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -170,11 +170,11 @@ ippAddDate(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddInteger(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int value) /* I - Value of attribute */
|
||||
ippAddInteger(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
char *name, /* I - Name of attribute */
|
||||
int value) /* I - Value of attribute */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -202,12 +202,12 @@ ippAddInteger(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddIntegers(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
const int *values) /* I - Values */
|
||||
ippAddIntegers(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
int *values) /* I - Values */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
@@ -236,12 +236,12 @@ ippAddIntegers(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddString(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
const char *name, /* I - Name of attribute */
|
||||
const char *charset, /* I - Character set */
|
||||
const char *value) /* I - Value */
|
||||
ippAddString(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
char *name, /* I - Name of attribute */
|
||||
char *charset, /* I - Character set */
|
||||
char *value) /* I - Value */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -267,13 +267,13 @@ ippAddString(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddStrings(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
const char *charset, /* I - Character set */
|
||||
const char **values) /* I - Values */
|
||||
ippAddStrings(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
ipp_tag_t type, /* I - Type of attribute */
|
||||
char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
char *charset, /* I - Character set */
|
||||
char **values) /* I - Values */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
@@ -309,11 +309,11 @@ ippAddStrings(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddRange(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int lower, /* I - Lower value */
|
||||
int upper) /* I - Upper value */
|
||||
ippAddRange(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
int lower, /* I - Lower value */
|
||||
int upper) /* I - Upper value */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -339,12 +339,12 @@ ippAddRange(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddRanges(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
const int *lower, /* I - Lower values */
|
||||
const int *upper) /* I - Upper values */
|
||||
ippAddRanges(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
int *lower, /* I - Lower values */
|
||||
int *upper) /* I - Upper values */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
@@ -376,12 +376,12 @@ ippAddRanges(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddResolution(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
ipp_res_t units, /* I - Units for resolution */
|
||||
int xres, /* I - X resolution */
|
||||
int yres) /* I - Y resolution */
|
||||
ippAddResolution(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
ipp_res_t units, /* I - Units for resolution */
|
||||
int xres, /* I - X resolution */
|
||||
int yres) /* I - Y resolution */
|
||||
{
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
|
||||
@@ -408,13 +408,13 @@ ippAddResolution(ipp_t *ipp, /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - New attribute */
|
||||
ippAddResolutions(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
const char *name, /* I - Name of attribute */
|
||||
int num_values,/* I - Number of values */
|
||||
ipp_res_t units, /* I - Units for resolution */
|
||||
const int *xres, /* I - X resolutions */
|
||||
const int *yres) /* I - Y resolutions */
|
||||
ippAddResolutions(ipp_t *ipp, /* I - IPP request */
|
||||
ipp_tag_t group, /* I - IPP group */
|
||||
char *name, /* I - Name of attribute */
|
||||
int num_values, /* I - Number of values */
|
||||
ipp_res_t units, /* I - Units for resolution */
|
||||
int *xres, /* I - X resolutions */
|
||||
int *yres) /* I - Y resolutions */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ipp_attribute_t *attr; /* New attribute */
|
||||
@@ -472,8 +472,8 @@ ippAddSeparator(ipp_t *ipp) /* I - IPP request */
|
||||
* in seconds.
|
||||
*/
|
||||
|
||||
time_t /* O - UNIX time value */
|
||||
ippDateToTime(const ipp_uchar_t *date) /* I - RFC 1903 date info */
|
||||
time_t /* O - UNIX time value */
|
||||
ippDateToTime(ipp_uchar_t *date)/* I - RFC 1903 date info */
|
||||
{
|
||||
struct tm unixdate; /* UNIX date/time info */
|
||||
time_t t; /* Computed time */
|
||||
@@ -576,9 +576,9 @@ ippDelete(ipp_t *ipp) /* I - IPP request */
|
||||
*/
|
||||
|
||||
ipp_attribute_t * /* O - Matching attribute */
|
||||
ippFindAttribute(ipp_t *ipp, /* I - IPP request */
|
||||
const char *name, /* I - Name of attribute */
|
||||
ipp_tag_t type) /* I - Type of attribute */
|
||||
ippFindAttribute(ipp_t *ipp, /* I - IPP request */
|
||||
char *name, /* I - Name of attribute */
|
||||
ipp_tag_t type) /* I - Type of attribute */
|
||||
{
|
||||
ipp_attribute_t *attr; /* Current atttribute */
|
||||
|
||||
@@ -593,7 +593,7 @@ ippFindAttribute(ipp_t *ipp, /* I - IPP request */
|
||||
DEBUG_printf(("ippFindAttribute: attr = %08x, name = \'%s\'\n", attr,
|
||||
attr->name));
|
||||
|
||||
if (attr->name != NULL && strcasecmp(attr->name, name) == 0 &&
|
||||
if (attr->name != NULL && strcmp(attr->name, name) == 0 &&
|
||||
(attr->value_tag == type ||
|
||||
(attr->value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) ||
|
||||
(attr->value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME)))
|
||||
@@ -723,7 +723,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
ipp_t *ipp) /* I - IPP data */
|
||||
{
|
||||
int n; /* Length of data */
|
||||
unsigned char buffer[8192]; /* Data buffer */
|
||||
char buffer[8192]; /* Data buffer */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
ipp_tag_t tag; /* Current tag */
|
||||
|
||||
@@ -801,7 +801,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
ipp->state = IPP_DATA;
|
||||
break;
|
||||
}
|
||||
else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
|
||||
else if (tag <= IPP_TAG_UNSUPPORTED)
|
||||
{
|
||||
/*
|
||||
* Group tag... Set the current group and continue...
|
||||
@@ -865,7 +865,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
|
||||
attr->group_tag = ipp->curtag;
|
||||
attr->value_tag = tag;
|
||||
attr->name = strdup((char *)buffer);
|
||||
attr->name = strdup(buffer);
|
||||
attr->num_values = 0;
|
||||
}
|
||||
|
||||
@@ -911,7 +911,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
buffer[n] = '\0';
|
||||
DEBUG_printf(("ippRead: value = \'%s\'\n", buffer));
|
||||
|
||||
attr->values[attr->num_values].string.text = strdup((char *)buffer);
|
||||
attr->values[attr->num_values].string.text = strdup(buffer);
|
||||
break;
|
||||
case IPP_TAG_DATE :
|
||||
if (ipp_read(http, buffer, 11) < 11)
|
||||
@@ -950,7 +950,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
|
||||
buffer[n] = '\0';
|
||||
|
||||
attr->values[attr->num_values].string.charset = strdup((char *)buffer);
|
||||
attr->values[attr->num_values].string.charset = strdup(buffer);
|
||||
|
||||
if (ipp_read(http, buffer, 2) < 2)
|
||||
return (IPP_ERROR);
|
||||
@@ -962,7 +962,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
|
||||
buffer[n] = '\0';
|
||||
|
||||
attr->values[attr->num_values].string.text = strdup((char *)buffer);
|
||||
attr->values[attr->num_values].string.text = strdup(buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -989,7 +989,7 @@ ippRead(http_t *http, /* I - HTTP data */
|
||||
* 'ippTimeToDate()' - Convert from UNIX time to RFC 1903 format.
|
||||
*/
|
||||
|
||||
const ipp_uchar_t * /* O - RFC-1903 date/time data */
|
||||
ipp_uchar_t * /* O - RFC-1903 date/time data */
|
||||
ippTimeToDate(time_t t) /* I - UNIX time value */
|
||||
{
|
||||
struct tm *unixdate; /* UNIX unixdate/time info */
|
||||
@@ -1042,7 +1042,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int n; /* Length of data */
|
||||
unsigned char buffer[8192], /* Data buffer */
|
||||
char buffer[8192], /* Data buffer */
|
||||
*bufptr; /* Pointer into buffer */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
|
||||
@@ -1071,7 +1071,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*bufptr++ = ipp->request.any.request_id >> 8;
|
||||
*bufptr++ = ipp->request.any.request_id;
|
||||
|
||||
if (httpWrite(http, (char *)buffer, bufptr - buffer) < 0)
|
||||
if (httpWrite(http, buffer, bufptr - buffer) < 0)
|
||||
{
|
||||
DEBUG_puts("ippWrite: Could not write IPP header...");
|
||||
return (IPP_ERROR);
|
||||
@@ -1327,7 +1327,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
* Write the data out...
|
||||
*/
|
||||
|
||||
if (httpWrite(http, (char *)buffer, bufptr - buffer) < 0)
|
||||
if (httpWrite(http, buffer, bufptr - buffer) < 0)
|
||||
{
|
||||
DEBUG_puts("ippWrite: Could not write IPP attribute...");
|
||||
return (IPP_ERROR);
|
||||
@@ -1350,7 +1350,7 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
*/
|
||||
|
||||
buffer[0] = IPP_TAG_END;
|
||||
if (httpWrite(http, (char *)buffer, 1) < 0)
|
||||
if (httpWrite(http, buffer, 1) < 0)
|
||||
{
|
||||
DEBUG_puts("ippWrite: Could not write IPP end-tag...");
|
||||
return (IPP_ERROR);
|
||||
@@ -1375,11 +1375,11 @@ ippWrite(http_t *http, /* I - HTTP data */
|
||||
int /* O - Port number */
|
||||
ippPort(void)
|
||||
{
|
||||
const char *server_port; /* SERVER_PORT environment variable */
|
||||
char *server_port; /* SERVER_PORT environment variable */
|
||||
struct servent *port; /* Port number info */
|
||||
|
||||
|
||||
if ((server_port = getenv("IPP_PORT")) != NULL)
|
||||
if ((server_port = getenv("SERVER_PORT")) != NULL)
|
||||
return (atoi(server_port));
|
||||
else if ((port = getservbyname("ipp", NULL)) == NULL)
|
||||
return (IPP_PORT);
|
||||
@@ -1427,13 +1427,13 @@ add_attr(ipp_t *ipp, /* I - IPP request */
|
||||
* 'ipp_read()' - Semi-blocking read on a HTTP connection...
|
||||
*/
|
||||
|
||||
static int /* O - Number of bytes read */
|
||||
ipp_read(http_t *http, /* I - Client connection */
|
||||
unsigned char *buffer, /* O - Buffer for data */
|
||||
int length) /* I - Total length */
|
||||
static int /* O - Number of bytes read */
|
||||
ipp_read(http_t *http, /* I - Client connection */
|
||||
char *buffer,/* O - Buffer for data */
|
||||
int length) /* I - Total length */
|
||||
{
|
||||
int tbytes, /* Total bytes read */
|
||||
bytes; /* Bytes read this pass */
|
||||
int tbytes, /* Total bytes read */
|
||||
bytes; /* Bytes read this pass */
|
||||
|
||||
|
||||
/*
|
||||
@@ -1441,7 +1441,7 @@ ipp_read(http_t *http, /* I - Client connection */
|
||||
*/
|
||||
|
||||
for (tbytes = 0; tbytes < length; tbytes += bytes, buffer += bytes)
|
||||
if ((bytes = httpRead(http, (char *)buffer, length - tbytes)) <= 0)
|
||||
if ((bytes = httpRead(http, buffer, length - tbytes)) <= 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -1452,6 +1452,7 @@ ipp_read(http_t *http, /* I - Client connection */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
+17
-18
@@ -75,8 +75,8 @@ typedef enum /**** Format tags for attribute formats... ****/
|
||||
IPP_TAG_JOB,
|
||||
IPP_TAG_END,
|
||||
IPP_TAG_PRINTER,
|
||||
IPP_TAG_UNSUPPORTED_GROUP,
|
||||
IPP_TAG_UNSUPPORTED_VALUE = 0x10,
|
||||
IPP_TAG_EXTENSION,
|
||||
IPP_TAG_UNSUPPORTED = 0x10,
|
||||
IPP_TAG_DEFAULT,
|
||||
IPP_TAG_UNKNOWN,
|
||||
IPP_TAG_NOVALUE,
|
||||
@@ -87,12 +87,11 @@ typedef enum /**** Format tags for attribute formats... ****/
|
||||
IPP_TAG_DATE,
|
||||
IPP_TAG_RESOLUTION,
|
||||
IPP_TAG_RANGE,
|
||||
IPP_TAG_COLLECTION,
|
||||
IPP_TAG_TEXTLANG,
|
||||
IPP_TAG_NAMELANG,
|
||||
IPP_TAG_TEXT = 0x41,
|
||||
IPP_TAG_NAME,
|
||||
IPP_TAG_KEYWORD = 0x44,
|
||||
IPP_TAG_KEYWORD,
|
||||
IPP_TAG_URI,
|
||||
IPP_TAG_URISCHEME,
|
||||
IPP_TAG_CHARSET,
|
||||
@@ -307,25 +306,25 @@ 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);
|
||||
extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int value);
|
||||
extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const int *values);
|
||||
extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper);
|
||||
extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper);
|
||||
extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres);
|
||||
extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres);
|
||||
extern time_t ippDateToTime(ipp_uchar_t *date);
|
||||
extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, char *name, char value);
|
||||
extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, char *name, int num_values, char *values);
|
||||
extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, char *name, ipp_uchar_t *value);
|
||||
extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, char *name, int value);
|
||||
extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, char *name, int num_values, int *values);
|
||||
extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, char *name, int lower, int upper);
|
||||
extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, char *name, int num_values, int *lower, int *upper);
|
||||
extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, char *name, ipp_res_t units, int xres, int yres);
|
||||
extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, char *name, int num_values, ipp_res_t units, int *xres, int *yres);
|
||||
extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp);
|
||||
extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, const char *charset, const char *value);
|
||||
extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const char *charset, const char **values);
|
||||
extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, char *name, char *charset, char *value);
|
||||
extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, char *name, int num_values, char *charset, char **values);
|
||||
extern void ippDelete(ipp_t *ipp);
|
||||
extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);
|
||||
extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, 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_uchar_t *ippTimeToDate(time_t t);
|
||||
extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp);
|
||||
extern int ippPort(void);
|
||||
|
||||
|
||||
+18
-38
@@ -14,7 +14,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
|
||||
@@ -127,11 +127,10 @@ cupsLangFree(cups_lang_t *lang) /* I - Language to free */
|
||||
*/
|
||||
|
||||
cups_lang_t * /* O - Language data */
|
||||
cupsLangGet(const char *language) /* I - Language or locale */
|
||||
cupsLangGet(char *language) /* I - Language or locale */
|
||||
{
|
||||
int i, count; /* Looping vars */
|
||||
char langname[16], /* Requested language name */
|
||||
real[16], /* Real language name */
|
||||
char real[16], /* Real language name */
|
||||
filename[1024], /* Filename for language locale file */
|
||||
*localedir; /* Directory for locale files */
|
||||
FILE *fp; /* Language locale file pointer */
|
||||
@@ -146,48 +145,30 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
* standard POSIX locale and is copied unchanged. Otherwise the
|
||||
* language string is converted from ll-cc (language-country) to ll_CC
|
||||
* to match the file naming convention used by all POSIX-compliant
|
||||
* operating systems. Any trailing character set specification is
|
||||
* dropped.
|
||||
* operating systems.
|
||||
*/
|
||||
|
||||
if (language == NULL || language[0] == '\0' ||
|
||||
strcmp(language, "POSIX") == 0)
|
||||
strcpy(langname, "C");
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Copy the locale string over safely...
|
||||
*/
|
||||
if (language == NULL || language[0] == '\0')
|
||||
language = "C";
|
||||
|
||||
strncpy(langname, language, sizeof(langname) - 1);
|
||||
langname[sizeof(langname) - 1] = '\0';
|
||||
|
||||
/*
|
||||
* Strip charset from "locale.charset"...
|
||||
*/
|
||||
|
||||
if ((text = strchr(langname, '.')) != NULL)
|
||||
*text = '\0';
|
||||
}
|
||||
|
||||
if (strlen(langname) < 2)
|
||||
if (strlen(language) < 2)
|
||||
strcpy(real, "C");
|
||||
else
|
||||
{
|
||||
real[0] = tolower(langname[0]);
|
||||
real[1] = tolower(langname[1]);
|
||||
real[0] = tolower(language[0]);
|
||||
real[1] = tolower(language[1]);
|
||||
|
||||
if (langname[2] == '_' || langname[2] == '-')
|
||||
if (language[2] == '_' || language[2] == '-')
|
||||
{
|
||||
real[2] = '_';
|
||||
real[3] = toupper(langname[3]);
|
||||
real[4] = toupper(langname[4]);
|
||||
real[3] = toupper(language[3]);
|
||||
real[4] = toupper(language[4]);
|
||||
real[5] = '\0';
|
||||
langname[5] = '\0';
|
||||
language[5] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
langname[2] = '\0';
|
||||
language[2] = '\0';
|
||||
real[2] = '\0';
|
||||
}
|
||||
}
|
||||
@@ -201,7 +182,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)
|
||||
@@ -211,8 +192,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");
|
||||
}
|
||||
|
||||
@@ -221,7 +201,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
for (lang = lang_cache; lang != NULL; lang = lang->next)
|
||||
if (strcmp(lang->language, langname) == 0)
|
||||
if (strcmp(lang->language, language) == 0)
|
||||
{
|
||||
lang->used ++;
|
||||
|
||||
@@ -308,7 +288,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*/
|
||||
|
||||
lang->used ++;
|
||||
strcpy(lang->language, langname);
|
||||
strcpy(lang->language, language);
|
||||
|
||||
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
|
||||
if (strcmp(lang_encodings[i], line) == 0)
|
||||
|
||||
+22
-43
@@ -14,7 +14,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
|
||||
@@ -48,11 +48,13 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_CLOSE,
|
||||
CUPS_MSG_YES,
|
||||
CUPS_MSG_NO,
|
||||
CUPS_MSG_AUTO,
|
||||
CUPS_MSG_ON,
|
||||
CUPS_MSG_OFF,
|
||||
CUPS_MSG_SAVE,
|
||||
CUPS_MSG_DISCARD,
|
||||
CUPS_MSG_DEFAULT,
|
||||
CUPS_MSG_USER_DEFINED,
|
||||
CUPS_MSG_OPTIONS,
|
||||
CUPS_MSG_MORE_INFO,
|
||||
CUPS_MSG_BLACK,
|
||||
@@ -61,14 +63,18 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_MAGENTA,
|
||||
CUPS_MSG_YELLOW,
|
||||
CUPS_MSG_COPYRIGHT,
|
||||
CUPS_MSG_ALL_RIGHTS_RESERVED,
|
||||
CUPS_MSG_GENERAL,
|
||||
CUPS_MSG_PRINTER,
|
||||
CUPS_MSG_POSTSCRIPT,
|
||||
CUPS_MSG_IMAGE,
|
||||
CUPS_MSG_HPGL2,
|
||||
CUPS_MSG_EXTRA,
|
||||
CUPS_MSG_DOCUMENT,
|
||||
CUPS_MSG_OTHER,
|
||||
CUPS_MSG_TEXT,
|
||||
CUPS_MSG_HPGL,
|
||||
CUPS_MSG_ADVANCED,
|
||||
CUPS_MSG_PRINT_BANNER_PAGE,
|
||||
CUPS_MSG_VERBOSE_LOGGING,
|
||||
CUPS_MSG_PRINT_PAGES,
|
||||
CUPS_MSG_DOCUMENT,
|
||||
CUPS_MSG_ENTIRE_DOCUMENT,
|
||||
CUPS_MSG_PAGE_RANGE,
|
||||
CUPS_MSG_REVERSE_ORDER,
|
||||
@@ -81,16 +87,22 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_ZOOM_BY_PERCENT,
|
||||
CUPS_MSG_ZOOM_BY_PPI,
|
||||
CUPS_MSG_MIRROR_IMAGE,
|
||||
CUPS_MSG_ROTATE_IMAGE,
|
||||
CUPS_MSG_BEST_FIT,
|
||||
CUPS_MSG_COLOR_SATURATION,
|
||||
CUPS_MSG_COLOR_HUE,
|
||||
CUPS_MSG_NUMBER_OF_COLUMNS,
|
||||
CUPS_MSG_MARGINS,
|
||||
CUPS_MSG_WRAP_TEXT,
|
||||
CUPS_MSG_FIT_TO_PAGE,
|
||||
CUPS_MSG_SHADING,
|
||||
CUPS_MSG_DEFAULT_PEN_WIDTH,
|
||||
CUPS_MSG_GAMMA_CORRECTION,
|
||||
CUPS_MSG_BRIGHTNESS,
|
||||
CUPS_MSG_ADD,
|
||||
CUPS_MSG_DELETE,
|
||||
CUPS_MSG_MODIFY,
|
||||
CUPS_MSG_COLOR_PROFILE,
|
||||
CUPS_MSG_ADD_PRINTER,
|
||||
CUPS_MSG_DELETE_PRINTER,
|
||||
CUPS_MSG_MODIFY_PRINTER,
|
||||
CUPS_MSG_PRINTER_URI,
|
||||
CUPS_MSG_PRINTER_NAME,
|
||||
CUPS_MSG_PRINTER_LOCATION,
|
||||
@@ -122,34 +134,6 @@ typedef enum /**** Message Indices ****/
|
||||
CUPS_MSG_IDLE,
|
||||
CUPS_MSG_PROCESSING,
|
||||
CUPS_MSG_STOPPED,
|
||||
CUPS_MSG_ALL,
|
||||
CUPS_MSG_ODD,
|
||||
CUPS_MSG_EVEN_PAGES,
|
||||
CUPS_MSG_DARKER_LIGHTER,
|
||||
CUPS_MSG_MEDIA_SIZE,
|
||||
CUPS_MSG_MEDIA_TYPE,
|
||||
CUPS_MSG_MEDIA_SOURCE,
|
||||
CUPS_MSG_ORIENTATION,
|
||||
CUPS_MSG_PORTRAIT,
|
||||
CUPS_MSG_LANDSCAPE,
|
||||
CUPS_MSG_JOB_STATE,
|
||||
CUPS_MSG_JOB_NAME,
|
||||
CUPS_MSG_USER_NAME,
|
||||
CUPS_MSG_PRIORITY,
|
||||
CUPS_MSG_COPIES,
|
||||
CUPS_MSG_FILE_SIZE,
|
||||
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
|
||||
@@ -186,16 +170,11 @@ 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, 0))
|
||||
extern char *cupsLangEncoding(cups_lang_t *lang);
|
||||
extern void cupsLangFlush(void);
|
||||
extern void cupsLangFree(cups_lang_t *lang);
|
||||
extern cups_lang_t *cupsLangGet(const char *language);
|
||||
extern cups_lang_t *cupsLangGet(char *language);
|
||||
# define cupsLangString(lang,msg) (lang)->messages[(msg)]
|
||||
|
||||
# ifdef __cplusplus
|
||||
|
||||
+76
-69
@@ -33,6 +33,7 @@
|
||||
* ppdMarkDefaults() - Mark all default options in the PPD file.
|
||||
* ppdMarkOption() - Mark an option in a PPD file.
|
||||
* ppd_defaults() - Set the defaults for this group and all sub-groups.
|
||||
* ppd_default() - Set the default choice for an option.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -47,7 +48,8 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void ppd_defaults(ppd_file_t *ppd, ppd_group_t *g);
|
||||
static void ppd_defaults(ppd_group_t *g);
|
||||
static void ppd_default(ppd_option_t *o);
|
||||
|
||||
|
||||
/*
|
||||
@@ -57,10 +59,9 @@ static void ppd_defaults(ppd_file_t *ppd, ppd_group_t *g);
|
||||
int /* O - Number of conflicts found */
|
||||
ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
{
|
||||
int i, j, k, /* Looping variables */
|
||||
int i, j, /* Looping variables */
|
||||
conflicts; /* Number of conflicts */
|
||||
ppd_const_t *c; /* Current constraint */
|
||||
ppd_group_t *g, *sg; /* Groups */
|
||||
ppd_option_t *o1, *o2; /* Options */
|
||||
ppd_choice_t *c1, *c2; /* Choices */
|
||||
|
||||
@@ -68,22 +69,8 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (ppd == NULL)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Clear all conflicts...
|
||||
*/
|
||||
|
||||
conflicts = 0;
|
||||
|
||||
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
|
||||
{
|
||||
for (j = g->num_options, o1 = g->options; j > 0; j --, o1 ++)
|
||||
o1->conflicted = 0;
|
||||
|
||||
for (j = g->num_subgroups, sg = g->subgroups; j > 0; j --, sg ++)
|
||||
for (k = sg->num_options, o1 = sg->options; k > 0; k --, o1 ++)
|
||||
o1->conflicted = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop through all of the UI constraints and flag any options
|
||||
* that conflict...
|
||||
@@ -117,7 +104,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (c1->marked)
|
||||
break;
|
||||
|
||||
if (j == 0 || strcasecmp(c1->choice, "None") == 0)
|
||||
if (j == 0)
|
||||
c1 = NULL;
|
||||
}
|
||||
|
||||
@@ -147,7 +134,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
if (c2->marked)
|
||||
break;
|
||||
|
||||
if (j == 0 || strcasecmp(c2->choice, "None") == 0)
|
||||
if (j == 0)
|
||||
c2 = NULL;
|
||||
}
|
||||
|
||||
@@ -162,6 +149,11 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
o1->conflicted = 1;
|
||||
o2->conflicted = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
o1->conflicted = 0;
|
||||
o2->conflicted = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -178,7 +170,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
|
||||
ppd_choice_t * /* O - Choice pointer or NULL */
|
||||
ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */
|
||||
const char *choice) /* I - Name of choice */
|
||||
char *choice) /* I - Name of choice */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ppd_choice_t *c; /* Current choice */
|
||||
@@ -188,7 +180,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);
|
||||
@@ -201,7 +193,7 @@ ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */
|
||||
|
||||
ppd_choice_t * /* O - Pointer to choice or NULL */
|
||||
ppdFindMarkedChoice(ppd_file_t *ppd, /* I - PPD file */
|
||||
const char *option) /* I - Keyword/option name */
|
||||
char *option) /* I - Keyword/option name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ppd_option_t *o; /* Pointer to option */
|
||||
@@ -225,7 +217,7 @@ ppdFindMarkedChoice(ppd_file_t *ppd, /* I - PPD file */
|
||||
|
||||
ppd_option_t * /* O - Pointer to option or NULL */
|
||||
ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */
|
||||
const char *option) /* I - Option/Keyword name */
|
||||
char *option) /* I - Option/Keyword name */
|
||||
{
|
||||
int i, j, k; /* Looping vars */
|
||||
ppd_option_t *o; /* Pointer to option */
|
||||
@@ -239,12 +231,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);
|
||||
}
|
||||
|
||||
@@ -258,8 +250,8 @@ ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */
|
||||
|
||||
int /* O - Non-zero if option is marked */
|
||||
ppdIsMarked(ppd_file_t *ppd, /* I - PPD file data */
|
||||
const char *option, /* I - Option/Keyword name */
|
||||
const char *choice) /* I - Choice name */
|
||||
char *option, /* I - Option/Keyword name */
|
||||
char *choice) /* I - Choice name */
|
||||
{
|
||||
ppd_option_t *o; /* Option pointer */
|
||||
ppd_choice_t *c; /* Choice pointer */
|
||||
@@ -287,13 +279,19 @@ 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)
|
||||
return;
|
||||
|
||||
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
|
||||
ppd_defaults(ppd, g);
|
||||
ppd_defaults(g);
|
||||
|
||||
o = ppdFindOption(ppd, "PageSize");
|
||||
|
||||
for (i = 0; i < ppd->num_sizes; i ++)
|
||||
ppd->sizes[i].marked = strcmp(ppd->sizes[i].name, o->defchoice) == 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -308,8 +306,8 @@ ppdMarkDefaults(ppd_file_t *ppd)/* I - PPD file record */
|
||||
|
||||
int /* O - Number of conflicts */
|
||||
ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
const char *option, /* I - Keyword */
|
||||
const char *choice) /* I - Option name */
|
||||
char *option, /* I - Keyword */
|
||||
char *choice) /* I - Option name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ppd_option_t *o; /* Option pointer */
|
||||
@@ -319,7 +317,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...
|
||||
@@ -333,47 +331,35 @@ 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)
|
||||
break;
|
||||
if (strcmp(c->choice, choice) == 0)
|
||||
c->marked = 1;
|
||||
else if (o->ui != PPD_UI_PICKMANY)
|
||||
c->marked = 0;
|
||||
|
||||
if (i)
|
||||
if (strcmp(option, "PageSize") == 0 || strcmp(option, "PageRegion") == 0)
|
||||
{
|
||||
/*
|
||||
* Option found; mark it and then handle unmarking any other options.
|
||||
* Mark current page size...
|
||||
*/
|
||||
|
||||
c->marked = 1;
|
||||
for (i = 0; i < ppd->num_sizes; i ++)
|
||||
ppd->sizes[i].marked = strcmp(ppd->sizes[i].name, choice) == 0;
|
||||
|
||||
if (o->ui != PPD_UI_PICKMANY)
|
||||
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
|
||||
if (strcasecmp(c->choice, choice) != 0)
|
||||
c->marked = 0;
|
||||
/*
|
||||
* Unmark the current PageSize or PageRegion setting, as appropriate...
|
||||
*/
|
||||
|
||||
if (strcasecmp(option, "PageSize") == 0 || strcasecmp(option, "PageRegion") == 0)
|
||||
if (strcmp(option, "PageSize") == 0)
|
||||
{
|
||||
/*
|
||||
* Mark current page size...
|
||||
*/
|
||||
|
||||
for (i = 0; i < ppd->num_sizes; i ++)
|
||||
ppd->sizes[i].marked = strcasecmp(ppd->sizes[i].name, choice) == 0;
|
||||
|
||||
/*
|
||||
* Unmark the current PageSize or PageRegion setting, as appropriate...
|
||||
*/
|
||||
|
||||
if (strcasecmp(option, "PageSize") == 0)
|
||||
{
|
||||
if ((o = ppdFindOption(ppd, "PageRegion")) != NULL)
|
||||
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, "PageRegion");
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
o = ppdFindOption(ppd, "PageSize");
|
||||
for (i = 0; i < o->num_choices; i ++)
|
||||
o->choices[i].marked = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,8 +372,7 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
*/
|
||||
|
||||
static void
|
||||
ppd_defaults(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd_group_t *g) /* I - Group to default */
|
||||
ppd_defaults(ppd_group_t *g) /* I - Group to default */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ppd_option_t *o; /* Current option */
|
||||
@@ -398,11 +383,33 @@ 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)
|
||||
ppdMarkOption(ppd, o->keyword, o->defchoice);
|
||||
if (strcmp(o->keyword, "PageRegion") != 0)
|
||||
ppd_default(o);
|
||||
|
||||
for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++)
|
||||
ppd_defaults(ppd, sg);
|
||||
ppd_defaults(sg);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_default()' - Set the default choice for an option.
|
||||
*/
|
||||
|
||||
static void
|
||||
ppd_default(ppd_option_t *o) /* I - Option to default */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
ppd_choice_t *c; /* Current choice */
|
||||
|
||||
|
||||
if (o == NULL)
|
||||
return;
|
||||
|
||||
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
|
||||
if (strcmp(c->choice, o->defchoice) == 0)
|
||||
c->marked = 1;
|
||||
else
|
||||
c->marked = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+6
-17
@@ -14,7 +14,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
|
||||
@@ -33,15 +33,6 @@
|
||||
* Revision History:
|
||||
*
|
||||
* $Log: mime.c,v $
|
||||
* Revision 1.15 1999/10/10 15:40:23 mike
|
||||
* Scanf, strcpy, and sprintf security changes.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
@@ -183,8 +174,8 @@ mimeDelete(mime_t *mime) /* I - MIME database */
|
||||
*/
|
||||
|
||||
mime_t * /* O - Updated MIME database */
|
||||
mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
const char *pathname) /* I - Directory to load */
|
||||
mimeMerge(mime_t *mime, /* I - MIME database to add to */
|
||||
char *pathname) /* I - Directory to load */
|
||||
{
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
HANDLE dir; /* Directory handle */
|
||||
@@ -201,9 +192,7 @@ 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 ||
|
||||
(pathsep[-1] != '/' && pathsep[-1] != '\\'))
|
||||
@@ -303,7 +292,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);
|
||||
}
|
||||
}
|
||||
@@ -323,7 +312,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);
|
||||
}
|
||||
}
|
||||
|
||||
+7
-7
@@ -14,7 +14,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
|
||||
@@ -114,16 +114,16 @@ typedef struct /**** MIME Database ****/
|
||||
|
||||
extern void mimeDelete(mime_t *mime);
|
||||
#define mimeLoad(pathname) mimeMerge((mime_t *)0, (pathname));
|
||||
extern mime_t *mimeMerge(mime_t *mime, const char *pathname);
|
||||
extern mime_t *mimeMerge(mime_t *mime, char *pathname);
|
||||
extern mime_t *mimeNew(void);
|
||||
|
||||
extern mime_type_t *mimeAddType(mime_t *mime, const char *super, const char *type);
|
||||
extern int mimeAddTypeRule(mime_type_t *mt, const char *rule);
|
||||
extern mime_type_t *mimeFileType(mime_t *mime, const char *pathname);
|
||||
extern mime_type_t *mimeType(mime_t *mime, const char *super, const char *type);
|
||||
extern mime_type_t *mimeAddType(mime_t *mime, char *super, char *type);
|
||||
extern int mimeAddTypeRule(mime_type_t *mt, char *rule);
|
||||
extern mime_type_t *mimeFileType(mime_t *mime, char *pathname);
|
||||
extern mime_type_t *mimeType(mime_t *mime, char *super, char *type);
|
||||
|
||||
extern mime_filter_t *mimeAddFilter(mime_t *mime, mime_type_t *src, mime_type_t *dst,
|
||||
int cost, const char *filter);
|
||||
int cost, char *filter);
|
||||
extern mime_filter_t *mimeFilter(mime_t *mime, mime_type_t *src, mime_type_t *dst,
|
||||
int *num_filters);
|
||||
|
||||
|
||||
+20
-75
@@ -45,8 +45,8 @@
|
||||
*/
|
||||
|
||||
int /* O - Number of options */
|
||||
cupsAddOption(const char *name, /* I - Name of option */
|
||||
const char *value, /* I - Value of option */
|
||||
cupsAddOption(char *name, /* I - Name of option */
|
||||
char *value, /* I - Value of option */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t **options) /* IO - Pointer to options */
|
||||
{
|
||||
@@ -62,7 +62,7 @@ cupsAddOption(const char *name, /* I - Name of option */
|
||||
*/
|
||||
|
||||
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)
|
||||
@@ -128,8 +128,8 @@ cupsFreeOptions(int num_options, /* I - Number of options */
|
||||
* 'cupsGetOption()' - Get an option value.
|
||||
*/
|
||||
|
||||
const char * /* O - Option value or NULL */
|
||||
cupsGetOption(const char *name, /* I - Name of option */
|
||||
char * /* O - Option value or NULL */
|
||||
cupsGetOption(char *name, /* I - Name of option */
|
||||
int num_options,/* I - Number of options */
|
||||
cups_option_t *options) /* I - Options */
|
||||
{
|
||||
@@ -140,7 +140,7 @@ cupsGetOption(const char *name, /* I - Name of option */
|
||||
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);
|
||||
@@ -152,7 +152,7 @@ cupsGetOption(const char *name, /* I - Name of option */
|
||||
*/
|
||||
|
||||
int /* O - Number of options found */
|
||||
cupsParseOptions(const char *arg, /* I - Argument to parse */
|
||||
cupsParseOptions(char *arg, /* I - Argument to parse */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t **options) /* O - Options found */
|
||||
{
|
||||
@@ -279,93 +279,38 @@ cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int conflict; /* Option conflicts */
|
||||
char *val, /* Pointer into value */
|
||||
*ptr, /* Pointer into string */
|
||||
s[255]; /* Temporary string */
|
||||
|
||||
|
||||
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
|
||||
* marking each individual option.
|
||||
*/
|
||||
|
||||
for (val = options->value; *val;)
|
||||
{
|
||||
/*
|
||||
* Extract the sub-option from the string...
|
||||
*/
|
||||
|
||||
for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
|
||||
*ptr++ = *val++;
|
||||
*ptr++ = '\0';
|
||||
|
||||
if (*val == ',')
|
||||
val ++;
|
||||
|
||||
/*
|
||||
* Mark it...
|
||||
*/
|
||||
|
||||
if (ppdMarkOption(ppd, "PageSize", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "InputSlot", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "MediaType", s))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "EFMediaQualityMode", s)) /* EFI */
|
||||
conflict = 1;
|
||||
if (strcasecmp(s, "manual") == 0)
|
||||
if (ppdMarkOption(ppd, "ManualFeed", "True"))
|
||||
conflict = 1;
|
||||
}
|
||||
if (ppdMarkOption(ppd, "PageSize", options->value))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "InputSlot", options->value))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "MediaType", options->value))
|
||||
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;
|
||||
if (ppdMarkOption(ppd, "EFDuplex", "None")) /* EFI */
|
||||
conflict = 1;
|
||||
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;
|
||||
if (ppdMarkOption(ppd, "EFDuplex", "DuplexNoTumble")) /* EFI */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexNoTumble")) /* Kodak */
|
||||
if (ppdMarkOption(ppd, "Duplex", "NoTumble"))
|
||||
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;
|
||||
if (ppdMarkOption(ppd, "EFDuplex", "DuplexTumble")) /* EFI */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexTumble")) /* Kodak */
|
||||
if (ppdMarkOption(ppd, "Duplex", "Tumble"))
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(options->name, "resolution") == 0)
|
||||
{
|
||||
if (ppdMarkOption(ppd, "Resolution", options->value))
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "SetResolution", options->value))
|
||||
/* Calcomp, Linotype, QMS, Summagraphics, Tektronix, Varityper */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "JCLResolution", options->value)) /* HP */
|
||||
conflict = 1;
|
||||
if (ppdMarkOption(ppd, "CNRes_PGP", options->value)) /* Canon */
|
||||
conflict = 1;
|
||||
}
|
||||
else if (ppdMarkOption(ppd, options->name, options->value))
|
||||
conflict = 1;
|
||||
|
||||
|
||||
+31
-41
@@ -45,7 +45,7 @@
|
||||
|
||||
ppd_size_t * /* O - Size record for page or NULL */
|
||||
ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */
|
||||
const char *name) /* I - Size name */
|
||||
char *name) /* I - Size name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
float w, l; /* Width and length of page */
|
||||
@@ -57,19 +57,9 @@ ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */
|
||||
|
||||
if (name != NULL)
|
||||
{
|
||||
if (strncmp(name, "Custom.", 7) == 0 && ppd->variable_sizes)
|
||||
if (strncmp(name, "Custom.", 7) == 0 &&
|
||||
strcmp(ppd->sizes[0].name, "Custom") == 0)
|
||||
{
|
||||
/*
|
||||
* Find the custom page size...
|
||||
*/
|
||||
|
||||
for (i = 0; i < ppd->num_sizes; i ++)
|
||||
if (strcmp("Custom", ppd->sizes[i].name) == 0)
|
||||
break;
|
||||
|
||||
if (i == ppd->num_sizes)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Variable size; size name can be one of the following:
|
||||
*
|
||||
@@ -80,47 +70,47 @@ 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].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[0].width = w * 72.0;
|
||||
ppd->sizes[0].length = l * 72.0;
|
||||
ppd->sizes[0].left = ppd->custom_margins[0];
|
||||
ppd->sizes[0].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[0].right = w * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[0].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].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[0].width = w * 2.54 * 72.0;
|
||||
ppd->sizes[0].length = l * 2.54 * 72.0;
|
||||
ppd->sizes[0].left = ppd->custom_margins[0];
|
||||
ppd->sizes[0].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[0].right = w * 2.54 * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[0].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].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[0].width = w * 25.4 * 72.0;
|
||||
ppd->sizes[0].length = l * 25.4 * 72.0;
|
||||
ppd->sizes[0].left = ppd->custom_margins[0];
|
||||
ppd->sizes[0].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[0].right = w * 25.4 * 72.0 - ppd->custom_margins[2];
|
||||
ppd->sizes[0].top = l * 25.4 * 72.0 - ppd->custom_margins[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
ppd->sizes[i].width = w;
|
||||
ppd->sizes[i].length = l;
|
||||
ppd->sizes[i].left = ppd->custom_margins[0];
|
||||
ppd->sizes[i].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[i].right = w - ppd->custom_margins[2];
|
||||
ppd->sizes[i].top = l - ppd->custom_margins[3];
|
||||
ppd->sizes[0].width = w;
|
||||
ppd->sizes[0].length = l;
|
||||
ppd->sizes[0].left = ppd->custom_margins[0];
|
||||
ppd->sizes[0].bottom = ppd->custom_margins[1];
|
||||
ppd->sizes[0].right = w - ppd->custom_margins[2];
|
||||
ppd->sizes[0].top = l - ppd->custom_margins[3];
|
||||
}
|
||||
|
||||
return (ppd->sizes + i);
|
||||
return (ppd->sizes);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -154,7 +144,7 @@ ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */
|
||||
|
||||
float /* O - Width of page in points or 0.0 */
|
||||
ppdPageWidth(ppd_file_t *ppd, /* I - PPD file record */
|
||||
const char *name) /* I - Size name */
|
||||
char *name) /* I - Size name */
|
||||
{
|
||||
ppd_size_t *size; /* Page size */
|
||||
|
||||
@@ -172,7 +162,7 @@ ppdPageWidth(ppd_file_t *ppd, /* I - PPD file record */
|
||||
|
||||
float /* O - Length of page in points or 0.0 */
|
||||
ppdPageLength(ppd_file_t *ppd, /* I - PPD file */
|
||||
const char *name) /* I - Size name */
|
||||
char *name) /* I - Size name */
|
||||
{
|
||||
ppd_size_t *size; /* Page size */
|
||||
|
||||
|
||||
+107
-419
@@ -40,22 +40,17 @@
|
||||
* ppdOpenFile() - Read a PPD file into memory.
|
||||
* ppd_read() - Read a line from a PPD file, skipping comment lines
|
||||
* as necessary.
|
||||
* compare_strings() - Compare two strings.
|
||||
* compare_groups() - Compare two groups.
|
||||
* compare_options() - Compare two options.
|
||||
* compare_choices() - Compare two choices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers.
|
||||
*/
|
||||
|
||||
/*#define DEBUG*/
|
||||
#include "ppd.h"
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "string.h"
|
||||
#include "language.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -70,8 +65,6 @@
|
||||
# define WRITE_BINARY "w" /* Open a binary file for writing */
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
#define safe_free(p) if (p) free(p) /* Safe free macro */
|
||||
|
||||
#define PPD_KEYWORD 1 /* Line contained a keyword */
|
||||
#define PPD_OPTION 2 /* Line contained an option name */
|
||||
#define PPD_TEXT 4 /* Line contained human-readable text */
|
||||
@@ -82,14 +75,9 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static int compare_strings(char *s, char *t);
|
||||
static int compare_groups(ppd_group_t *g0, ppd_group_t *g1);
|
||||
static int compare_options(ppd_option_t *o0, ppd_option_t *o1);
|
||||
static int compare_choices(ppd_choice_t *c0, ppd_choice_t *c1);
|
||||
static int ppd_read(FILE *fp, char *keyword, char *option,
|
||||
char *text, char **string);
|
||||
static void ppd_decode(char *string);
|
||||
static void ppd_fix(char *string);
|
||||
static void ppd_free_group(ppd_group_t *group);
|
||||
static void ppd_free_option(ppd_option_t *option);
|
||||
static ppd_group_t *ppd_get_group(ppd_file_t *ppd, char *name);
|
||||
@@ -121,14 +109,14 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
* Free all strings at the top level...
|
||||
*/
|
||||
|
||||
safe_free(ppd->lang_encoding);
|
||||
safe_free(ppd->lang_version);
|
||||
safe_free(ppd->modelname);
|
||||
safe_free(ppd->ttrasterizer);
|
||||
safe_free(ppd->manufacturer);
|
||||
safe_free(ppd->product);
|
||||
safe_free(ppd->nickname);
|
||||
safe_free(ppd->shortnickname);
|
||||
free(ppd->lang_encoding);
|
||||
free(ppd->lang_version);
|
||||
free(ppd->modelname);
|
||||
free(ppd->ttrasterizer);
|
||||
free(ppd->manufacturer);
|
||||
free(ppd->product);
|
||||
free(ppd->nickname);
|
||||
free(ppd->shortnickname);
|
||||
|
||||
/*
|
||||
* Free any emulations...
|
||||
@@ -138,11 +126,11 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
{
|
||||
for (i = ppd->num_emulations, emul = ppd->emulations; i > 0; i --, emul ++)
|
||||
{
|
||||
safe_free(emul->start);
|
||||
safe_free(emul->stop);
|
||||
free(emul->start);
|
||||
free(emul->stop);
|
||||
}
|
||||
|
||||
safe_free(ppd->emulations);
|
||||
free(ppd->emulations);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -154,7 +142,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
|
||||
ppd_free_group(group);
|
||||
|
||||
safe_free(ppd->groups);
|
||||
free(ppd->groups);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -162,14 +150,14 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
*/
|
||||
|
||||
if (ppd->num_sizes > 0)
|
||||
safe_free(ppd->sizes);
|
||||
free(ppd->sizes);
|
||||
|
||||
/*
|
||||
* Free any constraints...
|
||||
*/
|
||||
|
||||
if (ppd->num_consts > 0)
|
||||
safe_free(ppd->consts);
|
||||
free(ppd->consts);
|
||||
|
||||
/*
|
||||
* Free any fonts...
|
||||
@@ -178,9 +166,9 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
if (ppd->num_fonts > 0)
|
||||
{
|
||||
for (i = ppd->num_fonts, font = ppd->fonts; i > 0; i --, font ++)
|
||||
safe_free(*font);
|
||||
free(*font);
|
||||
|
||||
safe_free(ppd->fonts);
|
||||
free(ppd->fonts);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -188,13 +176,13 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
|
||||
*/
|
||||
|
||||
if (ppd->num_profiles > 0)
|
||||
safe_free(ppd->profiles);
|
||||
free(ppd->profiles);
|
||||
|
||||
/*
|
||||
* Free the whole record...
|
||||
*/
|
||||
|
||||
safe_free(ppd);
|
||||
free(ppd);
|
||||
}
|
||||
|
||||
|
||||
@@ -217,7 +205,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
|
||||
i --, option ++)
|
||||
ppd_free_option(option);
|
||||
|
||||
safe_free(group->options);
|
||||
free(group->options);
|
||||
}
|
||||
|
||||
if (group->num_subgroups > 0)
|
||||
@@ -227,7 +215,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
|
||||
i --, subgroup ++)
|
||||
ppd_free_group(subgroup);
|
||||
|
||||
safe_free(group->subgroups);
|
||||
free(group->subgroups);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,9 +236,9 @@ ppd_free_option(ppd_option_t *option) /* I - Option to free */
|
||||
for (i = option->num_choices, choice = option->choices;
|
||||
i > 0;
|
||||
i --, choice ++)
|
||||
safe_free(choice->code);
|
||||
free(choice->code);
|
||||
|
||||
safe_free(option->choices);
|
||||
free(option->choices);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -287,7 +275,7 @@ ppd_get_group(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd->num_groups ++;
|
||||
|
||||
memset(group, 0, sizeof(ppd_group_t));
|
||||
strncpy(group->text, name, sizeof(group->text) - 1);
|
||||
strcpy(group->text, name);
|
||||
}
|
||||
|
||||
return (group);
|
||||
@@ -326,7 +314,7 @@ ppd_get_option(ppd_group_t *group, /* I - Group */
|
||||
group->num_options ++;
|
||||
|
||||
memset(option, 0, sizeof(ppd_option_t));
|
||||
strncpy(option->keyword, name, sizeof(option->keyword) - 1);
|
||||
strcpy(option->keyword, name);
|
||||
}
|
||||
|
||||
return (option);
|
||||
@@ -358,7 +346,7 @@ ppd_add_choice(ppd_option_t *option, /* I - Option */
|
||||
option->num_choices ++;
|
||||
|
||||
memset(choice, 0, sizeof(ppd_choice_t));
|
||||
strncpy(choice->choice, name, sizeof(choice->choice) - 1);
|
||||
strcpy(choice->choice, name);
|
||||
|
||||
return (choice);
|
||||
}
|
||||
@@ -388,7 +376,7 @@ ppd_add_size(ppd_file_t *ppd, /* I - PPD file */
|
||||
ppd->num_sizes ++;
|
||||
|
||||
memset(size, 0, sizeof(ppd_size_t));
|
||||
strncpy(size->name, name, sizeof(size->name) - 1);
|
||||
strcpy(size->name, name);
|
||||
|
||||
return (size);
|
||||
}
|
||||
@@ -421,15 +409,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd_section_t section; /* Order dependency section */
|
||||
ppd_profile_t *profile; /* Pointer to color profile */
|
||||
char **filter; /* Pointer to filter */
|
||||
cups_lang_t *language; /* Default language */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default language for the user...
|
||||
*/
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -451,14 +432,14 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
* Either this is not a PPD file, or it is not a 4.x PPD file.
|
||||
*/
|
||||
|
||||
safe_free(string);
|
||||
if (string != NULL)
|
||||
free(string);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
DEBUG_printf(("ppdOpen: keyword = %s, string = %08x\n", keyword, string));
|
||||
|
||||
safe_free(string);
|
||||
if (string != NULL)
|
||||
free(string);
|
||||
|
||||
/*
|
||||
* Allocate memory for the PPD file record...
|
||||
@@ -601,10 +582,9 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
ppd->num_profiles ++;
|
||||
|
||||
memset(profile, 0, sizeof(ppd_profile_t));
|
||||
strncpy(profile->resolution, name, sizeof(profile->resolution) - 1);
|
||||
strncpy(profile->media_type, text, sizeof(profile->media_type) - 1);
|
||||
sscanf(string, "%f%f%f%f%f%f%f%f%f%f%f", &(profile->density),
|
||||
&(profile->gamma),
|
||||
strcpy(profile->resolution, name);
|
||||
strcpy(profile->media_type, text);
|
||||
sscanf(string, "%f%f%f%f%f%f%f%f%f%f", &(profile->density),
|
||||
profile->matrix[0] + 0, profile->matrix[0] + 1,
|
||||
profile->matrix[0] + 2, profile->matrix[1] + 0,
|
||||
profile->matrix[1] + 1, profile->matrix[1] + 2,
|
||||
@@ -630,8 +610,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
string = NULL;
|
||||
}
|
||||
else if (strcmp(keyword, "VariablePaperSize") == 0 &&
|
||||
strcmp(string, "True") == 0 &&
|
||||
!ppd->variable_sizes)
|
||||
strcmp(string, "True") == 0)
|
||||
{
|
||||
ppd->variable_sizes = 1;
|
||||
|
||||
@@ -645,38 +624,35 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
* Add a "Custom" page size option...
|
||||
*/
|
||||
|
||||
if ((group = ppd_get_group(ppd,
|
||||
cupsLangString(language,
|
||||
CUPS_MSG_GENERAL))) == NULL)
|
||||
if ((group = ppd_get_group(ppd, "General")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((option = ppd_get_option(group, "PageSize")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
strcpy(choice->text, "Custom Size");
|
||||
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)
|
||||
@@ -691,62 +667,20 @@ 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 ((group = ppd_get_group(ppd,
|
||||
cupsLangString(language,
|
||||
CUPS_MSG_GENERAL))) == 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)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
strncpy(choice->text, cupsLangString(language, CUPS_MSG_VARIABLE),
|
||||
sizeof(choice->text) - 1);
|
||||
group = NULL;
|
||||
option = NULL;
|
||||
}
|
||||
|
||||
if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
ppdClose(ppd);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((choice = ppdFindChoice(option, "Custom")) == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -839,41 +773,45 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (subgroup != NULL)
|
||||
option = ppd_get_option(subgroup, name);
|
||||
else if (group == NULL)
|
||||
else
|
||||
{
|
||||
if (strcmp(name, "Collate") != 0 &&
|
||||
strcmp(name, "Duplex") != 0 &&
|
||||
strcmp(name, "InputSlot") != 0 &&
|
||||
strcmp(name, "ManualFeed") != 0 &&
|
||||
strcmp(name, "MediaType") != 0 &&
|
||||
strcmp(name, "MediaColor") != 0 &&
|
||||
strcmp(name, "MediaWeight") != 0 &&
|
||||
strcmp(name, "OutputBin") != 0 &&
|
||||
strcmp(name, "OutputMode") != 0 &&
|
||||
strcmp(name, "OutputOrder") != 0 &&
|
||||
strcmp(name, "PageSize") != 0 &&
|
||||
strcmp(name, "PageRegion") != 0)
|
||||
group = ppd_get_group(ppd, cupsLangString(language, CUPS_MSG_EXTRA));
|
||||
else
|
||||
group = ppd_get_group(ppd, cupsLangString(language, CUPS_MSG_GENERAL));
|
||||
|
||||
if (group == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
return (NULL);
|
||||
}
|
||||
if (strcmp(name, "Collate") != 0 &&
|
||||
strcmp(name, "Duplex") != 0 &&
|
||||
strcmp(name, "InputSlot") != 0 &&
|
||||
strcmp(name, "ManualFeed") != 0 &&
|
||||
strcmp(name, "MediaType") != 0 &&
|
||||
strcmp(name, "MediaColor") != 0 &&
|
||||
strcmp(name, "MediaWeight") != 0 &&
|
||||
strcmp(name, "OutputBin") != 0 &&
|
||||
strcmp(name, "OutputMode") != 0 &&
|
||||
strcmp(name, "OutputOrder") != 0 &&
|
||||
strcmp(name, "PageSize") != 0 &&
|
||||
strcmp(name, "PageRegion") != 0)
|
||||
group = ppd_get_group(ppd, "Printer");
|
||||
else
|
||||
group = ppd_get_group(ppd, "General");
|
||||
|
||||
option = ppd_get_option(group, name);
|
||||
if (group == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
option = ppd_get_option(group, name);
|
||||
group = NULL;
|
||||
}
|
||||
else
|
||||
option = ppd_get_option(group, name);
|
||||
group = NULL;
|
||||
}
|
||||
else
|
||||
option = ppd_get_option(group, name);
|
||||
|
||||
if (option == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -888,31 +826,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else
|
||||
option->ui = PPD_UI_PICKONE;
|
||||
|
||||
if (text[0])
|
||||
{
|
||||
strncpy(option->text, text, sizeof(option->text) - 1);
|
||||
ppd_fix(option->text);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp(name, "PageSize") == 0)
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SIZE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "MediaType") == 0)
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_TYPE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "InputSlot") == 0)
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_MEDIA_SOURCE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "ColorModel") == 0)
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_OUTPUT_MODE),
|
||||
sizeof(option->text) - 1);
|
||||
else if (strcmp(name, "Resolution") == 0)
|
||||
strncpy(option->text, cupsLangString(language, CUPS_MSG_RESOLUTION),
|
||||
sizeof(option->text) - 1);
|
||||
else
|
||||
strncpy(option->text, name, sizeof(option->text) - 1);
|
||||
}
|
||||
strcpy(option->text, text);
|
||||
|
||||
option->section = PPD_ORDER_ANY;
|
||||
}
|
||||
@@ -922,12 +836,19 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
* Find the JCL group, and add if needed...
|
||||
*/
|
||||
|
||||
if (group != NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
group = ppd_get_group(ppd, "JCL");
|
||||
|
||||
if (group == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -943,7 +864,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (option == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -958,7 +879,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
else
|
||||
option->ui = PPD_UI_PICKONE;
|
||||
|
||||
strncpy(option->text, text, sizeof(option->text) - 1);
|
||||
strcpy(option->text, text);
|
||||
|
||||
option->section = PPD_ORDER_JCL;
|
||||
group = NULL;
|
||||
@@ -975,15 +896,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (group != NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (strchr(string, '/') != NULL) /* Just show human readable text */
|
||||
strcpy(string, strchr(string, '/') + 1);
|
||||
|
||||
ppd_decode(string);
|
||||
ppd_fix(string);
|
||||
group = ppd_get_group(ppd, string);
|
||||
}
|
||||
else if (strcmp(keyword, "CloseGroup") == 0)
|
||||
@@ -997,7 +916,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (group == NULL || subgroup != NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1010,7 +929,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (subgroup == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1019,19 +938,17 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
group->num_subgroups ++;
|
||||
|
||||
memset(subgroup, 0, sizeof(ppd_group_t));
|
||||
ppd_decode(string);
|
||||
ppd_fix(string);
|
||||
strncpy(subgroup->text, string, sizeof(subgroup->text) - 1);
|
||||
strcpy(subgroup->text, string);
|
||||
}
|
||||
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);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1080,9 +997,6 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
}
|
||||
else if (strncmp(keyword, "Default", 7) == 0)
|
||||
{
|
||||
if (string == NULL)
|
||||
continue;
|
||||
|
||||
if (strchr(string, '/') != NULL)
|
||||
*strchr(string, '/') = '\0';
|
||||
|
||||
@@ -1100,15 +1014,14 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
for (i = 0; i < group->num_options; i ++)
|
||||
if (strcmp(keyword, group->options[i].keyword) == 0)
|
||||
{
|
||||
strncpy(group->options[i].defchoice, string,
|
||||
sizeof(group->options[i].defchoice) - 1);
|
||||
strcpy(group->options[i].defchoice, string);
|
||||
break;
|
||||
}
|
||||
|
||||
group = NULL;
|
||||
}
|
||||
else
|
||||
strncpy(option->defchoice, string, sizeof(option->defchoice) - 1);
|
||||
strcpy(option->defchoice, string);
|
||||
}
|
||||
else if (strcmp(keyword, "UIConstraints") == 0 ||
|
||||
strcmp(keyword, "NonUIConstraints") == 0)
|
||||
@@ -1122,7 +1035,7 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
if (constraint == NULL)
|
||||
{
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1130,14 +1043,14 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
constraint += ppd->num_consts;
|
||||
ppd->num_consts ++;
|
||||
|
||||
switch (sscanf(string, "%40s%40s%40s%40s", constraint->option1,
|
||||
switch (sscanf(string, "%s%s%s%s", constraint->option1,
|
||||
constraint->choice1, constraint->option2,
|
||||
constraint->choice2))
|
||||
{
|
||||
case 0 : /* Error */
|
||||
case 1 : /* Error */
|
||||
ppdClose(ppd);
|
||||
safe_free(string);
|
||||
free(string);
|
||||
break;
|
||||
|
||||
case 2 : /* Two options... */
|
||||
@@ -1159,17 +1072,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
|
||||
if (constraint->choice1[0] == '*')
|
||||
{
|
||||
strcpy(constraint->choice2, constraint->option2);
|
||||
strcpy(constraint->option2, constraint->choice1 + 1);
|
||||
constraint->choice1[0] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
if (constraint->option2[0] == '*')
|
||||
strcpy(constraint->option2, constraint->option2 + 1);
|
||||
else if (constraint->option2[0] == '*')
|
||||
strcpy(constraint->option2, constraint->option2 + 1);
|
||||
|
||||
constraint->choice2[0] = '\0';
|
||||
}
|
||||
constraint->choice2[0] = '\0';
|
||||
break;
|
||||
|
||||
case 4 : /* Two options, two choices... */
|
||||
@@ -1212,16 +1121,13 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
choice = ppd_add_choice(option, name);
|
||||
|
||||
if (mask & PPD_TEXT)
|
||||
{
|
||||
strncpy(choice->text, text, sizeof(choice->text) - 1);
|
||||
ppd_fix(choice->text);
|
||||
}
|
||||
strcpy(choice->text, text);
|
||||
else if (strcmp(name, "True") == 0)
|
||||
strcpy(choice->text, "Yes");
|
||||
else if (strcmp(name, "False") == 0)
|
||||
strcpy(choice->text, "No");
|
||||
else
|
||||
strncpy(choice->text, name, sizeof(choice->text) - 1);
|
||||
strcpy(choice->text, name);
|
||||
|
||||
if (strncmp(keyword, "JCL", 3) == 0)
|
||||
ppd_decode(string); /* Decode quoted string */
|
||||
@@ -1230,7 +1136,8 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
string = NULL; /* Don't free this string below */
|
||||
}
|
||||
|
||||
safe_free(string);
|
||||
if (string != NULL)
|
||||
free(string);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -1242,48 +1149,24 @@ ppdOpen(FILE *fp) /* I - File to read from */
|
||||
* Set the option back-pointer for each choice...
|
||||
*/
|
||||
|
||||
qsort(ppd->groups, ppd->num_groups, sizeof(ppd_group_t),
|
||||
(int (*)(const void *, const void *))compare_groups);
|
||||
|
||||
for (i = ppd->num_groups, group = ppd->groups;
|
||||
i > 0;
|
||||
i --, group ++)
|
||||
{
|
||||
qsort(group->options, group->num_options, sizeof(ppd_option_t),
|
||||
(int (*)(const void *, const void *))compare_options);
|
||||
|
||||
for (j = group->num_options, option = group->options;
|
||||
j > 0;
|
||||
j --, option ++)
|
||||
{
|
||||
qsort(option->choices, option->num_choices, sizeof(ppd_choice_t),
|
||||
(int (*)(const void *, const void *))compare_choices);
|
||||
|
||||
for (k = 0; k < option->num_choices; k ++)
|
||||
option->choices[k].option = (void *)option;
|
||||
}
|
||||
|
||||
qsort(group->subgroups, group->num_subgroups, sizeof(ppd_group_t),
|
||||
(int (*)(const void *, const void *))compare_groups);
|
||||
|
||||
for (j = group->num_subgroups, subgroup = group->subgroups;
|
||||
j > 0;
|
||||
j --, subgroup ++)
|
||||
{
|
||||
qsort(subgroup->options, subgroup->num_options, sizeof(ppd_option_t),
|
||||
(int (*)(const void *, const void *))compare_options);
|
||||
|
||||
for (k = group->num_options, option = group->options;
|
||||
k > 0;
|
||||
k --, option ++)
|
||||
{
|
||||
qsort(option->choices, option->num_choices, sizeof(ppd_choice_t),
|
||||
(int (*)(const void *, const void *))compare_choices);
|
||||
|
||||
for (m = 0; m < option->num_choices; m ++)
|
||||
option->choices[m].option = (void *)option;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (ppd);
|
||||
@@ -1318,7 +1201,7 @@ ppdOpenFd(int fd) /* I - File to read from */
|
||||
|
||||
ppd = ppdOpen(fp);
|
||||
|
||||
safe_free(fp);
|
||||
free(fp);
|
||||
}
|
||||
else
|
||||
ppd = NULL;
|
||||
@@ -1332,7 +1215,7 @@ ppdOpenFd(int fd) /* I - File to read from */
|
||||
*/
|
||||
|
||||
ppd_file_t * /* O - PPD file record */
|
||||
ppdOpenFile(const char *filename) /* I - File to read from */
|
||||
ppdOpenFile(char *filename) /* I - File to read from */
|
||||
{
|
||||
FILE *fp; /* File pointer */
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
@@ -1362,151 +1245,6 @@ ppdOpenFile(const char *filename) /* I - File to read from */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'compare_strings()' - Compare two strings.
|
||||
*/
|
||||
|
||||
int /* O - Result of comparison */
|
||||
compare_strings(char *s, /* I - First string */
|
||||
char *t) /* I - Second string */
|
||||
{
|
||||
int diff, /* Difference between digits */
|
||||
digits; /* Number of digits */
|
||||
|
||||
|
||||
/*
|
||||
* Loop through both strings, returning only when a difference is
|
||||
* seen. Also, compare whole numbers rather than just characters, too!
|
||||
*/
|
||||
|
||||
while (*s && *t)
|
||||
{
|
||||
if (isdigit(*s) && isdigit(*t))
|
||||
{
|
||||
/*
|
||||
* Got a number; start by skipping leading 0's...
|
||||
*/
|
||||
|
||||
while (*s == '0')
|
||||
s ++;
|
||||
while (*t == '0')
|
||||
t ++;
|
||||
|
||||
/*
|
||||
* Skip equal digits...
|
||||
*/
|
||||
|
||||
while (isdigit(*s) && *s == *t)
|
||||
{
|
||||
s ++;
|
||||
t ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bounce out if *s and *t aren't both digits...
|
||||
*/
|
||||
|
||||
if (isdigit(*s) && !isdigit(*t))
|
||||
return (1);
|
||||
else if (!isdigit(*s) && isdigit(*t))
|
||||
return (-1);
|
||||
else if (!isdigit(*s) || !isdigit(*t))
|
||||
continue;
|
||||
|
||||
if (*s < *t)
|
||||
diff = -1;
|
||||
else
|
||||
diff = 1;
|
||||
|
||||
/*
|
||||
* Figure out how many more digits there are...
|
||||
*/
|
||||
|
||||
digits = 0;
|
||||
|
||||
while (isdigit(*s))
|
||||
{
|
||||
digits ++;
|
||||
s ++;
|
||||
}
|
||||
|
||||
while (isdigit(*t))
|
||||
{
|
||||
digits --;
|
||||
t ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return if the number or value of the digits is different...
|
||||
*/
|
||||
|
||||
if (digits < 0)
|
||||
return (-1);
|
||||
else if (digits > 0)
|
||||
return (1);
|
||||
else
|
||||
return (diff);
|
||||
}
|
||||
else if (tolower(*s) < tolower(*t))
|
||||
return (-1);
|
||||
else if (tolower(*s) > tolower(*t))
|
||||
return (1);
|
||||
else
|
||||
{
|
||||
s ++;
|
||||
t ++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the results of the final comparison...
|
||||
*/
|
||||
|
||||
if (*s)
|
||||
return (1);
|
||||
else if (*t)
|
||||
return (-1);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'compare_groups()' - Compare two groups.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
compare_groups(ppd_group_t *g0, /* I - First group */
|
||||
ppd_group_t *g1) /* I - Second group */
|
||||
{
|
||||
return (compare_strings(g0->text, g1->text));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'compare_options()' - Compare two options.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
compare_options(ppd_option_t *o0,/* I - First option */
|
||||
ppd_option_t *o1)/* I - Second option */
|
||||
{
|
||||
return (compare_strings(o0->text, o1->text));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'compare_choices()' - Compare two choices.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
compare_choices(ppd_choice_t *c0,/* I - First choice */
|
||||
ppd_choice_t *c1)/* I - Second choice */
|
||||
{
|
||||
return (compare_strings(c0->text, c1->text));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_read()' - Read a line from a PPD file, skipping comment lines as
|
||||
* necessary.
|
||||
@@ -1757,56 +1495,6 @@ ppd_decode(char *string) /* I - String to decode */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_fix()' - Fix WinANSI characters in the range 0x80 to 0x9f to be
|
||||
* valid ISO-8859-1 characters...
|
||||
*/
|
||||
|
||||
static void
|
||||
ppd_fix(char *string) /* IO - String to fix */
|
||||
{
|
||||
unsigned char *p; /* Pointer into string */
|
||||
static unsigned char lut[32] =/* Lookup table for characters */
|
||||
{
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
0x20,
|
||||
'l',
|
||||
'`',
|
||||
'\'',
|
||||
'^',
|
||||
'~',
|
||||
0x20, /* bar */
|
||||
0x20, /* circumflex */
|
||||
0x20, /* dot */
|
||||
0x20, /* double dot */
|
||||
0x20,
|
||||
0x20, /* circle */
|
||||
0x20, /* ??? */
|
||||
0x20,
|
||||
'\"', /* should be right quotes */
|
||||
0x20, /* ??? */
|
||||
0x20 /* accent */
|
||||
};
|
||||
|
||||
|
||||
for (p = (unsigned char *)string; *p; p ++)
|
||||
if (*p >= 0x80 && *p < 0xa0)
|
||||
*p = lut[*p - 0x80];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+11
-12
@@ -153,7 +153,6 @@ typedef struct /**** sRGB Color Profiles ****/
|
||||
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 */
|
||||
} ppd_profile_t;
|
||||
|
||||
@@ -210,20 +209,20 @@ 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 ppdIsMarked(ppd_file_t *ppd, const char *keyword,
|
||||
const char *option);
|
||||
extern int ppdIsMarked(ppd_file_t *ppd, char *keyword,
|
||||
char *option);
|
||||
extern void ppdMarkDefaults(ppd_file_t *ppd);
|
||||
extern int ppdMarkOption(ppd_file_t *ppd, const char *keyword,
|
||||
const char *option);
|
||||
extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option);
|
||||
extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword);
|
||||
extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword);
|
||||
extern int ppdMarkOption(ppd_file_t *ppd, char *keyword,
|
||||
char *option);
|
||||
extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, char *option);
|
||||
extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, char *keyword);
|
||||
extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, char *keyword);
|
||||
extern ppd_file_t *ppdOpen(FILE *fp);
|
||||
extern ppd_file_t *ppdOpenFd(int fd);
|
||||
extern ppd_file_t *ppdOpenFile(const char *filename);
|
||||
extern float ppdPageLength(ppd_file_t *ppd, const char *name);
|
||||
extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name);
|
||||
extern float ppdPageWidth(ppd_file_t *ppd, const char *name);
|
||||
extern ppd_file_t *ppdOpenFile(char *filename);
|
||||
extern float ppdPageLength(ppd_file_t *ppd, char *name);
|
||||
extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, char *name);
|
||||
extern float ppdPageWidth(ppd_file_t *ppd, char *name);
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
|
||||
+1
-6
@@ -129,13 +129,8 @@ typedef enum
|
||||
CUPS_CSPACE_CMYK, /* Cyan, magenta, yellow, black */
|
||||
CUPS_CSPACE_YMCK, /* Yellow, magenta, cyan, black */
|
||||
CUPS_CSPACE_KCMY, /* Black, cyan, magenta, yellow */
|
||||
CUPS_CSPACE_KCMYcm, /* Black, cyan, magenta, yellow, *
|
||||
CUPS_CSPACE_KCMYcm /* Black, cyan, magenta, yellow, *
|
||||
* light-cyan, light-magenta */
|
||||
CUPS_CSPACE_GMCK, /* Gold, magenta, yellow, black */
|
||||
CUPS_CSPACE_GMCS, /* Gold, magenta, yellow, silver */
|
||||
CUPS_CSPACE_WHITE, /* White ink (as black) */
|
||||
CUPS_CSPACE_GOLD, /* Gold foil */
|
||||
CUPS_CSPACE_SILVER /* Silver foil */
|
||||
} cups_cspace_t;
|
||||
|
||||
|
||||
|
||||
@@ -1,287 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* snprintf functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* 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
|
||||
* 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
@@ -14,7 +14,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
|
||||
|
||||
+1
-29
@@ -14,7 +14,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
|
||||
@@ -29,8 +29,6 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdarg.h>
|
||||
# include <config.h>
|
||||
# include <string.h>
|
||||
|
||||
@@ -45,15 +43,6 @@
|
||||
# endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
@@ -70,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
-1
@@ -14,7 +14,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
|
||||
|
||||
+2
-2
@@ -14,7 +14,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
|
||||
@@ -104,7 +104,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
case 3 :
|
||||
src = mimeFileType(mime, argv[1]);
|
||||
|
||||
sscanf(argv[2], "%15[^/]/31%s", super, type);
|
||||
sscanf(argv[2], "%[^/]/%s", super, type);
|
||||
dst = mimeType(mime, super, type);
|
||||
|
||||
filters = mimeFilter(mime, src, dst, &num_filters);
|
||||
|
||||
+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
|
||||
|
||||
+2
-2
@@ -14,7 +14,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
|
||||
@@ -45,7 +45,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i, j, k, m, n; /* Looping vars */
|
||||
const char *filename; /* File to load */
|
||||
char *filename; /* File to load */
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
ppd_size_t *size; /* Size record */
|
||||
ppd_group_t *group; /* UI group */
|
||||
|
||||
+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
|
||||
|
||||
+27
-30
@@ -14,7 +14,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
|
||||
@@ -50,8 +50,8 @@
|
||||
*/
|
||||
|
||||
static int compare(mime_type_t **, mime_type_t **);
|
||||
static int checkrules(const char *, FILE *, mime_magic_t *);
|
||||
static int patmatch(const char *, const char *);
|
||||
static int checkrules(char *, FILE *, mime_magic_t *);
|
||||
static int patmatch(char *, char *);
|
||||
|
||||
|
||||
/*
|
||||
@@ -59,9 +59,9 @@ static int patmatch(const char *, const char *);
|
||||
*/
|
||||
|
||||
mime_type_t * /* O - New (or existing) MIME type */
|
||||
mimeAddType(mime_t *mime, /* I - MIME database */
|
||||
const char *super, /* I - Super-type name */
|
||||
const char *type) /* I - Type name */
|
||||
mimeAddType(mime_t *mime, /* I - MIME database */
|
||||
char *super, /* I - Super-type name */
|
||||
char *type) /* I - Type name */
|
||||
{
|
||||
mime_type_t *temp, /* New MIME type */
|
||||
**types; /* New MIME types array */
|
||||
@@ -108,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 *),
|
||||
@@ -125,7 +125,7 @@ mimeAddType(mime_t *mime, /* I - MIME database */
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
const char *rule) /* I - Rule to add */
|
||||
char *rule) /* I - Rule to add */
|
||||
{
|
||||
int num_values, /* Number of values seen */
|
||||
op, /* Operation code */
|
||||
@@ -392,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;
|
||||
@@ -497,14 +497,14 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */
|
||||
* 'mimeFileType()' - Determine the type of a file.
|
||||
*/
|
||||
|
||||
mime_type_t * /* O - Type of file */
|
||||
mimeFileType(mime_t *mime, /* I - MIME database */
|
||||
const char *pathname) /* I - Name of file to check */
|
||||
mime_type_t * /* O - Type of file */
|
||||
mimeFileType(mime_t *mime, /* I - MIME database */
|
||||
char *pathname) /* I - Name of file to check */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
FILE *fp; /* File pointer */
|
||||
mime_type_t **types; /* File types */
|
||||
const char *filename; /* Base filename of file */
|
||||
char *filename; /* Base filename of file */
|
||||
|
||||
|
||||
/*
|
||||
@@ -556,9 +556,9 @@ mimeFileType(mime_t *mime, /* I - MIME database */
|
||||
*/
|
||||
|
||||
mime_type_t * /* O - Matching file type definition */
|
||||
mimeType(mime_t *mime, /* I - MIME database */
|
||||
const char *super, /* I - Super-type name */
|
||||
const char *type) /* I - Type name */
|
||||
mimeType(mime_t *mime, /* I - MIME database */
|
||||
char *super, /* I - Super-type name */
|
||||
char *type) /* I - Type name */
|
||||
{
|
||||
mime_type_t key, /* MIME type search key*/
|
||||
*keyptr, /* Key pointer... */
|
||||
@@ -582,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,
|
||||
@@ -623,7 +620,7 @@ compare(mime_type_t **t0, /* I - First type */
|
||||
*/
|
||||
|
||||
static int /* O - 1 if match, 0 if no match */
|
||||
checkrules(const char *filename, /* I - Filename */
|
||||
checkrules(char *filename, /* I - Filename */
|
||||
FILE *fp, /* I - File to check */
|
||||
mime_magic_t *rules) /* I - Rules to check */
|
||||
{
|
||||
@@ -689,8 +686,8 @@ checkrules(const char *filename, /* I - Filename */
|
||||
bufptr = buffer + rules->offset - bufoffset;
|
||||
while (n > 0)
|
||||
if ((*bufptr >= 32 && *bufptr <= 126) ||
|
||||
(*bufptr >= 8 && *bufptr <= 13) ||
|
||||
*bufptr == 26 || *bufptr == 27)
|
||||
(*bufptr >= 8 && *bufptr <= 10) ||
|
||||
*bufptr == 13 || *bufptr == 26)
|
||||
{
|
||||
n --;
|
||||
bufptr ++;
|
||||
@@ -732,8 +729,8 @@ checkrules(const char *filename, /* I - Filename */
|
||||
while (n > 0)
|
||||
if ((*bufptr >= 160 && *bufptr <= 254) ||
|
||||
(*bufptr >= 32 && *bufptr <= 126) ||
|
||||
(*bufptr >= 8 && *bufptr <= 13) ||
|
||||
*bufptr == 26 || *bufptr == 27)
|
||||
(*bufptr >= 8 && *bufptr <= 10) ||
|
||||
*bufptr == 13 || *bufptr == 26)
|
||||
{
|
||||
n --;
|
||||
bufptr ++;
|
||||
@@ -909,9 +906,9 @@ checkrules(const char *filename, /* I - Filename */
|
||||
* 'patmatch()' - Pattern matching...
|
||||
*/
|
||||
|
||||
static int /* O - 1 if match, 0 if no match */
|
||||
patmatch(const char *s, /* I - String to match against */
|
||||
const char *pat) /* I - Pattern to match against */
|
||||
static int /* O - 1 if match, 0 if no match */
|
||||
patmatch(char *s, /* I - String to match against */
|
||||
char *pat) /* I - Pattern to match against */
|
||||
{
|
||||
/*
|
||||
* Range check the input...
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* User, system, and password routines for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* 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
|
||||
* 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:
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "cups.h"
|
||||
#include <config.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
/*
|
||||
* WIN32 and OS/2 username and password stuff...
|
||||
*/
|
||||
|
||||
/*
|
||||
* 'cupsUser()' - Return the current user's name.
|
||||
*/
|
||||
|
||||
const char * /* O - User name */
|
||||
cupsUser(void)
|
||||
{
|
||||
return ("WindowsUser");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetPassword()' - Get a password from the user...
|
||||
*/
|
||||
|
||||
const char * /* O - Password */
|
||||
cupsGetPassword(const char *prompt) /* I - Prompt string */
|
||||
{
|
||||
return (NULL);
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* UNIX username and password stuff...
|
||||
*/
|
||||
|
||||
# include <pwd.h>
|
||||
|
||||
/*
|
||||
* 'cupsUser()' - Return the current user's name.
|
||||
*/
|
||||
|
||||
const char * /* O - User name */
|
||||
cupsUser(void)
|
||||
{
|
||||
struct passwd *pwd; /* User/password entry */
|
||||
|
||||
|
||||
/*
|
||||
* Rewind the password file...
|
||||
*/
|
||||
|
||||
setpwent();
|
||||
|
||||
/*
|
||||
* Lookup the password entry for the current user.
|
||||
*/
|
||||
|
||||
if ((pwd = getpwuid(getuid())) == NULL)
|
||||
return ("unknown"); /* Unknown user! */
|
||||
|
||||
/*
|
||||
* Rewind the password file again and return the username...
|
||||
*/
|
||||
|
||||
setpwent();
|
||||
|
||||
return (pwd->pw_name);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetPassword()' - Get a password from the user...
|
||||
*/
|
||||
|
||||
const char * /* O - Password */
|
||||
cupsGetPassword(const char *prompt) /* I - Prompt string */
|
||||
{
|
||||
return (getpass(prompt));
|
||||
}
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsServer()' - Return the hostname of the default server...
|
||||
*/
|
||||
|
||||
const char * /* O - Server name */
|
||||
cupsServer(void)
|
||||
{
|
||||
FILE *fp; /* cupsd.conf file */
|
||||
char *server; /* Pointer to server name */
|
||||
static char line[1024]; /* Line from file */
|
||||
|
||||
|
||||
/*
|
||||
* First see if the CUPS_SERVER environment variable is set...
|
||||
*/
|
||||
|
||||
if ((server = getenv("CUPS_SERVER")) != NULL)
|
||||
return (server);
|
||||
|
||||
/*
|
||||
* Next check to see if we have a cupsd.conf file...
|
||||
*/
|
||||
|
||||
if ((fp = fopen(CUPS_SERVERROOT "/conf/cupsd.conf", "r")) == NULL)
|
||||
return ("localhost");
|
||||
|
||||
/*
|
||||
* Read the cupsd.conf file and look for a ServerName line...
|
||||
*/
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
+103
-267
@@ -14,7 +14,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
|
||||
@@ -57,16 +57,14 @@
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static http_t *cups_server = NULL; /* Current server connection */
|
||||
static ipp_status_t last_error = IPP_OK; /* Last IPP error */
|
||||
static char authstring[255] = ""; /* Authorization string */
|
||||
static http_t *cups_server = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static char *cups_connect(const char *name, char *printer, char *hostname);
|
||||
static char *cups_connect(char *name, char *printer, char *hostname);
|
||||
|
||||
|
||||
/*
|
||||
@@ -74,8 +72,8 @@ static char *cups_connect(const char *name, char *printer, char *hostname);
|
||||
*/
|
||||
|
||||
int /* O - 1 on success, 0 on failure */
|
||||
cupsCancelJob(const char *name, /* I - Name of printer or class */
|
||||
int job) /* I - Job ID */
|
||||
cupsCancelJob(char *name, /* I - Name of printer or class */
|
||||
int job) /* I - Job ID */
|
||||
{
|
||||
char printer[HTTP_MAX_URI], /* Printer name */
|
||||
hostname[HTTP_MAX_URI], /* Hostname */
|
||||
@@ -100,7 +98,6 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
* job-id
|
||||
* [requesting-user-name]
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
@@ -117,31 +114,21 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
|
||||
"attributes-natural-language", NULL,
|
||||
language != NULL ? language->language : "C");
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
|
||||
sprintf(uri, "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cupsUser());
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job);
|
||||
|
||||
/*
|
||||
* Do the request...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(cups_server, request, "/jobs/")) == NULL)
|
||||
{
|
||||
last_error = IPP_BAD_REQUEST;
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
last_error = response->request.status.status_code;
|
||||
ippDelete(response);
|
||||
|
||||
return (1);
|
||||
}
|
||||
ippDelete(response);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
@@ -150,10 +137,10 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
|
||||
*/
|
||||
|
||||
ipp_t * /* O - Response data */
|
||||
cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
ipp_t *request, /* I - IPP request */
|
||||
const char *resource, /* I - HTTP resource for POST */
|
||||
const char *filename) /* I - File to send or NULL */
|
||||
cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
ipp_t *request, /* I - IPP request */
|
||||
char *resource, /* I - HTTP resource for POST */
|
||||
char *filename) /* I - File to send or NULL */
|
||||
{
|
||||
ipp_t *response; /* IPP response data */
|
||||
char length[255]; /* Content-Length field */
|
||||
@@ -162,9 +149,14 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
struct stat fileinfo; /* File information */
|
||||
int bytes; /* Number of bytes read/written */
|
||||
char buffer[8192]; /* Output buffer */
|
||||
const char *password; /* Password string */
|
||||
char plain[255], /* Plaintext username:password */
|
||||
#if !defined(WIN32) && !defined(__EMX__)
|
||||
char *password, /* Password string */
|
||||
plain[255], /* Plaintext username:password */
|
||||
encode[255]; /* Encoded username:password */
|
||||
char junk[8192]; /* Junk buffer for error data */
|
||||
#endif /* !WIN32 && !__EMX__ */
|
||||
static char authstring[255] = "";
|
||||
/* Authorization string */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsDoFileRequest(%08x, %08s, \'%s\', \'%s\')\n",
|
||||
@@ -212,7 +204,7 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
*/
|
||||
|
||||
if (filename != NULL)
|
||||
sprintf(length, "%u", ippLength(request) + (size_t)fileinfo.st_size);
|
||||
sprintf(length, "%u", ippLength(request) + fileinfo.st_size);
|
||||
else
|
||||
sprintf(length, "%u", ippLength(request));
|
||||
|
||||
@@ -228,7 +220,8 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
DEBUG_puts("cupsDoFileRequest: post...");
|
||||
|
||||
if (httpPost(http, resource))
|
||||
continue;
|
||||
if (httpPost(http, resource))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Send the IPP data and wait for the response...
|
||||
@@ -261,6 +254,7 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
|
||||
|
||||
#if !defined(WIN32) && !defined(__EMX__)
|
||||
if (status == HTTP_UNAUTHORIZED)
|
||||
{
|
||||
DEBUG_puts("cupsDoFileRequest: unauthorized...");
|
||||
@@ -271,10 +265,7 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
httpFlush(http);
|
||||
|
||||
printf("Authentication required for %s on %s...\n", cupsUser(),
|
||||
http->hostname);
|
||||
|
||||
if ((password = cupsGetPassword("UNIX Password: ")) != NULL)
|
||||
if ((password = getpass("Password:")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Got a password; send it to the server...
|
||||
@@ -282,27 +273,18 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
if (!password[0])
|
||||
break;
|
||||
snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), password);
|
||||
sprintf(plain, "%s:%s", cuserid(NULL), password);
|
||||
httpEncode64(encode, plain);
|
||||
snprintf(authstring, sizeof(authstring), "Basic %s", encode);
|
||||
sprintf(authstring, "Basic %s", encode);
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
else if (status == HTTP_ERROR)
|
||||
{
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH)
|
||||
#else
|
||||
if (http->error != ENETDOWN && http->error != ENETUNREACH)
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
else if (status != HTTP_OK)
|
||||
#endif /* !WIN32 && !__EMX__ */
|
||||
|
||||
if (status != HTTP_OK)
|
||||
{
|
||||
DEBUG_printf(("cupsDoFileRequest: error %d...\n", status));
|
||||
|
||||
@@ -371,7 +353,6 @@ cupsGetClasses(char ***classes) /* O - Classes */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
char **temp; /* Temporary pointer */
|
||||
|
||||
|
||||
/*
|
||||
@@ -397,10 +378,10 @@ cupsGetClasses(char ***classes) /* O - Classes */
|
||||
language = cupsLangDefault();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
@@ -409,46 +390,29 @@ cupsGetClasses(char ***classes) /* O - Classes */
|
||||
n = 0;
|
||||
*classes = NULL;
|
||||
|
||||
if ((response = cupsDoRequest(cups_server, request, "/")) != NULL)
|
||||
if ((response = cupsDoRequest(cups_server, request, "/classes/")) != NULL)
|
||||
{
|
||||
last_error = response->request.status.status_code;
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
if (attr->name != NULL &&
|
||||
strcasecmp(attr->name, "printer-name") == 0 &&
|
||||
if (strcmp(attr->name, "printer-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
{
|
||||
if (n == 0)
|
||||
temp = malloc(sizeof(char *));
|
||||
*classes = malloc(sizeof(char *));
|
||||
else
|
||||
temp = realloc(*classes, sizeof(char *) * (n + 1));
|
||||
*classes = realloc(*classes, sizeof(char *) * (n + 1));
|
||||
|
||||
if (temp == NULL)
|
||||
if (*classes == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
n --;
|
||||
free((*classes)[n]);
|
||||
}
|
||||
|
||||
free(*classes);
|
||||
ippDelete(response);
|
||||
return (0);
|
||||
}
|
||||
|
||||
*classes = temp;
|
||||
temp[n] = strdup(attr->values[0].string.text);
|
||||
(*classes)[n] = strdup(attr->values[0].string.text);
|
||||
n ++;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
last_error = IPP_BAD_REQUEST;
|
||||
|
||||
return (n);
|
||||
}
|
||||
@@ -458,7 +422,7 @@ cupsGetClasses(char ***classes) /* O - Classes */
|
||||
* 'cupsGetDefault()' - Get the default printer or class.
|
||||
*/
|
||||
|
||||
const char * /* O - Default printer or NULL */
|
||||
char * /* O - Default printer or NULL */
|
||||
cupsGetDefault(void)
|
||||
{
|
||||
ipp_t *request, /* IPP Request */
|
||||
@@ -510,22 +474,17 @@ cupsGetDefault(void)
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
if ((response = cupsDoRequest(cups_server, request, "/")) != NULL)
|
||||
if ((response = cupsDoRequest(cups_server, request, "/printers/")) != NULL)
|
||||
{
|
||||
last_error = response->request.status.status_code;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
|
||||
{
|
||||
strncpy(def_printer, attr->values[0].string.text, sizeof(def_printer) - 1);
|
||||
def_printer[sizeof(def_printer) - 1] = '\0';
|
||||
strcpy(def_printer, attr->values[0].string.text);
|
||||
ippDelete(response);
|
||||
return (def_printer);
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
last_error = IPP_BAD_REQUEST;
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
@@ -535,8 +494,8 @@ cupsGetDefault(void)
|
||||
* 'cupsGetPPD()' - Get the PPD file for a printer.
|
||||
*/
|
||||
|
||||
const char * /* O - Filename for PPD file */
|
||||
cupsGetPPD(const char *name) /* I - Printer name */
|
||||
char * /* O - Filename for PPD file */
|
||||
cupsGetPPD(char *name) /* I - Printer name */
|
||||
{
|
||||
FILE *fp; /* PPD file */
|
||||
int bytes; /* Number of bytes read */
|
||||
@@ -544,12 +503,9 @@ cupsGetPPD(const char *name) /* I - Printer name */
|
||||
char printer[HTTP_MAX_URI], /* Printer name */
|
||||
hostname[HTTP_MAX_URI], /* Hostname */
|
||||
resource[HTTP_MAX_URI]; /* Resource name */
|
||||
char *tempdir; /* Temporary file directory */
|
||||
const char *password; /* Password string */
|
||||
char plain[255], /* Plaintext username:password */
|
||||
encode[255]; /* Encoded username:password */
|
||||
http_status_t status; /* HTTP status from server */
|
||||
static char filename[HTTP_MAX_URI]; /* Local filename */
|
||||
char *tempdir; /* Temporary file directory */
|
||||
struct stat fileinfo; /* File information */
|
||||
|
||||
|
||||
/*
|
||||
@@ -565,67 +521,36 @@ cupsGetPPD(const char *name) /* I - Printer name */
|
||||
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
tempdir = "C:/WINDOWS/TEMP";
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s.ppd", tempdir, printer);
|
||||
#else
|
||||
if ((tempdir = getenv("TMPDIR")) == NULL)
|
||||
tempdir = "/tmp";
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%d.%s.ppd", tempdir, getuid(), printer);
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
sprintf(filename, "%s/%s.ppd", tempdir, printer);
|
||||
if (stat(filename, &fileinfo))
|
||||
memset(&fileinfo, 0, sizeof(fileinfo));
|
||||
|
||||
/*
|
||||
* And send a request to the HTTP server...
|
||||
* And send a request to the HTTP server using "if-modified-since"...
|
||||
*/
|
||||
|
||||
snprintf(resource, sizeof(resource), "/printers/%s.ppd", printer);
|
||||
sprintf(resource, "/printers/%s.ppd", printer);
|
||||
|
||||
do
|
||||
httpClearFields(cups_server);
|
||||
httpSetField(cups_server, HTTP_FIELD_HOST, hostname);
|
||||
httpSetField(cups_server, HTTP_FIELD_IF_MODIFIED_SINCE,
|
||||
httpGetDateString(fileinfo.st_mtime));
|
||||
httpGet(cups_server, resource);
|
||||
|
||||
switch (httpUpdate(cups_server))
|
||||
{
|
||||
httpClearFields(cups_server);
|
||||
httpSetField(cups_server, HTTP_FIELD_HOST, hostname);
|
||||
httpSetField(cups_server, HTTP_FIELD_AUTHORIZATION, authstring);
|
||||
|
||||
if (httpGet(cups_server, resource))
|
||||
{
|
||||
status = HTTP_UNAUTHORIZED;
|
||||
continue;
|
||||
}
|
||||
|
||||
while ((status = httpUpdate(cups_server)) == HTTP_CONTINUE);
|
||||
|
||||
if (status == HTTP_UNAUTHORIZED)
|
||||
{
|
||||
DEBUG_puts("cupsGetPPD: unauthorized...");
|
||||
|
||||
/*
|
||||
* Flush any error message...
|
||||
*/
|
||||
|
||||
httpFlush(cups_server);
|
||||
|
||||
printf("Authentication required for %s on %s...\n", cupsUser(),
|
||||
cups_server->hostname);
|
||||
|
||||
if ((password = cupsGetPassword("UNIX Password: ")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Got a password; send it to the server...
|
||||
*/
|
||||
|
||||
if (!password[0])
|
||||
break;
|
||||
snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), password);
|
||||
httpEncode64(encode, plain);
|
||||
snprintf(authstring, sizeof(authstring), "Basic %s", encode);
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
case HTTP_OK : /* New file - get it! */
|
||||
break;
|
||||
}
|
||||
case HTTP_NOT_MODIFIED : /* File hasn't been modified; use the current copy */
|
||||
return (filename);
|
||||
default :
|
||||
return (NULL);
|
||||
}
|
||||
while (status == HTTP_UNAUTHORIZED);
|
||||
|
||||
/*
|
||||
* OK, we need to copy the file; open the file and copy it...
|
||||
@@ -664,7 +589,6 @@ cupsGetPrinters(char ***printers) /* O - Printers */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
char **temp; /* Temporary pointer */
|
||||
|
||||
|
||||
/*
|
||||
@@ -690,10 +614,10 @@ cupsGetPrinters(char ***printers) /* O - Printers */
|
||||
language = cupsLangDefault();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
"attributes-charset", NULL, cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
"attributes-natural-language", NULL, language->language);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
@@ -702,70 +626,42 @@ cupsGetPrinters(char ***printers) /* O - Printers */
|
||||
n = 0;
|
||||
*printers = NULL;
|
||||
|
||||
if ((response = cupsDoRequest(cups_server, request, "/")) != NULL)
|
||||
if ((response = cupsDoRequest(cups_server, request, "/printers/")) != NULL)
|
||||
{
|
||||
last_error = response->request.status.status_code;
|
||||
|
||||
for (attr = response->attrs; attr != NULL; attr = attr->next)
|
||||
if (attr->name != NULL &&
|
||||
strcasecmp(attr->name, "printer-name") == 0 &&
|
||||
if (strcmp(attr->name, "printer-name") == 0 &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
{
|
||||
if (n == 0)
|
||||
temp = malloc(sizeof(char *));
|
||||
*printers = malloc(sizeof(char *));
|
||||
else
|
||||
temp = realloc(*printers, sizeof(char *) * (n + 1));
|
||||
*printers = realloc(*printers, sizeof(char *) * (n + 1));
|
||||
|
||||
if (temp == NULL)
|
||||
if (*printers == NULL)
|
||||
{
|
||||
/*
|
||||
* Ran out of memory!
|
||||
*/
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
n --;
|
||||
free((*printers)[n]);
|
||||
}
|
||||
|
||||
free(*printers);
|
||||
ippDelete(response);
|
||||
return (0);
|
||||
}
|
||||
|
||||
*printers = temp;
|
||||
temp[n] = strdup(attr->values[0].string.text);
|
||||
(*printers)[n] = strdup(attr->values[0].string.text);
|
||||
n ++;
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
}
|
||||
else
|
||||
last_error = IPP_BAD_REQUEST;
|
||||
|
||||
return (n);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsLastError()' - Return the last IPP error that occurred.
|
||||
*/
|
||||
|
||||
ipp_status_t /* O - IPP error code */
|
||||
cupsLastError(void)
|
||||
{
|
||||
return (last_error);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsPrintFile()' - Print a file to a printer or class.
|
||||
*/
|
||||
|
||||
int /* O - Job ID */
|
||||
cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
const char *filename, /* I - File to print */
|
||||
const char *title, /* I - Title of job */
|
||||
cupsPrintFile(char *name, /* I - Printer or class name */
|
||||
char *filename, /* I - File to print */
|
||||
char *title, /* I - Title of job */
|
||||
int num_options,/* I - Number of options */
|
||||
cups_option_t *options) /* I - Options */
|
||||
{
|
||||
@@ -813,7 +709,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
request->request.op.operation_id = IPP_PRINT_JOB;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
snprintf(uri, sizeof(uri), "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
|
||||
sprintf(uri, "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
@@ -832,17 +728,22 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
*/
|
||||
|
||||
if (cupsGetOption("raw", num_options, options))
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/vnd.cups-raw");
|
||||
else
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
|
||||
NULL, "application/octet-stream");
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cupsUser());
|
||||
#if defined(WIN32) || defined(__EMX__)
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, "WindowsUser");
|
||||
#else
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cuserid(NULL));
|
||||
#endif /* WIN32 || __EMX__ */
|
||||
|
||||
if (title)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, title);
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, title);
|
||||
|
||||
/*
|
||||
* Then add all options on the command-line...
|
||||
@@ -854,7 +755,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
* Skip the "raw" option - handled above...
|
||||
*/
|
||||
|
||||
if (strcasecmp(options[i].name, "raw") == 0)
|
||||
if (strcmp(options[i].name, "raw") == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@@ -898,7 +799,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strncasecmp(option, "no", 2) == 0)
|
||||
if (strncmp(option, "no", 2) == 0)
|
||||
{
|
||||
option += 2;
|
||||
n = 0;
|
||||
@@ -915,7 +816,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
* String value(s)...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("cupsPrintFile: Adding string option \'%s\' with value \'%s\'...\n",
|
||||
DEBUG_printf(("cupsPrintJob: Adding string option \'%s\' with value \'%s\'...\n",
|
||||
option, val));
|
||||
|
||||
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, option, NULL, val);
|
||||
@@ -931,28 +832,28 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
n2 = strtol(s + 1, NULL, 0);
|
||||
ippAddRange(request, IPP_TAG_JOB, option, n, n2);
|
||||
|
||||
DEBUG_printf(("cupsPrintFile: Adding range option \'%s\' with value %d-%d...\n",
|
||||
DEBUG_printf(("cupsPrintJob: Adding range option \'%s\' with value %d-%d...\n",
|
||||
option, n, n2));
|
||||
}
|
||||
else if (*s == 'x')
|
||||
{
|
||||
n2 = strtol(s + 1, &s, 0);
|
||||
|
||||
if (strcasecmp(s, "dpc") == 0)
|
||||
if (strcmp(s, "dpc") == 0)
|
||||
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_CM, n, n2);
|
||||
else if (strcasecmp(s, "dpi") == 0)
|
||||
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);
|
||||
|
||||
DEBUG_printf(("cupsPrintFile: Adding resolution option \'%s\' with value %s...\n",
|
||||
DEBUG_printf(("cupsPrintJob: Adding resolution option \'%s\' with value %s...\n",
|
||||
option, val));
|
||||
}
|
||||
else
|
||||
{
|
||||
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, option, n);
|
||||
|
||||
DEBUG_printf(("cupsPrintFile: Adding integer option \'%s\' with value %d...\n",
|
||||
DEBUG_printf(("cupsPrintJob: Adding integer option \'%s\' with value %d...\n",
|
||||
option, n));
|
||||
}
|
||||
}
|
||||
@@ -962,7 +863,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
* Boolean value...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("cupsPrintFile: Adding boolean option \'%s\' with value %d...\n",
|
||||
DEBUG_printf(("cupsPrintJob: Adding boolean option \'%s\' with value %d...\n",
|
||||
option, n));
|
||||
ippAddBoolean(request, IPP_TAG_JOB, option, (char)n);
|
||||
}
|
||||
@@ -972,7 +873,7 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
* Try printing the file...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "/printers/%s", printer);
|
||||
sprintf(uri, "/printers/%s", printer);
|
||||
|
||||
if ((response = cupsDoFileRequest(cups_server, request, uri, filename)) == NULL)
|
||||
jobid = 0;
|
||||
@@ -997,64 +898,14 @@ cupsPrintFile(const char *name, /* I - Printer or class name */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsTempFile()' - Generate a temporary filename.
|
||||
*/
|
||||
|
||||
char * /* O - Filename */
|
||||
cupsTempFile(char *filename, /* I - Pointer to buffer */
|
||||
int len) /* I - Size of buffer */
|
||||
{
|
||||
char *tmpdir; /* TMPDIR environment var */
|
||||
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...
|
||||
*/
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) == NULL)
|
||||
tmpdir = "/var/tmp";
|
||||
|
||||
if ((int)(strlen(tmpdir) + 8) > len)
|
||||
{
|
||||
/*
|
||||
* The specified directory exceeds the size of the buffer; default it...
|
||||
*/
|
||||
|
||||
strcpy(buf, "/var/tmp/XXXXXX");
|
||||
return (mktemp(buf));
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Make the temporary name using the specified directory...
|
||||
*/
|
||||
|
||||
sprintf(filename, "%s/XXXXXX", tmpdir);
|
||||
return (mktemp(filename));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_connect()' - Connect to the specified host...
|
||||
*/
|
||||
|
||||
static char * /* I - Printer name or NULL */
|
||||
cups_connect(const char *name, /* I - Destination (printer[@host]) */
|
||||
char *printer, /* O - Printer name [HTTP_MAX_URI] */
|
||||
char *hostname) /* O - Hostname [HTTP_MAX_URI] */
|
||||
static char * /* I - Printer name if success, NULL if fail */
|
||||
cups_connect(char *name, /* I - Destination (printer[@host]) */
|
||||
char *printer, /* O - Printer name */
|
||||
char *hostname) /* O - Hostname */
|
||||
{
|
||||
char hostbuf[HTTP_MAX_URI];
|
||||
/* Name of host */
|
||||
@@ -1063,30 +914,18 @@ cups_connect(const char *name, /* I - Destination (printer[@host]) */
|
||||
|
||||
|
||||
if (name == NULL)
|
||||
{
|
||||
last_error = IPP_BAD_REQUEST;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (sscanf(name, "%1023[^@]@%1023s", printerbuf, hostbuf) == 1)
|
||||
{
|
||||
strncpy(hostbuf, cupsServer(), sizeof(hostbuf) - 1);
|
||||
hostbuf[sizeof(hostbuf) - 1] = '\0';
|
||||
}
|
||||
if (sscanf(name, "%[^@]@%s", printerbuf, hostbuf) == 1)
|
||||
strcpy(hostbuf, "localhost");
|
||||
|
||||
if (hostname != NULL)
|
||||
{
|
||||
strncpy(hostname, hostbuf, HTTP_MAX_URI - 1);
|
||||
hostname[HTTP_MAX_URI - 1] = '\0';
|
||||
}
|
||||
strcpy(hostname, hostbuf);
|
||||
else
|
||||
hostname = hostbuf;
|
||||
|
||||
if (printer != NULL)
|
||||
{
|
||||
strncpy(printer, printerbuf, HTTP_MAX_URI - 1);
|
||||
printer[HTTP_MAX_URI - 1] = '\0';
|
||||
}
|
||||
strcpy(printer, printerbuf);
|
||||
else
|
||||
printer = printerbuf;
|
||||
|
||||
@@ -1099,10 +938,7 @@ cups_connect(const char *name, /* I - Destination (printer[@host]) */
|
||||
}
|
||||
|
||||
if ((cups_server = httpConnect(hostname, ippPort())) == NULL)
|
||||
{
|
||||
last_error = IPP_SERVICE_UNAVAILABLE;
|
||||
return (NULL);
|
||||
}
|
||||
else
|
||||
return (printer);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
%%BeginResource: procset hpgltops 1.0 0
|
||||
%
|
||||
% "$Id: HPGLprolog 312 1999-05-11 19:45:40Z mike $"
|
||||
%
|
||||
% HP-GL/2 filter procset for the Common UNIX Printing System (CUPS).
|
||||
%
|
||||
% This procset contains the basic drawing commands that are used to
|
||||
% reduce output size. Note the 'MP' (make newpath) definition - this
|
||||
% should be called 'NP' (newpath), but GhostScript uses the 'NP' name
|
||||
% for 'noaccess put' in some of its font files...
|
||||
%
|
||||
% Copyright 1993-1999 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
|
||||
%
|
||||
/MO { moveto } bind def
|
||||
/LI { lineto } bind def
|
||||
/FI { fill } bind def
|
||||
/ST { stroke } bind def
|
||||
/CP { closepath } bind def
|
||||
/MP { newpath } bind def
|
||||
%
|
||||
% If you have more than 8 pens defined for your HP-GL/2 output you'll
|
||||
% need to add P# definitions (# = pen number) to set the appropriate color.
|
||||
% If you don't you'll get errors. The default 8 pens cover the primary
|
||||
% colors (white, black, red, green, yellow, blue, magenta, cyan). Ditto
|
||||
% for pen widths (W#).
|
||||
%
|
||||
% PC and PW commands in the input stream will define/redefine these
|
||||
% appropriately, but some packages don't generate them...
|
||||
%
|
||||
/P0 { 1.0 1.0 1.0 setrgbcolor } bind def
|
||||
/P1 { 0.0 0.0 0.0 setrgbcolor } bind def
|
||||
/P2 { 1.0 0.0 0.0 setrgbcolor } bind def
|
||||
/P3 { 0.0 1.0 0.0 setrgbcolor } bind def
|
||||
/P4 { 1.0 1.0 0.0 setrgbcolor } bind def
|
||||
/P5 { 0.0 0.0 1.0 setrgbcolor } bind def
|
||||
/P6 { 1.0 0.0 1.0 setrgbcolor } bind def
|
||||
/P7 { 0.0 1.0 1.0 setrgbcolor } bind def
|
||||
/W0 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W1 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W2 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W3 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W4 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W5 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W6 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
/W7 { DefaultPenWidth PenScaling mul setlinewidth } bind def
|
||||
%%EndResource
|
||||
+2
-2
@@ -48,8 +48,8 @@ clean:
|
||||
#
|
||||
|
||||
install:
|
||||
-$(MKDIR) $(DATADIR)/data
|
||||
$(CP) $(FILES) $(DATADIR)/data
|
||||
-$(MKDIR) $(DATADIR)
|
||||
$(CP) $(FILES) $(DATADIR)
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
|
||||
+1051
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+5
-21
@@ -30,10 +30,8 @@ include ../Makedefs
|
||||
|
||||
.SUFFIXES: .html .pdf .shtml
|
||||
.shtml.html:
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif --numbered -f $@ $<
|
||||
.shtml.pdf:
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif --duplex --compression=9 \
|
||||
--numbered --jpeg -f $@ $<
|
||||
|
||||
@@ -41,12 +39,12 @@ include ../Makedefs
|
||||
# Document files...
|
||||
#
|
||||
|
||||
DOCUMENTS = cmp.shtml idd.shtml sam.shtml sdd.shtml spm.shtml \
|
||||
ssr.shtml stp.shtml sum.shtml
|
||||
DOCUMENTS = cmp.shtml idd.shtml sam.shtml sdd.shtml ssr.shtml \
|
||||
stp.shtml sum.shtml svd.shtml
|
||||
DOCIMAGES = images/cups-block-diagram.gif images/cups-large.gif \
|
||||
images/cups-medium.gif images/cups-small.gif
|
||||
WEBPAGES = cups.css cupsdoc.css index.html documentation.html
|
||||
WEBIMAGES = images/classes.gif images/logo.gif images/navbar.gif \
|
||||
WEBIMAGES = images/logo.gif images/navbar.gif \
|
||||
images/printer-idle.gif images/printer-processing.gif \
|
||||
images/printer-stopped.gif
|
||||
|
||||
@@ -81,35 +79,21 @@ install:
|
||||
$(CP) $(DOCIMAGES) $(DATADIR)/doc/images
|
||||
|
||||
#
|
||||
# The overview, admin manual, programmers manual, and users manual get
|
||||
# special attention...
|
||||
# The overview, admin guide, and user's guide get special attention...
|
||||
#
|
||||
|
||||
overview.pdf: overview.html
|
||||
echo Formatting $@...
|
||||
htmldoc --duplex --compression=9 --jpeg --webpage -f overview.pdf overview.html
|
||||
htmldoc --duplex --compression=9 --jpeg --webpage -f $@ $<
|
||||
|
||||
sam.html: sam.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif -f $@ $<
|
||||
sam.pdf: sam.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif --duplex --compression=9 \
|
||||
--jpeg -f $@ $<
|
||||
|
||||
spm.html: spm.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif -f $@ $<
|
||||
spm.pdf: spm.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif --duplex --compression=9 \
|
||||
--jpeg -f $@ $<
|
||||
|
||||
sum.html: sum.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif -f $@ $<
|
||||
sum.pdf: sum.shtml
|
||||
echo Formatting $@...
|
||||
htmldoc --title images/cups-large.gif --duplex --compression=9 \
|
||||
--jpeg -f $@ $<
|
||||
|
||||
|
||||
+121
-223
@@ -1,213 +1,111 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>CUPS Configuration Management Plan</TITLE>
|
||||
<META NAME="AUTHOR" CONTENT="Easy Software Products">
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-CMP-1.0">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<STYLE>
|
||||
BODY { font-family: serif; font-size: 11.0pt }
|
||||
H1 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H2 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H3 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H4 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H5 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H6 { font-family: sans-serif; font-size: 20.0pt }
|
||||
SUB { font-size: 8.0pt }
|
||||
SUP { font-size: 8.0pt }
|
||||
PRE { font-size: 9.0pt }
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER><A HREF="#CONTENTS"><H1>CUPS Configuration Management Plan</H1></A><BR>
|
||||
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
|
||||
<H1>CUPS Configuration Management Plan</H1></A><BR>
|
||||
CUPS-CMP-1.0<BR>
|
||||
Easy Software Products<BR>
|
||||
Copyright 1997-1999, All Rights Reserved<BR>
|
||||
</CENTER>
|
||||
<HR>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="#1">1 Scope</A></B>
|
||||
<BR><B><A HREF=#1>1 Scope</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#1_1">1.1 Identification</A></LI>
|
||||
<LI><A HREF="#1_2">1.2 System Overview</A></LI>
|
||||
<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
|
||||
<LI><A HREF=#1_1>1.1 Identification</A></LI>
|
||||
<LI><A HREF=#1_2>1.2 System Overview</A></LI>
|
||||
<LI><A HREF=#1_3>1.3 Document Overview</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#2">2 References</A></B>
|
||||
<B><A HREF=#2>2 References</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
|
||||
<LI><A HREF=#2_1>2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF=#2_2>2.2 Other Documents</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#3">3 File Management</A></B>
|
||||
<B><A HREF=#3>3 File Management</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1">3.1 Directory Structure</A></LI>
|
||||
<LI><A HREF="#3_2">3.2 Source Files</A></LI>
|
||||
<LI><A HREF="#3_3">3.3 Configuration Management</A></LI>
|
||||
<LI><A HREF=#3_1>3.1 Directory Structure</A></LI>
|
||||
<LI><A HREF=#3_2>3.2 Source Files</A></LI>
|
||||
<LI><A HREF=#3_3>3.3 Configuration Management</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#4">4 Trouble Report Processing</A></B>
|
||||
<B><A HREF=#4>4 Trouble Report Processing</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#4_1">4.1 Classification</A></LI>
|
||||
<LI><A HREF="#4_2">4.2 Identification</A></LI>
|
||||
<LI><A HREF="#4_3">4.3 Correction</A></LI>
|
||||
<LI><A HREF="#4_4">4.4 Notification</A></LI>
|
||||
<LI><A HREF=#4_1>4.1 Classification</A></LI>
|
||||
<LI><A HREF=#4_2>4.2 Identification</A></LI>
|
||||
<LI><A HREF=#4_3>4.3 Correction</A></LI>
|
||||
<LI><A HREF=#4_4>4.4 Notification</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#5">5 Software Releases</A></B>
|
||||
<B><A HREF=#5>5 Software Releases</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#5_1">5.1 Version Numbering</A></LI>
|
||||
<LI><A HREF="#5_2">5.2 Generation</A></LI>
|
||||
<LI><A HREF="#5_3">5.3 Testing</A></LI>
|
||||
<LI><A HREF="#5_4">5.4 Release</A></LI>
|
||||
<LI><A HREF=#5_1>5.1 Version Numbering</A></LI>
|
||||
<LI><A HREF=#5_2>5.2 Generation</A></LI>
|
||||
<LI><A HREF=#5_3>5.3 Testing</A></LI>
|
||||
<LI><A HREF=#5_4>5.4 Release</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#6">A Glossary</A></B>
|
||||
<B><A HREF=#6>A Glossary</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#6_1">A.1 Terms</A></LI>
|
||||
<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
|
||||
<LI><A HREF=#6_1>A.1 Terms</A></LI>
|
||||
<LI><A HREF=#6_2>A.2 Acronyms</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#7">B Coding Requirements</A></B>
|
||||
<B><A HREF=#7>B Coding Requirements</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#7_1">B.1 Source Files</A></LI>
|
||||
<LI><A HREF=#7_1>B.1 Source Files</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_1_1">B.1.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_1_2">B.1.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_1_1>B.1.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_1_2>B.1.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_2">B.2 Functions</A></LI>
|
||||
<LI><A HREF=#7_2>B.2 Functions</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_2_1">B.2.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_2_2">B.2.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_2_1>B.2.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_2_2>B.2.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_3">B.3 Methods</A></LI>
|
||||
<LI><A HREF=#7_3>B.3 Methods</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_3_1">B.3.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_3_2">B.3.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_3_1>B.3.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_3_2>B.3.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_4">B.4 Variables</A></LI>
|
||||
<LI><A HREF=#7_4>B.4 Variables</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_4_1">B.4.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_4_2">B.4.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_4_1>B.4.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_4_2>B.4.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_5">B.5 Types</A></LI>
|
||||
<LI><A HREF=#7_5>B.5 Types</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_5_1">B.5.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_5_2">B.5.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_5_1>B.5.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_5_2>B.5.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_6">B.6 Structures</A></LI>
|
||||
<LI><A HREF=#7_6>B.6 Structures</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_6_1">B.6.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_6_2">B.6.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_6_1>B.6.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_6_2>B.6.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_7">B.7 Classes</A></LI>
|
||||
<LI><A HREF=#7_7>B.7 Classes</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_7_1">B.7.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_7_2">B.7.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_7_1>B.7.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_7_2>B.7.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_8">B.8 Constants</A></LI>
|
||||
<LI><A HREF=#7_8>B.8 Constants</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_8_1">B.8.1 Naming</A></LI>
|
||||
<LI><A HREF="#7_8_2">B.8.2 Documentation</A></LI>
|
||||
<LI><A HREF=#7_8_1>B.8.1 Naming</A></LI>
|
||||
<LI><A HREF=#7_8_2>B.8.2 Documentation</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#7_9">B.9 Code</A></LI>
|
||||
<LI><A HREF=#7_9>B.9 Code</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#7_9_1">B.9.1 Documentation</A></LI>
|
||||
<LI><A HREF="#7_9_2">B.9.2 Style</A></LI>
|
||||
<LI><A HREF=#7_9_1>B.9.1 Documentation</A></LI>
|
||||
<LI><A HREF=#7_9_2>B.9.2 Style</A></LI>
|
||||
</UL>
|
||||
</UL>
|
||||
<B><A HREF="#8">C Software Trouble Report Form</A></B><HR>
|
||||
GIF89a¯ÿòÌÌÌ™™™fff333ÿÿÿÿÿÿÿÿÿ!ù,¯ÿBþXºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª2€0p,Ïtmßx®ï
|
||||
|
||||
<!--=�•pH,��Ö«Çl:ŸÐ¨”ù ¯Ø¬ÖXN¿à°xL~¬Û´zmxËð¸|N§Ùø¼(Pïûÿ€�bwz…jn‚‰Š‹Œ�9„†‘!-->
|
||||
;±Ýíˆndý !¸ ž³wà…MƒƒY~¿{,gÚ\‚äé
|
||||
Œ×Ø(tÙî!Ï=Ñ.ûz¯�áÑŸ:ì;Ã9qöíÉë]/¿ºÉ¤Et/†'Îþt9ÀØ–ž_ÙÇ\|W•wArö¸Ý�2Ô×
|
||||
tN°0Tï}�¡û‰$!‚yMxî)ˆš‰Ô�ø@nB°U½ÊwE„§!ŠF H L8B
|
||||
c‰;ždŠ-æDVWdг€h±äÚ“P¶%#(4Fiå•Ï\hŠ:�Re!\ÒÄ—X^¦%€¥À-$E€Ö/úHŽšlââöÌQX
|
||||
|
||||
<!--äÇ"iL :a7‚]›0IZ¡YØø¡‡D}¤–Uj±á
|
||||
^â䙿`Ú@¦5b|šà�«Á±§3Ñ KwÔ\ªB¨±H)+�=¡Ó©"
|
||||
©¢ 8uƒ†¸öŠD§•lþ:„d�RX�ilÌ:Ë!´;¹t+„e<
|
||||
‡;øô+‚bbhaÚ0Ê6é.D™ð޹̹ñÖkoê({ï¾ü{f¿-->
|
||||
¸1Nô¯b"œŠüjåÁÂE0…È8ö5GkZ|ÒÁwt„C»ÔQSÇo6ÔÙ�[�W„$²*Ž+4Pb-8¹P1þ'8"‘ФÄ$ Cyê‘„)>ãŠtè`Ð3‡‹¾z"«rE'Âqfä°Ë
|
||||
‘qÂ\|€„Ž¡ôö»%É(.—bڽȀ�íÉ`{¬EÇ1w’ »[Hß`(B6ö�“
|
||||
†')ÊRŽÎa[�ÃrbC!Tå°Œ
|
||||
2Q·ÈHZê#–®üË/àô¯FÝê(Û²% ºXË9öÀbÁ4f.ù-oý�™XËB…�IÎÒ7¹*@ÃÓŽÍT€hà‘ÌWâ�™Ã$f:µyžn†ó†r„'té�Kv`
|
||||
Ç+dª– œ79s�ò|'=×¢Ìx¶òœÿ„¦œˆeÎ;*à$þ” IÝÆaÏ{–3ŽÅ�Á
|
||||
P“ÍS[ÙL¨3©òQ7éÆò#ãûô0F×ðsE°t§@‘ØQÜ´´ ©:3ÓRíd �¥*MITnŒ£¨H]ØQÁd
|
||||
@òþ—¬rMœŽaO
|
||||
<!--x‹ŒÖ3½4 °XT'ª®ƒ:T£uéWeºádËeú¸è¬Ù7
|
||||
|
||||
ëÒÏ;„sœåµ7m(ýПtl¤RV�)-->
|
||||
rë^yÀ·(¸îéêû$uDòrã/a,I.°ÙUÀœb hˆ`�¾B ë"
|
||||
Ü`HØxȸo1þ[á\8f^æ|\ý‚¢¢zø0(ˆ\ {ƒÄgäÞõ€çâ§Á˜0*\³n¼‹m¶/Äeª±ÿ†ì
|
||||
Ç,½DN2€œº+ùÉ|í0L¡Le*ð¸Ã>­2ëf,eIPOËÅàr—±”80SAŸcFªatç»ãy¤¸ršçÌ¡5ïoõËsžï|¿8˙Φ¬þ,ï¼èà)ÁÌ;øk¡—†dDpÑòø2¢q�fHã!Ë“~ÙŸ-í
|
||||
'g:,æ4y?ýäP‹Z›ž#ÏÕ´Î5AK‰k]ûš›ÒKõ¯‡më€õzØÈƫ؎Ý>B{PЪ.6hf]º?©ÌIŽuO„í�M‚ÌÇÜcµ3˜
|
||||
61‹NÒ[†W£ ¦m¿­{ÂPâvζKnUˆ[ ònĽ±÷n?l:Áž3ušë�¬sP[ÿnn¾çP�…WõÔFj[Â÷
|
||||
¹vÏ™à‰˜xú�'ˆ£ÀÀ†p¸4.êãKÇ¿ÂÁ±o§¢ü"Á|Nk`îʘ
|
||||
<!--•¤7 yþ D-->
|
||||
�
|
||||
jl©ÌuˆËi™0pmC´«+‰÷6¤2­éÏe`(ŽJ]¥iõð3ƒØí"p|ª!:qøFس 6£
|
||||
@­,þŠqüã��oÌÇ®ž�ÖüV�“¶QÇ›Evî¹²É8ÙªS"æÀç‡x± àþ‡�>—Iãg
|
||||
ïÝ>Y‰çN80æ§ ±¾GLLìÕµ…(1Þ¼!8}þ¬“*…ª‰Ùì:e»´œ
|
||||
ª¿ên_6ÂÃSÀ`eG;Ö„CƒCcˆ¿‡4¸yeî¯Í)oøByRm½0?íLîÅ`QÿjÓÙ/ºôÓN|Ý
|
||||
<!--â9ço‘SŽà•?œýáu¿þá¯~!ÒŸ¿ÍÏüýÏ�Iw1ßþZÈN¥Ex£&\(¤á[ɤ€v2€WW-->
|
||||
|
||||
þÙAÜŒÁ¸D5©D a�ævx ?жx°DM@•!h‰àÈ€Ž§®
|
||||
• �á×B`ð¤ªE?›“”Þdƒ"8$Ý`Ki0…OðƒnΓ±µvtžè€I([,¹Ndɨh\'6X
|
||||
�Pã—Š‰Éøt ¢‘¥�˜¬è €ˆ†Ky™FˆŒë`š”yƒ„¨š €š‰ƒM©‡øFQhY„
|
||||
9¶X¯×–í4š¤™Y\)"¹AN]‰xéz÷Gq07�)�©ñ™•Y€r°ŒŽi‹ �z ™ÇäFÍÉT�–ù›
|
||||
ËŽC œwI›üX]‹¹\ëY]þf lïYbj8ŸÈuœbŸÍÅtú©fÞןfBI—“*øé:ÛØUj Ò
|
||||
ˆõ¹ Õp $(~ ¡Ú ¡gù{îp�ZI?¡ƒîÀv:“a¦˜6¢§Ô]Ý‘(ªê)!ŸÚ¢:
|
||||
jwµ¡4ÚvíHÛǘ9ºXhó•üù£¥Á¢VÉ{Dº2š‰(°¤3š¤a÷ +У¥“p¢þò4Vº—
|
||||
E´¥è¤k°7ºhT*€¿èw`ÚžiÄ …S¦Æ¦mê Nêƒ#ú¢f€ xê†ý
|
||||
8z©7�uÚp{Ú=~]7`«h‡ÚsÚg:…zd˜ó§ÎA-vþAñr¦'–AÚ)9–š¢âSi;£…š 1�ªo"ª
|
||||
¦J;“º rº8Ui|é>¡Úœú
|
||||
<!--pv³2<ƒj£·«É¦kÉ 1Š:¬Èe ”«ÉÚlÑ•ªÍZn¯Š2Ì‹s«ÁÖÚàé¨Ûº=¤zŽŸú6áUä
|
||||
Øš¨¿újá
|
||||
¦0®éJ«
|
||||
¯NÕ井öÐVeζ¯õbm¶7ù´Ž-->
|
||||
“ë¥Dfný2»ƒ–0j«�®»ºK;zë¢Íö»—!µ—S»³r>K+6ˆ‹¨XÒ»; CÈ
|
||||
8Ê;¢»ÃÛ/Œ‹¥ž!¬s½VR½óõÏ‹Oâ[/çK¨þ˜Ñ:Í‹\Ý+ Sc:ïËž’º¶ë9Æ»
|
||||
<!--ëSç�½¤tj ½YUÀœãÀ©%
|
||||
Ìró)Á0¨§—³½Ç…Á¬Ì¤LÛ6øK!<Á:Àê*ª…ÃÁî…Á.‡²
|
||||
¥¼‘z Âä ¦ýËÀ~¸7<,´GóÃý‹ÂöêÀe:Ä¢‰°ë«£m£,žyAI¡…˜Q!8-->
|
||||
ô 8ly$
|
||||
8©ÙÅmX2Ùh>—?¯!šHüÁ^LsP,Ÿ«Y‹âá¿ÿtšì‚£Y
|
||||
r¦Éš¥9ÇjžÄ8-ÆÇŒ¶iêPÂbA˜ù‰Ã¸š»³7RœCWRoìŠå MŒŠ�”åt™ Œ›�réÉq
|
||||
<!--Zva&‹Z¤jzÊŠ¬‡7èV)“‹|›ká�!¦*€Á¶öÄ84’Wž¶L�Êñ½Fª6ÄOq̰Š}Ŭ—|žÎ|4!ÍAh+è•L¢
|
||||
%|‹Û¬Å$-->
|
||||
|
||||
å�>}�Lê}ÎǨ 5:àŒ|�"þÇwÐsøæ�Nΰ¹#R>~-N‰®èƒ ßcðÞÚÎÑ¥®åGÎâ툉Ýè*‚¸
|
||||
=‚ž ºëâ…­ëÀ>Û·žën^žmèÊëð¼ã>å×Λ«}êØ÷
|
||||
“�Œ¬ËI�Á·AÔNÍëv>]t.âÚLЫþíï¾ñnäÖÜæs¹¿±â°+†
|
||||
¬UØïî•.ç¬ÎìÍ.è´ÞŠG=ðù��‚§ž¯”ë^äÛ®êh-‹ê�ê!i!�ÕvMíiªîþ¾òîá/þÑ-OÖGð,oñº!å’gOâ P�OìOôBþÈàhâ+?ï>ßÊVHÀsaõ™€õ$óSîõ—»�ó8.žß¹
|
||||
~áßÈ©ö»]ò3ëÆt_÷[ïôb¯ç‚Ü÷Õ«@u™ð;zܘ‘Ü@óŽ2’?ùƒ¸ÙlùF ¶™¯ù›N ž0œú£¶¤ÿ0#9:�ß§½ž©Ÿ\#ÃÙæó2é+û‚ÀÓ¸�_äM/ÓtaÚý3”]Ù«¿¸iîaF>ª�}ŒØvÍïMÍ÷Ðëä©îrÜŒöqñ_ÀüªrâF®ò
|
||||
ýþ¸—hT_ã�4sx”ýÝî)ç.Qgû�àŸÏ%ì‹}i´ASû|þð@QÜ
|
||||
$J9€»-̱÷Üô�MØ‘hZ˜¦:°œ*ÏlßxÒ|ϼ¡ÅLÀ� ¬Áfù9BÑdìÁ|«VV„¢�“énKv
|
||||
<!--u贮̮iiçͦt›šV/.²ê}mywu#|Yc‚X|jŽ�x‹dE“)0U
|
||||
�’ T–<W€o zbQ`F�¥2›�³:�°Ctª·‰!™²*¨…º»¢~аz¬†Á¯Ä‡´Õ޶Ó(iÃm²F›ÍÚhÜޓơօäc|ØËUÒÙþ²ëøçõƒ³ÜØ<î™w‰Ö¿Eéhä›@ðÂ
|
||||
-->
|
||||
|
||||
kB�_ƒg 3ʳ8#Þ¬L=0;J¤äÈ@¤F|'i~±© žaÊŠÆg;d*3²”©bPÏ¢TäHô¦?�[†
|
||||
ÄäƒhN6ZM¢D:c*BR!$±ckƒ’V­-uÛ@[øp„Ÿ]¼8ö-1{TήWÏ2ñ� Šp=¸q«Ñ½es.‰„4+#Ëe¦¥W5µekxr䛓/XÍš5Iǃ=kÝúµì˰û�N–2q�Å[r¦yZ£QŽ›ÇÞ�txŠäcK—Ííɹ
|
||||
iþ¡9¼m1oñ¢©/²8îìSté4l’Wm¾9óéÖÛÐãã{{üzÞ¿çøêöÞzà}œàL¨ "˜
|
||||
ÄÐsà¶PGLUúå`MÞ ¡†9¬§Û{pX¸¡wÚw߇¡¨ ‰í "M�UXNx
|
||||
<!--É……¡×ƒ��à¨âŠêÄõ#ƒå“Ž:Å(ã4Ö¸Až˜�:@Ùw¸ YÝ‹tIã’Ö”˜$…a(å‹X¥F7×IÈbŠ["Y€M縹K~`¶Øä-->
|
||||
+l´á¦
|
||||
j²F:Á.êÆÛj¤³Búî ¼Ê«/£Ö’[н#í+ð¥ænJÞ¸«æ;ð©õ‹¨ _ËðÄŠÒ»*º?
|
||||
ƒÂwœ�Ãyzh±°Øzl2,#oZ2È›r|òË‚°¼$Ç)ë
|
||||
óÍÙÔ,éfs€1Î@/øîÏPõÌiÐH·�ðÃBkLtÒP¯bôS;NÝWÔXÏ
|
||||
ó’dlÍtÖ`�°tžOc óÅa§}AÄ›²1vËjÇmþu+`ÍÍÁ·qwü6˜‚ì½sÞXŸ�¨Ë$xM6àP³-iÉSÚ½AÙˆïë84–ø=xä8^!ä*L>Þ˜ƒk¹Œ({Iè�^!ḘN$ê
|
||||
«®ç!ºû‚ÿÝ ë¯ßoî—Oü¨¾ÿî9í]ñÞ{ñÙÊ®ãlhŽ(èÌÃê¼~ÔS¢|öÕŸzýw¬Ë§|øÝ—*½ŒÈ×­|úåwzþæ“)Nrû¾Ê?*ô¥
|
||||
¿*÷ô7ú½~Múúú÷ª÷Ɉ•S3x*ûí�P”ùH£�°°àó(è¾í-Jƒú™
|
||||
åAF�{#\”g…Áœ)�!),Ô #ÓÂǼ�jþ1œŒþh©²K„9$ƒYè)Ž ˆA È
|
||||
—‡)#1‰Óp"˜ð'Ã%n‰P´‡Ù¨-‹1³¢^\%ƈÔp„CLÖ5Ã
|
||||
<!--a‘�^œßâx¯
|
||||
€±peŒ-->
|
||||
<HR>
|
||||
<H1><A NAME="1">1 Scope</A></H1>
|
||||
<H2><A NAME="1_1">1.1 Identification</A></H2>
|
||||
<B><A HREF=#8>C Software Trouble Report Form</A></B><HR>
|
||||
<H1><A NAME=1>1 Scope</A></H1>
|
||||
<H2><A NAME=1_1>1.1 Identification</A></H2>
|
||||
This configuration management plan document provides the guidelines
|
||||
for development and maintainance of the Common UNIX Printing System
|
||||
("CUPS") Version 1.0 software.
|
||||
<H2><A NAME="1_2">1.2 System Overview</A></H2>
|
||||
<H2><A NAME=1_2>1.2 System Overview</A></H2>
|
||||
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
|
||||
@@ -223,7 +121,7 @@ applications under UNIX. </P>
|
||||
<P>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. </P>
|
||||
<H2><A NAME="1_3">1.3 Document Overview</A></H2>
|
||||
<H2><A NAME=1_3>1.3 Document Overview</A></H2>
|
||||
This configuration management document is organized into the following
|
||||
sections:
|
||||
<UL>
|
||||
@@ -235,8 +133,8 @@ sections:
|
||||
<LI>A - Glossary</LI>
|
||||
<LI>B - Coding Requirements</LI>
|
||||
</UL>
|
||||
<H1><A NAME="2">2 References</A></H1>
|
||||
<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
|
||||
<H1><A NAME=2>2 References</A></H1>
|
||||
<H2><A NAME=2_1>2.1 CUPS Documentation</A></H2>
|
||||
The following CUPS documentation is referenced by this document:
|
||||
<UL>
|
||||
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan </LI>
|
||||
@@ -249,32 +147,32 @@ sections:
|
||||
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual </LI>
|
||||
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description </LI>
|
||||
</UL>
|
||||
<H2><A NAME="2_2">2.2 Other Documents</A></H2>
|
||||
<H2><A NAME=2_2>2.2 Other Documents</A></H2>
|
||||
The following non-CUPS documents are referenced by this document:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
|
||||
<LI>IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>IPP/1.0: Implementers Guide </LI>
|
||||
<LI>IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
|
||||
</UL>
|
||||
<H1><A NAME="3">3 File Management</A></H1>
|
||||
<H2><A NAME="3_1">3.1 Directory Structure</A></H2>
|
||||
<H1><A NAME=3>3 File Management</A></H1>
|
||||
<H2><A NAME=3_1>3.1 Directory Structure</A></H2>
|
||||
Each source file shall be placed a sub-directory corresponding to the
|
||||
software sub-system it belongs to ("scheduler", "libcups", etc.) To
|
||||
remain compatible with older UNIX filesystems, directory names shall
|
||||
not exceed 16 characters in length.
|
||||
<H2><A NAME="3_2">3.2 Source Files</A></H2>
|
||||
<H2><A NAME=3_2>3.2 Source Files</A></H2>
|
||||
Source files shall be documented and formatted as described in
|
||||
Appendix B, Coding Requirements.
|
||||
<H2><A NAME="3_3">3.3 Configuration Management</A></H2>
|
||||
<H2><A NAME=3_3>3.3 Configuration Management</A></H2>
|
||||
Source files shall be placed under the control of the Concurrent
|
||||
Versions System ("CVS") software. Source files shall be "checked in"
|
||||
with each change so that modifications can be tracked.
|
||||
<P>Documentation on the CVS software is included with the whitepaper,
|
||||
"CVS II: Parallelizing Software Development". </P>
|
||||
<H1><A NAME="4">4 Trouble Report Processing</A></H1>
|
||||
<H1><A NAME=4>4 Trouble Report Processing</A></H1>
|
||||
A Software Trouble Report ("STR") shall be submitted every time a user
|
||||
or vendor experiences a problem with the CUPS software. Trouble reports
|
||||
are maintained in a database with one of the following states:
|
||||
@@ -285,7 +183,7 @@ are maintained in a database with one of the following states:
|
||||
<LI>STR is pending (new STR or additional information available)</LI>
|
||||
</OL>
|
||||
Trouble reports shall be processed using the following steps.
|
||||
<H2><A NAME="4_1">4.1 Classification</A></H2>
|
||||
<H2><A NAME=4_1>4.1 Classification</A></H2>
|
||||
When a trouble report is received it must be classified at one of the
|
||||
following levels:
|
||||
<OL>
|
||||
@@ -301,7 +199,7 @@ following levels:
|
||||
<LI>Specific to an operating system</LI>
|
||||
<LI>Applies to all machines and operating systems</LI>
|
||||
</OL>
|
||||
<H2><A NAME="4_2">4.2 Identification</A></H2>
|
||||
<H2><A NAME=4_2>4.2 Identification</A></H2>
|
||||
Once the level and scope of the trouble report is determined the
|
||||
software sub-system(s) involved with the problem are determined. This
|
||||
may involve additional communication with the user or vendor to isolate
|
||||
@@ -309,16 +207,16 @@ the problem to a specific cause.
|
||||
<P>When the sub-system(s) involved have been identified, an engineer
|
||||
will then determine the change(s) needed and estimate the time required
|
||||
for the change(s). </P>
|
||||
<H2><A NAME="4_3">4.3 Correction</A></H2>
|
||||
<H2><A NAME=4_3>4.3 Correction</A></H2>
|
||||
Corrections are scheduled based upon the severity and complexity of
|
||||
the problem. Once all changes have been made, documented, and tested
|
||||
successfully a new software release snapshot is generated. Additional
|
||||
tests are added as necessary for proper testing of the changes.
|
||||
<H2><A NAME="4_4">4.4 Notification</A></H2>
|
||||
<H2><A NAME=4_4>4.4 Notification</A></H2>
|
||||
The user or vendor is notified when the fix is available or if the
|
||||
problem was caused by user error.
|
||||
<H1><A NAME="5">5 Software Releases</A></H1>
|
||||
<H2><A NAME="5_1">5.1 Version Numbering</A></H2>
|
||||
<H1><A NAME=5>5 Software Releases</A></H1>
|
||||
<H2><A NAME=5_1>5.1 Version Numbering</A></H2>
|
||||
CUPS uses a three-part version number separated by periods to
|
||||
represent the major, minor, and patch release numbers:
|
||||
<UL>
|
||||
@@ -363,22 +261,22 @@ numbers reset to 0:
|
||||
2.0.0 Production release of 2.0.0
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="5_2">5.2 Generation</A></H2>
|
||||
<H2><A NAME=5_2>5.2 Generation</A></H2>
|
||||
Software releases shall be generated for each successfully completed
|
||||
software trouble report. All object and executable files shall be
|
||||
deleted prior to performing a full build to ensure that source files
|
||||
are recompiled.
|
||||
<H2><A NAME="5_3">5.3 Testing</A></H2>
|
||||
<H2><A NAME=5_3>5.3 Testing</A></H2>
|
||||
Software testing shall be conducted according to the CUPS Software
|
||||
Test Plan, CUPS-STP-1.0. Failed tests cause STRs to be generated to
|
||||
correct the problems found.
|
||||
<H2><A NAME="5_4">5.4 Release</A></H2>
|
||||
<H2><A NAME=5_4>5.4 Release</A></H2>
|
||||
When testing has been completed successfully a new distribution image
|
||||
is created from the current CVS code "snapshot". No production release
|
||||
shall contain software that has not passed the appropriate software
|
||||
tests.
|
||||
<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
|
||||
<H2><A NAME="6_1">A.1 Terms</A></H2>
|
||||
<H1 TYPE=A VALUE=1><A NAME=6>A Glossary</A></H1>
|
||||
<H2><A NAME=6_1>A.1 Terms</A></H2>
|
||||
<DL>
|
||||
<DT>C </DT>
|
||||
<DD>A computer language. </DD>
|
||||
@@ -391,7 +289,7 @@ tests.
|
||||
<DT>socket </DT>
|
||||
<DD>A two-way network communications channel. </DD>
|
||||
</DL>
|
||||
<H2><A NAME="6_2">A.2 Acronyms</A></H2>
|
||||
<H2><A NAME=6_2>A.2 Acronyms</A></H2>
|
||||
<DL>
|
||||
<DT>ASCII </DT>
|
||||
<DD>American Standard Code for Information Interchange </DD>
|
||||
@@ -426,23 +324,23 @@ tests.
|
||||
<DT>TFTP </DT>
|
||||
<DD>Trivial File Transfer Protocol </DD>
|
||||
</DL>
|
||||
<H1><A NAME="7">B Coding Requirements</A></H1>
|
||||
<H1><A NAME=7>B Coding Requirements</A></H1>
|
||||
These coding requirements provide detailed information on source file
|
||||
formatting and documentation content. These guidelines shall be applied
|
||||
to all C and C++ source files provided with CUPS.
|
||||
<H2><A NAME="7_1">B.1 Source Files</A></H2>
|
||||
<H3><A NAME="7_1_1">B.1.1 Naming</A></H3>
|
||||
<H2><A NAME=7_1>B.1 Source Files</A></H2>
|
||||
<H3><A NAME=7_1_1>B.1.1 Naming</A></H3>
|
||||
All source files names shall be 16 characters or less in length to
|
||||
ensure compatibility with older UNIX filesystems. Source files
|
||||
containing functions shall have an extension of ".c" for ANSI C and
|
||||
".cpp" for C++ source files. All other "include" files shall have an
|
||||
extension of ".h".
|
||||
<H3><A NAME="7_1_2">B.1.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_1_2>B.1.2 Documentation</A></H3>
|
||||
The top of each source file shall contain a header giving the name of
|
||||
the file, the purpose or nature of the source file, the copyright and
|
||||
licensing notice, and the functions contained in the file. The file
|
||||
name and revision information is provided by the CVS "$Id: cmp.shtml,v
|
||||
1.4 1999/09/22 20:06:18 mike Exp $" tag:
|
||||
1.3 1999/05/21 20:54:04 mike Exp $" tag:
|
||||
<UL>
|
||||
<PRE>
|
||||
/*
|
||||
@@ -478,7 +376,7 @@ name and revision information is provided by the CVS "$Id: cmp.shtml,v
|
||||
</PRE>
|
||||
</UL>
|
||||
The bottom of each source file shall contain a trailer giving the name
|
||||
of the file using the CVS "$Id: cmp.shtml,v 1.4 1999/09/22 20:06:18
|
||||
of the file using the CVS "$Id: cmp.shtml,v 1.3 1999/05/21 20:54:04
|
||||
mike Exp $" tag. The primary purpose of this is to mark the end of a
|
||||
source file; if the trailer is missing it is possible that code has
|
||||
been lost near the end of the file:
|
||||
@@ -489,8 +387,8 @@ been lost near the end of the file:
|
||||
*/
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_2">B.2 Functions</A></H2>
|
||||
<H3><A NAME="7_2_1">B.2.1 Naming</A></H3>
|
||||
<H2><A NAME=7_2>B.2 Functions</A></H2>
|
||||
<H3><A NAME=7_2_1>B.2.1 Naming</A></H3>
|
||||
Functions with a global scope shall be capitalized ("DoThis",
|
||||
"DoThat", "DoSomethingElse", etc.) The only exception to this rule
|
||||
shall be the CUPS interface library functions which may begin with a
|
||||
@@ -498,7 +396,7 @@ prefix word in lowercase ("cupsDoThis", "cupsDoThat", etc.)
|
||||
<P>Functions with a local scope shall be declared "static" and be
|
||||
lowercase with underscores between words ("do_this", "do_that",
|
||||
"do_something_else", etc.) </P>
|
||||
<H3><A NAME="7_2_2">B.2.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_2_2>B.2.2 Documentation</A></H3>
|
||||
Each function shall begin with a comment header describing what the
|
||||
function does, the possible input limits (if any), and the possible
|
||||
output values (if any), and any special information needed:
|
||||
@@ -518,11 +416,11 @@ do_this(float x) /* I - Power value (0.0 <= x <= 1.0) */
|
||||
}
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_3">B.3 Methods</A></H2>
|
||||
<H3><A NAME="7_3_1">B.3.1 Naming</A></H3>
|
||||
<H2><A NAME=7_3>B.3 Methods</A></H2>
|
||||
<H3><A NAME=7_3_1>B.3.1 Naming</A></H3>
|
||||
Methods shall be in lowercase with underscores between words
|
||||
("do_this", "do_that", "do_something_else", etc.)
|
||||
<H3><A NAME="7_3_2">B.3.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_3_2>B.3.2 Documentation</A></H3>
|
||||
Each method shall begin with a comment header describing what the
|
||||
method does, the possible input limits (if any), and the possible
|
||||
output values (if any), and any special information needed:
|
||||
@@ -542,8 +440,8 @@ class::do_this(float x) /* I - Power value (0.0 <= x <= 1.0) */
|
||||
}
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_4">B.4 Variables</A></H2>
|
||||
<H3><A NAME="7_4_1">B.4.1 Naming</A></H3>
|
||||
<H2><A NAME=7_4>B.4 Variables</A></H2>
|
||||
<H3><A NAME=7_4_1>B.4.1 Naming</A></H3>
|
||||
Variables with a global scope shall be capitalized ("ThisVariable",
|
||||
"ThatVariable", "ThisStateVariable", etc.) The only exception to this
|
||||
rule shall be the CUPS interface library global variables which must
|
||||
@@ -554,7 +452,7 @@ possible.
|
||||
between words ("this_variable", "that_variable", etc.) Any local
|
||||
variables shared by functions within a source file shall be declared
|
||||
"static". </P>
|
||||
<H3><A NAME="7_4_2">B.4.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_4_2>B.4.2 Documentation</A></H3>
|
||||
Each variable shall be declared on a separate line and shall be
|
||||
immediately followed by a comment block describing the variable:
|
||||
<UL>
|
||||
@@ -563,12 +461,12 @@ int this_variable; /* The current state of this */
|
||||
int that_variable; /* The current state of that */
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_5">B.5 Types</A></H2>
|
||||
<H3><A NAME="7_5_1">B.5.1 Naming</A></H3>
|
||||
<H2><A NAME=7_5>B.5 Types</A></H2>
|
||||
<H3><A NAME=7_5_1>B.5.1 Naming</A></H3>
|
||||
All type names shall be lowercase with underscores between words and
|
||||
"_t" appended to the end of the name ("this_type_t", "that_type_t",
|
||||
etc.)
|
||||
<H3><A NAME="7_5_2">B.5.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_5_2>B.5.2 Documentation</A></H3>
|
||||
Each type shall have a comment block immediately before the typedef:
|
||||
<UL>
|
||||
<PRE>
|
||||
@@ -578,12 +476,12 @@ etc.)
|
||||
typedef int cups_this_type_t;
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_6">B.6 Structures</A></H2>
|
||||
<H3><A NAME="7_6_1">B.6.1 Naming</A></H3>
|
||||
<H2><A NAME=7_6>B.6 Structures</A></H2>
|
||||
<H3><A NAME=7_6_1>B.6.1 Naming</A></H3>
|
||||
All structure names shall be lowercase with underscores between words
|
||||
and "_str" appended to the end of the name ("this_struct_str",
|
||||
"that_struct_str", etc.)
|
||||
<H3><A NAME="7_6_2">B.6.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_6_2>B.6.2 Documentation</A></H3>
|
||||
Each structure shall have a comment block immediately before the
|
||||
struct and each member shall be documented in accordance with the
|
||||
variable naming policy above:
|
||||
@@ -599,11 +497,11 @@ struct cups_this_struct_str
|
||||
};
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_7">B.7 Classes</A></H2>
|
||||
<H3><A NAME="7_7_1">B.7.1 Naming</A></H3>
|
||||
<H2><A NAME=7_7>B.7 Classes</A></H2>
|
||||
<H3><A NAME=7_7_1>B.7.1 Naming</A></H3>
|
||||
All class names shall be lowercase with underscores between words
|
||||
("this_class", "that_class", etc.)
|
||||
<H3><A NAME="7_7_2">B.7.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_7_2>B.7.2 Documentation</A></H3>
|
||||
Each class shall have a comment block immediately before the class and
|
||||
each member shall be documented in accordance with the variable naming
|
||||
policy above:
|
||||
@@ -619,15 +517,15 @@ class cups_this_class
|
||||
};
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_8">B.8 Constants</A></H2>
|
||||
<H3><A NAME="7_8_1">B.8.1 Naming</A></H3>
|
||||
<H2><A NAME=7_8>B.8 Constants</A></H2>
|
||||
<H3><A NAME=7_8_1>B.8.1 Naming</A></H3>
|
||||
All constant names shall be uppercase with underscored between words
|
||||
("THIS_CONSTANT", "THAT_CONSTANT", etc.) Constants defined for the CUPS
|
||||
interface library must begin with an uppercase prefix
|
||||
("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.)
|
||||
<P>Typed enumerations shall be used whenever possible to allow for type
|
||||
checking by the compiler. </P>
|
||||
<H3><A NAME="7_8_2">B.8.2 Documentation</A></H3>
|
||||
<H3><A NAME=7_8_2>B.8.2 Documentation</A></H3>
|
||||
Comment blocks shall immediately follow each constant:
|
||||
<UL>
|
||||
<PRE>
|
||||
@@ -638,8 +536,8 @@ enum
|
||||
};
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="7_9">B.9 Code</A></H2>
|
||||
<H3><A NAME="7_9_1">B.9.1 Documentation</A></H3>
|
||||
<H2><A NAME=7_9>B.9 Code</A></H2>
|
||||
<H3><A NAME=7_9_1>B.9.1 Documentation</A></H3>
|
||||
All source code shall utilize block comments within functions to
|
||||
describe the operations being performed by a group of statements:
|
||||
<UL>
|
||||
@@ -666,8 +564,8 @@ do
|
||||
} while (i == (sizeof(array) / sizeof(array[0])));
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="7_9_2">B.9.2 Style</A></H3>
|
||||
<H4 TYPE="a">B.9.2.a Indentation</H4>
|
||||
<H3><A NAME=7_9_2>B.9.2 Style</A></H3>
|
||||
<H4 TYPE=a>B.9.2.a Indentation</H4>
|
||||
All code blocks enclosed by brackets shall begin with the opening
|
||||
brace on a new line. The code then follows starting on a new line after
|
||||
the brace and is indented 2 spaces. The closing brace is then placed on
|
||||
@@ -728,20 +626,20 @@ for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
|
||||
array[i] = STATE_IDLE;
|
||||
</PRE>
|
||||
</UL>
|
||||
<H1 ALIGN="RIGHT"><A NAME="8">C Software Trouble Report Form</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=8>C Software Trouble Report Form</A></H1>
|
||||
<CENTER>
|
||||
<TABLE WIDTH="80%">
|
||||
<TR><TH ALIGN="RIGHT">Summary of Problem:</TH><TD ALIGN="LEFT">
|
||||
<TABLE WIDTH=80%>
|
||||
<TR><TH ALIGN=RIGHT>Summary of Problem:</TH><TD ALIGN=LEFT>
|
||||
________________________________________</TD></TR>
|
||||
<TR><TH ALIGN="RIGHT">Problem Severity:</TH><TD ALIGN="LEFT">__1=RFE
|
||||
<TR><TH ALIGN=RIGHT>Problem Severity:</TH><TD ALIGN=LEFT>__1=RFE
|
||||
<BR>__2=Documentation-Error
|
||||
<BR>__3=Unable-to-Print-a-File
|
||||
<BR>__4=Unable-to-Print-to-a-Printer
|
||||
<BR>__5=Unable-to-Print-at-All</TD></TR>
|
||||
<TR><TH ALIGN="RIGHT">Problem Scope:</TH><TD ALIGN="LEFT">__1=Machine
|
||||
<TR><TH ALIGN=RIGHT>Problem Scope:</TH><TD ALIGN=LEFT>__1=Machine
|
||||
__2=Operating-System __3=All</TD></TR>
|
||||
<TR><TH ALIGN="RIGHT" VALIGN="TOP">Detailed Description of Problem:</TH><TD
|
||||
ALIGN="LEFT">________________________________________
|
||||
<TR><TH ALIGN=RIGHT VALIGN=TOP>Detailed Description of Problem:</TH><TD ALIGN=LEFT>
|
||||
________________________________________
|
||||
<BR>________________________________________
|
||||
<BR>________________________________________
|
||||
<BR>________________________________________
|
||||
|
||||
+748
-726
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+7
-7
@@ -75,10 +75,10 @@ The following non-CUPS documents are referenced by this document:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft)
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1
|
||||
<LI>IPP/1.0: Encoding and Transport
|
||||
<LI>IPP/1.0: Implementers Guide
|
||||
<LI>IPP/1.0: Model and Semantics
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide
|
||||
</UL>
|
||||
|
||||
<H1>File Management</H1>
|
||||
@@ -334,12 +334,12 @@ extension of ".h".
|
||||
The top of each source file shall contain a header giving the name of the
|
||||
file, the purpose or nature of the source file, the copyright and licensing
|
||||
notice, and the functions contained in the file. The file name and revision
|
||||
information is provided by the CVS "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $" tag:
|
||||
information is provided by the CVS "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $" tag:
|
||||
|
||||
<UL>
|
||||
<PRE>
|
||||
/*
|
||||
* "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $"
|
||||
* "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $"
|
||||
*
|
||||
* Description of file contents.
|
||||
*
|
||||
@@ -372,14 +372,14 @@ information is provided by the CVS "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike
|
||||
</UL>
|
||||
|
||||
The bottom of each source file shall contain a trailer giving the name
|
||||
of the file using the CVS "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $" tag. The primary purpose of this is to
|
||||
of the file using the CVS "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $" tag. The primary purpose of this is to
|
||||
mark the end of a source file; if the trailer is missing it is possible
|
||||
that code has been lost near the end of the file:
|
||||
|
||||
<UL>
|
||||
<PRE>
|
||||
/*
|
||||
* End of "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $".
|
||||
* End of "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $".
|
||||
*/
|
||||
</PRE>
|
||||
</UL>
|
||||
|
||||
@@ -32,12 +32,8 @@ The following documentation for CUPS is available on this server:
|
||||
<A HREF="sum.pdf">PDF</A> )
|
||||
|
||||
<LI>Software Administrators Manual (
|
||||
<A HREF="sam.html">HTML</A> |
|
||||
<A HREF="sam.pdf">PDF</A> )
|
||||
|
||||
<LI>Software Programmers Manual (
|
||||
<A HREF="spm.html">HTML</A> |
|
||||
<A HREF="spm.pdf">PDF</A> )
|
||||
<A HREF="sum.html">HTML</A> |
|
||||
<A HREF="sum.pdf">PDF</A> )
|
||||
|
||||
<LI>Configuration Management Plan (
|
||||
<A HREF="cmp.html">HTML</A> |
|
||||
@@ -59,6 +55,8 @@ The following documentation for CUPS is available on this server:
|
||||
<A HREF="ssr.html">HTML</A> |
|
||||
<A HREF="ssr.pdf">PDF</A> )
|
||||
|
||||
<LI>Software Test Plan (Not Yet Available)
|
||||
|
||||
</UL>
|
||||
|
||||
<HR>
|
||||
|
||||
+183
-346
@@ -1,193 +1,93 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>CUPS Interface Design Description</TITLE>
|
||||
<TITLE>DRAFT - CUPS Interface Design Description</TITLE>
|
||||
<META NAME="AUTHOR" CONTENT="Easy Software Products">
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-IDD-1.0">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<STYLE>
|
||||
BODY { font-family: serif; font-size: 11.0pt }
|
||||
H1 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H2 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H3 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H4 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H5 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H6 { font-family: sans-serif; font-size: 20.0pt }
|
||||
SUB { font-size: 8.0pt }
|
||||
SUP { font-size: 8.0pt }
|
||||
PRE { font-size: 9.0pt }
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER><A HREF="#CONTENTS"><H1>CUPS Interface Design Description</H1></A><BR>
|
||||
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
|
||||
<H1>DRAFT - CUPS Interface Design Description</H1></A><BR>
|
||||
CUPS-IDD-1.0<BR>
|
||||
Easy Software Products<BR>
|
||||
Copyright 1997-1999, All Rights Reserved<BR>
|
||||
</CENTER>
|
||||
<HR>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="#1">1 Scope</A></B>
|
||||
<BR><B><A HREF=#1>1 Scope</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#1_1">1.1 Identification</A></LI>
|
||||
<LI><A HREF="#1_2">1.2 System Overview</A></LI>
|
||||
<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
|
||||
<LI><A HREF=#1_1>1.1 Identification</A></LI>
|
||||
<LI><A HREF=#1_2>1.2 System Overview</A></LI>
|
||||
<LI><A HREF=#1_3>1.3 Document Overview</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#2">2 References</A></B>
|
||||
<B><A HREF=#2>2 References</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
|
||||
<LI><A HREF=#2_1>2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF=#2_2>2.2 Other Documents</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#3">3 Internal Interfaces</A></B>
|
||||
<B><A HREF=#3>3 Internal Interfaces</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1">3.1 Character Set Files</A></LI>
|
||||
<LI><A HREF="#3_2">3.2 Language Files</A></LI>
|
||||
<LI><A HREF="#3_3">3.3 MIME Files</A></LI>
|
||||
<LI><A HREF=#3_1>3.1 Character Set Files</A></LI>
|
||||
<LI><A HREF=#3_2>3.2 Language Files</A></LI>
|
||||
<LI><A HREF=#3_3>3.3 MIME Files</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_3_1">3.3.1 mime.types</A></LI>
|
||||
<LI><A HREF="#3_3_2">3.3.2 mime.convs</A></LI>
|
||||
<LI><A HREF=#3_3_1>3.3.1 mime.types</A></LI>
|
||||
<LI><A HREF=#3_3_2>3.3.2 mime.convs</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_4">3.4 PostScript Printer Description Files</A></LI>
|
||||
<LI><A HREF=#3_4>3.4 PostScript Printer Description Files</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_4_1">3.4.1 CUPS Extensions to PPD Files</A></LI>
|
||||
<LI><A HREF=#3_4_1>3.4.1 CUPS Extensions to PPD Files</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_5">3.5 Scheduler Configuration Files</A></LI>
|
||||
<LI><A HREF=#3_5>3.5 Scheduler Configuration Files</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_5_1">3.5.1 classes.conf</A></LI>
|
||||
<LI><A HREF="#3_5_2">3.5.2 cupsd.conf</A></LI>
|
||||
<LI><A HREF="#3_5_3">3.5.3 printers.conf</A></LI>
|
||||
<LI><A HREF=#3_5_1>3.5.1 classes.conf</A></LI>
|
||||
<LI><A HREF=#3_5_2>3.5.2 cupsd.conf</A></LI>
|
||||
<LI><A HREF=#3_5_3>3.5.3 printers.conf</A></LI>
|
||||
</UL>
|
||||
</UL>
|
||||
<B><A HREF="#4">4 External Interfaces</A></B>
|
||||
<B><A HREF=#4>4 External Interfaces</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#4_1">4.1 AppSocket Protocol</A></LI>
|
||||
<LI><A HREF="#4_2">4.2 CUPS Browsing Protocol</A></LI>
|
||||
<LI><A HREF="#4_3">4.3 CUPS PostScript File</A></LI>
|
||||
<LI><A HREF="#4_4">4.4 CUPS Raster File</A></LI>
|
||||
<LI><A HREF="#4_5">4.5 CUPS Raw Files</A></LI>
|
||||
<LI><A HREF="#4_6">4.6 Internet Printing Protocol</A></LI>
|
||||
<LI><A HREF=#4_1>4.1 AppSocket Protocol</A></LI>
|
||||
<LI><A HREF=#4_2>4.2 CUPS Browsing Protocol</A></LI>
|
||||
<LI><A HREF=#4_3>4.3 CUPS PostScript File</A></LI>
|
||||
<LI><A HREF=#4_4>4.4 CUPS Raster File</A></LI>
|
||||
<LI><A HREF=#4_5>4.5 CUPS Raw Files</A></LI>
|
||||
<LI><A HREF=#4_6>4.6 File Transfer Protocol</A></LI>
|
||||
<LI><A HREF=#4_7>4.7 Internet Printing Protocol</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#4_6_1">4.6.1 Get Default Destination (CUPS_GET_DEFAULT =
|
||||
<LI><A HREF=#4_7_1>4.7.1 Get Default Destination (CUPS_GET_DEFAULT =
|
||||
0x4001)</A></LI>
|
||||
<LI><A HREF="#4_6_2">4.6.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></LI>
|
||||
<LI><A HREF="#4_6_3">4.6.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></LI>
|
||||
<LI><A HREF="#4_6_4">4.6.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
|
||||
<LI><A HREF=#4_7_2>4.7.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></LI>
|
||||
<LI><A HREF=#4_7_3>4.7.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></LI>
|
||||
<LI><A HREF=#4_7_4>4.7.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
|
||||
</LI>
|
||||
<LI><A HREF="#4_6_5">4.6.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></LI>
|
||||
<LI><A HREF="#4_6_6">4.6.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></LI>
|
||||
<LI><A HREF="#4_6_7">4.6.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></LI>
|
||||
<LI><A HREF="#4_6_8">4.6.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></LI>
|
||||
<LI><A HREF="#4_6_9">4.6.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></LI>
|
||||
<LI><A HREF="#4_6_10">4.6.10 Set Default Destination (CUPS_SET_DEFAULT
|
||||
= 0x400A)</A></LI>
|
||||
<LI><A HREF=#4_7_5>4.7.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></LI>
|
||||
<LI><A HREF=#4_7_6>4.7.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></LI>
|
||||
<LI><A HREF=#4_7_7>4.7.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></LI>
|
||||
<LI><A HREF=#4_7_8>4.7.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></LI>
|
||||
<LI><A HREF=#4_7_9>4.7.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></LI>
|
||||
<LI><A HREF=#4_7_10>4.7.10 Set Default Destination (CUPS_SET_DEFAULT =
|
||||
0x400A)</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#4_7">4.7 Line Printer Daemon Protocol</A></LI>
|
||||
<LI><A HREF="#4_8">4.8 Server Message Block Protocol</A></LI>
|
||||
<LI><A HREF=#4_8>4.8 Line Printer Daemon Protocol</A></LI>
|
||||
<LI><A HREF=#4_9>4.9 Server Message Block Protocol</A></LI>
|
||||
<LI><A HREF=#4_10>4.10 Trivial File Transfer Protocol</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#5">5 5 - Directories</A></B>
|
||||
<B><A HREF=#5>5 5 - Directories</A></B>
|
||||
<BR>
|
||||
<BR><B><A HREF="#6">A Glossary</A></B>
|
||||
<BR><B><A HREF=#6>A Glossary</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#6_1">A.1 Terms</A></LI>
|
||||
<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
|
||||
<LI><A HREF=#6_1>A.1 Terms</A></LI>
|
||||
<LI><A HREF=#6_2>A.2 Acronyms</A></LI>
|
||||
</UL>
|
||||
<HR>
|
||||
GIF89a¯ÿòÌÌÌ™™™fff333ÿÿÿÿÿÿÿÿÿ!ù,¯ÿBþXºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª2€0p,Ïtmßx®ï
|
||||
|
||||
<!--=�•pH,��Ö«Çl:ŸÐ¨”ù ¯Ø¬ÖXN¿à°xL~¬Û´zmxËð¸|N§Ùø¼(Pïûÿ€�bwz…jn‚‰Š‹Œ�9„†‘!-->
|
||||
;±Ýíˆndý !¸ ž³wà…MƒƒY~¿{,gÚ\‚äé
|
||||
Œ×Ø(tÙî!Ï=Ñ.ûz¯�áÑŸ:ì;Ã9qöíÉë]/¿ºÉ¤Et/†'Îþt9ÀØ–ž_ÙÇ\|W•wArö¸Ý�2Ô×
|
||||
tN°0Tï}�¡û‰$!‚yMxî)ˆš‰Ô�ø@nB°U½ÊwE„§!ŠF H L8B
|
||||
c‰;ždŠ-æDVWdг€h±äÚ“P¶%#(4Fiå•Ï\hŠ:�Re!\ÒÄ—X^¦%€¥À-$E€Ö/úHŽšlââöÌQX
|
||||
|
||||
<!--äÇ"iL :a7‚]›0IZ¡YØø¡‡D}¤–Uj±á
|
||||
^â䙿`Ú@¦5b|šà�«Á±§3Ñ KwÔ\ªB¨±H)+�=¡Ó©"
|
||||
©¢ 8uƒ†¸öŠD§•lþ:„d�RX�ilÌ:Ë!´;¹t+„e<
|
||||
‡;øô+‚bbhaÚ0Ê6é.D™ð޹̹ñÖkoê({ï¾ü{f¿-->
|
||||
¸1Nô¯b"œŠüjåÁÂE0…È8ö5GkZ|ÒÁwt„C»ÔQSÇo6ÔÙ�[�W„$²*Ž+4Pb-8¹P1þ'8"‘ФÄ$ Cyê‘„)>ãŠtè`Ð3‡‹¾z"«rE'Âqfä°Ë
|
||||
‘qÂ\|€„Ž¡ôö»%É(.—bڽȀ�íÉ`{¬EÇ1w’ »[Hß`(B6ö�“
|
||||
†')ÊRŽÎa[�ÃrbC!Tå°Œ
|
||||
2Q·ÈHZê#–®üË/àô¯FÝê(Û²% ºXË9öÀbÁ4f.ù-oý�™XËB…�IÎÒ7¹*@ÃÓŽÍT€hà‘ÌWâ�™Ã$f:µyžn†ó†r„'té�Kv`
|
||||
Ç+dª– œ79s�ò|'=×¢Ìx¶òœÿ„¦œˆeÎ;*à$þ” IÝÆaÏ{–3ŽÅ�Á
|
||||
P“ÍS[ÙL¨3©òQ7éÆò#ãûô0F×ðsE°t§@‘ØQÜ´´ ©:3ÓRíd �¥*MITnŒ£¨H]ØQÁd
|
||||
@òþ—¬rMœŽaO
|
||||
<!--x‹ŒÖ3½4 °XT'ª®ƒ:T£uéWeºádËeú¸è¬Ù7
|
||||
|
||||
ëÒÏ;„sœåµ7m(ýПtl¤RV�)-->
|
||||
rë^yÀ·(¸îéêû$uDòrã/a,I.°ÙUÀœb hˆ`�¾B ë"
|
||||
Ü`HØxȸo1þ[á\8f^æ|\ý‚¢¢zø0(ˆ\ {ƒÄgäÞõ€çâ§Á˜0*\³n¼‹m¶/Äeª±ÿ†ì
|
||||
Ç,½DN2€œº+ùÉ|í0L¡Le*ð¸Ã>­2ëf,eIPOËÅàr—±”80SAŸcFªatç»ãy¤¸ršçÌ¡5ïoõËsžï|¿8˙Φ¬þ,ï¼èà)ÁÌ;øk¡—†dDpÑòø2¢q�fHã!Ë“~ÙŸ-í
|
||||
'g:,æ4y?ýäP‹Z›ž#ÏÕ´Î5AK‰k]ûš›ÒKõ¯‡më€õzØÈƫ؎Ý>B{PЪ.6hf]º?©ÌIŽuO„í�M‚ÌÇÜcµ3˜
|
||||
61‹NÒ[†W£ ¦m¿­{ÂPâvζKnUˆ[ ònĽ±÷n?l:Áž3ušë�¬sP[ÿnn¾çP�…WõÔFj[Â÷
|
||||
¹vÏ™à‰˜xú�'ˆ£ÀÀ†p¸4.êãKÇ¿ÂÁ±o§¢ü"Á|Nk`îʘ
|
||||
<!--•¤7 yþ D-->
|
||||
�
|
||||
jl©ÌuˆËi™0pmC´«+‰÷6¤2­éÏe`(ŽJ]¥iõð3ƒØí"p|ª!:qøFس 6£
|
||||
@­,þŠqüã��oÌÇ®ž�ÖüV�“¶QÇ›Evî¹²É8ÙªS"æÀç‡x± àþ‡�>—Iãg
|
||||
ïÝ>Y‰çN80æ§ ±¾GLLìÕµ…(1Þ¼!8}þ¬“*…ª‰Ùì:e»´œ
|
||||
ª¿ên_6ÂÃSÀ`eG;Ö„CƒCcˆ¿‡4¸yeî¯Í)oøByRm½0?íLîÅ`QÿjÓÙ/ºôÓN|Ý
|
||||
<!--â9ço‘SŽà•?œýáu¿þá¯~!ÒŸ¿ÍÏüýÏ�Iw1ßþZÈN¥Ex£&\(¤á[ɤ€v2€WW-->
|
||||
|
||||
þÙAÜŒÁ¸D5©D a�ævx ?жx°DM@•!h‰àÈ€Ž§®
|
||||
• �á×B`ð¤ªE?›“”Þdƒ"8$Ý`Ki0…OðƒnΓ±µvtžè€I([,¹Ndɨh\'6X
|
||||
�Pã—Š‰Éøt ¢‘¥�˜¬è €ˆ†Ky™FˆŒë`š”yƒ„¨š €š‰ƒM©‡øFQhY„
|
||||
9¶X¯×–í4š¤™Y\)"¹AN]‰xéz÷Gq07�)�©ñ™•Y€r°ŒŽi‹ �z ™ÇäFÍÉT�–ù›
|
||||
ËŽC œwI›üX]‹¹\ëY]þf lïYbj8ŸÈuœbŸÍÅtú©fÞןfBI—“*øé:ÛØUj Ò
|
||||
ˆõ¹ Õp $(~ ¡Ú ¡gù{îp�ZI?¡ƒîÀv:“a¦˜6¢§Ô]Ý‘(ªê)!ŸÚ¢:
|
||||
jwµ¡4ÚvíHÛǘ9ºXhó•üù£¥Á¢VÉ{Dº2š‰(°¤3š¤a÷ +У¥“p¢þò4Vº—
|
||||
E´¥è¤k°7ºhT*€¿èw`ÚžiÄ …S¦Æ¦mê Nêƒ#ú¢f€ xê†ý
|
||||
8z©7�uÚp{Ú=~]7`«h‡ÚsÚg:…zd˜ó§ÎA-vþAñr¦'–AÚ)9–š¢âSi;£…š 1�ªo"ª
|
||||
¦J;“º rº8Ui|é>¡Úœú
|
||||
<!--pv³2<ƒj£·«É¦kÉ 1Š:¬Èe ”«ÉÚlÑ•ªÍZn¯Š2Ì‹s«ÁÖÚàé¨Ûº=¤zŽŸú6áUä
|
||||
Øš¨¿újá
|
||||
¦0®éJ«
|
||||
¯NÕ井öÐVeζ¯õbm¶7ù´Ž-->
|
||||
“ë¥Dfný2»ƒ–0j«�®»ºK;zë¢Íö»—!µ—S»³r>K+6ˆ‹¨XÒ»; CÈ
|
||||
8Ê;¢»ÃÛ/Œ‹¥ž!¬s½VR½óõÏ‹Oâ[/çK¨þ˜Ñ:Í‹\Ý+ Sc:ïËž’º¶ë9Æ»
|
||||
<!--ëSç�½¤tj ½YUÀœãÀ©%
|
||||
Ìró)Á0¨§—³½Ç…Á¬Ì¤LÛ6øK!<Á:Àê*ª…ÃÁî…Á.‡²
|
||||
¥¼‘z Âä ¦ýËÀ~¸7<,´GóÃý‹ÂöêÀe:Ä¢‰°ë«£m£,žyAI¡…˜Q!8-->
|
||||
ô 8ly$
|
||||
8©ÙÅmX2Ùh>—?¯!šHüÁ^LsP,Ÿ«Y‹âá¿ÿtšì‚£Y
|
||||
r¦Éš¥9ÇjžÄ8-ÆÇŒ¶iêPÂbA˜ù‰Ã¸š»³7RœCWRoìŠå MŒŠ�”åt™ Œ›�réÉq
|
||||
<!--Zva&‹Z¤jzÊŠ¬‡7èV)“‹|›ká�!¦*€Á¶öÄ84’Wž¶L�Êñ½Fª6ÄOq̰Š}Ŭ—|žÎ|4!ÍAh+è•L¢
|
||||
%|‹Û¬Å$-->
|
||||
|
||||
å�>}�Lê}ÎǨ 5:àŒ|�"þÇwÐsøæ�Nΰ¹#R>~-N‰®èƒ ßcðÞÚÎÑ¥®åGÎâ툉Ýè*‚¸
|
||||
=‚ž ºëâ…­ëÀ>Û·žën^žmèÊëð¼ã>å×Λ«}êØ÷
|
||||
“�Œ¬ËI�Á·AÔNÍëv>]t.âÚLЫþíï¾ñnäÖÜæs¹¿±â°+†
|
||||
¬UØïî•.ç¬ÎìÍ.è´ÞŠG=ðù��‚§ž¯”ë^äÛ®êh-‹ê�ê!i!�ÕvMíiªîþ¾òîá/þÑ-OÖGð,oñº!å’gOâ P�OìOôBþÈàhâ+?ï>ßÊVHÀsaõ™€õ$óSîõ—»�ó8.žß¹
|
||||
~áßÈ©ö»]ò3ëÆt_÷[ïôb¯ç‚Ü÷Õ«@u™ð;zܘ‘Ü@óŽ2’?ùƒ¸ÙlùF ¶™¯ù›N ž0œú£¶¤ÿ0#9:�ß§½ž©Ÿ\#ÃÙæó2é+û‚ÀÓ¸�_äM/ÓtaÚý3”]Ù«¿¸iîaF>ª�}ŒØvÍïMÍ÷Ðëä©îrÜŒöqñ_ÀüªrâF®ò
|
||||
ýþ¸—hT_ã�4sx”ýÝî)ç.Qgû�àŸÏ%ì‹}i´ASû|þð@QÜ
|
||||
$J9€»-̱÷Üô�MØ‘hZ˜¦:°œ*ÏlßxÒ|ϼ¡ÅLÀ� ¬Áfù9BÑdìÁ|«VV„¢�“énKv
|
||||
<!--u贮̮iiçͦt›šV/.²ê}mywu#|Yc‚X|jŽ�x‹dE“)0U
|
||||
�’ T–<W€o zbQ`F�¥2›�³:�°Ctª·‰!™²*¨…º»¢~аz¬†Á¯Ä‡´Õ޶Ó(iÃm²F›ÍÚhÜޓơօäc|ØËUÒÙþ²ëøçõƒ³ÜØ<î™w‰Ö¿Eéhä›@ðÂ
|
||||
-->
|
||||
|
||||
kB�_ƒg 3ʳ8#Þ¬L=0;J¤äÈ@¤F|'i~±© žaÊŠÆg;d*3²”©bPÏ¢TäHô¦?�[†
|
||||
ÄäƒhN6ZM¢D:c*BR!$±ckƒ’V­-uÛ@[øp„Ÿ]¼8ö-1{TήWÏ2ñ� Šp=¸q«Ñ½es.‰„4+#Ëe¦¥W5µekxr䛓/XÍš5Iǃ=kÝúµì˰û�N–2q�Å[r¦yZ£QŽ›ÇÞ�txŠäcK—Ííɹ
|
||||
iþ¡9¼m1oñ¢©/²8îìSté4l’Wm¾9óéÖÛÐãã{{üzÞ¿çøêöÞzà}œàL¨ "˜
|
||||
ÄÐsà¶PGLUúå`MÞ ¡†9¬§Û{pX¸¡wÚw߇¡¨ ‰í "M�UXNx
|
||||
<!--É……¡×ƒ��à¨âŠêÄõ#ƒå“Ž:Å(ã4Ö¸Až˜�:@Ùw¸ YÝ‹tIã’Ö”˜$…a(å‹X¥F7×IÈbŠ["Y€M縹K~`¶Øä-->
|
||||
+l´á¦
|
||||
j²F:Á.êÆÛj¤³Búî ¼Ê«/£Ö’[н#í+ð¥ænJÞ¸«æ;ð©õ‹¨ _ËðÄŠÒ»*º?
|
||||
ƒÂwœ�Ãyzh±°Øzl2,#oZ2È›r|òË‚°¼$Ç)ë
|
||||
óÍÙÔ,éfs€1Î@/øîÏPõÌiÐH·�ðÃBkLtÒP¯bôS;NÝWÔXÏ
|
||||
ó’dlÍtÖ`�°tžOc óÅa§}AÄ›²1vËjÇmþu+`ÍÍÁ·qwü6˜‚ì½sÞXŸ�¨Ë$xM6àP³-iÉSÚ½AÙˆïë84–ø=xä8^!ä*L>Þ˜ƒk¹Œ({Iè�^!ḘN$ê
|
||||
«®ç!ºû‚ÿÝ ë¯ßoî—Oü¨¾ÿî9í]ñÞ{ñÙÊ®ãlhŽ(èÌÃê¼~ÔS¢|öÕŸzýw¬Ë§|øÝ—*½ŒÈ×­|úåwzþæ“)Nrû¾Ê?*ô¥
|
||||
¿*÷ô7ú½~Múúú÷ª÷Ɉ•S3x*ûí�P”ùH£�°°àó(è¾í-Jƒú™
|
||||
åAF�{#\”g…Áœ)�!),Ô #ÓÂǼ�jþ1œŒþh©²K„9$ƒYè)Ž ˆA È
|
||||
—‡)#1‰Óp"˜ð'Ã%n‰P´‡Ù¨-‹1³¢^\%ƈÔp„CLÖ5Ã
|
||||
<!--a‘�^œßâx¯
|
||||
€±peŒ-->
|
||||
<HR>
|
||||
<H1><A NAME="1">1 Scope</A></H1>
|
||||
<H2><A NAME="1_1">1.1 Identification</A></H2>
|
||||
<H1><A NAME=1>1 Scope</A></H1>
|
||||
<H2><A NAME=1_1>1.1 Identification</A></H2>
|
||||
<P>This interface design description document provides detailed file
|
||||
formats, message formats, and program conventions for the Common UNIX
|
||||
Printing System ("CUPS") Version 1.0. </P>
|
||||
<H2><A NAME="1_2">1.2 System Overview</A></H2>
|
||||
<H2><A NAME=1_2>1.2 System Overview</A></H2>
|
||||
<P>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
|
||||
@@ -203,7 +103,7 @@ applications under UNIX. </P>
|
||||
<P>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. </P>
|
||||
<H2><A NAME="1_3">1.3 Document Overview</A></H2>
|
||||
<H2><A NAME=1_3>1.3 Document Overview</A></H2>
|
||||
<P>This interface design description document is organized into the
|
||||
following sections: </P>
|
||||
<UL>
|
||||
@@ -214,8 +114,8 @@ following sections: </P>
|
||||
<LI>5 - Directories </LI>
|
||||
<LI>A - Glossary </LI>
|
||||
</UL>
|
||||
<H1><A NAME="2">2 References</A></H1>
|
||||
<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
|
||||
<H1><A NAME=2>2 References</A></H1>
|
||||
<H2><A NAME=2_1>2.1 CUPS Documentation</A></H2>
|
||||
<P>The following CUPS documentation is referenced by this document: </P>
|
||||
<UL>
|
||||
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan </LI>
|
||||
@@ -228,18 +128,18 @@ following sections: </P>
|
||||
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual </LI>
|
||||
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description </LI>
|
||||
</UL>
|
||||
<H2><A NAME="2_2">2.2 Other Documents</A></H2>
|
||||
<H2><A NAME=2_2>2.2 Other Documents</A></H2>
|
||||
<P>The following non-CUPS documents are referenced by this document: </P>
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
|
||||
<LI>IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>IPP/1.0: Implementers Guide </LI>
|
||||
<LI>IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
|
||||
</UL>
|
||||
<H1><A NAME="3">3 Internal Interfaces</A></H1>
|
||||
<H2><A NAME="3_1">3.1 Character Set Files</A></H2>
|
||||
<H1><A NAME=3>3 Internal Interfaces</A></H1>
|
||||
<H2><A NAME=3_1>3.1 Character Set Files</A></H2>
|
||||
<P>The character set files define a mapping between 8-bit characters
|
||||
and the Unicode character set. They are named using the ISO standard
|
||||
number defined for the character set. Each file consists of up to 256
|
||||
@@ -247,7 +147,7 @@ lines of ASCII text. Each line consists of two hexadecimal numbers; the
|
||||
first number is the character number in the character set (0x00 to
|
||||
0xff), and the second number is the Unicode character number (0x0000 to
|
||||
0xffff). </P>
|
||||
<H2><A NAME="3_2">3.2 Language Files</A></H2>
|
||||
<H2><A NAME=3_2>3.2 Language Files</A></H2>
|
||||
<P>The language files define the default character set and a collection
|
||||
of text messages in that language. They are named by prefixing the
|
||||
string "cups_" to the front of the language specifier (e.g. "cups_en",
|
||||
@@ -272,9 +172,9 @@ messages. The currently recognized values are: </P>
|
||||
<P>The second and succeeding lines define text messages. If the message
|
||||
text is preceded by a number, then the current message number is
|
||||
updated and the text after the number is used. </P>
|
||||
<H2><A NAME="3_3">3.3 MIME Files</A></H2>
|
||||
<H2><A NAME=3_3>3.3 MIME Files</A></H2>
|
||||
<P>CUPS uses two MIME files in its standard configuration. </P>
|
||||
<H3><A NAME="3_3_1">3.3.1 mime.types</A></H3>
|
||||
<H3><A NAME=3_3_1>3.3.1 mime.types</A></H3>
|
||||
<P>The mime.types file defines the recognized file types and consists
|
||||
of 1 or more lines of ASCII text. Comment lines start with the pound
|
||||
("#") character. The backslash ("\") character can be used at the end
|
||||
@@ -302,10 +202,7 @@ operator := "+" | [ logical AND ]
|
||||
"!" [ unary NOT ]
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <CODE>int</CODE> and <CODE>short</CODE> rules match look for
|
||||
integers in network byte order (a.k.a. big-endian) with the
|
||||
most-significant byte first. </P>
|
||||
<H3><A NAME="3_3_2">3.3.2 mime.convs</A></H3>
|
||||
<H3><A NAME=3_3_2>3.3.2 mime.convs</A></H3>
|
||||
<P>The mime.types file defines the recognized file filters and consists
|
||||
of 1 or more lines of ASCII text. Comment lines start with the pound
|
||||
("#") character. </P>
|
||||
@@ -314,12 +211,12 @@ of 1 or more lines of ASCII text. Comment lines start with the pound
|
||||
the MIME types are a cost value (0 to 100) and the filter program to
|
||||
use. If the filter program is not specified using the full path then it
|
||||
must reside in the CUPS filter directory. </P>
|
||||
<H2><A NAME="3_4">3.4 PostScript Printer Description Files</A></H2>
|
||||
<H2><A NAME=3_4>3.4 PostScript Printer Description Files</A></H2>
|
||||
<P>The PostScript Printer Description (PPD) file format is described in <A
|
||||
HREF="http://partners.adobe.com/supportservice/devrelations/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
|
||||
Adobe TechNote #5003: PostScript Printer Description File Format
|
||||
HREF=http://partners.adobe.com/supportservice/devrelations/PDFS/TN/5003.PPD_Spec_v4.3.pdf>
|
||||
Adobe TechNote #5003: PostScript Printer Description File Format
|
||||
Specification Version 4.3</A>. </P>
|
||||
<H3><A NAME="3_4_1">3.4.1 CUPS Extensions to PPD Files</A></H3>
|
||||
<H3><A NAME=3_4_1>3.4.1 CUPS Extensions to PPD Files</A></H3>
|
||||
<P>CUPS adds several new attributes that are described below. </P>
|
||||
<H4>3.4.1.1 cupsFilter</H4>
|
||||
<P>This string attribute provides a conversion rule of the form: </P>
|
||||
@@ -330,7 +227,7 @@ source/type cost program
|
||||
</UL>
|
||||
<P>The destination type is assumed to the printer's type. If a printer
|
||||
supports the source type directly the special filter program "-" may be
|
||||
specified. </P>
|
||||
used. </P>
|
||||
<H4>3.4.1.2 cupsManualCopies</H4>
|
||||
<P>This boolean attribute notifies the RIP filters that the destination
|
||||
printer does not support copy generation in hardware. The default value
|
||||
@@ -343,17 +240,17 @@ specific model of printer. </P>
|
||||
<P>This string attribute specifies a color profile of the form: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
resolution/type density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22
|
||||
resolution/type density m00 m01 m02 m10 m11 m12 m20 m21 m22
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <I>resolution</I> and <I>type</I> values may be "-" to act as a
|
||||
wildcard. Otherwise they must match one of the <CODE>Resolution</CODE>
|
||||
or <CODE>MediaType</CODE> attributes defined in the PPD file. </P>
|
||||
<P>The <I>density</I> and <I>gamma</I> values define gamma and density
|
||||
adjustment function such that: </P>
|
||||
<P>The <I>density</I> value defines a gamma and density adjustment
|
||||
function such that: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
f(x) = density * x<SUP>gamma</SUP>
|
||||
f(x) = d * x<SUP>1/d</SUP>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <I>m00</I> through <I>m22</I> values define a 3x3 transformation
|
||||
@@ -363,7 +260,7 @@ after</I> the CMY transformation. </P>
|
||||
<P>This required attribute describes which version of the CUPS IDD was
|
||||
used for the PPD file extensions. Currently it must be the string
|
||||
"1.0". </P>
|
||||
<H2><A NAME="3_5">3.5 Scheduler Configuration Files</A></H2>
|
||||
<H2><A NAME=3_5>3.5 Scheduler Configuration Files</A></H2>
|
||||
<P>The scheduler reads three configuration files that define the
|
||||
available printers, classes, and services: </P>
|
||||
<DL>
|
||||
@@ -375,161 +272,99 @@ the scheduler. </DD>
|
||||
<DT>printers.conf </DT>
|
||||
<DD>This file defines all of the printers known to the system. </DD>
|
||||
</DL>
|
||||
<H3><A NAME="3_5_1">3.5.1 classes.conf</A></H3>
|
||||
<H3><A NAME=3_5_1>3.5.1 classes.conf</A></H3>
|
||||
<P>The classes.conf file consists of 1 or more lines of ASCII text.
|
||||
Comment lines start with the pound ("#") character. </P>
|
||||
<P>Each non-blank line starts with the name of a configuration
|
||||
directive followed by its value. The following directives are
|
||||
understood:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="90%">
|
||||
<TR><TH WIDTH="25%">Directive</TH><TH>Description</TH></TR>
|
||||
<TABLE BORDER=1 WIDTH=90%>
|
||||
<TR><TH WIDTH=25%>Directive</TH><TH>Description</TH></TR>
|
||||
<TR><TD><Class name>
|
||||
<BR> </Class></TD><TD>Surrounds a class definition.</TD></TR>
|
||||
<BR> </Class></TD><TD></TR>
|
||||
<TR><TD><DefaultClass name>
|
||||
<BR> </Class></TD><TD>Surrounds a class definition for the default
|
||||
destination.</TD></TR>
|
||||
<TR><TD>Accepting</TD><TD>Specifies whether the class is accepting new
|
||||
jobs. May be the names "Yes" or "No".</TD></TR>
|
||||
<TR><TD>Info</TD><TD>A textual description of the class.</TD></TR>
|
||||
<TR><TD>Location</TD><TD>A textual location of the class.</TD></TR>
|
||||
<TR><TD>MoreInfo</TD><TD>A URL pointing to additional information on
|
||||
the class.</TD></TR>
|
||||
<TR><TD>Printer</TD><TD>Specifies a printer that is a member of the
|
||||
class.</TD></TR>
|
||||
<BR> </Class></TD><TD></TR>
|
||||
<TR><TD>Info</TD><TD></TR>
|
||||
<TR><TD>Location</TD><TD></TR>
|
||||
<TR><TD>MoreInfo</TD><TD></TR>
|
||||
<TR><TD>Printer</TD><TD></TR>
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
<H3><A NAME="3_5_2">3.5.2 cupsd.conf</A></H3>
|
||||
<H3><A NAME=3_5_2>3.5.2 cupsd.conf</A></H3>
|
||||
<P>The cupsd.conf file consists of 1 or more lines of ASCII text.
|
||||
Comment lines start with the pound ("#") character. </P>
|
||||
<P>Each non-blank line starts with the name of a configuration
|
||||
directive followed by its value. The following directives are
|
||||
understood:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="90%">
|
||||
<TR><TH WIDTH="25%">Directive</TH><TH>Default</TH><TH>Description</TH></TR>
|
||||
<TR><TD>AccessLog</TD><TD>logs/access_log</TD><TD>Specifies the
|
||||
location of the access log file.</TD></TR>
|
||||
<TR><TD>Allow</TD><TD>-</TD><TD>Allows connections from the specified
|
||||
host, network, or domain.</TD></TR>
|
||||
<TR><TD>AuthClass</TD><TD>-</TD><TD>Specifies what level of
|
||||
authentication is required; may be either "User", "System", or "Group".</TD>
|
||||
</TR>
|
||||
<TR><TD>AuthType</TD><TD>None</TD><TD>Specifies the type of
|
||||
authentication to perform; may be either "None" or "Basic".</TD></TR>
|
||||
<TR><TD>BrowseAddress</TD><TD>255.255.255.255</TD><TD>Specifies a
|
||||
broadcast address to send CUPS browsing packets to.</TD></TR>
|
||||
<TR><TD>BrowseInterval</TD><TD>30</TD><TD>Specifies the number of
|
||||
seconds between browsing updates.</TD></TR>
|
||||
<TR><TD>BrowsePort</TD><TD>631</TD><TD>Specifies the UDP port number to
|
||||
use for browse packets.</TD></TR>
|
||||
<TR><TD>BrowseTimeout</TD><TD>300</TD><TD>Specifies the number of
|
||||
seconds to wait until remote destinations are removed from the local
|
||||
destination list.</TD></TR>
|
||||
<TR><TD>Browsing</TD><TD>On</TD><TD>Specifies whether or not printer
|
||||
and class browsing is enabled; can be "On" or "Off".</TD></TR>
|
||||
<TR><TD>DefaultCharset</TD><TD>iso-8859-1</TD><TD>Specifies the default
|
||||
character set.</TD></TR>
|
||||
<TR><TD>DefaultLanguage</TD><TD>current locale</TD><TD>Specifies the
|
||||
default language.</TD></TR>
|
||||
<TR><TD>Deny</TD><TD>-</TD><TD>Refuses connections from the specified
|
||||
host, network, or domain.</TD></TR>
|
||||
<TR><TD>DocumentRoot</TD><TD>/usr/share/cups/doc</TD><TD>Specifies the
|
||||
document data root directory.</TD></TR>
|
||||
<TR><TD>ErrorLog</TD><TD>logs/error_log</TD><TD>Specifies the error log
|
||||
file location.</TD></TR>
|
||||
<TR><TD>Group</TD><TD>root, sys, system</TD><TD>Specifies the group
|
||||
name or ID that is used when running external programs.</TD></TR>
|
||||
<TR><TD>HostNameLookups</TD><TD>Off</TD><TD>Specifies whether or not to
|
||||
perform reverse IP address lookups to get the actual hostname; may be
|
||||
"On" or "Off". Hostname lookups can significantly degrade the
|
||||
performance of the CUPS server if one or more DNS servers is not
|
||||
functioning properly.</TD></TR>
|
||||
<TR><TD>ImplicitClasses</TD><TD>On</TD><TD>Specifies whether or not to
|
||||
automatically create printer classes when more than one printer or
|
||||
class of the same name is detected on the network; may be "On" or
|
||||
"Off".</TD></TR>
|
||||
<TR><TD>KeepAlive</TD><TD>On</TD><TD>Specifies whether or not to use
|
||||
the HTTP Keep-Alive feature; may be "On" or "Off".</TD></TR>
|
||||
<TR><TD>KeepAliveTimeout</TD><TD>30</TD><TD>Specifies the amount of
|
||||
time to keep the HTTP connection alive before closing it.</TD></TR>
|
||||
<TABLE BORDER=1 WIDTH=90%>
|
||||
<TR><TH WIDTH=25%>Directive</TH><TH>Description</TH></TR>
|
||||
<TR><TD>AccessLog</TD><TD>Specifies the location of the access log file
|
||||
(default "logs/access_log").</TD></TR>
|
||||
<TR><TD>Allow</TD><TD></TR>
|
||||
<TR><TD>AuthClass</TD><TD></TR>
|
||||
<TR><TD>AuthType</TD><TD></TR>
|
||||
<TR><TD>BrowseAddress</TD><TD></TR>
|
||||
<TR><TD>BrowseInterval</TD><TD></TR>
|
||||
<TR><TD>BrowsePort</TD><TD></TR>
|
||||
<TR><TD>BrowseTimeout</TD><TD></TR>
|
||||
<TR><TD>Browsing</TD><TD></TR>
|
||||
<TR><TD>DefaultCharset</TD><TD></TR>
|
||||
<TR><TD>DefaultLanguage</TD><TD></TR>
|
||||
<TR><TD>Deny</TD><TD></TR>
|
||||
<TR><TD>DocumentRoot</TD><TD></TR>
|
||||
<TR><TD>ErrorLog</TD><TD></TR>
|
||||
<TR><TD>Group</TD><TD></TR>
|
||||
<TR><TD>HostNameLookups</TD><TD></TR>
|
||||
<TR><TD>ImplicitClasses</TD><TD></TR>
|
||||
<TR><TD>KeepAlive</TD><TD></TR>
|
||||
<TR><TD>KeepAliveTimeout</TD><TD></TR>
|
||||
<TR><TD><Location path>
|
||||
<BR> </Location></TD><TD>-</TD><TD>Specifies a location to restrict
|
||||
access to.</TD></TR>
|
||||
<TR><TD>LogLevel</TD><TD>info</TD><TD>Controls the amount of
|
||||
information that is logged in the error log file. Can be one of
|
||||
"debug", "info", "warn", "error", or "none", in decreasing order or
|
||||
verbosity.</TD></TR>
|
||||
<TR><TD>MaxClients</TD><TD>100</TD><TD>Specifies the maximum number of
|
||||
simultaneous active clients. This value is internally limited to 1/3
|
||||
of the total number of availabel file descriptors.</TD></TR>
|
||||
<TR><TD>MaxLogSize</TD><TD>0</TD><TD>Specifies the maximum size of the
|
||||
access, error, and page log files in bytes. If set to 0 then no
|
||||
maximum size is set. Log files are rotated automatically when this
|
||||
size is exceeded.</TD></TR>
|
||||
<TR><TD>MaxRequestSize</TD><TD>0</TD><TD>Specifies the maximum size of
|
||||
HTTP requests in bytes. If set to 0 then there is no maximum.</TD></TR>
|
||||
<TR><TD>Order</TD><TD>Allow,Deny</TD><TD>Specifies the order of Allow
|
||||
and Deny directive processing; can be "Deny,Allow" to implicitly deny
|
||||
hosts unless they are allowed by an Allow line, or "Allow,Deny" to
|
||||
implicitly allow hosts unless they are denied by a Deny line.</TD></TR>
|
||||
<TR><TD>PageLog</TD><TD>logs/page_log</TD><TD>Specifies the location of
|
||||
the page log file.</TD></TR>
|
||||
<TR><TD>Port</TD><TD>631</TD><TD>Specifies a port number to listen to
|
||||
for HTTP connections.</TD></TR>
|
||||
<TR><TD>RIPCache</TD><TD>8m</TD><TD>Specifies the size of the memory
|
||||
cache in bytes that is used by RIP filters.</TD></TR>
|
||||
<TR><TD>ServerAdmin</TD><TD>root@ServerName</TD><TD>Specifies the
|
||||
person to contact with problems.</TD></TR>
|
||||
<TR><TD>ServerName</TD><TD>hostname</TD><TD>Specifies the hostname that
|
||||
is supplied to HTTP clients. This is also used to determine the
|
||||
default CUPS server for the CUPS IPP client applications.</TD></TR>
|
||||
<TR><TD>ServerRoot</TD><TD>/var/cups</TD><TD>Specifies the root
|
||||
directory for server data files.</TD></TR>
|
||||
<TR><TD>SystemGroup</TD><TD>root, sys, system</TD><TD>Specifies the
|
||||
group name used for System class authentication.</TD></TR>
|
||||
<TR><TD>TempDir</TD><TD>/var/tmp</TD><TD>Specifies the temporary
|
||||
directory to use.</TD></TR>
|
||||
<TR><TD>Timeout</TD><TD>300</TD><TD>The timeout in seconds before
|
||||
client connections are closed in the middle of a request.</TD></TR>
|
||||
<TR><TD>User</TD><TD>lp</TD><TD>Specifies the user that is used when
|
||||
running external programs.</TD></TR>
|
||||
<BR> </Location></TD><TD></TR>
|
||||
<TR><TD>LogLevel</TD><TD></TR>
|
||||
<TR><TD>MaxLogSize</TD><TD></TR>
|
||||
<TR><TD>MaxRequestSize</TD><TD></TR>
|
||||
<TR><TD>Order</TD><TD></TR>
|
||||
<TR><TD>PageLog</TD><TD></TR>
|
||||
<TR><TD>Port</TD><TD></TR>
|
||||
<TR><TD>RIPCache</TD><TD></TR>
|
||||
<TR><TD>ServerAdmin</TD><TD></TR>
|
||||
<TR><TD>ServerName</TD><TD></TR>
|
||||
<TR><TD>ServerRoot</TD><TD></TR>
|
||||
<TR><TD>SystemGroup</TD><TD></TR>
|
||||
<TR><TD>Timeout</TD><TD></TR>
|
||||
<TR><TD>User</TD><TD></TR>
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
<H3><A NAME="3_5_3">3.5.3 printers.conf</A></H3>
|
||||
<H3><A NAME=3_5_3>3.5.3 printers.conf</A></H3>
|
||||
<P>The printers.conf file consists of 1 or more lines of ASCII text.
|
||||
Comment lines start with the pound ("#") character. </P>
|
||||
<P>Each non-blank line starts with the name of a configuration
|
||||
directive followed by its value. The following directives are
|
||||
understood:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="90%">
|
||||
<TR><TH WIDTH="25%">Directive</TH><TH>Description</TH></TR>
|
||||
<TR><TD>Accepting</TD><TD>Specifies whether the printer is accepting
|
||||
new jobs. May be the names "Yes" or "No".</TD></TR>
|
||||
<TABLE BORDER=1 WIDTH=90%>
|
||||
<TR><TH WIDTH=25%>Directive</TH><TH>Description</TH></TR>
|
||||
<TR><TD><DefaultPrinter name>
|
||||
<BR> </Printer></TD><TD>Surrounds the printer definition for a default
|
||||
destination.</TD></TR>
|
||||
<TR><TD>DeviceURI</TD><TD>Specifies the device-uri attribute for the
|
||||
printer.</TD></TR>
|
||||
<TR><TD>Info</TD><TD>A textual description of the printer.</TD></TR>
|
||||
<TR><TD>Location</TD><TD>A textual location of the printer.</TD></TR>
|
||||
<TR><TD>MoreInfo</TD><TD>A URL pointing to additional information on
|
||||
the printer.</TD></TR>
|
||||
<BR> </Printer></TD><TD></TR>
|
||||
<TR><TD>DeviceURI</TD><TD></TR>
|
||||
<TR><TD>Info</TD><TD></TR>
|
||||
<TR><TD>Location</TD><TD></TR>
|
||||
<TR><TD>MoreInfo</TD><TD></TR>
|
||||
<TR><TD><Printer name>
|
||||
<BR> </Printer></TD><TD>Surrounds the printer definition.</TD></TR>
|
||||
<TR><TD>State</TD><TD>Specifies the initial state of the printer; can
|
||||
be "Idle" or "Stopped".</TD></TR>
|
||||
<BR> </Printer></TD><TD></TR>
|
||||
<TR><TD>State</TD><TD></TR>
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
<H1><A NAME="4">4 External Interfaces</A></H1>
|
||||
<H2><A NAME="4_1">4.1 AppSocket Protocol</A></H2>
|
||||
<H1><A NAME=4>4 External Interfaces</A></H1>
|
||||
<H2><A NAME=4_1>4.1 AppSocket Protocol</A></H2>
|
||||
<P>The AppSocket protocol is an 8-bit clean TCP/IP socket connection.
|
||||
The default IP service port is 9100. The URI method name is "socket". </P>
|
||||
<H2><A NAME="4_2">4.2 CUPS Browsing Protocol</A></H2>
|
||||
The default IP service port is 9100. </P>
|
||||
<H2><A NAME=4_2>4.2 CUPS Browsing Protocol</A></H2>
|
||||
<P>The CUPS Browsing Protocol is a UDP/IP-based broadcast service. By
|
||||
default this service operates on IP service port 631. </P>
|
||||
<P>Each broadcast packet describes the state of a single printer or
|
||||
@@ -545,13 +380,12 @@ printer-state</CODE> and <CODE>printer-uri-supported</CODE> attributes. </P>
|
||||
<P>The <I>type</I> value is a hexadecimal number string representing
|
||||
capability/type bits:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="40%">
|
||||
<TR><TH WIDTH="8%">Bit</TH><TH>Description</TH></TR>
|
||||
<TABLE BORDER=1 WIDTH=40%>
|
||||
<TR><TH WIDTH=8%>Bit</TH><TH>Description</TH></TR>
|
||||
<TR><TD>0</TD><TD>0 = printer
|
||||
<BR> 1 = class</TD></TR>
|
||||
<TR><TD>1</TD><TD>0 = local
|
||||
<BR> 1 = remote
|
||||
<BR> (always 1)</TD></TR>
|
||||
<BR> 1 = remote</TD></TR>
|
||||
<TR><TD>2</TD><TD>1 = can print B</TD></TR>
|
||||
<TR><TD>3</TD><TD>1 = can print color</TD></TR>
|
||||
<TR><TD>4</TD><TD>1 = can duplex</TD></TR>
|
||||
@@ -569,13 +403,13 @@ capability/type bits:
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
<H2><A NAME="4_3">4.3 CUPS PostScript File</A></H2>
|
||||
<H2><A NAME=4_3>4.3 CUPS PostScript File</A></H2>
|
||||
<P>CUPS PostScript files are device-dependent Adobe PostScript program
|
||||
files. The PostScript language is described in the <A HREF="http://partners.adobe.com/supportservice/devrelations/PDFS/TN/PLRM.pdf">
|
||||
Adobe PostScript Language Reference Manual, Third Edition</A>. </P>
|
||||
files. The PostScript language is described in the <A HREF=http://partners.adobe.com/supportservice/devrelations/PDFS/TN/PLRM.pdf>
|
||||
Adobe PostScript Language Reference Manual, Third Edition</A>. </P>
|
||||
<P>The MIME type for CUPS PostScript files is <CODE>
|
||||
application/vnd.cups-postscript</CODE>. </P>
|
||||
<H2><A NAME="4_4">4.4 CUPS Raster File</A></H2>
|
||||
<H2><A NAME=4_4>4.4 CUPS Raster File</A></H2>
|
||||
<P>CUPS raster files are device-dependent raster image files that
|
||||
contain a PostScript page device dictionary and device-dependent raster
|
||||
imagery for each page in the document. These files are used to
|
||||
@@ -593,8 +427,8 @@ automatically. </P>
|
||||
Each page starts with a page device dictionary header and is followed
|
||||
immediately by the raster data for that page.
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="80%">
|
||||
<TR><TH WIDTH="10%">Bytes</TH><TH WIDTH="20%">Description</TH><TH>Values</TH>
|
||||
<TABLE BORDER=1 WIDTH=80%>
|
||||
<TR><TH WIDTH=10%>Bytes</TH><TH WIDTH=20%>Description</TH><TH>Values</TH>
|
||||
</TR>
|
||||
<TR><TD>0-63</TD><TD>MediaClass</TD><TD>Nul-terminated ASCII string</TD></TR>
|
||||
<TR><TD>64-127</TD><TD>MediaColor</TD><TD>Nul-terminated ASCII string</TD>
|
||||
@@ -701,40 +535,42 @@ CMYK CMYK)
|
||||
</P>
|
||||
<P>The MIME type for CUPS Raster files is <CODE>
|
||||
application/vnd.cups-raster</CODE>. </P>
|
||||
<H2><A NAME="4_5">4.5 CUPS Raw Files</A></H2>
|
||||
<H2><A NAME=4_5>4.5 CUPS Raw Files</A></H2>
|
||||
<P>Raw files are printer-dependent print files that are in a format
|
||||
suitable to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The
|
||||
MIME type for CUPS Raw files is <CODE>application/vnd.cups-raw</CODE>. </P>
|
||||
<H2><A NAME="4_6">4.6 Internet Printing Protocol</A></H2>
|
||||
<H2><A NAME=4_6>4.6 File Transfer Protocol</A></H2>
|
||||
<P>The File Transfer Protocol (FTP) is described by <A HREF=http://www.ietf.org/rfc/rfc959.txt>
|
||||
RFC 959: File Transfer Protocol</A>. </P>
|
||||
<H2><A NAME=4_7>4.7 Internet Printing Protocol</A></H2>
|
||||
<P>The Internet Printing Protocol is described by the following RFCs: </P>
|
||||
<UL>
|
||||
<LI><A HREF="http://www.ietf.org/rfc/rfc2565.txt"> RFC 2565: Internet
|
||||
<LI><A HREF=http://www.ietf.org/rfc/rfc2565.txt>RFC 2565: Internet
|
||||
Printing Protocol/1.0: Encoding and Transport</A></LI>
|
||||
<LI><A HREF="http://www.ietf.org/rfc/rfc2566.txt"> RFC 2566: Internet
|
||||
<LI><A HREF=http://www.ietf.org/rfc/rfc2566.txt>RFC 2566: Internet
|
||||
Printing Protocol/1.0: Model and Semantics</A></LI>
|
||||
<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt"> RFC 2567: Design
|
||||
Goals for an Internet Printing Protocol</A></LI>
|
||||
<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt"> RFC 2568: Rationale
|
||||
for the Structure of the Model and Protocol for the Internet Printing
|
||||
<LI><A HREF=http://www.ietf.org/rfc/rfc2567.txt>RFC 2567: Design Goals
|
||||
for an Internet Printing Protocol</A></LI>
|
||||
<LI><A HREF=http://www.ietf.org/rfc/rfc2568.txt>RFC 2568: Rationale for
|
||||
the Structure of the Model and Protocol for the Internet Printing
|
||||
Protocol</A></LI>
|
||||
<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt"> RFC 2569: Mapping
|
||||
<LI><A HREF=http://www.ietf.org/rfc/rfc2569.txt>RFC 2569: Mapping
|
||||
between LPD and IPP Protocols</A></LI>
|
||||
</UL>
|
||||
<P>The URI method name for IPP is "ipp". </P>
|
||||
<P>CUPS defines the following extension operations to IPP. </P>
|
||||
<H3><A NAME="4_6_1">4.6.1 Get Default Destination (CUPS_GET_DEFAULT =
|
||||
<H3><A NAME=4_7_1>4.7.1 Get Default Destination (CUPS_GET_DEFAULT =
|
||||
0x4001)</A></H3>
|
||||
<P>The get default destination operation returns the printer attributes
|
||||
for the system default printer or class. The only required attributes
|
||||
are <CODE>attributes-charset</CODE> and <CODE>
|
||||
attributes-natural-language</CODE>. </P>
|
||||
<P>Get default destination will only return <CODE>ipp-ok</CODE>. </P>
|
||||
<H3><A NAME="4_6_2">4.6.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></H3>
|
||||
<H3><A NAME=4_7_2>4.7.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></H3>
|
||||
<P>The get printers operation returns the printer attributes for all
|
||||
printers known to the system. The only required attributes are <CODE>
|
||||
attributes-charset</CODE> and <CODE>attributes-natural-language</CODE>. </P>
|
||||
<P>Get printers will only return <CODE>ipp-ok</CODE>. </P>
|
||||
<H3><A NAME="4_6_3">4.6.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></H3>
|
||||
<H3><A NAME=4_7_3>4.7.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></H3>
|
||||
<P>The add printer operation adds or replaces the specified printer.
|
||||
The <CODE>attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>
|
||||
and <CODE>printer-uri</CODE> attributes are required. </P>
|
||||
@@ -743,23 +579,23 @@ printer-more-info</CODE>, and <CODE>device-uri</CODE> attributes are
|
||||
required when initially adding a printer and optional when modifying a
|
||||
printer. </P>
|
||||
<P>A PPD file or System V interface script may follow the IPP request
|
||||
body. If a valid interface script or PPD file is not provided then the
|
||||
printer is treated as a generic PostScript device. </P>
|
||||
body. Note that the printer will be disabled until a valid interface
|
||||
script or PPD file is sent. </P>
|
||||
<P>Add printer will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-authorized</CODE>
|
||||
, <CODE>ipp-bad-request</CODE>, or <CODE>ipp-attributes</CODE>. </P>
|
||||
<H3><A NAME="4_6_4">4.6.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
|
||||
<H3><A NAME=4_7_4>4.7.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
|
||||
</H3>
|
||||
<P>The delete printer operation removes the specified printer. The only
|
||||
required attributes are <CODE>attributes-charset</CODE>, <CODE>
|
||||
attributes-natural-language</CODE>, and <CODE>printer-uri</CODE>. </P>
|
||||
<P>Delete printer will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
|
||||
, or <CODE>ipp-not-authorized</CODE>. </P>
|
||||
<H3><A NAME="4_6_5">4.6.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></H3>
|
||||
<H3><A NAME=4_7_5>4.7.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></H3>
|
||||
<P>The get classes operation returns the printer attributes for all
|
||||
classes known to the system. The only required attributes are <CODE>
|
||||
attributes-charset</CODE> and <CODE>attributes-natural-language</CODE>. </P>
|
||||
<P>Get classes will only return <CODE>ipp-ok</CODE>. </P>
|
||||
<H3><A NAME="4_6_6">4.6.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></H3>
|
||||
<H3><A NAME=4_7_6>4.7.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></H3>
|
||||
<P>The add class operation adds or replaces the specified class. The <CODE>
|
||||
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
|
||||
and <CODE>printer-uri</CODE> attributes are required. </P>
|
||||
@@ -769,27 +605,27 @@ required when initially adding a printer and optional when modifying a
|
||||
printer. </P>
|
||||
<P>Add class will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-authorized</CODE>
|
||||
, <CODE>ipp-bad-request</CODE>, or <CODE>ipp-attributes</CODE>. </P>
|
||||
<H3><A NAME="4_6_7">4.6.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></H3>
|
||||
<H3><A NAME=4_7_7>4.7.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></H3>
|
||||
<P>The delete class operation removes the specified class. The only
|
||||
required attributes are <CODE>attributes-charset</CODE>, <CODE>
|
||||
attributes-natural-language</CODE>, and <CODE>printer-uri</CODE>. </P>
|
||||
<P>Delete class will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
|
||||
, or <CODE>ipp-not-authorized</CODE>. </P>
|
||||
<H3><A NAME="4_6_8">4.6.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></H3>
|
||||
<H3><A NAME=4_7_8>4.7.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></H3>
|
||||
<P>The accept jobs operation allows jobs to be accepted by the
|
||||
specified destination. The only required attributes are <CODE>
|
||||
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
|
||||
and <CODE>printer-uri</CODE>. </P>
|
||||
<P>Accept jobs will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
|
||||
, or <CODE>ipp-not-authorized</CODE>. </P>
|
||||
<H3><A NAME="4_6_9">4.6.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></H3>
|
||||
<H3><A NAME=4_7_9>4.7.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></H3>
|
||||
<P>The reject jobs operation prevents jobs from being accepted by the
|
||||
specified destination. The only required attributes are <CODE>
|
||||
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
|
||||
and <CODE>printer-uri</CODE>. </P>
|
||||
<P>Reject jobs will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
|
||||
, or <CODE>ipp-not-authorized</CODE>. </P>
|
||||
<H3><A NAME="4_6_10">4.6.10 Set Default Destination (CUPS_SET_DEFAULT =
|
||||
<H3><A NAME=4_7_10>4.7.10 Set Default Destination (CUPS_SET_DEFAULT =
|
||||
0x400A)</A></H3>
|
||||
<P>The set default destination operation returns the printer attributes
|
||||
for the system default printer or class. The only required attributes
|
||||
@@ -798,27 +634,28 @@ are <CODE>attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>
|
||||
<P>Set default destination will return <CODE>ipp-ok</CODE>, <CODE>
|
||||
ipp-not-authorized</CODE>, <CODE>ipp-bad-request</CODE>, or <CODE>
|
||||
ipp-not-found</CODE>. </P>
|
||||
<H2><A NAME="4_7">4.7 Line Printer Daemon Protocol</A></H2>
|
||||
<P>The Line Printer Daemon (LPD) protocol is described by <A HREF="http://www.ietf.org/rfc/rfc1179.txt">
|
||||
<H2><A NAME=4_8>4.8 Line Printer Daemon Protocol</A></H2>
|
||||
<P>The Line Printer Daemon (LPD) protocol is described by <A HREF=http://www.ietf.org/rfc/rfc1179.txt>
|
||||
RFC 1179: Line Printer Daemon Protocol</A>. </P>
|
||||
<P>The URI method name for LPD is "lpd". </P>
|
||||
<H2><A NAME="4_8">4.8 Server Message Block Protocol</A></H2>
|
||||
<H2><A NAME=4_9>4.9 Server Message Block Protocol</A></H2>
|
||||
<P>The Server Message Block (SMB) and related Common Internet File
|
||||
System (CIFS) protocols are described at <A HREF="http://anu.samba.org/cifs">
|
||||
System (CIFS) protocols are described at <A HREF=http://anu.samba.org/cifs>
|
||||
http://anu.samba.org/cifs</A>. </P>
|
||||
<P>The URI method name for SMB is "smb". </P>
|
||||
<H1><A NAME="5">5 5 - Directories</A></H1>
|
||||
<H2><A NAME=4_10>4.10 Trivial File Transfer Protocol</A></H2>
|
||||
<P>The Trivial File Transfer Protocol (TFTP) is described by <A HREF=http://www.ietf.org/rfc/rfc1350.txt>
|
||||
RFC 1350: The TFTP Protocol (Revision 2)</A>. </P>
|
||||
<H1><A NAME=5>5 5 - Directories</A></H1>
|
||||
<DL>
|
||||
<DT>/usr/bin </DT>
|
||||
<DD>The <CODE>cancel</CODE>, <CODE>lp</CODE>, <CODE>lpq</CODE>, <CODE>
|
||||
lpr</CODE>, <CODE>lprm</CODE>, and <CODE>lpstat</CODE> commands reside
|
||||
here. </DD>
|
||||
<DT>/usr/lib </DT>
|
||||
<DD>The <CODE>accept</CODE>, <CODE>disable</CODE>, <CODE>enable</CODE>, <CODE>
|
||||
lpadmin</CODE>, and <CODE>reject</CODE> commands reside here. </DD>
|
||||
<DT>/usr/sbin </DT>
|
||||
<DD>The <CODE>accept</CODE>, <CODE>cupsd</CODE>, <CODE>lpadmin</CODE>, <CODE>
|
||||
lpc</CODE>, and <CODE>reject</CODE> commands reside here. </DD>
|
||||
<DD>The <CODE>lpc</CODE> and <CODE>cupsd</CODE> commands resize here. </DD>
|
||||
<DT>/usr/share/cups </DT>
|
||||
<DD>This is the root directory of the CUPS static data. </DD>
|
||||
<DT>/usr/share/cups/data </DT>
|
||||
<DD>The character set and filter data files reside here. </DD>
|
||||
<DT>/usr/share/cups/fonts </DT>
|
||||
<DD>The <CODE>pstoraster</CODE> font files reside here. </DD>
|
||||
@@ -848,8 +685,8 @@ page_log</CODE> files reside here. </DD>
|
||||
<DT>/var/cups/requests </DT>
|
||||
<DD>This directory contains pending print job files. </DD>
|
||||
</DL>
|
||||
<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
|
||||
<H2><A NAME="6_1">A.1 Terms</A></H2>
|
||||
<H1 TYPE=A VALUE=1><A NAME=6>A Glossary</A></H1>
|
||||
<H2><A NAME=6_1>A.1 Terms</A></H2>
|
||||
<DL>
|
||||
<DT>C </DT>
|
||||
<DD>A computer language. </DD>
|
||||
@@ -862,7 +699,7 @@ page_log</CODE> files reside here. </DD>
|
||||
<DT>socket </DT>
|
||||
<DD>A two-way network communications channel. </DD>
|
||||
</DL>
|
||||
<H2><A NAME="6_2">A.2 Acronyms</A></H2>
|
||||
<H2><A NAME=6_2>A.2 Acronyms</A></H2>
|
||||
<DL>
|
||||
<DT>ASCII </DT>
|
||||
<DD>American Standard Code for Information Interchange </DD>
|
||||
|
||||
+1264
-1224
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+76
-159
@@ -3,7 +3,7 @@
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-IDD-1.0">
|
||||
<META NAME="Author" CONTENT="Easy Software Products">
|
||||
<TITLE>CUPS Interface Design Description</TITLE>
|
||||
<TITLE>DRAFT - CUPS Interface Design Description</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
@@ -74,10 +74,10 @@ sections:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft)
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1
|
||||
<LI>IPP/1.0: Encoding and Transport
|
||||
<LI>IPP/1.0: Implementers Guide
|
||||
<LI>IPP/1.0: Model and Semantics
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide
|
||||
</UL>
|
||||
|
||||
<H1>Internal Interfaces</H1>
|
||||
@@ -156,9 +156,6 @@ operator := "+" | [ logical AND ]
|
||||
"!" [ unary NOT ]
|
||||
</PRE></UL>
|
||||
|
||||
<P>The <CODE>int</CODE> and <CODE>short</CODE> rules match look for integers
|
||||
in network byte order (a.k.a. big-endian) with the most-significant byte first.
|
||||
|
||||
<H3>mime.convs</H3>
|
||||
|
||||
<P>The mime.types file defines the recognized file filters and consists
|
||||
@@ -191,8 +188,7 @@ source/type cost program
|
||||
</PRE></UL>
|
||||
|
||||
<P>The destination type is assumed to the printer's type. If a printer
|
||||
supports the source type directly the special filter program "-" may be
|
||||
specified.
|
||||
supports the source type directly the special filter program "-" may be used.
|
||||
|
||||
<H4>cupsManualCopies</H4>
|
||||
|
||||
@@ -210,18 +206,18 @@ printer.
|
||||
<P>This string attribute specifies a color profile of the form:
|
||||
|
||||
<UL><PRE>
|
||||
resolution/type density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22
|
||||
resolution/type density m00 m01 m02 m10 m11 m12 m20 m21 m22
|
||||
</PRE></UL>
|
||||
|
||||
<P>The <I>resolution</I> and <I>type</I> values may be "-" to act as a
|
||||
wildcard. Otherwise they must match one of the <CODE>Resolution</CODE> or
|
||||
<CODE>MediaType</CODE> attributes defined in the PPD file.
|
||||
|
||||
<P>The <I>density</I> and <I>gamma</I> values define gamma and density
|
||||
adjustment function such that:
|
||||
<P>The <I>density</I> value defines a gamma and density adjustment function
|
||||
such that:
|
||||
|
||||
<UL><PRE>
|
||||
f(x) = density * x<SUP>gamma</SUP>
|
||||
f(x) = d * x<SUP>1/d</SUP>
|
||||
</PRE></UL>
|
||||
|
||||
<P>The <I>m00</I> through <I>m22</I> values define a 3x3 transformation
|
||||
@@ -269,33 +265,28 @@ followed by its value. The following directives are understood:
|
||||
<TR>
|
||||
<TD><Class name><BR>
|
||||
</Class></TD>
|
||||
<TD>Surrounds a class definition.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><DefaultClass name><BR>
|
||||
</Class></TD>
|
||||
<TD>Surrounds a class definition for the default destination.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Accepting</TD>
|
||||
<TD>Specifies whether the class is accepting new jobs. May be
|
||||
the names "Yes" or "No".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Info</TD>
|
||||
<TD>A textual description of the class.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Location</TD>
|
||||
<TD>A textual location of the class.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>MoreInfo</TD>
|
||||
<TD>A URL pointing to additional information on the class.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Printer</TD>
|
||||
<TD>Specifies a printer that is a member of the class.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
|
||||
@@ -310,213 +301,141 @@ followed by its value. The following directives are understood:
|
||||
<CENTER><TABLE WIDTH="90%" BORDER="1">
|
||||
<TR>
|
||||
<TH WIDTH="25%">Directive</TH>
|
||||
<TH>Default</TH>
|
||||
<TH>Description</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>AccessLog</TD>
|
||||
<TD>logs/access_log</TD>
|
||||
<TD>Specifies the location of the access log file.</TD>
|
||||
<TD>Specifies the location of the access log file (default
|
||||
"logs/access_log").</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Allow</TD>
|
||||
<TD>-</TD>
|
||||
<TD>Allows connections from the specified host, network, or
|
||||
domain.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>AuthClass</TD>
|
||||
<TD>-</TD>
|
||||
<TD>Specifies what level of authentication is required; may be either
|
||||
"User", "System", or "Group".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>AuthType</TD>
|
||||
<TD>None</TD>
|
||||
<TD>Specifies the type of authentication to perform; may be either
|
||||
"None" or "Basic".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>BrowseAddress</TD>
|
||||
<TD>255.255.255.255</TD>
|
||||
<TD>Specifies a broadcast address to send CUPS browsing packets to.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>BrowseInterval</TD>
|
||||
<TD>30</TD>
|
||||
<TD>Specifies the number of seconds between browsing updates.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>BrowsePort</TD>
|
||||
<TD>631</TD>
|
||||
<TD>Specifies the UDP port number to use for browse packets.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>BrowseTimeout</TD>
|
||||
<TD>300</TD>
|
||||
<TD>Specifies the number of seconds to wait until remote destinations
|
||||
are removed from the local destination list.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Browsing</TD>
|
||||
<TD>On</TD>
|
||||
<TD>Specifies whether or not printer and class browsing is enabled; can
|
||||
be "On" or "Off".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>DefaultCharset</TD>
|
||||
<TD>iso-8859-1</TD>
|
||||
<TD>Specifies the default character set.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>DefaultLanguage</TD>
|
||||
<TD>current locale</TD>
|
||||
<TD>Specifies the default language.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Deny</TD>
|
||||
<TD>-</TD>
|
||||
<TD>Refuses connections from the specified host, network, or
|
||||
domain.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>DocumentRoot</TD>
|
||||
<TD>/usr/share/cups/doc</TD>
|
||||
<TD>Specifies the document data root directory.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>ErrorLog</TD>
|
||||
<TD>logs/error_log</TD>
|
||||
<TD>Specifies the error log file location.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Group</TD>
|
||||
<TD>root, sys, system</TD>
|
||||
<TD>Specifies the group name or ID that is used when running
|
||||
external programs.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>HostNameLookups</TD>
|
||||
<TD>Off</TD>
|
||||
<TD>Specifies whether or not to perform reverse IP address lookups to
|
||||
get the actual hostname; may be "On" or "Off". Hostname lookups can
|
||||
significantly degrade the performance of the CUPS server if one or
|
||||
more DNS servers is not functioning properly.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>ImplicitClasses</TD>
|
||||
<TD>On</TD>
|
||||
<TD>Specifies whether or not to automatically create printer classes
|
||||
when more than one printer or class of the same name is detected on
|
||||
the network; may be "On" or "Off".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>KeepAlive</TD>
|
||||
<TD>On</TD>
|
||||
<TD>Specifies whether or not to use the HTTP Keep-Alive feature; may
|
||||
be "On" or "Off".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>KeepAliveTimeout</TD>
|
||||
<TD>30</TD>
|
||||
<TD>Specifies the amount of time to keep the HTTP connection alive
|
||||
before closing it.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><Location path><BR>
|
||||
</Location></TD>
|
||||
<TD>-</TD>
|
||||
<TD>Specifies a location to restrict access to.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>LogLevel</TD>
|
||||
<TD>info</TD>
|
||||
<TD>Controls the amount of information that is logged in the
|
||||
error log file. Can be one of "debug", "info", "warn", "error",
|
||||
or "none", in decreasing order or verbosity.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>MaxClients</TD>
|
||||
<TD>100</TD>
|
||||
<TD>Specifies the maximum number of simultaneous active clients.
|
||||
This value is internally limited to 1/3 of the total number of
|
||||
availabel file descriptors.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>MaxLogSize</TD>
|
||||
<TD>0</TD>
|
||||
<TD>Specifies the maximum size of the access, error, and page
|
||||
log files in bytes. If set to 0 then no maximum size is set.
|
||||
Log files are rotated automatically when this size is
|
||||
exceeded.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>MaxRequestSize</TD>
|
||||
<TD>0</TD>
|
||||
<TD>Specifies the maximum size of HTTP requests in bytes. If set to 0
|
||||
then there is no maximum.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Order</TD>
|
||||
<TD>Allow,Deny</TD>
|
||||
<TD>Specifies the order of Allow and Deny directive processing; can
|
||||
be "Deny,Allow" to implicitly deny hosts unless they are allowed by
|
||||
an Allow line, or "Allow,Deny" to implicitly allow hosts unless they
|
||||
are denied by a Deny line.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>PageLog</TD>
|
||||
<TD>logs/page_log</TD>
|
||||
<TD>Specifies the location of the page log file.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Port</TD>
|
||||
<TD>631</TD>
|
||||
<TD>Specifies a port number to listen to for HTTP connections.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>RIPCache</TD>
|
||||
<TD>8m</TD>
|
||||
<TD>Specifies the size of the memory cache in bytes that is used by
|
||||
RIP filters.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>ServerAdmin</TD>
|
||||
<TD>root@ServerName</TD>
|
||||
<TD>Specifies the person to contact with problems.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>ServerName</TD>
|
||||
<TD>hostname</TD>
|
||||
<TD>Specifies the hostname that is supplied to HTTP clients. This
|
||||
is also used to determine the default CUPS server for the CUPS IPP
|
||||
client applications.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>ServerRoot</TD>
|
||||
<TD>/var/cups</TD>
|
||||
<TD>Specifies the root directory for server data files.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>SystemGroup</TD>
|
||||
<TD>root, sys, system</TD>
|
||||
<TD>Specifies the group name used for System class authentication.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>TempDir</TD>
|
||||
<TD>/var/tmp</TD>
|
||||
<TD>Specifies the temporary directory to use.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Timeout</TD>
|
||||
<TD>300</TD>
|
||||
<TD>The timeout in seconds before client connections are closed
|
||||
in the middle of a request.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>User</TD>
|
||||
<TD>lp</TD>
|
||||
<TD>Specifies the user that is used when running external programs.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
|
||||
@@ -533,41 +452,35 @@ followed by its value. The following directives are understood:
|
||||
<TH WIDTH="25%">Directive</TH>
|
||||
<TH>Description</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Accepting</TD>
|
||||
<TD>Specifies whether the printer is accepting new jobs. May be
|
||||
the names "Yes" or "No".</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><DefaultPrinter name><BR>
|
||||
</Printer></TD>
|
||||
<TD>Surrounds the printer definition for a default destination.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>DeviceURI</TD>
|
||||
<TD>Specifies the device-uri attribute for the printer.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Info</TD>
|
||||
<TD>A textual description of the printer.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Location</TD>
|
||||
<TD>A textual location of the printer.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>MoreInfo</TD>
|
||||
<TD>A URL pointing to additional information on the printer.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><Printer name><BR>
|
||||
</Printer></TD>
|
||||
<TD>Surrounds the printer definition.</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>State</TD>
|
||||
<TD>Specifies the initial state of the printer; can be "Idle" or
|
||||
"Stopped".</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
|
||||
@@ -576,7 +489,7 @@ followed by its value. The following directives are understood:
|
||||
<H2>AppSocket Protocol</H2>
|
||||
|
||||
<P>The AppSocket protocol is an 8-bit clean TCP/IP socket connection.
|
||||
The default IP service port is 9100. The URI method name is "socket".
|
||||
The default IP service port is 9100.
|
||||
|
||||
<H2>CUPS Browsing Protocol</H2>
|
||||
|
||||
@@ -610,8 +523,7 @@ capability/type bits:
|
||||
<TR>
|
||||
<TD>1</TD>
|
||||
<TD>0 = local<BR>
|
||||
1 = remote<BR>
|
||||
(always 1)</TD>
|
||||
1 = remote</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>2</TD>
|
||||
@@ -951,6 +863,12 @@ raster data for that page.
|
||||
to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The MIME type for CUPS
|
||||
Raw files is <CODE>application/vnd.cups-raw</CODE>.
|
||||
|
||||
<H2>File Transfer Protocol</H2>
|
||||
|
||||
<P>The File Transfer Protocol (FTP) is described by
|
||||
<A HREF="http://www.ietf.org/rfc/rfc959.txt">RFC 959: File Transfer
|
||||
Protocol</A>.
|
||||
|
||||
<H2>Internet Printing Protocol</H2>
|
||||
|
||||
<P>The Internet Printing Protocol is described by the following RFCs:
|
||||
@@ -975,8 +893,6 @@ Raw files is <CODE>application/vnd.cups-raw</CODE>.
|
||||
|
||||
</UL>
|
||||
|
||||
<P>The URI method name for IPP is "ipp".
|
||||
|
||||
<P>CUPS defines the following extension operations to IPP.
|
||||
|
||||
<H3>Get Default Destination (CUPS_GET_DEFAULT = 0x4001)</H3>
|
||||
@@ -1010,8 +926,8 @@ are required when initially adding a printer and optional when modifying
|
||||
a printer.
|
||||
|
||||
<P>A PPD file or System V interface script may follow the IPP request
|
||||
body. If a valid interface script or PPD file is not provided then the
|
||||
printer is treated as a generic PostScript device.
|
||||
body. Note that the printer will be disabled until a valid interface script or
|
||||
PPD file is sent.
|
||||
|
||||
<P>Add printer will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-authorized</CODE>,
|
||||
<CODE>ipp-bad-request</CODE>, or <CODE>ipp-attributes</CODE>.
|
||||
@@ -1097,15 +1013,17 @@ are <CODE>attributes-charset</CODE>,
|
||||
<A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179: Line Printer Daemon
|
||||
Protocol</A>.
|
||||
|
||||
<P>The URI method name for LPD is "lpd".
|
||||
|
||||
<H2>Server Message Block Protocol</H2>
|
||||
|
||||
<P>The Server Message Block (SMB) and related Common Internet File
|
||||
System (CIFS) protocols are described at
|
||||
<A HREF="http://anu.samba.org/cifs">http://anu.samba.org/cifs</A>.
|
||||
|
||||
<P>The URI method name for SMB is "smb".
|
||||
<H2>Trivial File Transfer Protocol</H2>
|
||||
|
||||
<P>The Trivial File Transfer Protocol (TFTP) is described by
|
||||
<A HREF="http://www.ietf.org/rfc/rfc1350.txt">RFC 1350: The TFTP Protocol
|
||||
(Revision 2)</A>.
|
||||
|
||||
<H1>5 - Directories</H1>
|
||||
|
||||
@@ -1116,15 +1034,14 @@ System (CIFS) protocols are described at
|
||||
<CODE>lpr</CODE>, <CODE>lprm</CODE>, and <CODE>lpstat</CODE> commands
|
||||
reside here.
|
||||
|
||||
<DT>/usr/lib
|
||||
<DD>The <CODE>accept</CODE>, <CODE>disable</CODE>, <CODE>enable</CODE>,
|
||||
<CODE>lpadmin</CODE>, and <CODE>reject</CODE> commands reside here.
|
||||
|
||||
<DT>/usr/sbin
|
||||
<DD>The <CODE>accept</CODE>, <CODE>cupsd</CODE>,
|
||||
<CODE>lpadmin</CODE>, <CODE>lpc</CODE>, and <CODE>reject</CODE>
|
||||
commands reside here.
|
||||
<DD>The <CODE>lpc</CODE> and <CODE>cupsd</CODE> commands resize here.
|
||||
|
||||
<DT>/usr/share/cups
|
||||
<DD>This is the root directory of the CUPS static data.
|
||||
|
||||
<DT>/usr/share/cups/data
|
||||
<DD>The character set and filter data files reside here.
|
||||
|
||||
<DT>/usr/share/cups/fonts
|
||||
|
||||
Arquivo binário não exibido.
|
Antes Largura: | Altura: | Tamanho: 591 B |
+11
-16
@@ -11,7 +11,7 @@
|
||||
<TD><H1 ALIGN=right>An Overview of the<BR>
|
||||
Common UNIX Printing System</H1></DIV>
|
||||
|
||||
<P ALIGN=right>October 4, 1999<BR>
|
||||
<P ALIGN=right>May 11, 1999<BR>
|
||||
Michael Sweet, Easy Software Products<BR>
|
||||
Copyright 1998-1999, All Rights Reserved.</P>
|
||||
</TD>
|
||||
@@ -163,9 +163,7 @@ Apache server configuration file and defines all of the access control
|
||||
properties for the server.
|
||||
|
||||
<P>The printer and class definition files list the available printer
|
||||
queues and classes. Printer classes are collections of printers. Jobs
|
||||
sent to a class are forwarded to the first available printer in the
|
||||
class, round-robin fashion.
|
||||
queues and classes.
|
||||
|
||||
<P>The MIME type files list the supported MIME types (text/plain,
|
||||
application/postscript, etc.) and "magic" rules for automatically
|
||||
@@ -176,16 +174,13 @@ when a <I>Print-Job</I> request is received with a
|
||||
<I>document-format</I> of <I>application/octet-stream</I>.
|
||||
|
||||
<P>The MIME conversion rule files list the available filters. These
|
||||
files are augmented by <I>cupsFilter</I> entries in the printer PPD
|
||||
files. The filters are used when a job is dispatched so that an
|
||||
application can send a convenient file format to the printing system
|
||||
files are augmented by <I>AddFilter</I> entries in the printer
|
||||
definition files. The filters are used when a job is dispatched so that
|
||||
an application can send a convenient file format to the printing system
|
||||
which then converts the document into a printable format as needed.
|
||||
Each filter has a relative cost associated with it, and the filtering
|
||||
algorithm chooses the set of filters that will convert the file to the
|
||||
needed format with the lowest total "cost".
|
||||
|
||||
<P>The PPD files describe the capabilities of PostScript printers.
|
||||
There is one PPD file for each printer.
|
||||
<P>The PPD files describe the capabilities of PostScript printers. There is
|
||||
one PPD file for each printer.
|
||||
|
||||
<H3>CUPS Interface Library</H3>
|
||||
|
||||
@@ -204,8 +199,8 @@ and job options. All output is sent to the standard output.
|
||||
<H3>Backends</H3>
|
||||
|
||||
A backend program is a special filter that writes incoming data to a
|
||||
device or network connection. Backends for serial, parallel, LPD,
|
||||
IPP, SMB, and AppSocket (JetDirect) connections are provided in
|
||||
device or network connection. Backends for serial, parallel, LPD, TFTP,
|
||||
FTP, IPP, SMB, and AppSocket (JetDirect) connections are provided in
|
||||
CUPS 1.0.
|
||||
|
||||
<H2>Berkeley and System V Commands</H2>
|
||||
@@ -229,8 +224,8 @@ interfaces to ensure compatibility with existing applications.
|
||||
|
||||
<H2>Licensing</H2>
|
||||
|
||||
CUPS is available under the terms of the GNU General Public License
|
||||
which means that it is basically free except for binary-only
|
||||
CUPS is available under the terms of the Aladdin Free Public
|
||||
License, which means that it is basically free except for commercial
|
||||
distribution. Vendors wishing to license CUPS for their printing
|
||||
solution should contact Easy Software Products at:
|
||||
|
||||
|
||||
Arquivo binário não exibido.
+110
-386
@@ -1,207 +1,92 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>CUPS Software Administrators Manual</TITLE>
|
||||
<TITLE>DRAFT - CUPS Software Administrators Manual</TITLE>
|
||||
<META NAME="AUTHOR" CONTENT="Easy Software Products">
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.4">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<STYLE>
|
||||
BODY { font-family: serif; font-size: 11.0pt }
|
||||
H1 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H2 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H3 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H4 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H5 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H6 { font-family: sans-serif; font-size: 20.0pt }
|
||||
SUB { font-size: 8.0pt }
|
||||
SUP { font-size: 8.0pt }
|
||||
PRE { font-size: 9.0pt }
|
||||
</STYLE>
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.0">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER><A HREF="#CONTENTS"><H1>CUPS Software Administrators Manual</H1></A><BR>
|
||||
CUPS-SAM-1.0.4<BR>
|
||||
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
|
||||
<H1>DRAFT - CUPS Software Administrators Manual</H1></A><BR>
|
||||
CUPS-SAM-1.0.0<BR>
|
||||
Easy Software Products<BR>
|
||||
Copyright 1997-1999, All Rights Reserved<BR>
|
||||
</CENTER>
|
||||
<HR>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="#1">Preface</A></B>
|
||||
<BR><B><A HREF=#1>Preface</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#1_1">System Overview</A></LI>
|
||||
<LI><A HREF="#1_2">Document Overview</A></LI>
|
||||
<LI><A HREF=#1_1>System Overview</A></LI>
|
||||
<LI><A HREF=#1_2>Document Overview</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#2">1 - Printing System Overview</A></B>
|
||||
<B><A HREF=#2>1 - Printing System Overview</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#2_1">The Printing Problem</A></LI>
|
||||
<LI><A HREF="#2_2">The Technology</A></LI>
|
||||
<LI><A HREF="#2_3">Jobs</A></LI>
|
||||
<LI><A HREF="#2_4">Classes</A></LI>
|
||||
<LI><A HREF="#2_5">Filters</A></LI>
|
||||
<LI><A HREF="#2_6">Printer Drivers</A></LI>
|
||||
<LI><A HREF="#2_7">Networking</A></LI>
|
||||
<LI><A HREF=#2_1>The Printing Problem</A></LI>
|
||||
<LI><A HREF=#2_2>The Technology</A></LI>
|
||||
<LI><A HREF=#2_3>Filters</A></LI>
|
||||
<LI><A HREF=#2_4>Printer Drivers</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#3">2 - Building and Installing CUPS</A></B>
|
||||
<B><A HREF=#3>2 - Building and Installing CUPS</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1">Installing a Source Distribution</A></LI>
|
||||
<LI><A HREF=#3_1>Installing a Source Distribution</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1_1">Requirements</A></LI>
|
||||
<LI><A HREF="#3_1_2">Compiling CUPS</A></LI>
|
||||
<LI><A HREF="#3_1_3">Installing the Software</A></LI>
|
||||
<LI><A HREF="#3_1_4">Running the Software</A></LI>
|
||||
<LI><A HREF=#3_1_1>Requirements</A></LI>
|
||||
<LI><A HREF=#3_1_2>Compiling CUPS</A></LI>
|
||||
<LI><A HREF=#3_1_3>Installing the Software</A></LI>
|
||||
<LI><A HREF=#3_1_4>Running the Software</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#binary">Installing a Binary Distribution</A></LI>
|
||||
<LI><A HREF=#binary>Installing a Binary Distribution</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#4">3 - Printer Queue Management</A></B>
|
||||
<B><A HREF=#4>3 - Printer Queue Management</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#4_1">The lpadmin Command</A></LI>
|
||||
<LI><A HREF="#4_2">Adding and Modifying Printers</A></LI>
|
||||
<LI><A HREF=#4_1>The lpadmin Command</A></LI>
|
||||
<LI><A HREF=#4_2>Adding and Modifying Printers</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#4_2_1">Using Standard Printer Drivers</A></LI>
|
||||
<LI><A HREF=#4_2_1>Using Standard Printer Drivers</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#4_3">Removing Printers</A></LI>
|
||||
<LI><A HREF="#4_4">Printer Classes</A></LI>
|
||||
<LI><A HREF="#4_5">Setting the Default Printer</A></LI>
|
||||
<LI><A HREF="#4_6">Starting and Stopping Printers</A></LI>
|
||||
<LI><A HREF="#4_7">Accepting and Rejecting Print Jobs</A></LI>
|
||||
<LI><A HREF=#4_3>Removing Printers</A></LI>
|
||||
<LI><A HREF=#4_4>Printer Classes</A></LI>
|
||||
<LI><A HREF=#4_5>Setting the Default Printer</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#5">4 - Printing System Management</A></B>
|
||||
<B><A HREF=#5>4 - Printing System Management</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#5_1">Changing the Configuration Files</A></LI>
|
||||
<LI><A HREF="#5_2">Temporary Files</A></LI>
|
||||
<LI><A HREF="#5_3">Network Configuration</A></LI>
|
||||
<LI><A HREF=#5_1>Network Configuration</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#5_3_1">Port</A></LI>
|
||||
<LI><A HREF="#5_3_2">Listen</A></LI>
|
||||
<LI><A HREF="#5_3_3">BrowsePort</A></LI>
|
||||
<LI><A HREF="#5_3_4">BrowseAddress</A></LI>
|
||||
<LI><A HREF=#5_1_1>Port</A></LI>
|
||||
<LI><A HREF=#5_1_2>Listen</A></LI>
|
||||
<LI><A HREF=#5_1_3>BrowsePort</A></LI>
|
||||
<LI><A HREF=#5_1_4>BrowseAddress</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#5_4">Printer Security</A></LI>
|
||||
<LI><A HREF=#5_2>Printer Security</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#5_4_1">Location</A></LI>
|
||||
<LI><A HREF="#5_4_2">Order</A></LI>
|
||||
<LI><A HREF="#5_4_3">Allow</A></LI>
|
||||
<LI><A HREF="#5_4_4">Deny</A></LI>
|
||||
<LI><A HREF="#5_4_5">AuthType</A></LI>
|
||||
<LI><A HREF="#5_4_6">AuthClass</A></LI>
|
||||
<LI><A HREF="#5_4_7">AuthGroupName</A></LI>
|
||||
<LI><A HREF="#5_4_8">SystemGroup</A></LI>
|
||||
<LI><A HREF=#5_2_1>Location</A></LI>
|
||||
<LI><A HREF=#5_2_2>Order</A></LI>
|
||||
<LI><A HREF=#5_2_3>Allow</A></LI>
|
||||
<LI><A HREF=#5_2_4>Deny</A></LI>
|
||||
<LI><A HREF=#5_2_5>AuthType</A></LI>
|
||||
<LI><A HREF=#5_2_6>AuthClass</A></LI>
|
||||
<LI><A HREF=#5_2_7>AuthGroupName</A></LI>
|
||||
<LI><A HREF=#5_2_8>SystemGroup</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#5_5">File Formats</A></LI>
|
||||
<LI><A HREF=#5_3>File Formats</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#5_5_1">mime.types</A></LI>
|
||||
<LI><A HREF="#5_5_2">mime.convs</A></LI>
|
||||
<LI><A HREF=#5_3_1>mime.types</A></LI>
|
||||
<LI><A HREF=#5_3_2>mime.convs</A></LI>
|
||||
</UL>
|
||||
</UL>
|
||||
<B><A HREF="#6">5 - Printer Accounting</A></B>
|
||||
<B><A HREF=#6>5 - Printer Accounting</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#6_1">Where to Find the Log Files</A></LI>
|
||||
<LI><A HREF="#6_2">The access_log File</A></LI>
|
||||
<LI><A HREF="#6_3">The error_log File</A></LI>
|
||||
<LI><A HREF="#6_4">The page_log File</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#7">A - Using CUPS with SAMBA</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#7_1">What is SAMBA?</A></LI>
|
||||
<LI><A HREF="#7_2">How Do I Configure SAMBA for CUPS?</A></LI>
|
||||
<LI><A HREF="#7_3">How Do I Configure CUPS for SAMBA?</A></LI>
|
||||
<LI><A HREF=#6_1>Where to Find the Log Files</A></LI>
|
||||
<LI><A HREF=#6_2>The access_log File</A></LI>
|
||||
<LI><A HREF=#6_3>The error_log File</A></LI>
|
||||
<LI><A HREF=#6_4>The page_log File</A></LI>
|
||||
</UL>
|
||||
<HR>
|
||||
GIF89a¯ÿòÌÌÌ™™™fff333ÿÿÿÿÿÿÿÿÿ!ù,¯ÿBþXºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª2€0p,Ïtmßx®ï
|
||||
|
||||
<!--=�•pH,��Ö«Çl:ŸÐ¨”ù ¯Ø¬ÖXN¿à°xL~¬Û´zmxËð¸|N§Ùø¼(Pïûÿ€�bwz…jn‚‰Š‹Œ�9„†‘!-->
|
||||
;±Ýíˆndý !¸ ž³wà…MƒƒY~¿{,gÚ\‚äé
|
||||
Œ×Ø(tÙî!Ï=Ñ.ûz¯�áÑŸ:ì;Ã9qöíÉë]/¿ºÉ¤Et/†'Îþt9ÀØ–ž_ÙÇ\|W•wArö¸Ý�2Ô×
|
||||
tN°0Tï}�¡û‰$!‚yMxî)ˆš‰Ô�ø@nB°U½ÊwE„§!ŠF H L8B
|
||||
c‰;ždŠ-æDVWdг€h±äÚ“P¶%#(4Fiå•Ï\hŠ:�Re!\ÒÄ—X^¦%€¥À-$E€Ö/úHŽšlââöÌQX
|
||||
|
||||
<!--äÇ"iL :a7‚]›0IZ¡YØø¡‡D}¤–Uj±á
|
||||
^â䙿`Ú@¦5b|šà�«Á±§3Ñ KwÔ\ªB¨±H)+�=¡Ó©"
|
||||
©¢ 8uƒ†¸öŠD§•lþ:„d�RX�ilÌ:Ë!´;¹t+„e<
|
||||
‡;øô+‚bbhaÚ0Ê6é.D™ð޹̹ñÖkoê({ï¾ü{f¿-->
|
||||
¸1Nô¯b"œŠüjåÁÂE0…È8ö5GkZ|ÒÁwt„C»ÔQSÇo6ÔÙ�[�W„$²*Ž+4Pb-8¹P1þ'8"‘ФÄ$ Cyê‘„)>ãŠtè`Ð3‡‹¾z"«rE'Âqfä°Ë
|
||||
‘qÂ\|€„Ž¡ôö»%É(.—bڽȀ�íÉ`{¬EÇ1w’ »[Hß`(B6ö�“
|
||||
†')ÊRŽÎa[�ÃrbC!Tå°Œ
|
||||
2Q·ÈHZê#–®üË/àô¯FÝê(Û²% ºXË9öÀbÁ4f.ù-oý�™XËB…�IÎÒ7¹*@ÃÓŽÍT€hà‘ÌWâ�™Ã$f:µyžn†ó†r„'té�Kv`
|
||||
Ç+dª– œ79s�ò|'=×¢Ìx¶òœÿ„¦œˆeÎ;*à$þ” IÝÆaÏ{–3ŽÅ�Á
|
||||
P“ÍS[ÙL¨3©òQ7éÆò#ãûô0F×ðsE°t§@‘ØQÜ´´ ©:3ÓRíd �¥*MITnŒ£¨H]ØQÁd
|
||||
@òþ—¬rMœŽaO
|
||||
<!--x‹ŒÖ3½4 °XT'ª®ƒ:T£uéWeºádËeú¸è¬Ù7
|
||||
|
||||
ëÒÏ;„sœåµ7m(ýПtl¤RV�)-->
|
||||
rë^yÀ·(¸îéêû$uDòrã/a,I.°ÙUÀœb hˆ`�¾B ë"
|
||||
Ü`HØxȸo1þ[á\8f^æ|\ý‚¢¢zø0(ˆ\ {ƒÄgäÞõ€çâ§Á˜0*\³n¼‹m¶/Äeª±ÿ†ì
|
||||
Ç,½DN2€œº+ùÉ|í0L¡Le*ð¸Ã>­2ëf,eIPOËÅàr—±”80SAŸcFªatç»ãy¤¸ršçÌ¡5ïoõËsžï|¿8˙Φ¬þ,ï¼èà)ÁÌ;øk¡—†dDpÑòø2¢q�fHã!Ë“~ÙŸ-í
|
||||
'g:,æ4y?ýäP‹Z›ž#ÏÕ´Î5AK‰k]ûš›ÒKõ¯‡më€õzØÈƫ؎Ý>B{PЪ.6hf]º?©ÌIŽuO„í�M‚ÌÇÜcµ3˜
|
||||
61‹NÒ[†W£ ¦m¿­{ÂPâvζKnUˆ[ ònĽ±÷n?l:Áž3ušë�¬sP[ÿnn¾çP�…WõÔFj[Â÷
|
||||
¹vÏ™à‰˜xú�'ˆ£ÀÀ†p¸4.êãKÇ¿ÂÁ±o§¢ü"Á|Nk`îʘ
|
||||
<!--•¤7 yþ D-->
|
||||
�
|
||||
jl©ÌuˆËi™0pmC´«+‰÷6¤2­éÏe`(ŽJ]¥iõð3ƒØí"p|ª!:qøFس 6£
|
||||
@­,þŠqüã��oÌÇ®ž�ÖüV�“¶QÇ›Evî¹²É8ÙªS"æÀç‡x± àþ‡�>—Iãg
|
||||
ïÝ>Y‰çN80æ§ ±¾GLLìÕµ…(1Þ¼!8}þ¬“*…ª‰Ùì:e»´œ
|
||||
ª¿ên_6ÂÃSÀ`eG;Ö„CƒCcˆ¿‡4¸yeî¯Í)oøByRm½0?íLîÅ`QÿjÓÙ/ºôÓN|Ý
|
||||
<!--â9ço‘SŽà•?œýáu¿þá¯~!ÒŸ¿ÍÏüýÏ�Iw1ßþZÈN¥Ex£&\(¤á[ɤ€v2€WW-->
|
||||
|
||||
þÙAÜŒÁ¸D5©D a�ævx ?жx°DM@•!h‰àÈ€Ž§®
|
||||
• �á×B`ð¤ªE?›“”Þdƒ"8$Ý`Ki0…OðƒnΓ±µvtžè€I([,¹Ndɨh\'6X
|
||||
�Pã—Š‰Éøt ¢‘¥�˜¬è €ˆ†Ky™FˆŒë`š”yƒ„¨š €š‰ƒM©‡øFQhY„
|
||||
9¶X¯×–í4š¤™Y\)"¹AN]‰xéz÷Gq07�)�©ñ™•Y€r°ŒŽi‹ �z ™ÇäFÍÉT�–ù›
|
||||
ËŽC œwI›üX]‹¹\ëY]þf lïYbj8ŸÈuœbŸÍÅtú©fÞןfBI—“*øé:ÛØUj Ò
|
||||
ˆõ¹ Õp $(~ ¡Ú ¡gù{îp�ZI?¡ƒîÀv:“a¦˜6¢§Ô]Ý‘(ªê)!ŸÚ¢:
|
||||
jwµ¡4ÚvíHÛǘ9ºXhó•üù£¥Á¢VÉ{Dº2š‰(°¤3š¤a÷ +У¥“p¢þò4Vº—
|
||||
E´¥è¤k°7ºhT*€¿èw`ÚžiÄ …S¦Æ¦mê Nêƒ#ú¢f€ xê†ý
|
||||
8z©7�uÚp{Ú=~]7`«h‡ÚsÚg:…zd˜ó§ÎA-vþAñr¦'–AÚ)9–š¢âSi;£…š 1�ªo"ª
|
||||
¦J;“º rº8Ui|é>¡Úœú
|
||||
<!--pv³2<ƒj£·«É¦kÉ 1Š:¬Èe ”«ÉÚlÑ•ªÍZn¯Š2Ì‹s«ÁÖÚàé¨Ûº=¤zŽŸú6áUä
|
||||
Øš¨¿újá
|
||||
¦0®éJ«
|
||||
¯NÕ井öÐVeζ¯õbm¶7ù´Ž-->
|
||||
“ë¥Dfný2»ƒ–0j«�®»ºK;zë¢Íö»—!µ—S»³r>K+6ˆ‹¨XÒ»; CÈ
|
||||
8Ê;¢»ÃÛ/Œ‹¥ž!¬s½VR½óõÏ‹Oâ[/çK¨þ˜Ñ:Í‹\Ý+ Sc:ïËž’º¶ë9Æ»
|
||||
<!--ëSç�½¤tj ½YUÀœãÀ©%
|
||||
Ìró)Á0¨§—³½Ç…Á¬Ì¤LÛ6øK!<Á:Àê*ª…ÃÁî…Á.‡²
|
||||
¥¼‘z Âä ¦ýËÀ~¸7<,´GóÃý‹ÂöêÀe:Ä¢‰°ë«£m£,žyAI¡…˜Q!8-->
|
||||
ô 8ly$
|
||||
8©ÙÅmX2Ùh>—?¯!šHüÁ^LsP,Ÿ«Y‹âá¿ÿtšì‚£Y
|
||||
r¦Éš¥9ÇjžÄ8-ÆÇŒ¶iêPÂbA˜ù‰Ã¸š»³7RœCWRoìŠå MŒŠ�”åt™ Œ›�réÉq
|
||||
<!--Zva&‹Z¤jzÊŠ¬‡7èV)“‹|›ká�!¦*€Á¶öÄ84’Wž¶L�Êñ½Fª6ÄOq̰Š}Ŭ—|žÎ|4!ÍAh+è•L¢
|
||||
%|‹Û¬Å$-->
|
||||
|
||||
å�>}�Lê}ÎǨ 5:àŒ|�"þÇwÐsøæ�Nΰ¹#R>~-N‰®èƒ ßcðÞÚÎÑ¥®åGÎâ툉Ýè*‚¸
|
||||
=‚ž ºëâ…­ëÀ>Û·žën^žmèÊëð¼ã>å×Λ«}êØ÷
|
||||
“�Œ¬ËI�Á·AÔNÍëv>]t.âÚLЫþíï¾ñnäÖÜæs¹¿±â°+†
|
||||
¬UØïî•.ç¬ÎìÍ.è´ÞŠG=ðù��‚§ž¯”ë^äÛ®êh-‹ê�ê!i!�ÕvMíiªîþ¾òîá/þÑ-OÖGð,oñº!å’gOâ P�OìOôBþÈàhâ+?ï>ßÊVHÀsaõ™€õ$óSîõ—»�ó8.žß¹
|
||||
~áßÈ©ö»]ò3ëÆt_÷[ïôb¯ç‚Ü÷Õ«@u™ð;zܘ‘Ü@óŽ2’?ùƒ¸ÙlùF ¶™¯ù›N ž0œú£¶¤ÿ0#9:�ß§½ž©Ÿ\#ÃÙæó2é+û‚ÀÓ¸�_äM/ÓtaÚý3”]Ù«¿¸iîaF>ª�}ŒØvÍïMÍ÷Ðëä©îrÜŒöqñ_ÀüªrâF®ò
|
||||
ýþ¸—hT_ã�4sx”ýÝî)ç.Qgû�àŸÏ%ì‹}i´ASû|þð@QÜ
|
||||
$J9€»-̱÷Üô�MØ‘hZ˜¦:°œ*ÏlßxÒ|ϼ¡ÅLÀ� ¬Áfù9BÑdìÁ|«VV„¢�“énKv
|
||||
<!--u贮̮iiçͦt›šV/.²ê}mywu#|Yc‚X|jŽ�x‹dE“)0U
|
||||
�’ T–<W€o zbQ`F�¥2›�³:�°Ctª·‰!™²*¨…º»¢~аz¬†Á¯Ä‡´Õ޶Ó(iÃm²F›ÍÚhÜޓơօäc|ØËUÒÙþ²ëøçõƒ³ÜØ<î™w‰Ö¿Eéhä›@ðÂ
|
||||
-->
|
||||
|
||||
kB�_ƒg 3ʳ8#Þ¬L=0;J¤äÈ@¤F|'i~±© žaÊŠÆg;d*3²”©bPÏ¢TäHô¦?�[†
|
||||
ÄäƒhN6ZM¢D:c*BR!$±ckƒ’V­-uÛ@[øp„Ÿ]¼8ö-1{TήWÏ2ñ� Šp=¸q«Ñ½es.‰„4+#Ëe¦¥W5µekxr䛓/XÍš5Iǃ=kÝúµì˰û�N–2q�Å[r¦yZ£QŽ›ÇÞ�txŠäcK—Ííɹ
|
||||
iþ¡9¼m1oñ¢©/²8îìSté4l’Wm¾9óéÖÛÐãã{{üzÞ¿çøêöÞzà}œàL¨ "˜
|
||||
ÄÐsà¶PGLUúå`MÞ ¡†9¬§Û{pX¸¡wÚw߇¡¨ ‰í "M�UXNx
|
||||
<!--É……¡×ƒ��à¨âŠêÄõ#ƒå“Ž:Å(ã4Ö¸Až˜�:@Ùw¸ YÝ‹tIã’Ö”˜$…a(å‹X¥F7×IÈbŠ["Y€M縹K~`¶Øä-->
|
||||
+l´á¦
|
||||
j²F:Á.êÆÛj¤³Búî ¼Ê«/£Ö’[н#í+ð¥ænJÞ¸«æ;ð©õ‹¨ _ËðÄŠÒ»*º?
|
||||
ƒÂwœ�Ãyzh±°Øzl2,#oZ2È›r|òË‚°¼$Ç)ë
|
||||
óÍÙÔ,éfs€1Î@/øîÏPõÌiÐH·�ðÃBkLtÒP¯bôS;NÝWÔXÏ
|
||||
ó’dlÍtÖ`�°tžOc óÅa§}AÄ›²1vËjÇmþu+`ÍÍÁ·qwü6˜‚ì½sÞXŸ�¨Ë$xM6àP³-iÉSÚ½AÙˆïë84–ø=xä8^!ä*L>Þ˜ƒk¹Œ({Iè�^!ḘN$ê
|
||||
«®ç!ºû‚ÿÝ ë¯ßoî—Oü¨¾ÿî9í]ñÞ{ñÙÊ®ãlhŽ(èÌÃê¼~ÔS¢|öÕŸzýw¬Ë§|øÝ—*½ŒÈ×­|úåwzþæ“)Nrû¾Ê?*ô¥
|
||||
¿*÷ô7ú½~Múúú÷ª÷Ɉ•S3x*ûí�P”ùH£�°°àó(è¾í-Jƒú™
|
||||
åAF�{#\”g…Áœ)�!),Ô #ÓÂǼ�jþ1œŒþh©²K„9$ƒYè)Ž ˆA È
|
||||
—‡)#1‰Óp"˜ð'Ã%n‰P´‡Ù¨-‹1³¢^\%ƈÔp„CLÖ5Ã
|
||||
<!--a‘�^œßâx¯
|
||||
€±peŒ-->
|
||||
<HR>
|
||||
<H1 ALIGN="RIGHT"><A NAME="1">Preface</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=1>Preface</A></H1>
|
||||
This software administrators manual provides printer administration
|
||||
information for the Common UNIX Printing System ("CUPS") Version 1.0.4.
|
||||
<H2><A NAME="1_1">System Overview</A></H2>
|
||||
information for the Common UNIX Printing System ("CUPS") Version 1.0.0.
|
||||
<H2><A NAME=1_1>System Overview</A></H2>
|
||||
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
|
||||
@@ -217,7 +102,7 @@ applications under UNIX. </P>
|
||||
<P>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. </P>
|
||||
<H2><A NAME="1_2">Document Overview</A></H2>
|
||||
<H2><A NAME=1_2>Document Overview</A></H2>
|
||||
<P>This software administrators manual is organized into the following
|
||||
sections:</P>
|
||||
<UL>
|
||||
@@ -226,12 +111,11 @@ sections:</P>
|
||||
<LI>3 - Printer Queue Management</LI>
|
||||
<LI>4 - Printing System Management</LI>
|
||||
<LI>5 - Printer Accounting</LI>
|
||||
<LI>A - Using CUPS with SAMBA</LI>
|
||||
</UL>
|
||||
<H1 ALIGN="RIGHT"><A NAME="2">1 - Printing System Overview</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=2>1 - Printing System Overview</A></H1>
|
||||
<P>This chapter provides an overview of how the Common UNIX Printing
|
||||
System works. </P>
|
||||
<H2><A NAME="2_1">The Printing Problem</A></H2>
|
||||
<H2><A NAME=2_1>The Printing Problem</A></H2>
|
||||
<P>For years <I>the printing problem</I> has plagued UNIX®. Unlike
|
||||
Microsoft® Windows® or MacOS, UNIX has no standard interface or system
|
||||
in place for supporting printers. Among the solutions previously
|
||||
@@ -253,7 +137,7 @@ that supports a wide range of file formats with little or no effort.
|
||||
Since CUPS provides both the System V and Berkeley printing commands,
|
||||
users (and applications) can reap the benefits of this new technology
|
||||
with no changes. </P>
|
||||
<H2><A NAME="2_2">The Technology</A></H2>
|
||||
<H2><A NAME=2_2>The Technology</A></H2>
|
||||
<P>CUPS is based upon an emerging Internet standard called the Internet
|
||||
Printing Protocol, or IPP. IPP has been embraced by dozens of printer
|
||||
and printer server manufacturers, and will be supported by the next
|
||||
@@ -273,17 +157,7 @@ using their web browser. </P>
|
||||
Basic authentication and domain or IP-based access control. Digest
|
||||
authentication and TLS encryption will be available in future versions
|
||||
of CUPS. </P>
|
||||
<H2><A NAME="2_3">Jobs</A></H2>
|
||||
<P>Each file that is submitted for printing is called a <I>job</I>.
|
||||
Jobs are identified by a unique number starting at 1 and are assigned
|
||||
to a particular destination (usually a printer). Jobs can also have
|
||||
options associated with them such as media size, number of copies, and
|
||||
priority. </P>
|
||||
<H2><A NAME="2_4">Classes</A></H2>
|
||||
<P>CUPS supports collections of printers known as <I>classes</I>. Jobs
|
||||
sent to a class are forwarded to the first available printer in the
|
||||
class. </P>
|
||||
<H2><A NAME="2_5">Filters</A></H2>
|
||||
<H2><A NAME=2_3>Filters</A></H2>
|
||||
<P>Filters allow a user or application to print many types of files
|
||||
without extra effort. Print jobs sent to a CUPS server are filtered
|
||||
before sending them to a printer. Some filters convert job files to
|
||||
@@ -299,35 +173,19 @@ printer. </P>
|
||||
<P>CUPS provides backends for printing over parallel and serial ports,
|
||||
and over the network via the JetDirect (AppSocket), Server Message
|
||||
Block, and Line Printer Daemon protocols. </P>
|
||||
<H2><A NAME="2_6">Printer Drivers</A></H2>
|
||||
<H2><A NAME=2_4>Printer Drivers</A></H2>
|
||||
<P>Printer drivers in CUPS consist of one of more filters specific to a
|
||||
printer. CUPS includes a sample printer driver for Hewlett-Packard
|
||||
LaserJet and DeskJet printers. While this driver does not generate
|
||||
optimal output for different printer models, it does demonstrate how
|
||||
you can write your own printer drivers and incorporate them into CUPS. </P>
|
||||
<H2><A NAME="2_7">Networking</A></H2>
|
||||
<P>Printers and classes on the local system are automatically shared
|
||||
with other systems on the network. This allows you to setup one system
|
||||
to print to a printer and use this system as a printer server or spool
|
||||
host for all of the others. If there is only one occurrence of a
|
||||
printer on a network, then that printer can be accessed using its name
|
||||
alone. If more than one printer exists with the same name, users must
|
||||
select the printer by specifying which server to use (e.g.
|
||||
"printer@host1" or "printer@host2".) </P>
|
||||
<P>CUPS also provides <I>implicit classes</I>, which are collections of
|
||||
printers and/or classes with the same name. This allows you to setup
|
||||
multiple servers pointing to the same physical network printer, for
|
||||
example, so that you aren't relying on a single system for printing.
|
||||
Because this also works with printer classes, you can setup multiple
|
||||
servers and printers and never worry about a "single point of failure"
|
||||
unless all of the printers and servers goes down! </P>
|
||||
<H1 ALIGN="RIGHT"><A NAME="3">2 - Building and Installing CUPS</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=3>2 - Building and Installing CUPS</A></H1>
|
||||
<P>This chapter shows how to build and install the Common UNIX Printing
|
||||
System. If you are installing a binary distribution from the CUPS web
|
||||
site, proceed to the section titled, <A HREF="#binary">Installing a
|
||||
site, proceed to the section titled, <A HREF=#binary>Installing a
|
||||
Binary Distribution</A>. </P>
|
||||
<H2><A NAME="3_1">Installing a Source Distribution</A></H2>
|
||||
<H3><A NAME="3_1_1">Requirements</A></H3>
|
||||
<H2><A NAME=3_1>Installing a Source Distribution</A></H2>
|
||||
<H3><A NAME=3_1_1>Requirements</A></H3>
|
||||
<P>You'll need an ANSI C compiler to build CUPS on your system. As its
|
||||
name implies, CUPS is designed to run on the UNIX operating system,
|
||||
however the CUPS interface library and most of the filters and backends
|
||||
@@ -338,24 +196,24 @@ reduced functionality. Easy Software Products maintains a mirror of the
|
||||
current versions of these libraries at: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
<A HREF="ftp://ftp.easysw.com/pub/libraries">ftp://ftp.easysw.com/pub/libraries</A>
|
||||
<A HREF=ftp://ftp.easysw.com/pub/libraries>ftp://ftp.easysw.com/pub/libraries</A>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>If you make changes to the man pages you'll need GNU groff or
|
||||
another nroff-like package. GNU groff is available from: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
<A HREF="ftp://ftp.gnu.org/pub/groff">ftp://ftp.gnu.org/pub/groff</A>
|
||||
<A HREF=ftp://ftp.gnu.org/pub/groff>ftp://ftp.gnu.org/pub/groff</A>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The documentation is formatted using the HTMLDOC software. If you
|
||||
need to make changes you can get the HTMLDOC software from: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
<A HREF="http://www.easysw.com/htmldoc">http://www.easysw.com/htmldoc</A>
|
||||
<A HREF=http://www.easysw.com/htmldoc>http://www.easysw.com/htmldoc</A>
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="3_1_2">Compiling CUPS</A></H3>
|
||||
<H3><A NAME=3_1_2>Compiling CUPS</A></H3>
|
||||
<P>CUPS uses GNU autoconf to configure the makefiles and source code
|
||||
for your system. To configure CUPS for your system type: </P>
|
||||
<UL>
|
||||
@@ -390,14 +248,14 @@ LDFLAGS</CODE> environment variables prior to running configure: </P>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>to build the software. </P>
|
||||
<H3><A NAME="3_1_3">Installing the Software</A></H3>
|
||||
<H3><A NAME=3_1_3>Installing the Software</A></H3>
|
||||
<P>To install the software type: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% make install ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="3_1_4">Running the Software</A></H3>
|
||||
<H3><A NAME=3_1_4>Running the Software</A></H3>
|
||||
Once you have installed the software you can start the CUPS daemon by
|
||||
typing:
|
||||
<UL>
|
||||
@@ -405,7 +263,7 @@ typing:
|
||||
% /usr/sbin/cupsd & ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="binary">Installing a Binary Distribution</A></H2>
|
||||
<H2><A NAME=binary>Installing a Binary Distribution</A></H2>
|
||||
<P>We are currently distributing CUPS binary distributions in TAR
|
||||
format with installation and removal scripts. </P>
|
||||
<UL><B>WARNING:</B>
|
||||
@@ -425,21 +283,21 @@ installation script with: </P>
|
||||
</UL>
|
||||
<P>After asking you a few yes/no questions the CUPS software will be
|
||||
installed and the scheduler will be started automatically. </P>
|
||||
<H1 ALIGN="RIGHT"><A NAME="4">3 - Printer Queue Management</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=4>3 - Printer Queue Management</A></H1>
|
||||
<P>This chapter discusses how to add, modify, and delete print queues
|
||||
on your system. </P>
|
||||
<H2><A NAME="4_1">The lpadmin Command</A></H2>
|
||||
<H2><A NAME=4_1>The lpadmin Command</A></H2>
|
||||
<P>The <CODE>lpadmin</CODE> command allows you to perform most printer
|
||||
administration tasks from the command-line. Since <CODE>lpadmin</CODE>
|
||||
is also a System V printing system command, it is located in the <CODE>
|
||||
/usr/lib</CODE> directory instead of a more common one like <CODE>
|
||||
/usr/bin</CODE> or <CODE>/usr/sbin</CODE>. </P>
|
||||
<H2><A NAME="4_2">Adding and Modifying Printers</A></H2>
|
||||
<H2><A NAME=4_2>Adding and Modifying Printers</A></H2>
|
||||
<P>To add a printer to CUPS you simply run the <CODE>lpadmin</CODE>
|
||||
command with the "-p" option: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -E -v<I>device</I> -P<I>ppd</I> ENTER
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -v<I>device</I> -P<I>ppd</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>Spaces between the option letter and value are optional. </P>
|
||||
@@ -454,8 +312,7 @@ installation of CUPS: </P>
|
||||
<DT>file:/dev/filename </DT>
|
||||
<DT>/dev/filename </DT>
|
||||
<DD>Sends all output to the specified file. </DD>
|
||||
<DT>http://[username:password@]hostname[:port]/resource </DT>
|
||||
<DT>ipp://[username:password@]hostname[:port]/resource </DT>
|
||||
<DT>ipp://hostname[:port]/resource </DT>
|
||||
<DD>Sends all output to the specified IPP printer or server. The <I>
|
||||
port</I> parameters defaults to 631. </DD>
|
||||
<DT>lpd://hostname/queue </DT>
|
||||
@@ -474,10 +331,6 @@ character:
|
||||
<LI><CODE>parity=<I>none</I></CODE> - Turns parity checking off. </LI>
|
||||
</UL>
|
||||
</DD>
|
||||
<DT>smb://[username:password@]hostname/queue </DT>
|
||||
<DT>smb://[username:password@]workgroup/hostname/queue </DT>
|
||||
<DD>Sends all output to the specified SMB (Windows) printer queue
|
||||
using the SAMBA software. </DD>
|
||||
<DT>socket://hostname[:port] </DT>
|
||||
<DD>Sends all output to the specified printer using the AppSocket
|
||||
protocol. The <I>port</I> parameter defaults to 9100. </DD>
|
||||
@@ -486,13 +339,13 @@ protocol. The <I>port</I> parameter defaults to 9100. </DD>
|
||||
file to use for this printer. Many options (such as media size, etc.)
|
||||
will not be available if you omit this part of the <CODE>lpadmin</CODE>
|
||||
command. </P>
|
||||
<H3><A NAME="4_2_1">Using Standard Printer Drivers</A></H3>
|
||||
<H3><A NAME=4_2_1>Using Standard Printer Drivers</A></H3>
|
||||
<P>The <CODE>lpadmin</CODE> command allows you to use "standard" PPD
|
||||
files and interface scripts located in the <CODE>/usr/share/cups/model</CODE>
|
||||
directory with the "-m" option: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -E -v<I>device</I> -m<I>model</I> ENTER
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -v<I>device</I> -m<I>model</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <I>model</I> argument specifies the name of the PPD file or
|
||||
@@ -501,10 +354,10 @@ DeskJet series driver connected to parallel port 1 under Linux you
|
||||
would use: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% /usr/lib/lpadmin -pDeskJet -E -vparallel:/dev/par1 -mdeskjet.ppd ENTER
|
||||
% /usr/lib/lpadmin -pDeskJet -vparallel:/dev/par1 -mdeskjet.ppd ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="4_3">Removing Printers</A></H2>
|
||||
<H2><A NAME=4_3>Removing Printers</A></H2>
|
||||
<P>To remove a printer to CUPS you simply run the <CODE>lpadmin</CODE>
|
||||
command with the "-x" option: </P>
|
||||
<UL>
|
||||
@@ -512,7 +365,7 @@ would use: </P>
|
||||
% /usr/lib/lpadmin -x<I>printer</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="4_4">Printer Classes</A></H2>
|
||||
<H2><A NAME=4_4>Printer Classes</A></H2>
|
||||
<P>CUPS allows you to group similar printers in a <I>printer class</I>.
|
||||
When a user sends a print job to a class, the job will be processed by
|
||||
the first available printer in that class. </P>
|
||||
@@ -530,7 +383,7 @@ remove a class just use the "-x" option: </P>
|
||||
% /usr/lib/lpadmin -x<I>class</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<H2><A NAME="4_5">Setting the Default Printer</A></H2>
|
||||
<H2><A NAME=4_5>Setting the Default Printer</A></H2>
|
||||
<P>To set the default printer or class simply run the <CODE>lpadmin</CODE>
|
||||
command with the "-d" option: </P>
|
||||
<UL>
|
||||
@@ -539,82 +392,21 @@ remove a class just use the "-x" option: </P>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <I>destination</I> argument is the name of the printer or class. </P>
|
||||
<H2><A NAME="4_6">Starting and Stopping Printers</A></H2>
|
||||
<P>The <CODE>enable</CODE> and <CODE>disable</CODE> commands start and
|
||||
stop printer queues, respectively: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% /usr/bin/enable <I>printer</I> ENTER
|
||||
% /usr/bin/disable <I>printer</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>Printers that are disabled may still accept jobs for printing, but
|
||||
won't actually print any files until they are restarted. This is useful
|
||||
if the printer malfunctions and you need time to correct the problem.
|
||||
Any queues jobs are printed after the printer is enabled (started). </P>
|
||||
<H2><A NAME="4_7">Accepting and Rejecting Print Jobs</A></H2>
|
||||
<P>The <CODE>accept</CODE> and <CODE>reject</CODE> commands accept and
|
||||
reject print jobs for the named printer, respectively: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% /usr/lib/accept <I>printer</I> ENTER
|
||||
% /usr/lib/reject <I>printer</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>As noted above, a printer can be stopped but accepting new print
|
||||
jobs. A printer can also be rejecting new print jobs while it finishes
|
||||
those that have been queued. This is useful for when you must perform
|
||||
maintenance on the printer and will not have it available to users for
|
||||
a long period of time. </P>
|
||||
<H1 ALIGN="RIGHT"><A NAME="5">4 - Printing System Management</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=5>4 - Printing System Management</A></H1>
|
||||
<P>This chapter shows how you can configure the CUPS server. </P>
|
||||
<H2><A NAME="5_1">Changing the Configuration Files</A></H2>
|
||||
<P>All of the server configuration files are located in the <CODE>
|
||||
/var/cups/conf</CODE> directory. Once you have made a change to a file
|
||||
you need to restart the CUPS server by sending it a HUP signal or using
|
||||
the supplied script "<CODE>cups.sh</CODE>": </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% ./cups.sh restart ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The binary distribution installs the script in the <CODE>init.d</CODE>
|
||||
directory with the name <CODE>lp</CODE> or <CODE>lpd</CODE> depending
|
||||
on the vendor-supplied printing system. </P>
|
||||
<H2><A NAME="5_2">Temporary Files</A></H2>
|
||||
<P>Normally CUPS puts all of its temporary files in <CODE>/var/tmp</CODE>
|
||||
. If you'd like to change this directory you'll need to edit the <CODE>
|
||||
/var/cups/conf/cupsd.conf</CODE> file. </P>
|
||||
<P>Start by creating the new temporary directory and setting the
|
||||
appropriate permissions: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% mkdir <I>/foo/bar/tmp</I> ENTER
|
||||
% chmod a+rwxt <I>/foo/bar/tmp</I> ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>Then change the line containing the <CODE>TempDir</CODE> directive
|
||||
in the <CODE>cupsd.conf</CODE> to the directory that you've created: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
TempDir <I>/foo/bar/tmp</I>
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>Finally, restart the server as outlined in the first section of this
|
||||
chapter. </P>
|
||||
<H2><A NAME="5_3">Network Configuration</A></H2>
|
||||
<H2><A NAME=5_1>Network Configuration</A></H2>
|
||||
<P>The default configuration of the CUPS server listens for connections
|
||||
from all network interfaces on port 631 (the standard IPP port).
|
||||
Administration functions are limited to local connections with the
|
||||
appropriate username and password. </P>
|
||||
<P>If you'd like to limit access to your system you'll need to edit the <CODE>
|
||||
/var/cups/conf/cupsd.conf</CODE> file. </P>
|
||||
<H3><A NAME="5_3_1">Port</A></H3>
|
||||
<H3><A NAME=5_1_1>Port</A></H3>
|
||||
<P>The <CODE>Port</CODE> directive specifies a port to listen on for
|
||||
all interfaces. Besides the standard IPP port (631) you can also setup
|
||||
your server to listen on the HTTP port (80) to use your CUPS server as
|
||||
a standard web server as well. </P>
|
||||
<H3><A NAME="5_3_2">Listen</A></H3>
|
||||
<H3><A NAME=5_1_2>Listen</A></H3>
|
||||
<P>The <CODE>Listen</CODE> directive specifies a listening address and
|
||||
port, extending the functionality of the <CODE>Port</CODE> directive.
|
||||
If you want to allow connections only from the local machine you can
|
||||
@@ -626,9 +418,9 @@ Listen 127.0.0.1:631
|
||||
</UL>
|
||||
<P>instead of the <CODE>Port</CODE> directive. </P>
|
||||
<P>If you want to limit access to a specific network/subnet, make sure
|
||||
you specify only the network address and not your system's network
|
||||
you specific only the network address and not your system's network
|
||||
address! </P>
|
||||
<H3><A NAME="5_3_3">BrowsePort</A></H3>
|
||||
<H3><A NAME=5_1_3>BrowsePort</A></H3>
|
||||
<P>The <CODE>BrowsePort</CODE> directive controls which port is
|
||||
monitored for remote printers. By default it is set to the IPP port
|
||||
(631), however you can change it as needed. </P>
|
||||
@@ -636,7 +428,7 @@ monitored for remote printers. By default it is set to the IPP port
|
||||
<P>You must set the <CODE>BrowsePort</CODE> to the same value on all
|
||||
of the systems that you want to see. </P>
|
||||
</UL>
|
||||
<H3><A NAME="5_3_4">BrowseAddress</A></H3>
|
||||
<H3><A NAME=5_1_4>BrowseAddress</A></H3>
|
||||
<P>The <CODE>BrowseAddress</CODE> directive specifies a broadcast
|
||||
address to use when sending printer status updates over the network.
|
||||
The default browse address is <CODE>255.255.255.255</CODE> which will
|
||||
@@ -646,10 +438,10 @@ send printer information to all subnets. </P>
|
||||
bits, printer browsing (and in fact all broadcast reception) will not
|
||||
work. This problem appears to be fixed in HP-UX 11.0. </P>
|
||||
</UL>
|
||||
<H2><A NAME="5_4">Printer Security</A></H2>
|
||||
<H2><A NAME=5_2>Printer Security</A></H2>
|
||||
<P>CUPS provides IP and domain-name based access control and Basic
|
||||
authentication for authentication. </P>
|
||||
<H3><A NAME="5_4_1">Location</A></H3>
|
||||
<H3><A NAME=5_2_1>Location</A></H3>
|
||||
<P>The <CODE>Location</CODE> directive defines access control for a
|
||||
specific HTTP directory. The following pseudo directories are provided
|
||||
by the CUPS server: </P>
|
||||
@@ -680,7 +472,7 @@ Allow From 127.0.0.1
|
||||
</Location>
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="5_4_2">Order</A></H3>
|
||||
<H3><A NAME=5_2_2>Order</A></H3>
|
||||
<P>The <CODE>Order</CODE> directive defines the default access control.
|
||||
The following values are supported: </P>
|
||||
<UL>
|
||||
@@ -691,7 +483,7 @@ listed in an <CODE>Allow</CODE> directive. </LI>
|
||||
</UL>
|
||||
<P>The <CODE>Order</CODE> directive must appear inside a <CODE>Location</CODE>
|
||||
directive. </P>
|
||||
<H3><A NAME="5_4_3">Allow</A></H3>
|
||||
<H3><A NAME=5_2_3>Allow</A></H3>
|
||||
<P>The <CODE>Allow</CODE> directive specifies a hostname, IP address,
|
||||
or network that is allowed access to the server: </P>
|
||||
<UL>
|
||||
@@ -711,24 +503,10 @@ Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
</UL>
|
||||
<P><CODE>Allow</CODE> directives are cummulative, so multiple <CODE>
|
||||
Allow</CODE> directives can be used to allow access for multiple hosts
|
||||
or networks. The <CODE>/mm</CODE> notation specifies a CIDR netmask:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="80%">
|
||||
<TR><TH>mm</TH><TH>netmask</TH></TR>
|
||||
<TR><TD>0</TD><TD>0.0.0.0</TD></TR>
|
||||
<TR><TD>1</TD><TD>128.0.0.0</TD></TR>
|
||||
<TR><TD>2</TD><TD>192.0.0.0</TD></TR>
|
||||
<TR><TD>...</TD><TD>...</TD></TR>
|
||||
<TR><TD>8</TD><TD>255.0.0.0</TD></TR>
|
||||
<TR><TD>16</TD><TD>255.255.0.0</TD></TR>
|
||||
<TR><TD>24</TD><TD>255.255.255.0</TD></TR>
|
||||
<TR><TD>32</TD><TD>255.255.255.255</TD></TR>
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
or networks. </P>
|
||||
<P>The <CODE>Allow</CODE> directive must appear inside a <CODE>Location</CODE>
|
||||
directive. </P>
|
||||
<H3><A NAME="5_4_4">Deny</A></H3>
|
||||
<H3><A NAME=5_2_4>Deny</A></H3>
|
||||
<P>The <CODE>Deny</CODE> directive specifies a hostname, IP address, or
|
||||
network that is allowed access to the server: </P>
|
||||
<UL>
|
||||
@@ -747,25 +525,10 @@ Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
</PRE>
|
||||
</UL>
|
||||
<P><CODE>Deny</CODE> directives are cummulative, so multiple <CODE>Deny</CODE>
|
||||
directives can be used to allow access for multiple hosts or networks.
|
||||
The <CODE>/mm</CODE> notation specifies a CIDR netmask:
|
||||
<CENTER>
|
||||
<TABLE BORDER="1" WIDTH="80%">
|
||||
<TR><TH>mm</TH><TH>netmask</TH></TR>
|
||||
<TR><TD>0</TD><TD>0.0.0.0</TD></TR>
|
||||
<TR><TD>1</TD><TD>128.0.0.0</TD></TR>
|
||||
<TR><TD>2</TD><TD>192.0.0.0</TD></TR>
|
||||
<TR><TD>...</TD><TD>...</TD></TR>
|
||||
<TR><TD>8</TD><TD>255.0.0.0</TD></TR>
|
||||
<TR><TD>16</TD><TD>255.255.0.0</TD></TR>
|
||||
<TR><TD>24</TD><TD>255.255.255.0</TD></TR>
|
||||
<TR><TD>32</TD><TD>255.255.255.255</TD></TR>
|
||||
</TABLE>
|
||||
</CENTER>
|
||||
</P>
|
||||
directives can be used to allow access for multiple hosts or networks. </P>
|
||||
<P>The <CODE>Deny</CODE> directive must appear inside a <CODE>Location</CODE>
|
||||
directive. </P>
|
||||
<H3><A NAME="5_4_5">AuthType</A></H3>
|
||||
<H3><A NAME=5_2_5>AuthType</A></H3>
|
||||
<P>The <CODE>AuthType</CODE> directive defines the type of
|
||||
authentication to perform: </P>
|
||||
<UL>
|
||||
@@ -776,7 +539,7 @@ using the UNIX password and group files. </LI>
|
||||
</UL>
|
||||
<P>The <CODE>AuthType</CODE> directive must appear inside a <CODE>
|
||||
Location</CODE> directive. </P>
|
||||
<H3><A NAME="5_4_6">AuthClass</A></H3>
|
||||
<H3><A NAME=5_2_6>AuthClass</A></H3>
|
||||
<P>The <CODE>AuthClass</CODE> directive defines what level of <CODE>
|
||||
Basic</CODE> access is required: </P>
|
||||
<UL>
|
||||
@@ -792,21 +555,21 @@ AuthGroupName</CODE> directive. </LI>
|
||||
</UL>
|
||||
<P>The <CODE>AuthClass</CODE> directive must appear inside a <CODE>
|
||||
Location</CODE> directive. </P>
|
||||
<H3><A NAME="5_4_7">AuthGroupName</A></H3>
|
||||
<H3><A NAME=5_2_7>AuthGroupName</A></H3>
|
||||
<P>The <CODE>AuthGroupName</CODE> directive sets the group to use for <CODE>
|
||||
Group</CODE> authentication. </P>
|
||||
<P>The <CODE>AuthGroupName</CODE> directive must appear inside a <CODE>
|
||||
Location</CODE> directive. </P>
|
||||
<H3><A NAME="5_4_8">SystemGroup</A></H3>
|
||||
<H3><A NAME=5_2_8>SystemGroup</A></H3>
|
||||
<P>The <CODE>SystemGroup</CODE> directive sets the administration group
|
||||
used when authenticating the <CODE>System</CODE> type. It defaults to
|
||||
the "sys" group. </P>
|
||||
<H2><A NAME="5_5">File Formats</A></H2>
|
||||
<H2><A NAME=5_3>File Formats</A></H2>
|
||||
<P>CUPS provides a MIME-based file typing and filtering mechanism to
|
||||
convert files to a printable format for each printer. The <CODE>
|
||||
mime.types</CODE> and <CODE>mime.convs</CODE> files define the file
|
||||
type and filters that are available on the system. </P>
|
||||
<H3><A NAME="5_5_1">mime.types</A></H3>
|
||||
<H3><A NAME=5_3_1>mime.types</A></H3>
|
||||
<P>The <CODE>mime.types</CODE> defines the known file types. Each line
|
||||
of the file starts with the MIME type and may be followed by one or
|
||||
more file type recognition rules. For example, the <CODE>text/html</CODE>
|
||||
@@ -842,13 +605,13 @@ the file type based upon the contents of the file instead. </P>
|
||||
to string </LI>
|
||||
<LI><CODE>char(offset,value)</CODE> - True if byte is identical </LI>
|
||||
<LI><CODE>short(offset,value)</CODE> - True if 16-bit integer is
|
||||
identical (network or "big-endian" byte order) </LI>
|
||||
identical </LI>
|
||||
<LI><CODE>int(offset,value)</CODE> - True if 32-bit integer is
|
||||
identical (network or "big-endian" byte order) </LI>
|
||||
identical </LI>
|
||||
<LI><CODE>locale("string")</CODE> - True if current locale matches
|
||||
string </LI>
|
||||
</UL>
|
||||
<H3><A NAME="5_5_2">mime.convs</A></H3>
|
||||
<H3><A NAME=5_3_2>mime.convs</A></H3>
|
||||
<P>The <CODE>mime.convs</CODE> file defines all of the filter programs
|
||||
that are known to the system. Each line consists of: </P>
|
||||
<UL>
|
||||
@@ -885,13 +648,13 @@ program job user title options [filename]
|
||||
<P>If specified, the <I>filename</I> argument defines a file to read
|
||||
when filtering, otherwise the filter must read from the standard input.
|
||||
All filtered output must go to the standard output. </P>
|
||||
<H1 ALIGN="RIGHT"><A NAME="6">5 - Printer Accounting</A></H1>
|
||||
<H1 ALIGN=RIGHT><A NAME=6>5 - Printer Accounting</A></H1>
|
||||
This chapter describes the CUPS log files.
|
||||
<H2><A NAME="6_1">Where to Find the Log Files</A></H2>
|
||||
<H2><A NAME=6_1>Where to Find the Log Files</A></H2>
|
||||
<P>The log files are normally stored in the <CODE>/var/cups/logs</CODE>
|
||||
directory. You can change this by editing the <CODE>
|
||||
/var/cups/conf/cupsd.conf</CODE> configuration file. </P>
|
||||
<H2><A NAME="6_2">The access_log File</A></H2>
|
||||
<H2><A NAME=6_2>The access_log File</A></H2>
|
||||
<P>The <CODE>access_log</CODE> file lists each HTTP resource that is
|
||||
accessed by a web browser or CUPS/IPP client. Each line is in the
|
||||
so-called "Common Log Format" used by many web servers and web
|
||||
@@ -930,7 +693,7 @@ above. </P>
|
||||
<P>The <I>bytes</I> field contains the number of bytes in the request.
|
||||
For POST requests the <I>bytes</I> field contains the number of bytes
|
||||
of non-IPP data that is received from the client. </P>
|
||||
<H2><A NAME="6_3">The error_log File</A></H2>
|
||||
<H2><A NAME=6_3>The error_log File</A></H2>
|
||||
<P>The <CODE>error_log</CODE> file lists messages from the scheduler
|
||||
(errors, warnings, etc.): </P>
|
||||
<UL>
|
||||
@@ -953,7 +716,7 @@ I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.
|
||||
page started printing. The format of this field is identical to the <I>
|
||||
data-time</I> field in the <CODE>access_log</CODE> file. </P>
|
||||
<P>The <I>message</I> fields contains a free-form textual message. </P>
|
||||
<H2><A NAME="6_4">The page_log File</A></H2>
|
||||
<H2><A NAME=6_4>The page_log File</A></H2>
|
||||
<P>The <CODE>page_log</CODE> file lists each page that is sent to a
|
||||
printer. Each line contains the following information: </P>
|
||||
<UL>
|
||||
@@ -979,44 +742,5 @@ data-time</I> field in the <CODE>access_log</CODE> file. </P>
|
||||
number and number of copies being printed of that page. For printer
|
||||
that can not produce copies on their own, the <I>num-pages</I> field
|
||||
will always be 1. </P>
|
||||
<H1 ALIGN="RIGHT"><A NAME="7">A - Using CUPS with SAMBA</A></H1>
|
||||
<P>This appendix describes how to use CUPS with SAMBA. </P>
|
||||
<H2><A NAME="7_1">What is SAMBA?</A></H2>
|
||||
<P>In case you haven't heard of SAMBA, it is basically a software
|
||||
package that allows you to configure your UNIX system as a Windows file
|
||||
and printer server. It also allows you to access files and printers on
|
||||
a Windows system. Like CUPS, SAMBA is free software. </P>
|
||||
<P>SAMBA version 2.0.6 is the first release of SAMBA that supports
|
||||
CUPS. You can download SAMBA from: </P>
|
||||
<P ALIGN="CENTER"><A HREF="http://www.samba.org">http://www.samba.org</A>
|
||||
</P>
|
||||
<H2><A NAME="7_2">How Do I Configure SAMBA for CUPS?</A></H2>
|
||||
<P>To configure SAMBA for CUPS, edit the <CODE>smb.conf</CODE> file and
|
||||
replace the existing printing commands and options with the line: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
printing = cups
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>That's all there is to it! Remote users will now be able to browse
|
||||
and print to printers on your system. </P>
|
||||
<H2><A NAME="7_3">How Do I Configure CUPS for SAMBA?</A></H2>
|
||||
<P>To configure CUPS for SAMBA, run the following command: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% ln -s `which smbspool` /var/cups/backend/smb ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The <CODE>smbspool</CODE> program is provided with SAMBA starting
|
||||
with SAMBA 2.0.6. Once you have made the link you can use the <CODE>smb</CODE>
|
||||
method in the device URI for your printers: </P>
|
||||
<UL>
|
||||
<PRE>
|
||||
% lpadmin -p <I>printer</I> -v smb://<I>hostname/printer</I> ... ENTER
|
||||
% lpadmin -p <I>printer</I> -v smb://<I>workgroup/hostname/printer</I> ... ENTER
|
||||
</PRE>
|
||||
</UL>
|
||||
<P>The second form only needs to be used if the Windows system is in a
|
||||
different workgroup. </P>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
+776
-1025
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+12
-248
@@ -1,16 +1,16 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.4">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.0">
|
||||
<META NAME="Author" CONTENT="Easy Software Products">
|
||||
<TITLE>CUPS Software Administrators Manual</TITLE>
|
||||
<TITLE>DRAFT - CUPS Software Administrators Manual</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<H1 ALIGN=RIGHT>Preface</H1>
|
||||
|
||||
This software administrators manual provides printer administration
|
||||
information for the Common UNIX Printing System ("CUPS") Version 1.0.4.
|
||||
information for the Common UNIX Printing System ("CUPS") Version 1.0.0.
|
||||
|
||||
<H2>System Overview</H2>
|
||||
|
||||
@@ -42,7 +42,6 @@ can be used to support non-PostScript printers.
|
||||
<LI>3 - Printer Queue Management</LI>
|
||||
<LI>4 - Printing System Management</LI>
|
||||
<LI>5 - Printer Accounting</LI>
|
||||
<LI>A - Using CUPS with SAMBA</LI>
|
||||
</UL>
|
||||
|
||||
<H1 ALIGN=RIGHT>1 - Printing System Overview</H1>
|
||||
@@ -99,19 +98,6 @@ web browser.
|
||||
authentication and domain or IP-based access control. Digest authentication
|
||||
and TLS encryption will be available in future versions of CUPS.
|
||||
|
||||
<H2>Jobs</H2>
|
||||
|
||||
<P>Each file that is submitted for printing is called a <I>job</I>.
|
||||
Jobs are identified by a unique number starting at 1 and are assigned
|
||||
to a particular destination (usually a printer). Jobs can also have
|
||||
options associated with them such as media size, number of copies, and
|
||||
priority.
|
||||
|
||||
<H2>Classes</H2>
|
||||
|
||||
<P>CUPS supports collections of printers known as <I>classes</I>. Jobs sent
|
||||
to a class are forwarded to the first available printer in the class.
|
||||
|
||||
<H2>Filters</H2>
|
||||
|
||||
<P>Filters allow a user or application to print many types of files
|
||||
@@ -140,24 +126,6 @@ LaserJet and DeskJet printers. While this driver does not generate
|
||||
optimal output for different printer models, it does demonstrate how
|
||||
you can write your own printer drivers and incorporate them into CUPS.
|
||||
|
||||
<H2>Networking</H2>
|
||||
|
||||
<P>Printers and classes on the local system are automatically shared with
|
||||
other systems on the network. This allows you to setup one system to print
|
||||
to a printer and use this system as a printer server or spool host for all
|
||||
of the others. If there is only one occurrence of a printer on a network,
|
||||
then that printer can be accessed using its name alone. If more than one
|
||||
printer exists with the same name, users must select the printer by specifying
|
||||
which server to use (e.g. "printer@host1" or "printer@host2".)
|
||||
|
||||
<P>CUPS also provides <I>implicit classes</I>, which are collections of
|
||||
printers and/or classes with the same name. This allows you to setup multiple
|
||||
servers pointing to the same physical network printer, for example, so that
|
||||
you aren't relying on a single system for printing. Because this also works
|
||||
with printer classes, you can setup multiple servers and printers and never
|
||||
worry about a "single point of failure" unless all of the printers and servers
|
||||
goes down!
|
||||
|
||||
<H1 ALIGN=RIGHT>2 - Building and Installing CUPS</H1>
|
||||
|
||||
<P>This chapter shows how to build and install the Common UNIX Printing System.
|
||||
@@ -296,7 +264,7 @@ is also a System V printing system command, it is located in the
|
||||
with the "-p" option:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -E -v<I>device</I> -P<I>ppd</I> ENTER
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -v<I>device</I> -P<I>ppd</I> ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>Spaces between the option letter and value are optional.
|
||||
@@ -316,8 +284,7 @@ CUPS:
|
||||
<DT>/dev/filename
|
||||
<DD>Sends all output to the specified file.
|
||||
|
||||
<DT>http://[username:password@]hostname[:port]/resource
|
||||
<DT>ipp://[username:password@]hostname[:port]/resource
|
||||
<DT>ipp://hostname[:port]/resource
|
||||
<DD>Sends all output to the specified IPP printer or server.
|
||||
The <I>port</I> parameters defaults to 631.
|
||||
|
||||
@@ -344,11 +311,6 @@ CUPS:
|
||||
checking off.
|
||||
</UL>
|
||||
|
||||
<DT>smb://[username:password@]hostname/queue
|
||||
<DT>smb://[username:password@]workgroup/hostname/queue
|
||||
<DD>Sends all output to the specified SMB (Windows) printer queue
|
||||
using the SAMBA software.
|
||||
|
||||
<DT>socket://hostname[:port]
|
||||
<DD>Sends all output to the specified printer using the
|
||||
AppSocket protocol. The <I>port</I> parameter defaults to 9100.
|
||||
@@ -366,7 +328,7 @@ and interface scripts located in the <CODE>/usr/share/cups/model</CODE>
|
||||
directory with the "-m" option:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -E -v<I>device</I> -m<I>model</I> ENTER
|
||||
% /usr/lib/lpadmin -p<I>printer</I> -v<I>device</I> -m<I>model</I> ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>The <I>model</I> argument specifies the name of the PPD file or interface
|
||||
@@ -374,7 +336,7 @@ script. For example, to add a printer using the sample HP DeskJet series
|
||||
driver connected to parallel port 1 under Linux you would use:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/lib/lpadmin -pDeskJet -E -vparallel:/dev/par1 -mdeskjet.ppd ENTER
|
||||
% /usr/lib/lpadmin -pDeskJet -vparallel:/dev/par1 -mdeskjet.ppd ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<H2>Removing Printers</H2>
|
||||
@@ -417,80 +379,10 @@ command with the "-d" option:
|
||||
|
||||
<P>The <I>destination</I> argument is the name of the printer or class.
|
||||
|
||||
<H2>Starting and Stopping Printers</H2>
|
||||
|
||||
<P>The <CODE>enable</CODE> and <CODE>disable</CODE> commands start and stop
|
||||
printer queues, respectively:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/bin/enable <I>printer</I> ENTER
|
||||
% /usr/bin/disable <I>printer</I> ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>Printers that are disabled may still accept jobs for printing, but won't
|
||||
actually print any files until they are restarted. This is useful if the
|
||||
printer malfunctions and you need time to correct the problem. Any queues
|
||||
jobs are printed after the printer is enabled (started).
|
||||
|
||||
<H2>Accepting and Rejecting Print Jobs</H2>
|
||||
|
||||
<P>The <CODE>accept</CODE> and <CODE>reject</CODE> commands accept and reject
|
||||
print jobs for the named printer, respectively:
|
||||
|
||||
<UL><PRE>
|
||||
% /usr/lib/accept <I>printer</I> ENTER
|
||||
% /usr/lib/reject <I>printer</I> ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>As noted above, a printer can be stopped but accepting new print
|
||||
jobs. A printer can also be rejecting new print jobs while it finishes
|
||||
those that have been queued. This is useful for when you must perform
|
||||
maintenance on the printer and will not have it available to users for
|
||||
a long period of time.
|
||||
|
||||
<H1 ALIGN=RIGHT>4 - Printing System Management</H1>
|
||||
|
||||
<P>This chapter shows how you can configure the CUPS server.
|
||||
|
||||
<H2>Changing the Configuration Files</H2>
|
||||
|
||||
<P>All of the server configuration files are located in the
|
||||
<CODE>/var/cups/conf</CODE> directory. Once you have made a change to a
|
||||
file you need to restart the CUPS server by sending it a HUP signal or
|
||||
using the supplied script "<CODE>cups.sh</CODE>":
|
||||
|
||||
<UL><PRE>
|
||||
% ./cups.sh restart ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>The binary distribution installs the script in the
|
||||
<CODE>init.d</CODE> directory with the name <CODE>lp</CODE> or
|
||||
<CODE>lpd</CODE> depending on the vendor-supplied printing system.
|
||||
|
||||
<H2>Temporary Files</H2>
|
||||
|
||||
<P>Normally CUPS puts all of its temporary files in <CODE>/var/tmp</CODE>.
|
||||
If you'd like to change this directory you'll need to edit the
|
||||
<CODE>/var/cups/conf/cupsd.conf</CODE> file.
|
||||
|
||||
<P>Start by creating the new temporary directory and setting the appropriate
|
||||
permissions:
|
||||
|
||||
<UL><PRE>
|
||||
% mkdir <I>/foo/bar/tmp</I> ENTER
|
||||
% chmod a+rwxt <I>/foo/bar/tmp</I> ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>Then change the line containing the <CODE>TempDir</CODE> directive in
|
||||
the <CODE>cupsd.conf</CODE> to the directory that you've created:
|
||||
|
||||
<UL><PRE>
|
||||
TempDir <I>/foo/bar/tmp</I>
|
||||
</PRE></UL>
|
||||
|
||||
<P>Finally, restart the server as outlined in the first section of this
|
||||
chapter.
|
||||
|
||||
<H2>Network Configuration</H2>
|
||||
|
||||
<P>The default configuration of the CUPS server listens for connections from
|
||||
@@ -521,7 +413,7 @@ Listen 127.0.0.1:631
|
||||
<P>instead of the <CODE>Port</CODE> directive.
|
||||
|
||||
<P>If you want to limit access to a specific network/subnet, make sure you
|
||||
specify only the network address and not your system's network address!
|
||||
specific only the network address and not your system's network address!
|
||||
|
||||
<H3>BrowsePort</H3>
|
||||
|
||||
@@ -639,47 +531,7 @@ Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
</PRE></UL>
|
||||
|
||||
<P><CODE>Allow</CODE> directives are cummulative, so multiple <CODE>Allow</CODE>
|
||||
directives can be used to allow access for multiple hosts or networks. The
|
||||
<CODE>/mm</CODE> notation specifies a CIDR netmask:
|
||||
|
||||
<CENTER><TABLE WIDTH="80%" BORDER="1">
|
||||
<TR>
|
||||
<TH>mm</TH>
|
||||
<TH>netmask</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>0</TD>
|
||||
<TD>0.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>1</TD>
|
||||
<TD>128.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>2</TD>
|
||||
<TD>192.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>...</TD>
|
||||
<TD>...</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>8</TD>
|
||||
<TD>255.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>16</TD>
|
||||
<TD>255.255.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>24</TD>
|
||||
<TD>255.255.255.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>32</TD>
|
||||
<TD>255.255.255.255</TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
directives can be used to allow access for multiple hosts or networks.
|
||||
|
||||
<P>The <CODE>Allow</CODE> directive must appear inside a
|
||||
<CODE>Location</CODE> directive.
|
||||
@@ -704,47 +556,7 @@ Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
</PRE></UL>
|
||||
|
||||
<P><CODE>Deny</CODE> directives are cummulative, so multiple <CODE>Deny</CODE>
|
||||
directives can be used to allow access for multiple hosts or networks. The
|
||||
<CODE>/mm</CODE> notation specifies a CIDR netmask:
|
||||
|
||||
<CENTER><TABLE WIDTH="80%" BORDER="1">
|
||||
<TR>
|
||||
<TH>mm</TH>
|
||||
<TH>netmask</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>0</TD>
|
||||
<TD>0.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>1</TD>
|
||||
<TD>128.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>2</TD>
|
||||
<TD>192.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>...</TD>
|
||||
<TD>...</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>8</TD>
|
||||
<TD>255.0.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>16</TD>
|
||||
<TD>255.255.0.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>24</TD>
|
||||
<TD>255.255.255.0</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>32</TD>
|
||||
<TD>255.255.255.255</TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
directives can be used to allow access for multiple hosts or networks.
|
||||
|
||||
<P>The <CODE>Deny</CODE> directive must appear inside a
|
||||
<CODE>Location</CODE> directive.
|
||||
@@ -865,10 +677,10 @@ the file type based upon the contents of the file instead.
|
||||
<LI><CODE>char(offset,value)</CODE> - True if byte is identical
|
||||
|
||||
<LI><CODE>short(offset,value)</CODE> - True if 16-bit integer
|
||||
is identical (network or "big-endian" byte order)
|
||||
is identical
|
||||
|
||||
<LI><CODE>int(offset,value)</CODE> - True if 32-bit integer is
|
||||
identical (network or "big-endian" byte order)
|
||||
identical
|
||||
|
||||
<LI><CODE>locale("string")</CODE> - True if current locale
|
||||
matches string
|
||||
@@ -1036,53 +848,5 @@ field in the <CODE>access_log</CODE> file.
|
||||
and number of copies being printed of that page. For printer that can not
|
||||
produce copies on their own, the <I>num-pages</I> field will always be 1.
|
||||
|
||||
<H1 ALIGN="RIGHT">A - Using CUPS with SAMBA</H1>
|
||||
|
||||
<P>This appendix describes how to use CUPS with SAMBA.
|
||||
|
||||
<H2>What is SAMBA?</H2>
|
||||
|
||||
<P>In case you haven't heard of SAMBA, it is basically a software package
|
||||
that allows you to configure your UNIX system as a Windows file and printer
|
||||
server. It also allows you to access files and printers on a Windows system.
|
||||
Like CUPS, SAMBA is free software.
|
||||
|
||||
<P>SAMBA version 2.0.6 is the first release of SAMBA that supports CUPS.
|
||||
You can download SAMBA from:
|
||||
|
||||
<P ALIGN="CENTER"><A HREF="http://www.samba.org">http://www.samba.org</A></P>
|
||||
|
||||
<H2>How Do I Configure SAMBA for CUPS?</H2>
|
||||
|
||||
<P>To configure SAMBA for CUPS, edit the <CODE>smb.conf</CODE> file and
|
||||
replace the existing printing commands and options with the line:
|
||||
|
||||
<UL><PRE>
|
||||
printing = cups
|
||||
</PRE></UL>
|
||||
|
||||
<P>That's all there is to it! Remote users will now be able to browse and
|
||||
print to printers on your system.
|
||||
|
||||
<H2>How Do I Configure CUPS for SAMBA?</H2>
|
||||
|
||||
<P>To configure CUPS for SAMBA, run the following command:
|
||||
|
||||
<UL><PRE>
|
||||
% ln -s `which smbspool` /var/cups/backend/smb ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>The <CODE>smbspool</CODE> program is provided with SAMBA starting with
|
||||
SAMBA 2.0.6. Once you have made the link you can use the <CODE>smb</CODE>
|
||||
method in the device URI for your printers:
|
||||
|
||||
<UL><PRE>
|
||||
% lpadmin -p <I>printer</I> -v smb://<I>hostname/printer</I> ... ENTER
|
||||
% lpadmin -p <I>printer</I> -v smb://<I>workgroup/hostname/printer</I> ... ENTER
|
||||
</PRE></UL>
|
||||
|
||||
<P>The second form only needs to be used if the Windows system is in a
|
||||
different workgroup.
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
+161
-257
@@ -1,212 +1,109 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>CUPS Software Design Description</TITLE>
|
||||
<TITLE>DRAFT - CUPS Software Design Description</TITLE>
|
||||
<META NAME="AUTHOR" CONTENT="Easy Software Products">
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SDD-1.0">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<STYLE>
|
||||
BODY { font-family: serif; font-size: 11.0pt }
|
||||
H1 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H2 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H3 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H4 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H5 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H6 { font-family: sans-serif; font-size: 20.0pt }
|
||||
SUB { font-size: 8.0pt }
|
||||
SUP { font-size: 8.0pt }
|
||||
PRE { font-size: 9.0pt }
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER><A HREF="#CONTENTS"><H1>CUPS Software Design Description</H1></A><BR>
|
||||
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
|
||||
<H1>DRAFT - CUPS Software Design Description</H1></A><BR>
|
||||
CUPS-SDD-1.0<BR>
|
||||
Easy Software Products<BR>
|
||||
Copyright 1997-1999, All Rights Reserved<BR>
|
||||
</CENTER>
|
||||
<HR>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="#1">1 Scope</A></B>
|
||||
<BR><B><A HREF=#1>1 Scope</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#1_1">1.1 Identification</A></LI>
|
||||
<LI><A HREF="#1_2">1.2 System Overview</A></LI>
|
||||
<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
|
||||
<LI><A HREF=#1_1>1.1 Identification</A></LI>
|
||||
<LI><A HREF=#1_2>1.2 System Overview</A></LI>
|
||||
<LI><A HREF=#1_3>1.3 Document Overview</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#2">2 References</A></B>
|
||||
<B><A HREF=#2>2 References</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
|
||||
<LI><A HREF=#2_1>2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF=#2_2>2.2 Other Documents</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#3">3 Design Overview</A></B>
|
||||
<B><A HREF=#3>3 Design Overview</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1">3.1 Backends</A></LI>
|
||||
<LI><A HREF=#3_1>3.1 Backends</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1_1">3.1.1 ipp</A></LI>
|
||||
<LI><A HREF="#3_1_2">3.1.2 lpd</A></LI>
|
||||
<LI><A HREF="#3_1_3">3.1.3 parallel</A></LI>
|
||||
<LI><A HREF="#3_1_4">3.1.4 serial</A></LI>
|
||||
<LI><A HREF="#3_1_5">3.1.5 socket</A></LI>
|
||||
<LI><A HREF=#3_1_1>3.1.1 ipp</A></LI>
|
||||
<LI><A HREF=#3_1_2>3.1.2 lpd</A></LI>
|
||||
<LI><A HREF=#3_1_3>3.1.3 parallel</A></LI>
|
||||
<LI><A HREF=#3_1_4>3.1.4 serial</A></LI>
|
||||
<LI><A HREF=#3_1_5>3.1.5 smb</A></LI>
|
||||
<LI><A HREF=#3_1_6>3.1.6 socket</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_2">3.2 Berkeley Commands</A></LI>
|
||||
<LI><A HREF=#3_2>3.2 Berkeley Commands</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_2_1">3.2.1 lpc</A></LI>
|
||||
<LI><A HREF="#3_2_2">3.2.2 lpr</A></LI>
|
||||
<LI><A HREF="#3_2_3">3.2.3 lprm</A></LI>
|
||||
<LI><A HREF=#3_2_1>3.2.1 lpc</A></LI>
|
||||
<LI><A HREF=#3_2_2>3.2.2 lpr</A></LI>
|
||||
<LI><A HREF=#3_2_3>3.2.3 lprm</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_3">3.3 CGI</A></LI>
|
||||
<LI><A HREF=#3_3>3.3 CGI</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_3_1">3.3.1 classes.cgi</A></LI>
|
||||
<LI><A HREF="#3_3_2">3.3.2 jobs.cgi</A></LI>
|
||||
<LI><A HREF="#3_3_3">3.3.3 printers.cgi</A></LI>
|
||||
<LI><A HREF=#3_3_1>3.3.1 classes</A></LI>
|
||||
<LI><A HREF=#3_3_2>3.3.2 jobs</A></LI>
|
||||
<LI><A HREF=#3_3_3>3.3.3 printers</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_4">3.4 CUPS Interface Library</A></LI>
|
||||
<LI><A HREF=#3_4>3.4 CUPS Interface Library</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_4_1">3.4.1 Convenience Functions</A></LI>
|
||||
<LI><A HREF="#3_4_2">3.4.2 HTTP Functions</A></LI>
|
||||
<LI><A HREF="#3_4_3">3.4.3 IPP Functions</A></LI>
|
||||
<LI><A HREF="#3_4_4">3.4.4 Language Functions</A></LI>
|
||||
<LI><A HREF="#3_4_5">3.4.5 MIME Functions</A></LI>
|
||||
<LI><A HREF="#3_4_6">3.4.6 PPD Functions</A></LI>
|
||||
<LI><A HREF="#3_4_7">3.4.7 Raster Functions</A></LI>
|
||||
<LI><A HREF=#3_4_1>3.4.1 Convenience Functions</A></LI>
|
||||
<LI><A HREF=#3_4_2>3.4.2 HTTP Functions</A></LI>
|
||||
<LI><A HREF=#3_4_3>3.4.3 IPP Functions</A></LI>
|
||||
<LI><A HREF=#3_4_4>3.4.4 Language Functions</A></LI>
|
||||
<LI><A HREF=#3_4_5>3.4.5 MIME Functions</A></LI>
|
||||
<LI><A HREF=#3_4_6>3.4.6 PPD Functions</A></LI>
|
||||
<LI><A HREF=#3_4_7>3.4.7 Raster Functions</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_5">3.5 Filters</A></LI>
|
||||
<LI><A HREF=#3_5>3.5 Filters</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_5_1">3.5.1 hpgltops</A></LI>
|
||||
<LI><A HREF="#3_5_2">3.5.2 imagetops</A></LI>
|
||||
<LI><A HREF="#3_5_3">3.5.3 imagetoraster</A></LI>
|
||||
<LI><A HREF="#3_5_4">3.5.4 pstops</A></LI>
|
||||
<LI><A HREF="#3_5_5">3.5.5 pstoraster</A></LI>
|
||||
<LI><A HREF="#3_5_6">3.5.6 rastertohp</A></LI>
|
||||
<LI><A HREF="#3_5_7">3.5.7 texttops</A></LI>
|
||||
<LI><A HREF=#3_5_1>3.5.1 hpgltops</A></LI>
|
||||
<LI><A HREF=#3_5_2>3.5.2 imagetops</A></LI>
|
||||
<LI><A HREF=#3_5_3>3.5.3 pstops</A></LI>
|
||||
<LI><A HREF=#3_5_4>3.5.4 texttops</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_6">3.6 Scheduler</A></LI>
|
||||
<LI><A HREF=#3_6>3.6 Scheduler</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_6_1">3.6.1 Authorization</A></LI>
|
||||
<LI><A HREF="#3_6_2">3.6.2 Classes</A></LI>
|
||||
<LI><A HREF="#3_6_3">3.6.3 Client</A></LI>
|
||||
<LI><A HREF="#3_6_4">3.6.4 Configuration</A></LI>
|
||||
<LI><A HREF="#3_6_5">3.6.5 Directory Services</A></LI>
|
||||
<LI><A HREF="#3_6_6">3.6.6 IPP</A></LI>
|
||||
<LI><A HREF="#3_6_7">3.6.7 Jobs</A></LI>
|
||||
<LI><A HREF="#3_6_8">3.6.8 Logging</A></LI>
|
||||
<LI><A HREF="#3_6_9">3.6.9 Main</A></LI>
|
||||
<LI><A HREF="#3_6_10">3.6.10 Printers</A></LI>
|
||||
<LI><A HREF=#3_6_1>3.6.1 Authorization</A></LI>
|
||||
<LI><A HREF=#3_6_2>3.6.2 Classes</A></LI>
|
||||
<LI><A HREF=#3_6_3>3.6.3 Client</A></LI>
|
||||
<LI><A HREF=#3_6_4>3.6.4 Configuration</A></LI>
|
||||
<LI><A HREF=#3_6_5>3.6.5 Directory Services</A></LI>
|
||||
<LI><A HREF=#3_6_6>3.6.6 IPP</A></LI>
|
||||
<LI><A HREF=#3_6_7>3.6.7 Jobs</A></LI>
|
||||
<LI><A HREF=#3_6_8>3.6.8 Main</A></LI>
|
||||
<LI><A HREF=#3_6_9>3.6.9 Printers</A></LI>
|
||||
</UL>
|
||||
<LI><A HREF="#3_7">3.7 System V Commands</A></LI>
|
||||
<LI><A HREF=#3_7>3.7 System V Commands</A></LI>
|
||||
<UL>
|
||||
<LI><A HREF="#3_7_1">3.7.1 accept</A></LI>
|
||||
<LI><A HREF="#3_7_2">3.7.2 cancel</A></LI>
|
||||
<LI><A HREF="#3_7_3">3.7.3 disable</A></LI>
|
||||
<LI><A HREF="#3_7_4">3.7.4 enable</A></LI>
|
||||
<LI><A HREF="#3_7_5">3.7.5 lp</A></LI>
|
||||
<LI><A HREF="#3_7_6">3.7.6 lpadmin</A></LI>
|
||||
<LI><A HREF="#3_7_7">3.7.7 lpstat</A></LI>
|
||||
<LI><A HREF="#3_7_8">3.7.8 reject</A></LI>
|
||||
<LI><A HREF=#3_7_1>3.7.1 accept</A></LI>
|
||||
<LI><A HREF=#3_7_2>3.7.2 cancel</A></LI>
|
||||
<LI><A HREF=#3_7_3>3.7.3 disable</A></LI>
|
||||
<LI><A HREF=#3_7_4>3.7.4 enable</A></LI>
|
||||
<LI><A HREF=#3_7_5>3.7.5 lp</A></LI>
|
||||
<LI><A HREF=#3_7_6>3.7.6 lpadmin</A></LI>
|
||||
<LI><A HREF=#3_7_7>3.7.7 lpstat</A></LI>
|
||||
<LI><A HREF=#3_7_8>3.7.8 reject</A></LI>
|
||||
</UL>
|
||||
</UL>
|
||||
<B><A HREF="#4">A Glossary</A></B>
|
||||
<B><A HREF=#4>4 Detailed Design</A></B>
|
||||
<BR>
|
||||
<BR><B><A HREF=#5>A Glossary</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#4_1">A.1 Terms</A></LI>
|
||||
<LI><A HREF="#4_2">A.2 Acronyms</A></LI>
|
||||
<LI><A HREF=#5_1>A.1 Terms</A></LI>
|
||||
<LI><A HREF=#5_2>A.2 Acronyms</A></LI>
|
||||
</UL>
|
||||
<HR>
|
||||
GIF89a¯ÿòÌÌÌ™™™fff333ÿÿÿÿÿÿÿÿÿ!ù,¯ÿBþXºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª2€0p,Ïtmßx®ï
|
||||
|
||||
<!--=�•pH,ŹťÖ«Çl:źĐ¨”ů ŻŘ¬ÖXNżŕ°xL~¬Ű´zmxËđ¸|N§ŮřĽ(Pďű˙€�bwz…jn‚‰Š‹ŚŤ9„†‘!-->
|
||||
;±Ýí�ndý !¸ ž³wà…M��Y~¿{,gÚ\‚äé
|
||||
Ś×Ø(tÙî!Ï=Ñ.ûz¯ŤáÑź:ì;Ã9qöíÉë]/¿ºÉ¤Et/†'Îþt9ÀØ–ž_ÙÇ\|W•wArö¸Ý�2Ô×
|
||||
tN°0Tï}�¡û‰$!‚yMxî)�š‰Ô�ø@nB°U½ÊwE„§!ŠF H L8B
|
||||
c‰;ždŠ-æDVWdг€h±äÚ“P¶%#(4Fiå•Ï\hŠ:ŤRe!\ÒÄ—X^¦%€¥À-$E€Ö/úHŽšlââöÌQX
|
||||
|
||||
<!--äÇ"iL :a7‚]›0IZˇYŘřˇ‡D}¤–Uj±á
|
||||
^âä™ć`Ú@¦5b|šŕ�«Á±§3Ń KwÔ\ŞB¨±H)+Ź=ˇÓ©"
|
||||
©˘ 8u�†¸öŠD§•lţ:„d�RXťilĚ:Ë!´;ąt+„e<
|
||||
‡;řô+‚bbhaÚ0Ę6é.D™đ޹̹ńÖkoę({ďľü{fż-->
|
||||
¸1Nô¯b"śŠüjåÁÂE0…È8ö5GkZ|ÒÁwt„C»ÔQSÇo6ÔÙ�[�W„$²*Ž+4Pb-8¹P1þ'8"‘ФÄ$ Cyê‘„)>ãŠtè`Ð3‡‹¾z"«rE'Âqfä°Ë
|
||||
‘qÂ\|€„Ž¡ôö»%É(.—bڽȀ�íÉ`{¬EÇ1w’ »[Hß`(B6ö�“
|
||||
†')ÊRŽÎa[�ÃrbC!Tå°Ś
|
||||
2Q·ÈHZê#–®üË/àô¯FÝê(Û²% ºXË9öÀbÁ4f.ù-oýŹ™XËB…�IÎÒ7¹*@ÃÓŽÍT€hà‘ÌWâ�™Ã$f:µyžn†ó†r„'téŤKv`
|
||||
Ç+dª– ś79sťò|'=×¢Ìx¶òśÿ„¦ś�eÎ;*à$þ” IÝÆaÏ{–3ŽÅ�Á
|
||||
P“ÍS[ÙL¨3©òQ7éÆò#ãûô0F×ðsE°t§@‘ØQÜ´´ ©:3ÓRíd �¥*MITnŚ£¨H]ØQÁd
|
||||
@òþ—¬rMśŽaO
|
||||
<!--x‹ŚÖ3˝4 °XT'Ş®�:TŁuéWeşádËeú¸č¬Ů7
|
||||
|
||||
ëŇĎ;„sśĺµ7m(ýĐźtl¤RVť)-->
|
||||
rë^yÀ·(¸îéêû$uDòrã/a,I.°ÙUÀśb h�`Ť¾B ë"
|
||||
Ü`HØxȸo1þ[á\8f^æ|\ý‚¢¢zø0(�\ {�ÄgäÞõ€çâ§Á�0*\³n¼‹m¶/Äeª±ÿ†ì
|
||||
Ç,½DN2€śº+ùÉ|í0L¡Le*ð¸Ã>­2ëf,eIPOËÅàr—±”80SAźcFªatç»ãy¤¸ršçÌ¡5ïoõËsžï|¿8˙Φ¬þ,ï¼èà)ÁÌ;øk¡—†dDpÑòø2¢q�fHã!Ë“~Ùź-í
|
||||
'g:,æ4y?ýäP‹Z›ž#ÏÕ´Î5AK‰k]ûš›ÒKõ¯‡më€õzØÈƫ؎Ý>B{PЪ.6hf]º?©ÌIŽuO„íŤM‚ÌÇÜcµ3�
|
||||
61‹NÒ[†W£ ¦m¿­{ÂPâvζKnU�[ ònĽ±÷n?l:Áž3ušëť¬sP[ÿnn¾çPŤ…WõÔFj[Â÷
|
||||
¹vÏ™à‰�xúŤ'�£ÀÀ†p¸4.êãKÇ¿ÂÁ±o§¢ü"Á|Nk`îÊ�
|
||||
<!--•¤7 yţ D-->
|
||||
ť
|
||||
jl©Ìu�Ëi™0pmC´«+‰÷6¤2­éÏe`(ŽJ]¥iõð3�Øí"p|ª!:qøFس 6£
|
||||
@­,þŠqüã��oÌÇ®žŤÖüVŹ“¶QÇ›Evî¹²É8ÙªS"æÀç‡x± àþ‡Ź>—Iãg
|
||||
ïÝ>Y‰çN80æ§ ±¾GLLìÕµ…(1Þ¼!8}þ¬“*…ª‰Ùì:e»´ś
|
||||
ª¿ên_6ÂÃSÀ`eG;Ö„C�Cc�¿‡4¸yeî¯Í)oøByRm½0?íLîÅ`QÿjÓÙ/ºôÓN|Ý
|
||||
<!--â9ço‘SŽŕ•?śýáużţáŻ~!ŇźżÍĎüýĎťIw1ßţZČNĄExŁ&\(¤á[ɤ€v2€WW-->
|
||||
|
||||
þÙAÜŚÁ¸D5©D aŤævx ?жx°DM@•!h‰àÈ€Ž§®
|
||||
• Źá×B`ð¤ªE?›“”Þd�"8$Ý`Ki0…Oð�nΓ±µvtžè€I([,¹Ndɨh\'6X
|
||||
ŤPã—Š‰Éøt ¢‘¥��¬è €�†Ky™F�Śë`š”y�„¨š €š‰�M©‡øFQhY„
|
||||
9¶X¯×–í4š¤™Y\)"¹AN]‰xéz÷Gq07�)�©ñ™•Y€r°ŚŽi‹ �z ™ÇäFÍÉT�–ù›
|
||||
ËŽC śwI›üX]‹¹\ëY]þf lïYbj8źÈuśbźÍÅtú©fÞןfBI—“*øé:ÛØUj Ò
|
||||
�õ¹ Õp $(~ ¡Ú ¡gù{îpŹZI?¡�îÀv:“a¦�6¢§Ô]Ý‘(ªê)!źÚ¢:
|
||||
jwµ¡4ÚvíHÛÇ�9ºXhó•üù£¥Á¢VÉ{Dº2š‰(°¤3š¤a÷ +У¥“p¢þò4Vº—
|
||||
E´¥è¤k°7ºhT*€¿èw`ÚžiÄ …S¦Æ¦mê Nê�#ú¢f€ xê†ý
|
||||
8z©7ŹuÚp{Ú=~]7`«h‡ÚsÚg:…zd�ó§ÎA-vþAñr¦'–AÚ)9–š¢âSi;£…š 1Źªo"ª
|
||||
¦J;“º rº8Ui|é>¡Úśú
|
||||
<!--pvł2<�jŁ·«É¦kÉ 1Š:¬Če ”«ÉÚlŃ•ŞÍZnŻŠ2Ě‹s«ÁÖÚŕé¨Űş=¤zŽźú6áUä
|
||||
Řš¨żújá
|
||||
¦0®éJ«
|
||||
ŻNŐäş•öĐVeζŻőbm¶7ů´Ž-->
|
||||
“ë¥Dfný2»�–0j«�®»ºK;zë¢Íö»—!µ—S»³r>K+6�‹¨XÒ»; CÈ
|
||||
8Ê;¢»ÃÛ/Ś‹¥ž!¬s½VR½óõÏ‹Oâ[/çK¨þ�Ñ:Í‹\Ý+ Sc:ïËž’º¶ë9Æ»
|
||||
<!--ëSç�˝¤tj ˝YUŔśăŔ©%
|
||||
Ěró)Á0¨§—ł˝Ç…Á¬Ě¤LŰ6řK!<Á:Ŕę*Ş…ĂÁî…Á.‡˛
|
||||
ĄĽ‘z Âä ¦ýËŔ~¸7<,´GóĂý‹ÂöęŔe:̉°ë«ŁmŁ,žyAIˇ…�Q!8-->
|
||||
ô 8ly$
|
||||
8©ÙÅmX2Ùh>—?¯!šHüÁ^LsP,ź«Y‹âá¿ÿtšì‚£Y
|
||||
r¦Éš¥9ÇjžÄ8-ÆÇڶiêPÂbAÂ�ù‰Ã¸š»³7RśCWRoìŠå MŚŠť”åt™ Ś›ŹréÉq
|
||||
<!--Zva&‹Z¤jzĘŠ¬‡7čV)“‹|›káť!¦*€Á¶öÄ84’Wž¶L�Ęń˝FŞ6ÄOq̰Š}Ŭ—|žÎ|4!ÍAh+č•L˘
|
||||
%|‹Ű¬Ĺ$-->
|
||||
|
||||
å�>}ŤLê}ÎǨ 5:àŚ|�"þÇwÐsøæ�Nΰ¹#R>~-N‰®è� ßcðÞÚÎÑ¥®åGÎâí�‰Ýè*‚¸
|
||||
=‚ž ºëâ…­ëÀ>Û·žën^žmèÊëð¼ã>å×Λ«}êØ÷
|
||||
“ťŚ¬ËIťÁ·AÔNÍëv>]t.âÚLЫþíï¾ñnäÖÜæs¹¿±â°+†
|
||||
¬UØïî•.ç¬ÎìÍ.è´ÞŠG=ðùŤŤ‚§ž¯”ë^äÛ®êh-‹êŹê!i!ŹÕvMíiªîþ¾òîá/þÑ-OÖGð,oñº!å’gOâ PŤOìOôBþÈàhâ+?ï>ßÊVHÀsaõ™€õ$óSîõ—»ťó8.žß¹
|
||||
~áßÈ©ö»]ò3ëÆt_÷[ïôb¯ç‚Ü÷Õ«@u™ð;zÜ�‘Ü@óŽ2’?ù�¸ÙlùF ¶™¯ù›N ž0śú£¶¤ÿ0#9:�ß§½ž©ź\#ÃÙæó2é+û‚ÀÓ¸�_äM/ÓtaÚý3”]Ù«¿¸iîaF>ª�}ŚØvÍïMÍ÷Ðëä©îrÜŚöqñ_ÀüªrâF®ò
|
||||
ýþ¸—hT_ãŤ4sx”ýÝî)ç.Qgû�àźÏ%ì‹}i´ASû|þð@QÜ
|
||||
$J9€»-̱÷ÜôŤMØ‘hZ�¦:°ś*ÏlßxÒ|ϼ¡ÅLÀ� ¬Áfù9BÑdìÁ|«VV„¢�“énKv
|
||||
<!--u贮̮iiçͦt›šV/.˛ę}mywu#|Yc‚X|jŽŹx‹dE“)0U
|
||||
Ť’ T–<W€o zbQ`F�Ą2›�ł:ť°CtŞ·‰!™˛*¨…ş»˘~аz¬†ÁŻÄ‡´Ő޶Ó(iĂm˛F›ÍÚhÜޓơօäc|ŘËUŇŮţ˛ëřçő�łÜŘ<î™w‰ÖżEéhä›@đÂ
|
||||
-->
|
||||
|
||||
kBŹ_�g 3ʳ8#Þ¬L=0;J¤äÈ@¤F|'i~±© žaÊŠÆg;d*3²”©bPÏ¢TäHô¦?ť[†
|
||||
Ää�hN6ZM¢D:c*BR!$±ck�’V­-uÛ@[øp„ź]¼8ö-1{TήWÏ2ñŤ Šp=¸q«Ñ½es.‰„4+#Ëe¦¥W5µekxr䛓/XÍš5IÇ�=kÝúµì˰ûŤN–2q�Å[r¦yZ£QŽ›ÇÞťtxŠäcK—Ííɹ
|
||||
iþ¡9¼m1oñ¢©/²8îìSté4l’Wm¾9óéÖÛÐãã{{üzÞ¿çøêöÞzà}śàL¨ "�
|
||||
ÄÐsà¶PGLUúå`MÞ ¡†9¬§Û{pX¸¡wÚw߇¡¨ ‰í "M�UXNx
|
||||
<!--É……ˇ×�ŤŹŕ¨âŠęÄő#�哎:Ĺ(ă4Ö¸Až�Ź:@Ůw¸ YÝ‹tIă’Ö”�$…a(ĺ‹XĄF7×IČbŠ["Y€M縹K~`¶Řä-->
|
||||
+l´á¦
|
||||
j²F:Á.êÆÛj¤³Búî ¼Ê«/£Ö’[н#í+ð¥ænJÞ¸«æ;ð©õ‹¨ _ËðÄŠÒ»*º?
|
||||
�ÂwśŤÃyzh±°Øzl2,#oZ2È›r|òË‚°¼$Ç)ë
|
||||
óÍÙÔ,éfs€1Î@/øîÏPõÌiÐH·�ðÃBkLtÒP¯bôS;NÝWÔXÏ
|
||||
ó’dlÍtÖ`ʰtžOc óÅa§}AÄ›²1vËjÇmþu+`ÍÍÁ·qwü6�‚ì½sÞXźŤ¨Ë$xM6àP³-iÉSÚ½AÙ�ïë84–ø=xä8^!ä*L>Þ��k¹Ś({IèŹ^!á¸�N$ê
|
||||
«®ç!ºû‚ÿÝ ë¯ßoî—Oü¨¾ÿî9í]ñÞ{ñÙÊ®ãlhŽ(èÌÃê¼~ÔS¢|öÕźzýw¬Ë§|øÝ—*½ŚÈ×­|úåwzþæ“)Nrû¾Ê?*ô¥
|
||||
¿*÷ô7ú½~Múúú÷ª÷É�•S3x*ûíŹP”ùH£�°°àó(è¾í-J�ú™
|
||||
åAF�{#\”g…Áś)�!),Ô #ÓÂǼ�jþ1śŚþh©²K„9$�Yè)Ž �A È
|
||||
—‡)#1‰Óp"�ð'Ã%n‰P´‡Ù¨-‹1³¢^\%Æ�Ôp„CLÖ5Ã
|
||||
<!--a‘�^śßâxŻ
|
||||
€±peŚ-->
|
||||
<HR>
|
||||
<H1><A NAME="1">1 Scope</A></H1>
|
||||
<H2><A NAME="1_1">1.1 Identification</A></H2>
|
||||
<H1><A NAME=1>1 Scope</A></H1>
|
||||
<H2><A NAME=1_1>1.1 Identification</A></H2>
|
||||
This software design description document provides detailed
|
||||
information on the architecture and coding of the Common UNIX Printing
|
||||
System ("CUPS") Version 1.0.
|
||||
<H2><A NAME="1_2">1.2 System Overview</A></H2>
|
||||
<H2><A NAME=1_2>1.2 System Overview</A></H2>
|
||||
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
|
||||
@@ -222,17 +119,18 @@ applications under UNIX. </P>
|
||||
<P>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. </P>
|
||||
<H2><A NAME="1_3">1.3 Document Overview</A></H2>
|
||||
<H2><A NAME=1_3>1.3 Document Overview</A></H2>
|
||||
This software design description document is organized into the
|
||||
following sections:
|
||||
<UL>
|
||||
<LI>1 - Scope </LI>
|
||||
<LI>2 - References </LI>
|
||||
<LI>3 - Design Overview </LI>
|
||||
<LI>4 - Detailed Design </LI>
|
||||
<LI>A - Glossary </LI>
|
||||
</UL>
|
||||
<H1><A NAME="2">2 References</A></H1>
|
||||
<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
|
||||
<H1><A NAME=2>2 References</A></H1>
|
||||
<H2><A NAME=2_1>2.1 CUPS Documentation</A></H2>
|
||||
The following CUPS documentation is referenced by this document:
|
||||
<UL>
|
||||
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan </LI>
|
||||
@@ -245,17 +143,17 @@ can be used to support non-PostScript printers. </P>
|
||||
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual </LI>
|
||||
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description </LI>
|
||||
</UL>
|
||||
<H2><A NAME="2_2">2.2 Other Documents</A></H2>
|
||||
<H2><A NAME=2_2>2.2 Other Documents</A></H2>
|
||||
The following non-CUPS documents are referenced by this document:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
|
||||
<LI>IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>IPP/1.0: Implementers Guide </LI>
|
||||
<LI>IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
|
||||
</UL>
|
||||
<H1><A NAME="3">3 Design Overview</A></H1>
|
||||
<H1><A NAME=3>3 Design Overview</A></H1>
|
||||
CUPS is composed of 7 software sub-systems that operate together to
|
||||
perform common printing tasks:
|
||||
<UL>
|
||||
@@ -267,7 +165,7 @@ can be used to support non-PostScript printers. </P>
|
||||
<LI>Scheduler </LI>
|
||||
<LI>System V Commands </LI>
|
||||
</UL>
|
||||
<H2><A NAME="3_1">3.1 Backends</A></H2>
|
||||
<H2><A NAME=3_1>3.1 Backends</A></H2>
|
||||
The backends implement communications over a number of different
|
||||
interfaces. All backends are called with a common set of arguments:
|
||||
<UL>
|
||||
@@ -286,18 +184,18 @@ interfaces. All backends are called with a common set of arguments:
|
||||
</UL>
|
||||
Backends are named using the method of the URI, so a URI of
|
||||
"ipp://hostname/resource" would be processed by the "ipp" backend.
|
||||
<H3><A NAME="3_1_1">3.1.1 ipp</A></H3>
|
||||
<H3><A NAME=3_1_1>3.1.1 ipp</A></H3>
|
||||
The ipp backend sends the specified job to a network printer or host
|
||||
using the Internet Printing Protocol. The URI is as specified by the <CODE>
|
||||
printer-uri-supported</CODE> attribute from the printer or host.
|
||||
<H3><A NAME="3_1_2">3.1.2 lpd</A></H3>
|
||||
<H3><A NAME=3_1_2>3.1.2 lpd</A></H3>
|
||||
The lpd backend sends the specified job to a network printer or host
|
||||
using the Line Printer Daemon protocol. The URI is of the form:
|
||||
<UL>
|
||||
<PRE>lpd://hostname/queue
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="3_1_3">3.1.3 parallel</A></H3>
|
||||
<H3><A NAME=3_1_3>3.1.3 parallel</A></H3>
|
||||
The parallel backend sends the specified job to a local printer
|
||||
connected via the specified parallel port device. The URI is of the
|
||||
form:
|
||||
@@ -305,7 +203,7 @@ form:
|
||||
<PRE>parallel:/dev/file
|
||||
</PRE>
|
||||
</UL>
|
||||
<H3><A NAME="3_1_4">3.1.4 serial</A></H3>
|
||||
<H3><A NAME=3_1_4>3.1.4 serial</A></H3>
|
||||
The serial backend sends the specified job to a local printer
|
||||
connected via the specified serial port device. The URI is of the
|
||||
form:
|
||||
@@ -321,7 +219,17 @@ form:
|
||||
<LI><CODE>parity=<I>odd</I></CODE> - Sets odd parity checking. </LI>
|
||||
<LI><CODE>parity=<I>none</I></CODE> - Turns parity checking off. </LI>
|
||||
</UL>
|
||||
<H3><A NAME="3_1_5">3.1.5 socket</A></H3>
|
||||
<H3><A NAME=3_1_5>3.1.5 smb</A></H3>
|
||||
The smb backend sends the specified job to a network host using the
|
||||
Server Message Block protocol, which is used by most machines running
|
||||
Microsoft® Windows®. The URI is of the form:
|
||||
<UL>
|
||||
<PRE>smb://hostname/queue
|
||||
</PRE>
|
||||
</UL>
|
||||
Usernames and passwords required to access the printer are stored in
|
||||
an external file.
|
||||
<H3><A NAME=3_1_6>3.1.6 socket</A></H3>
|
||||
The socket backend sends the specified job to a network host using the
|
||||
AppSocket protocol commonly used by Hewlett-Packard and Tektronix
|
||||
printers. The URI is of the form:
|
||||
@@ -330,69 +238,77 @@ printers. The URI is of the form:
|
||||
</PRE>
|
||||
</UL>
|
||||
The default port number is 9100.
|
||||
<H2><A NAME="3_2">3.2 Berkeley Commands</A></H2>
|
||||
<H2><A NAME=3_2>3.2 Berkeley Commands</A></H2>
|
||||
The Berkeley commands provide a simple command-line interface to CUPS
|
||||
to submit and control print jobs. It is provided for compatibility with
|
||||
existing software that is hard coded to use the Berkeley commands.
|
||||
<H3><A NAME="3_2_1">3.2.1 lpc</A></H3>
|
||||
existing software that is hard coded to use the Berkeley commands,
|
||||
however since printer options cannot be specified using the Berkeley
|
||||
commands their use it not encouraged.
|
||||
<H3><A NAME=3_2_1>3.2.1 lpc</A></H3>
|
||||
The lpc command allows users and administrators to check the status
|
||||
and control print queues. The version provided with CUPS supports the
|
||||
following commands:
|
||||
<UL>
|
||||
<LI>quit - Quits the lpc command. </LI>
|
||||
<LI>abort - Stops a printer or all printers and any active print jobs. </LI>
|
||||
<LI>disable - Prevents new jobs from being submitted to the specified
|
||||
printer or all printers. </LI>
|
||||
<LI>down - Stops a printer or all printers after completing the current
|
||||
print jobs. </LI>
|
||||
<LI>enable - Allows new jobs to be submitted. </LI>
|
||||
<LI>start - Starts a printer or all printers. </LI>
|
||||
<LI>status - Shows the status of printers and jobs in the queue. </LI>
|
||||
<LI>up - Starts a printer or all printers. </LI>
|
||||
</UL>
|
||||
<H3><A NAME="3_2_2">3.2.2 lpr</A></H3>
|
||||
<H3><A NAME=3_2_2>3.2.2 lpr</A></H3>
|
||||
The lpr command submits a job for printing. The CUPS version of lpr
|
||||
silently ignores the "i", "t", "m", "h", and "s" options.
|
||||
<H3><A NAME="3_2_3">3.2.3 lprm</A></H3>
|
||||
silently ignores the "i", "p", "t", "m", "h", and "s" options.
|
||||
<H3><A NAME=3_2_3>3.2.3 lprm</A></H3>
|
||||
The lprm removes one or more print jobs.
|
||||
<H2><A NAME="3_3">3.3 CGI</A></H2>
|
||||
<H2><A NAME=3_3>3.3 CGI</A></H2>
|
||||
The Common Gateway Interface (CGI) programs provide a web-based status
|
||||
interface to monitor the status of printers, classes, and jobs.
|
||||
<H3><A NAME="3_3_1">3.3.1 classes.cgi</A></H3>
|
||||
<H3><A NAME=3_3_1>3.3.1 classes</A></H3>
|
||||
The classes CGI lists the available printer classes and any pending
|
||||
jobs for the class. The user can click on individual classes to limit
|
||||
the display and click on jobs to see the job status.
|
||||
<H3><A NAME="3_3_2">3.3.2 jobs.cgi</A></H3>
|
||||
<H3><A NAME=3_3_2>3.3.2 jobs</A></H3>
|
||||
The jobs CGI lists the queued print jobs in order of priority. The
|
||||
list can be limited by printer or job. When the user displays the
|
||||
status of an individual print job all job options are displayed.
|
||||
<H3><A NAME="3_3_3">3.3.3 printers.cgi</A></H3>
|
||||
<H3><A NAME=3_3_3>3.3.3 printers</A></H3>
|
||||
The printers CGI lists the available printer queues and any pending
|
||||
jobs for the printer. The user can click on individual printers to
|
||||
limit the display and click on jobs to see the job status.
|
||||
<H2><A NAME="3_4">3.4 CUPS Interface Library</A></H2>
|
||||
<H2><A NAME=3_4>3.4 CUPS Interface Library</A></H2>
|
||||
The CUPS interface library provides common convenience, HTTP, IPP,
|
||||
language, MIME, PPD, and raster functions used by the CUPS software.
|
||||
<H3><A NAME="3_4_1">3.4.1 Convenience Functions</A></H3>
|
||||
<H3><A NAME=3_4_1>3.4.1 Convenience Functions</A></H3>
|
||||
Convenience functions are provided to submit an IPP request, send a
|
||||
print file, cancel a job, get a list of available printers, get a list
|
||||
of available classes, get the default printer or class, get the default
|
||||
server name, get the local username, and get a password string.
|
||||
<H3><A NAME="3_4_2">3.4.2 HTTP Functions</A></H3>
|
||||
print file, cancel a job, get a list of available printers, and get a
|
||||
list of available classes.
|
||||
<H3><A NAME=3_4_2>3.4.2 HTTP Functions</A></H3>
|
||||
The HTTP functions provide functions to connect to HTTP servers, issue
|
||||
requests, read data from a server, and write data to a server.
|
||||
<H3><A NAME="3_4_3">3.4.3 IPP Functions</A></H3>
|
||||
<H3><A NAME=3_4_3>3.4.3 IPP Functions</A></H3>
|
||||
The IPP function provide functions to manage IPP request data and
|
||||
attributes, read IPP responses from a server, and write IPP requests to
|
||||
a server.
|
||||
<H3><A NAME="3_4_4">3.4.4 Language Functions</A></H3>
|
||||
<H3><A NAME=3_4_4>3.4.4 Language Functions</A></H3>
|
||||
The language functions provide a standard interface for retrieving
|
||||
common textual messages for a particular locale and determining the
|
||||
correct encoding (e.g. US ASCII, ISO-8859-1, etc.)
|
||||
<H3><A NAME="3_4_5">3.4.5 MIME Functions</A></H3>
|
||||
<H3><A NAME=3_4_5>3.4.5 MIME Functions</A></H3>
|
||||
The Multimedia Internet Mail Exchange functions manage a MIME type and
|
||||
conversion database that supports file typing by extension and content,
|
||||
and least-cost file filtering from a source to a destination file type.
|
||||
<H3><A NAME="3_4_6">3.4.6 PPD Functions</A></H3>
|
||||
<H3><A NAME=3_4_6>3.4.6 PPD Functions</A></H3>
|
||||
The PostScript Printer Description functions manage PPD files, select
|
||||
options, check for option conflicts, and emit selected options in the
|
||||
correct order.
|
||||
<H3><A NAME="3_4_7">3.4.7 Raster Functions</A></H3>
|
||||
<H3><A NAME=3_4_7>3.4.7 Raster Functions</A></H3>
|
||||
The raster functions manage streams of CUPS raster data (described in
|
||||
the Interface Design Document) used by non-PostScript printer drivers.
|
||||
<H2><A NAME="3_5">3.5 Filters</A></H2>
|
||||
<H2><A NAME=3_5>3.5 Filters</A></H2>
|
||||
The filters implement file conversion services for CUPS. All filters
|
||||
are called with a common set of arguments:
|
||||
<UL>
|
||||
@@ -409,37 +325,29 @@ are called with a common set of arguments:
|
||||
</UL>
|
||||
Filters are added to the MIME conversion data file and implement all
|
||||
necessary conversions from one file type to another.
|
||||
<H3><A NAME="3_5_1">3.5.1 hpgltops</A></H3>
|
||||
<H3><A NAME=3_5_1>3.5.1 hpgltops</A></H3>
|
||||
The hpgltops filter converts HP-GL/2 files into PostScript.
|
||||
<H3><A NAME="3_5_2">3.5.2 imagetops</A></H3>
|
||||
<H3><A NAME=3_5_2>3.5.2 imagetops</A></H3>
|
||||
The imagetops filter converts image files into PostScript.
|
||||
<H3><A NAME="3_5_3">3.5.3 imagetoraster</A></H3>
|
||||
The imagetoraster filter converts image files into CUPS raster data.
|
||||
<H3><A NAME="3_5_4">3.5.4 pstops</A></H3>
|
||||
<H3><A NAME=3_5_3>3.5.3 pstops</A></H3>
|
||||
The pstops filter inserts printer-specific commands from PPD files and
|
||||
performs page filtering as requested by the user.
|
||||
<H3><A NAME="3_5_5">3.5.5 pstoraster</A></H3>
|
||||
The pstoraster filter converts PostScript program data into CUPS
|
||||
raster data.
|
||||
<H3><A NAME="3_5_6">3.5.6 rastertohp</A></H3>
|
||||
The rastertohp filter handles converting CUPS raster data to HP PCL
|
||||
and supports both color and black-and-white printers.
|
||||
<H3><A NAME="3_5_7">3.5.7 texttops</A></H3>
|
||||
<H3><A NAME=3_5_4>3.5.4 texttops</A></H3>
|
||||
The texttops filter converts text files into PostScript.
|
||||
<H2><A NAME="3_6">3.6 Scheduler</A></H2>
|
||||
The scheduler is a fully-functional HTTP/1.1 and IPP/1.0 server that
|
||||
manages the printers, classes, and jobs in the system. It also handles
|
||||
a simple broadcast-based directory service so that remote print queues
|
||||
and classes can be accessed transparently from the local system.
|
||||
<H3><A NAME="3_6_1">3.6.1 Authorization</A></H3>
|
||||
<H2><A NAME=3_6>3.6 Scheduler</A></H2>
|
||||
The scheduler is a fully-functional HTTP/1.1 server that manages the
|
||||
printers, classes, and jobs in the system. It also handles a simple
|
||||
broadcast-based directory service so that remote print queues and
|
||||
classes can be accessed transparently from the local system.
|
||||
<H3><A NAME=3_6_1>3.6.1 Authorization</A></H3>
|
||||
The authorization module is responsible for performing access control
|
||||
and authentication for all HTTP and IPP requests entering the system.
|
||||
<H3><A NAME="3_6_2">3.6.2 Classes</A></H3>
|
||||
<H3><A NAME=3_6_2>3.6.2 Classes</A></H3>
|
||||
The classes module is responsible for managing printer classes in the
|
||||
system. Each class is a collection of local and/or remote printers.
|
||||
The classes module also reads and writes the classes configuration
|
||||
file.
|
||||
<H3><A NAME="3_6_3">3.6.3 Client</A></H3>
|
||||
<H3><A NAME=3_6_3>3.6.3 Client</A></H3>
|
||||
The client module is responsible for all HTTP client communications.
|
||||
It handles listening on selected interfaces, accepting connections
|
||||
from prospective clients, processing incoming HTTP requests, and
|
||||
@@ -447,13 +355,13 @@ sending HTTP responses to those requests. The client module also is
|
||||
responsible for executing the external CGI programs as needed to
|
||||
support web-based printer, class, and job status monitoring.
|
||||
<P>Once authorized, all IPP requests are sent to the IPP module. </P>
|
||||
<H3><A NAME="3_6_4">3.6.4 Configuration</A></H3>
|
||||
<H3><A NAME=3_6_4>3.6.4 Configuration</A></H3>
|
||||
The configuration module is responsible for reading the CUPS
|
||||
configuration file and initializing the appropriate data structures and
|
||||
values. The configuration module also stops CUPS services before
|
||||
reading the configuration file and restarts them after the
|
||||
configuration file has been read.
|
||||
<H3><A NAME="3_6_5">3.6.5 Directory Services</A></H3>
|
||||
<H3><A NAME=3_6_5>3.6.5 Directory Services</A></H3>
|
||||
The directory services module sends and recieves printer state
|
||||
information over a broadcast socket. Remote printers and classes are
|
||||
automatically added to or removed from the local printer and class
|
||||
@@ -461,63 +369,59 @@ lists as needed.
|
||||
<P>The directory services module can only recieve printer state
|
||||
information over a single UDP port, however it can broadcast to
|
||||
multiple addresses and ports as needed. </P>
|
||||
<H3><A NAME="3_6_6">3.6.6 IPP</A></H3>
|
||||
<H3><A NAME=3_6_6>3.6.6 IPP</A></H3>
|
||||
The IPP module handles IPP requests and acts accordingly. URI
|
||||
validation is also performed here, as a client can post IPP data to any
|
||||
URI on the server which might sidestep the access control or
|
||||
authentication of the HTTP server.
|
||||
<H3><A NAME="3_6_7">3.6.7 Jobs</A></H3>
|
||||
URI on the server (which might sidestep the access control or
|
||||
authentication of the HTTP server.)
|
||||
<H3><A NAME=3_6_7>3.6.7 Jobs</A></H3>
|
||||
The jobs module manages print jobs, starts filter and backend
|
||||
processes for jobs to be printed, and monitors status messages from
|
||||
those filters and backends.
|
||||
<H3><A NAME="3_6_8">3.6.8 Logging</A></H3>
|
||||
The logging module manages the access, error, and page log files that
|
||||
are generated by the scheduler.
|
||||
<H3><A NAME="3_6_9">3.6.9 Main</A></H3>
|
||||
<H3><A NAME=3_6_8>3.6.8 Main</A></H3>
|
||||
The main module is responsible for timing out and dispatching input
|
||||
and output for client connections. It also watches for incoming <CODE>
|
||||
SIGHUP</CODE> and <CODE>SIGCHLD</CODE> signals, reloads the server
|
||||
configuration files as needed, and handles child process errors and
|
||||
exits.
|
||||
<H3><A NAME="3_6_10">3.6.10 Printers</A></H3>
|
||||
SIGHUP</CODE> signals and reloads the server configuration files as
|
||||
needed.
|
||||
<H3><A NAME=3_6_9>3.6.9 Printers</A></H3>
|
||||
The printers module is responsible for managing printers and PPD files
|
||||
in the system. The printers module also reads and writes the printers
|
||||
configuration file.
|
||||
<H2><A NAME="3_7">3.7 System V Commands</A></H2>
|
||||
<H2><A NAME=3_7>3.7 System V Commands</A></H2>
|
||||
The System V commands provide a robust command-line interface to CUPS
|
||||
to submit and control printers and jobs.
|
||||
<H3><A NAME="3_7_1">3.7.1 accept</A></H3>
|
||||
to submit and control print jobs.
|
||||
<H3><A NAME=3_7_1>3.7.1 accept</A></H3>
|
||||
The accept command tells the scheduler to accept new jobs for specific
|
||||
printers.
|
||||
<H3><A NAME="3_7_2">3.7.2 cancel</A></H3>
|
||||
<H3><A NAME=3_7_2>3.7.2 cancel</A></H3>
|
||||
The cancel command tells the scheduler to cancel one or more jobs that
|
||||
are queued for printing.
|
||||
<H3><A NAME="3_7_3">3.7.3 disable</A></H3>
|
||||
<H3><A NAME=3_7_3>3.7.3 disable</A></H3>
|
||||
The disable command tells the scheduler to stop printing jobs on the
|
||||
specified printers.
|
||||
<H3><A NAME="3_7_4">3.7.4 enable</A></H3>
|
||||
<H3><A NAME=3_7_4>3.7.4 enable</A></H3>
|
||||
The enable command tells the scheduler to start printing jobs on the
|
||||
specified printers.
|
||||
<H3><A NAME="3_7_5">3.7.5 lp</A></H3>
|
||||
<H3><A NAME=3_7_5>3.7.5 lp</A></H3>
|
||||
The lp command submits submits files for printing. Unlike the
|
||||
standard System V lp command, a single CUPS lp command will generate a
|
||||
separate job ID for each file that is printed. Also, the Solaris "f",
|
||||
"H", "P", "S", and "y" options are silently ignored.
|
||||
<H3><A NAME="3_7_6">3.7.6 lpadmin</A></H3>
|
||||
<H3><A NAME=3_7_6>3.7.6 lpadmin</A></H3>
|
||||
The lpadmin command manages printer queues and classes. The Solaris
|
||||
"A", "F", "I", "M", "P", "Q", "S", "T", "U", "W", "f", "l", "m", "o",
|
||||
"s", "t", and "u" options are not supported, and new options "P" (PPD
|
||||
file), "F" (filter), and "E" (enable and accept) are provided to
|
||||
configure CUPS-specific features such as PPD file and conversion
|
||||
filters.
|
||||
<H3><A NAME="3_7_7">3.7.7 lpstat</A></H3>
|
||||
file) and "F" (filter) are provided to configure CUPS-specific features
|
||||
such as PPD file and conversion filters.
|
||||
<H3><A NAME=3_7_7>3.7.7 lpstat</A></H3>
|
||||
The lpstat command lists printers, classes, and jobs as requested by
|
||||
the user.
|
||||
<H3><A NAME="3_7_8">3.7.8 reject</A></H3>
|
||||
<H3><A NAME=3_7_8>3.7.8 reject</A></H3>
|
||||
The reject command tells the scheduler not to accept new jobs for
|
||||
specific printers.
|
||||
<H1 TYPE="A" VALUE="1"><A NAME="4">A Glossary</A></H1>
|
||||
<H2><A NAME="4_1">A.1 Terms</A></H2>
|
||||
<H1><A NAME=4>4 Detailed Design</A></H1>
|
||||
<H1 TYPE=A VALUE=1><A NAME=5>A Glossary</A></H1>
|
||||
<H2><A NAME=5_1>A.1 Terms</A></H2>
|
||||
<DL>
|
||||
<DT>C </DT>
|
||||
<DD>A computer language. </DD>
|
||||
@@ -530,7 +434,7 @@ specific printers.
|
||||
<DT>socket </DT>
|
||||
<DD>A two-way network communications channel. </DD>
|
||||
</DL>
|
||||
<H2><A NAME="4_2">A.2 Acronyms</A></H2>
|
||||
<H2><A NAME=5_2>A.2 Acronyms</A></H2>
|
||||
<DL>
|
||||
<DT>ASCII </DT>
|
||||
<DD>American Standard Code for Information Interchange </DD>
|
||||
|
||||
+805
-778
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+52
-42
@@ -3,7 +3,7 @@
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SDD-1.0">
|
||||
<META NAME="Author" CONTENT="Easy Software Products">
|
||||
<TITLE>CUPS Software Design Description</TITLE>
|
||||
<TITLE>DRAFT - CUPS Software Design Description</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
@@ -48,6 +48,8 @@ following sections:
|
||||
|
||||
<LI>3 - Design Overview
|
||||
|
||||
<LI>4 - Detailed Design
|
||||
|
||||
<LI>A - Glossary
|
||||
|
||||
</UL>
|
||||
@@ -77,10 +79,10 @@ The following non-CUPS documents are referenced by this document:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft)
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1
|
||||
<LI>IPP/1.0: Encoding and Transport
|
||||
<LI>IPP/1.0: Implementers Guide
|
||||
<LI>IPP/1.0: Model and Semantics
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide
|
||||
</UL>
|
||||
|
||||
<H1>Design Overview</H1>
|
||||
@@ -183,6 +185,18 @@ The options can be any combination of the following:
|
||||
|
||||
</UL>
|
||||
|
||||
<H3>smb</H3>
|
||||
|
||||
The smb backend sends the specified job to a network host using the Server
|
||||
Message Block protocol, which is used by most machines running Microsoft®
|
||||
Windows®. The URI is of the form:
|
||||
|
||||
<UL><PRE>smb://hostname/queue
|
||||
</PRE></UL>
|
||||
|
||||
Usernames and passwords required to access the printer are stored in an
|
||||
external file.
|
||||
|
||||
<H3>socket</H3>
|
||||
|
||||
The socket backend sends the specified job to a network host using the
|
||||
@@ -198,7 +212,9 @@ The default port number is 9100.
|
||||
|
||||
The Berkeley commands provide a simple command-line interface to CUPS
|
||||
to submit and control print jobs. It is provided for compatibility with
|
||||
existing software that is hard coded to use the Berkeley commands.
|
||||
existing software that is hard coded to use the Berkeley commands,
|
||||
however since printer options cannot be specified using the Berkeley
|
||||
commands their use it not encouraged.
|
||||
|
||||
<H3>lpc</H3>
|
||||
|
||||
@@ -208,16 +224,28 @@ commands:
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>quit - Quits the lpc command.
|
||||
<LI>abort - Stops a printer or all printers and any active print jobs.
|
||||
|
||||
<LI>disable - Prevents new jobs from being submitted to the specified
|
||||
printer or all printers.
|
||||
|
||||
<LI>down - Stops a printer or all printers after completing the current
|
||||
print jobs.
|
||||
|
||||
<LI>enable - Allows new jobs to be submitted.
|
||||
|
||||
<LI>start - Starts a printer or all printers.
|
||||
|
||||
<LI>status - Shows the status of printers and jobs in the queue.
|
||||
|
||||
<LI>up - Starts a printer or all printers.
|
||||
|
||||
</UL>
|
||||
|
||||
<H3>lpr</H3>
|
||||
|
||||
The lpr command submits a job for printing. The CUPS version of lpr silently
|
||||
ignores the "i", "t", "m", "h", and "s" options.
|
||||
ignores the "i", "p", "t", "m", "h", and "s" options.
|
||||
|
||||
<H3>lprm</H3>
|
||||
|
||||
@@ -228,19 +256,19 @@ The lprm removes one or more print jobs.
|
||||
The Common Gateway Interface (CGI) programs provide a web-based status interface
|
||||
to monitor the status of printers, classes, and jobs.
|
||||
|
||||
<H3>classes.cgi</H3>
|
||||
<H3>classes</H3>
|
||||
|
||||
The classes CGI lists the available printer classes and any pending jobs for
|
||||
the class. The user can click on individual classes to limit the display and
|
||||
click on jobs to see the job status.
|
||||
|
||||
<H3>jobs.cgi</H3>
|
||||
<H3>jobs</H3>
|
||||
|
||||
The jobs CGI lists the queued print jobs in order of priority. The list can
|
||||
be limited by printer or job. When the user displays the status of an
|
||||
individual print job all job options are displayed.
|
||||
|
||||
<H3>printers.cgi</H3>
|
||||
<H3>printers</H3>
|
||||
|
||||
The printers CGI lists the available printer queues and any pending jobs for
|
||||
the printer. The user can click on individual printers to limit the display and
|
||||
@@ -254,9 +282,8 @@ language, MIME, PPD, and raster functions used by the CUPS software.
|
||||
<H3>Convenience Functions</H3>
|
||||
|
||||
Convenience functions are provided to submit an IPP request, send a print file,
|
||||
cancel a job, get a list of available printers, get a list of available
|
||||
classes, get the default printer or class, get the default server name, get
|
||||
the local username, and get a password string.
|
||||
cancel a job, get a list of available printers, and get a list of available
|
||||
classes.
|
||||
|
||||
<H3>HTTP Functions</H3>
|
||||
|
||||
@@ -327,34 +354,21 @@ The hpgltops filter converts HP-GL/2 files into PostScript.
|
||||
|
||||
The imagetops filter converts image files into PostScript.
|
||||
|
||||
<H3>imagetoraster</H3>
|
||||
|
||||
The imagetoraster filter converts image files into CUPS raster data.
|
||||
|
||||
<H3>pstops</H3>
|
||||
|
||||
The pstops filter inserts printer-specific commands from PPD files and
|
||||
performs page filtering as requested by the user.
|
||||
|
||||
<H3>pstoraster</H3>
|
||||
|
||||
The pstoraster filter converts PostScript program data into CUPS raster data.
|
||||
|
||||
<H3>rastertohp</H3>
|
||||
|
||||
The rastertohp filter handles converting CUPS raster data to HP PCL and
|
||||
supports both color and black-and-white printers.
|
||||
|
||||
<H3>texttops</H3>
|
||||
|
||||
The texttops filter converts text files into PostScript.
|
||||
|
||||
<H2>Scheduler</H2>
|
||||
|
||||
The scheduler is a fully-functional HTTP/1.1 and IPP/1.0 server that
|
||||
manages the printers, classes, and jobs in the system. It also handles
|
||||
a simple broadcast-based directory service so that remote print queues
|
||||
and classes can be accessed transparently from the local system.
|
||||
The scheduler is a fully-functional HTTP/1.1 server that manages the printers,
|
||||
classes, and jobs in the system. It also handles a simple broadcast-based
|
||||
directory service so that remote print queues and classes can be accessed
|
||||
transparently from the local system.
|
||||
|
||||
<H3>Authorization</H3>
|
||||
|
||||
@@ -399,8 +413,8 @@ ports as needed.
|
||||
|
||||
The IPP module handles IPP requests and acts accordingly. URI
|
||||
validation is also performed here, as a client can post IPP data to any
|
||||
URI on the server which might sidestep the access control or
|
||||
authentication of the HTTP server.
|
||||
URI on the server (which might sidestep the access control or
|
||||
authentication of the HTTP server.)
|
||||
|
||||
<H3>Jobs</H3>
|
||||
|
||||
@@ -408,17 +422,11 @@ The jobs module manages print jobs, starts filter and backend processes
|
||||
for jobs to be printed, and monitors status messages from those filters
|
||||
and backends.
|
||||
|
||||
<H3>Logging</H3>
|
||||
|
||||
The logging module manages the access, error, and page log files that are
|
||||
generated by the scheduler.
|
||||
|
||||
<H3>Main</H3>
|
||||
|
||||
The main module is responsible for timing out and dispatching input and output
|
||||
for client connections. It also watches for incoming <CODE>SIGHUP</CODE>
|
||||
and <CODE>SIGCHLD</CODE> signals, reloads the server configuration files as
|
||||
needed, and handles child process errors and exits.
|
||||
signals and reloads the server configuration files as needed.
|
||||
|
||||
<H3>Printers</H3>
|
||||
|
||||
@@ -429,7 +437,7 @@ configuration file.
|
||||
<H2>System V Commands</H2>
|
||||
|
||||
The System V commands provide a robust command-line interface to CUPS
|
||||
to submit and control printers and jobs.
|
||||
to submit and control print jobs.
|
||||
|
||||
<H3>accept</H3>
|
||||
|
||||
@@ -463,8 +471,8 @@ and "y" options are silently ignored.
|
||||
The lpadmin command manages printer queues and classes. The Solaris
|
||||
"A", "F", "I", "M", "P", "Q", "S", "T", "U", "W", "f", "l", "m", "o",
|
||||
"s", "t", and "u" options are not supported, and new options "P" (PPD
|
||||
file), "F" (filter), and "E" (enable and accept) are provided to configure
|
||||
CUPS-specific features such as PPD file and conversion filters.
|
||||
file) and "F" (filter) are provided to configure CUPS-specific features
|
||||
such as PPD file and conversion filters.
|
||||
|
||||
<H3>lpstat</H3>
|
||||
|
||||
@@ -476,6 +484,8 @@ user.
|
||||
The reject command tells the scheduler not to accept new jobs for specific
|
||||
printers.
|
||||
|
||||
<H1>Detailed Design</H1>
|
||||
|
||||
<H1 TYPE=A VALUE=1>Glossary</H1>
|
||||
|
||||
<H2>Terms</H2>
|
||||
|
||||
-4090
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
-9119
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
-4555
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+40
-222
@@ -1,154 +1,53 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>DRAFT - CUPS Software Security Report</TITLE>
|
||||
<META NAME="AUTHOR" CONTENT="Easy Software Products">
|
||||
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
|
||||
<META NAME="DOCNUMBER" CONTENT="CUPS-SSR-1.0">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<STYLE>
|
||||
BODY { font-family: serif; font-size: 11.0pt }
|
||||
H1 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H2 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H3 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H4 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H5 { font-family: sans-serif; font-size: 20.0pt }
|
||||
H6 { font-family: sans-serif; font-size: 20.0pt }
|
||||
SUB { font-size: 8.0pt }
|
||||
SUP { font-size: 8.0pt }
|
||||
PRE { font-size: 9.0pt }
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER><A HREF="#CONTENTS"><H1>DRAFT - CUPS Software Security Report</H1></A><BR>
|
||||
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
|
||||
<H1>DRAFT - CUPS Software Security Report</H1></A><BR>
|
||||
CUPS-SSR-1.0<BR>
|
||||
Easy Software Products<BR>
|
||||
Copyright 1997-1999, All Rights Reserved<BR>
|
||||
</CENTER>
|
||||
<HR>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="#1">1 Scope</A></B>
|
||||
<BR><B><A HREF=#1>1 Scope</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#1_1">1.1 Identification</A></LI>
|
||||
<LI><A HREF="#1_2">1.2 System Overview</A></LI>
|
||||
<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
|
||||
<LI><A HREF=#1_1>1.1 Identification</A></LI>
|
||||
<LI><A HREF=#1_2>1.2 System Overview</A></LI>
|
||||
<LI><A HREF=#1_3>1.3 Document Overview</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#2">2 References</A></B>
|
||||
<B><A HREF=#2>2 References</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
|
||||
<LI><A HREF=#2_1>2.1 CUPS Documentation</A></LI>
|
||||
<LI><A HREF=#2_2>2.2 Other Documents</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#3">3 Local Access Risks</A></B>
|
||||
<B><A HREF=#3>3 Risk Identification</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#3_1">3.1 Security Breaches</A></LI>
|
||||
<LI><A HREF=#3_1>3.1 Local Access Risks</A></LI>
|
||||
<LI><A HREF=#3_2>3.2 Remote Access Risks</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#4">4 Remote Access Risks</A></B>
|
||||
<B><A HREF=#4>4 Risk Assessment</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#4_1">4.1 Denial of Service Attacks</A></LI>
|
||||
<LI><A HREF="#4_2">4.2 Security Breaches</A></LI>
|
||||
<LI><A HREF=#4_1>4.1 Local Access Risks</A></LI>
|
||||
<LI><A HREF=#4_2>4.2 Remote Access Risks</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="#5">A Glossary</A></B>
|
||||
<B><A HREF=#5>A Glossary</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="#5_1">A.1 Terms</A></LI>
|
||||
<LI><A HREF="#5_2">A.2 Acronyms</A></LI>
|
||||
<LI><A HREF=#5_1>A.1 Terms</A></LI>
|
||||
<LI><A HREF=#5_2>A.2 Acronyms</A></LI>
|
||||
</UL>
|
||||
<HR>
|
||||
GIF89a¯ÿòÌÌÌ™™™fff333ÿÿÿÿÿÿÿÿÿ!ù,¯ÿBþXºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª2€0p,Ïtmßx®ï
|
||||
|
||||
<!--=�•pH,��Ö«Çl:ŸÐ¨”ù ¯Ø¬ÖXN¿à°xL~¬Û´zmxËð¸|N§Ùø¼(Pïûÿ€�bwz…jn‚‰Š‹Œ�9„†‘!-->
|
||||
;±Ýíˆndý !¸ ž³wà…MƒƒY~¿{,gÚ\‚äé
|
||||
Œ×Ø(tÙî!Ï=Ñ.ûz¯�áÑŸ:ì;Ã9qöíÉë]/¿ºÉ¤Et/†'Îþt9ÀØ–ž_ÙÇ\|W•wArö¸Ý�2Ô×
|
||||
tN°0Tï}�¡û‰$!‚yMxî)ˆš‰Ô�ø@nB°U½ÊwE„§!ŠF H L8B
|
||||
c‰;ždŠ-æDVWdг€h±äÚ“P¶%#(4Fiå•Ï\hŠ:�Re!\ÒÄ—X^¦%€¥À-$E€Ö/úHŽšlââöÌQX
|
||||
|
||||
<!--äÇ"iL :a7‚]›0IZ¡YØø¡‡D}¤–Uj±á
|
||||
^â䙿`Ú@¦5b|šà�«Á±§3Ñ KwÔ\ªB¨±H)+�=¡Ó©"
|
||||
©¢ 8uƒ†¸öŠD§•lþ:„d�RX�ilÌ:Ë!´;¹t+„e<
|
||||
‡;øô+‚bbhaÚ0Ê6é.D™ð޹̹ñÖkoê({ï¾ü{f¿-->
|
||||
¸1Nô¯b"œŠüjåÁÂE0…È8ö5GkZ|ÒÁwt„C»ÔQSÇo6ÔÙ�[�W„$²*Ž+4Pb-8¹P1þ'8"‘ФÄ$ Cyê‘„)>ãŠtè`Ð3‡‹¾z"«rE'Âqfä°Ë
|
||||
‘qÂ\|€„Ž¡ôö»%É(.—bڽȀ�íÉ`{¬EÇ1w’ »[Hß`(B6ö�“
|
||||
†')ÊRŽÎa[�ÃrbC!Tå°Œ
|
||||
2Q·ÈHZê#–®üË/àô¯FÝê(Û²% ºXË9öÀbÁ4f.ù-oý�™XËB…�IÎÒ7¹*@ÃÓŽÍT€hà‘ÌWâ�™Ã$f:µyžn†ó†r„'té�Kv`
|
||||
Ç+dª– œ79s�ò|'=×¢Ìx¶òœÿ„¦œˆeÎ;*à$þ” IÝÆaÏ{–3ŽÅ�Á
|
||||
P“ÍS[ÙL¨3©òQ7éÆò#ãûô0F×ðsE°t§@‘ØQÜ´´ ©:3ÓRíd �¥*MITnŒ£¨H]ØQÁd
|
||||
@òþ—¬rMœŽaO
|
||||
<!--x‹ŒÖ3½4 °XT'ª®ƒ:T£uéWeºádËeú¸è¬Ù7
|
||||
|
||||
ëÒÏ;„sœåµ7m(ýПtl¤RV�)-->
|
||||
rë^yÀ·(¸îéêû$uDòrã/a,I.°ÙUÀœb hˆ`�¾B ë"
|
||||
Ü`HØxȸo1þ[á\8f^æ|\ý‚¢¢zø0(ˆ\ {ƒÄgäÞõ€çâ§Á˜0*\³n¼‹m¶/Äeª±ÿ†ì
|
||||
Ç,½DN2€œº+ùÉ|í0L¡Le*ð¸Ã>­2ëf,eIPOËÅàr—±”80SAŸcFªatç»ãy¤¸ršçÌ¡5ïoõËsžï|¿8˙Φ¬þ,ï¼èà)ÁÌ;øk¡—†dDpÑòø2¢q�fHã!Ë“~ÙŸ-í
|
||||
'g:,æ4y?ýäP‹Z›ž#ÏÕ´Î5AK‰k]ûš›ÒKõ¯‡më€õzØÈƫ؎Ý>B{PЪ.6hf]º?©ÌIŽuO„í�M‚ÌÇÜcµ3˜
|
||||
61‹NÒ[†W£ ¦m¿­{ÂPâvζKnUˆ[ ònĽ±÷n?l:Áž3ušë�¬sP[ÿnn¾çP�…WõÔFj[Â÷
|
||||
¹vÏ™à‰˜xú�'ˆ£ÀÀ†p¸4.êãKÇ¿ÂÁ±o§¢ü"Á|Nk`îʘ
|
||||
<!--•¤7 yþ D-->
|
||||
�
|
||||
jl©ÌuˆËi™0pmC´«+‰÷6¤2­éÏe`(ŽJ]¥iõð3ƒØí"p|ª!:qøFس 6£
|
||||
@­,þŠqüã��oÌÇ®ž�ÖüV�“¶QÇ›Evî¹²É8ÙªS"æÀç‡x± àþ‡�>—Iãg
|
||||
ïÝ>Y‰çN80æ§ ±¾GLLìÕµ…(1Þ¼!8}þ¬“*…ª‰Ùì:e»´œ
|
||||
ª¿ên_6ÂÃSÀ`eG;Ö„CƒCcˆ¿‡4¸yeî¯Í)oøByRm½0?íLîÅ`QÿjÓÙ/ºôÓN|Ý
|
||||
<!--â9ço‘SŽà•?œýáu¿þá¯~!ÒŸ¿ÍÏüýÏ�Iw1ßþZÈN¥Ex£&\(¤á[ɤ€v2€WW-->
|
||||
|
||||
þÙAÜŒÁ¸D5©D a�ævx ?жx°DM@•!h‰àÈ€Ž§®
|
||||
• �á×B`ð¤ªE?›“”Þdƒ"8$Ý`Ki0…OðƒnΓ±µvtžè€I([,¹Ndɨh\'6X
|
||||
�Pã—Š‰Éøt ¢‘¥�˜¬è €ˆ†Ky™FˆŒë`š”yƒ„¨š €š‰ƒM©‡øFQhY„
|
||||
9¶X¯×–í4š¤™Y\)"¹AN]‰xéz÷Gq07�)�©ñ™•Y€r°ŒŽi‹ �z ™ÇäFÍÉT�–ù›
|
||||
ËŽC œwI›üX]‹¹\ëY]þf lïYbj8ŸÈuœbŸÍÅtú©fÞןfBI—“*øé:ÛØUj Ò
|
||||
ˆõ¹ Õp $(~ ¡Ú ¡gù{îp�ZI?¡ƒîÀv:“a¦˜6¢§Ô]Ý‘(ªê)!ŸÚ¢:
|
||||
jwµ¡4ÚvíHÛǘ9ºXhó•üù£¥Á¢VÉ{Dº2š‰(°¤3š¤a÷ +У¥“p¢þò4Vº—
|
||||
E´¥è¤k°7ºhT*€¿èw`ÚžiÄ …S¦Æ¦mê Nêƒ#ú¢f€ xê†ý
|
||||
8z©7�uÚp{Ú=~]7`«h‡ÚsÚg:…zd˜ó§ÎA-vþAñr¦'–AÚ)9–š¢âSi;£…š 1�ªo"ª
|
||||
¦J;“º rº8Ui|é>¡Úœú
|
||||
<!--pv³2<ƒj£·«É¦kÉ 1Š:¬Èe ”«ÉÚlÑ•ªÍZn¯Š2Ì‹s«ÁÖÚàé¨Ûº=¤zŽŸú6áUä
|
||||
Øš¨¿újá
|
||||
¦0®éJ«
|
||||
¯NÕ井öÐVeζ¯õbm¶7ù´Ž-->
|
||||
“ë¥Dfný2»ƒ–0j«�®»ºK;zë¢Íö»—!µ—S»³r>K+6ˆ‹¨XÒ»; CÈ
|
||||
8Ê;¢»ÃÛ/Œ‹¥ž!¬s½VR½óõÏ‹Oâ[/çK¨þ˜Ñ:Í‹\Ý+ Sc:ïËž’º¶ë9Æ»
|
||||
<!--ëSç�½¤tj ½YUÀœãÀ©%
|
||||
Ìró)Á0¨§—³½Ç…Á¬Ì¤LÛ6øK!<Á:Àê*ª…ÃÁî…Á.‡²
|
||||
¥¼‘z Âä ¦ýËÀ~¸7<,´GóÃý‹ÂöêÀe:Ä¢‰°ë«£m£,žyAI¡…˜Q!8-->
|
||||
ô 8ly$
|
||||
8©ÙÅmX2Ùh>—?¯!šHüÁ^LsP,Ÿ«Y‹âá¿ÿtšì‚£Y
|
||||
r¦Éš¥9ÇjžÄ8-ÆÇŒ¶iêPÂbA˜ù‰Ã¸š»³7RœCWRoìŠå MŒŠ�”åt™ Œ›�réÉq
|
||||
<!--Zva&‹Z¤jzÊŠ¬‡7èV)“‹|›ká�!¦*€Á¶öÄ84’Wž¶L�Êñ½Fª6ÄOq̰Š}Ŭ—|žÎ|4!ÍAh+è•L¢
|
||||
%|‹Û¬Å$-->
|
||||
|
||||
å�>}�Lê}ÎǨ 5:àŒ|�"þÇwÐsøæ�Nΰ¹#R>~-N‰®èƒ ßcðÞÚÎÑ¥®åGÎâ툉Ýè*‚¸
|
||||
=‚ž ºëâ…­ëÀ>Û·žën^žmèÊëð¼ã>å×Λ«}êØ÷
|
||||
“�Œ¬ËI�Á·AÔNÍëv>]t.âÚLЫþíï¾ñnäÖÜæs¹¿±â°+†
|
||||
¬UØïî•.ç¬ÎìÍ.è´ÞŠG=ðù��‚§ž¯”ë^äÛ®êh-‹ê�ê!i!�ÕvMíiªîþ¾òîá/þÑ-OÖGð,oñº!å’gOâ P�OìOôBþÈàhâ+?ï>ßÊVHÀsaõ™€õ$óSîõ—»�ó8.žß¹
|
||||
~áßÈ©ö»]ò3ëÆt_÷[ïôb¯ç‚Ü÷Õ«@u™ð;zܘ‘Ü@óŽ2’?ùƒ¸ÙlùF ¶™¯ù›N ž0œú£¶¤ÿ0#9:�ß§½ž©Ÿ\#ÃÙæó2é+û‚ÀÓ¸�_äM/ÓtaÚý3”]Ù«¿¸iîaF>ª�}ŒØvÍïMÍ÷Ðëä©îrÜŒöqñ_ÀüªrâF®ò
|
||||
ýþ¸—hT_ã�4sx”ýÝî)ç.Qgû�àŸÏ%ì‹}i´ASû|þð@QÜ
|
||||
$J9€»-̱÷Üô�MØ‘hZ˜¦:°œ*ÏlßxÒ|ϼ¡ÅLÀ� ¬Áfù9BÑdìÁ|«VV„¢�“énKv
|
||||
<!--u贮̮iiçͦt›šV/.²ê}mywu#|Yc‚X|jŽ�x‹dE“)0U
|
||||
�’ T–<W€o zbQ`F�¥2›�³:�°Ctª·‰!™²*¨…º»¢~аz¬†Á¯Ä‡´Õ޶Ó(iÃm²F›ÍÚhÜޓơօäc|ØËUÒÙþ²ëøçõƒ³ÜØ<î™w‰Ö¿Eéhä›@ðÂ
|
||||
-->
|
||||
|
||||
kB�_ƒg 3ʳ8#Þ¬L=0;J¤äÈ@¤F|'i~±© žaÊŠÆg;d*3²”©bPÏ¢TäHô¦?�[†
|
||||
ÄäƒhN6ZM¢D:c*BR!$±ckƒ’V­-uÛ@[øp„Ÿ]¼8ö-1{TήWÏ2ñ� Šp=¸q«Ñ½es.‰„4+#Ëe¦¥W5µekxr䛓/XÍš5Iǃ=kÝúµì˰û�N–2q�Å[r¦yZ£QŽ›ÇÞ�txŠäcK—Ííɹ
|
||||
iþ¡9¼m1oñ¢©/²8îìSté4l’Wm¾9óéÖÛÐãã{{üzÞ¿çøêöÞzà}œàL¨ "˜
|
||||
ÄÐsà¶PGLUúå`MÞ ¡†9¬§Û{pX¸¡wÚw߇¡¨ ‰í "M�UXNx
|
||||
<!--É……¡×ƒ��à¨âŠêÄõ#ƒå“Ž:Å(ã4Ö¸Až˜�:@Ùw¸ YÝ‹tIã’Ö”˜$…a(å‹X¥F7×IÈbŠ["Y€M縹K~`¶Øä-->
|
||||
+l´á¦
|
||||
j²F:Á.êÆÛj¤³Búî ¼Ê«/£Ö’[н#í+ð¥ænJÞ¸«æ;ð©õ‹¨ _ËðÄŠÒ»*º?
|
||||
ƒÂwœ�Ãyzh±°Øzl2,#oZ2È›r|òË‚°¼$Ç)ë
|
||||
óÍÙÔ,éfs€1Î@/øîÏPõÌiÐH·�ðÃBkLtÒP¯bôS;NÝWÔXÏ
|
||||
ó’dlÍtÖ`�°tžOc óÅa§}AÄ›²1vËjÇmþu+`ÍÍÁ·qwü6˜‚ì½sÞXŸ�¨Ë$xM6àP³-iÉSÚ½AÙˆïë84–ø=xä8^!ä*L>Þ˜ƒk¹Œ({Iè�^!ḘN$ê
|
||||
«®ç!ºû‚ÿÝ ë¯ßoî—Oü¨¾ÿî9í]ñÞ{ñÙÊ®ãlhŽ(èÌÃê¼~ÔS¢|öÕŸzýw¬Ë§|øÝ—*½ŒÈ×­|úåwzþæ“)Nrû¾Ê?*ô¥
|
||||
¿*÷ô7ú½~Múúú÷ª÷Ɉ•S3x*ûí�P”ùH£�°°àó(è¾í-Jƒú™
|
||||
åAF�{#\”g…Áœ)�!),Ô #ÓÂǼ�jþ1œŒþh©²K„9$ƒYè)Ž ˆA È
|
||||
—‡)#1‰Óp"˜ð'Ã%n‰P´‡Ù¨-‹1³¢^\%ƈÔp„CLÖ5Ã
|
||||
<!--a‘�^œßâx¯
|
||||
€±peŒ-->
|
||||
<HR>
|
||||
<H1><A NAME="1">1 Scope</A></H1>
|
||||
<H2><A NAME="1_1">1.1 Identification</A></H2>
|
||||
<H1><A NAME=1>1 Scope</A></H1>
|
||||
<H2><A NAME=1_1>1.1 Identification</A></H2>
|
||||
This software security report provides an analysis of possible
|
||||
security concerns for the Common UNIX Printing System ("CUPS") Version
|
||||
1.0.
|
||||
<H2><A NAME="1_2">1.2 System Overview</A></H2>
|
||||
<H2><A NAME=1_2>1.2 System Overview</A></H2>
|
||||
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
|
||||
@@ -164,18 +63,18 @@ applications under UNIX. </P>
|
||||
<P>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. </P>
|
||||
<H2><A NAME="1_3">1.3 Document Overview</A></H2>
|
||||
<H2><A NAME=1_3>1.3 Document Overview</A></H2>
|
||||
<P>This software security report is organized into the following
|
||||
sections:</P>
|
||||
<UL>
|
||||
<LI>1 - Scope</LI>
|
||||
<LI>2 - References</LI>
|
||||
<LI>3 - Local Access Risks</LI>
|
||||
<LI>4 - Remote Access Risks</LI>
|
||||
<LI>3 - Risk Identification</LI>
|
||||
<LI>4 - Risk Assessment</LI>
|
||||
<LI>A - Glossary</LI>
|
||||
</UL>
|
||||
<H1><A NAME="2">2 References</A></H1>
|
||||
<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
|
||||
<H1><A NAME=2>2 References</A></H1>
|
||||
<H2><A NAME=2_1>2.1 CUPS Documentation</A></H2>
|
||||
The following CUPS documentation is referenced by this document:
|
||||
<UL>
|
||||
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan </LI>
|
||||
@@ -188,105 +87,24 @@ sections:</P>
|
||||
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual </LI>
|
||||
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description </LI>
|
||||
</UL>
|
||||
<H2><A NAME="2_2">2.2 Other Documents</A></H2>
|
||||
<H2><A NAME=2_2>2.2 Other Documents</A></H2>
|
||||
The following non-CUPS documents are referenced by this document:
|
||||
<UL>
|
||||
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
|
||||
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
|
||||
<LI>IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>IPP/1.0: Implementers Guide </LI>
|
||||
<LI>IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
|
||||
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
|
||||
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
|
||||
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
|
||||
</UL>
|
||||
<H1><A NAME="3">3 Local Access Risks</A></H1>
|
||||
<P>Local access risks are those that can be exploited only with a local
|
||||
user account. This section does not address issues related to
|
||||
dissemination of the root password or other security issues associated
|
||||
with the UNIX operating system. </P>
|
||||
<H2><A NAME="3_1">3.1 Security Breaches</A></H2>
|
||||
<P>There are two known security vulnerabilities with local access: </P>
|
||||
<OL>
|
||||
<LI>Since the default installation creates a world-readable request
|
||||
directory, it is possible for local users to read the contents of
|
||||
print files before they are printed.
|
||||
<P>This problem can be alleviated by making the request directory
|
||||
readable only by the user specified in the CUPS configuration file. </P>
|
||||
</LI>
|
||||
<LI>Device URIs are passed to backend filters in argv[0] and in an
|
||||
environment variable. Since device URIs can contain usernames and
|
||||
passwords it may be possible for a local user to gain access to a
|
||||
remote resource.
|
||||
<P>We recommend that any password-protected accounts used for remote
|
||||
printing have limited access priviledges so that the possible damages
|
||||
can be minimized. </P>
|
||||
<P>The device URI is "sanitized" (the username and password are
|
||||
removed) when sent to an IPP client so that a remote user cannot
|
||||
exploit this vulnerability. </P>
|
||||
</LI>
|
||||
</OL>
|
||||
<H1><A NAME="4">4 Remote Access Risks</A></H1>
|
||||
<P>Remote access risks are those that can be exploited without a local
|
||||
user account and/or from a remote system. This section does not address
|
||||
issues related to network or firewall security. </P>
|
||||
<H2><A NAME="4_1">4.1 Denial of Service Attacks</A></H2>
|
||||
<P>Like all Internet services, the CUPS server is vulnerable to denial
|
||||
of service attacks, including: </P>
|
||||
<OL>
|
||||
<LI>Establishing multiple connections to the server until the server
|
||||
will accept no more.
|
||||
<P>This cannot be protected against by the current software. It is
|
||||
possible that future versions of the CUPS software could be configured
|
||||
to limit the number of connections allowed from a single host, however
|
||||
that still would not prevent a determined attack. </P>
|
||||
</LI>
|
||||
<LI>Repeatedly opening and closing connections to the server as fast
|
||||
as possible.
|
||||
<P>There is no easy way of protecting against this in the CUPS
|
||||
software. If the attack is coming from outside the local network it
|
||||
might be possible to filter such an attack, however once the
|
||||
connection request has been received by the server it must at least
|
||||
accept the connection to find out who is connecting. </P>
|
||||
</LI>
|
||||
<LI>Flooding the network with broadcast packets on port 631.
|
||||
<P>It might be possible to disable browsing if this condition is
|
||||
detected by the CUPS software, however if there are large numbers of
|
||||
printers available on the network such an algorithm might think that
|
||||
an attack was occurring when instead a valid update was being
|
||||
received. </P>
|
||||
</LI>
|
||||
<LI>Sending partial IPP requests; specifically, sending part of an
|
||||
attribute value and then stopping transmission.
|
||||
<P>The current code is structured to read and write the IPP request
|
||||
data on-the-fly, so there is no easy way to protect against this for
|
||||
large attribute values. </P>
|
||||
</LI>
|
||||
<LI>Sending large/long print jobs to printers, preventing other users
|
||||
from printing.
|
||||
<P>There are limited facilities for protecting against large print
|
||||
jobs (the <CODE>MaxRequestSize</CODE> attribute), however this will
|
||||
not protect printers from malicious users and print files that
|
||||
generate hundreds or thousands of pages. In general, we recommend
|
||||
restricting printer access to known hosts or networks, and adding
|
||||
user-level access control as needed for expensive printers. </P>
|
||||
</LI>
|
||||
</OL>
|
||||
<H2><A NAME="4_2">4.2 Security Breaches</A></H2>
|
||||
<P>The current CUPS server only supports Basic authentication with
|
||||
usernames and passwords. This essentially places the clear text of the
|
||||
username and password on the network. Since CUPS uses the UNIX username
|
||||
and password account information, the authentication information could
|
||||
be used to gain access to accounts (possibly priviledged accounts) on
|
||||
the server. </P>
|
||||
<P>The default CUPS configuration disables remote administration. We do
|
||||
not recommend that remote administration be enabled for all hosts,
|
||||
however if you have a trusted network or subnet access can be
|
||||
restricted accordingly. </P>
|
||||
<P>The next minor release of CUPS will support Digest authentication of
|
||||
the entire message body using separate MD5-based username and password
|
||||
files. This will protect password information and prevent unauthorized
|
||||
access due to compromised account passwords. </P>
|
||||
<H1 TYPE="A" VALUE="1"><A NAME="5">A Glossary</A></H1>
|
||||
<H2><A NAME="5_1">A.1 Terms</A></H2>
|
||||
<H1><A NAME=3>3 Risk Identification</A></H1>
|
||||
<H2><A NAME=3_1>3.1 Local Access Risks</A></H2>
|
||||
<H2><A NAME=3_2>3.2 Remote Access Risks</A></H2>
|
||||
<H1><A NAME=4>4 Risk Assessment</A></H1>
|
||||
<H2><A NAME=4_1>4.1 Local Access Risks</A></H2>
|
||||
<H2><A NAME=4_2>4.2 Remote Access Risks</A></H2>
|
||||
<H1 TYPE=A VALUE=1><A NAME=5>A Glossary</A></H1>
|
||||
<H2><A NAME=5_1>A.1 Terms</A></H2>
|
||||
<DL>
|
||||
<DT>C </DT>
|
||||
<DD>A computer language. </DD>
|
||||
@@ -299,7 +117,7 @@ access due to compromised account passwords. </P>
|
||||
<DT>socket </DT>
|
||||
<DD>A two-way network communications channel. </DD>
|
||||
</DL>
|
||||
<H2><A NAME="5_2">A.2 Acronyms</A></H2>
|
||||
<H2><A NAME=5_2>A.2 Acronyms</A></H2>
|
||||
<DL>
|
||||
<DT>ASCII </DT>
|
||||
<DD>American Standard Code for Information Interchange </DD>
|
||||
|
||||
+357
-330
@@ -1,58 +1,61 @@
|
||||
%PDF-1.2
|
||||
%âãÏÓ
|
||||
1 0 obj<</Producer(htmldoc 1.8.3 Copyright 1997-1999 Easy Software Products, All Rights Reserved.)/CreationDate(D:19991214182636Z)/Title(DRAFT - CUPS Software Security Report)/Author(Easy Software Products)>>endobj
|
||||
2 0 obj<</Type/Encoding/Differences[ 32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/minus/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]>>endobj
|
||||
3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj
|
||||
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
|
||||
5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding 2 0 R>>endobj
|
||||
6 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Italic/Encoding 2 0 R>>endobj
|
||||
7 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding 2 0 R>>endobj
|
||||
8 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Bold/Encoding 2 0 R>>endobj
|
||||
9 0 obj<</Type/Font/Subtype/Type1/BaseFont/Symbol>>endobj
|
||||
10 0 obj<</Subtype/Link/Rect[72.0 670.8 80.2 683.8]/Border[0 0 0]/Dest[81 0 R/XYZ null 818 0]>>endobj
|
||||
11 0 obj<</Subtype/Link/Rect[80.2 670.8 107.8 683.8]/Border[0 0 0]/Dest[81 0 R/XYZ null 818 0]>>endobj
|
||||
12 0 obj<</Subtype/Link/Rect[108.0 657.6 124.5 670.6]/Border[0 0 0]/Dest[81 0 R/XYZ null 735 0]>>endobj
|
||||
13 0 obj<</Subtype/Link/Rect[124.5 657.6 183.8 670.6]/Border[0 0 0]/Dest[81 0 R/XYZ null 735 0]>>endobj
|
||||
14 0 obj<</Subtype/Link/Rect[108.0 644.4 124.5 657.4]/Border[0 0 0]/Dest[81 0 R/XYZ null 654 0]>>endobj
|
||||
15 0 obj<</Subtype/Link/Rect[124.5 644.4 159.6 657.4]/Border[0 0 0]/Dest[81 0 R/XYZ null 654 0]>>endobj
|
||||
16 0 obj<</Subtype/Link/Rect[159.6 644.4 203.0 657.4]/Border[0 0 0]/Dest[81 0 R/XYZ null 654 0]>>endobj
|
||||
17 0 obj<</Subtype/Link/Rect[108.0 631.2 124.5 644.2]/Border[0 0 0]/Dest[81 0 R/XYZ null 429 0]>>endobj
|
||||
18 0 obj<</Subtype/Link/Rect[124.5 631.2 173.1 644.2]/Border[0 0 0]/Dest[81 0 R/XYZ null 429 0]>>endobj
|
||||
19 0 obj<</Subtype/Link/Rect[173.1 631.2 216.4 644.2]/Border[0 0 0]/Dest[81 0 R/XYZ null 429 0]>>endobj
|
||||
20 0 obj<</Subtype/Link/Rect[72.0 604.8 80.2 617.8]/Border[0 0 0]/Dest[87 0 R/XYZ null 818 0]>>endobj
|
||||
21 0 obj<</Subtype/Link/Rect[80.2 604.8 131.6 617.8]/Border[0 0 0]/Dest[87 0 R/XYZ null 818 0]>>endobj
|
||||
22 0 obj<</Subtype/Link/Rect[108.0 591.6 124.5 604.6]/Border[0 0 0]/Dest[87 0 R/XYZ null 735 0]>>endobj
|
||||
23 0 obj<</Subtype/Link/Rect[124.5 591.6 154.8 604.6]/Border[0 0 0]/Dest[87 0 R/XYZ null 735 0]>>endobj
|
||||
24 0 obj<</Subtype/Link/Rect[154.8 591.6 222.6 604.6]/Border[0 0 0]/Dest[87 0 R/XYZ null 735 0]>>endobj
|
||||
25 0 obj<</Subtype/Link/Rect[108.0 578.4 124.5 591.4]/Border[0 0 0]/Dest[87 0 R/XYZ null 535 0]>>endobj
|
||||
26 0 obj<</Subtype/Link/Rect[124.5 578.4 152.3 591.4]/Border[0 0 0]/Dest[87 0 R/XYZ null 535 0]>>endobj
|
||||
27 0 obj<</Subtype/Link/Rect[152.3 578.4 202.4 591.4]/Border[0 0 0]/Dest[87 0 R/XYZ null 535 0]>>endobj
|
||||
28 0 obj<</Subtype/Link/Rect[72.0 552.0 80.2 565.0]/Border[0 0 0]/Dest[93 0 R/XYZ null 818 0]>>endobj
|
||||
29 0 obj<</Subtype/Link/Rect[80.2 552.0 109.3 565.0]/Border[0 0 0]/Dest[93 0 R/XYZ null 818 0]>>endobj
|
||||
30 0 obj<</Subtype/Link/Rect[109.3 552.0 143.2 565.0]/Border[0 0 0]/Dest[93 0 R/XYZ null 818 0]>>endobj
|
||||
31 0 obj<</Subtype/Link/Rect[143.2 552.0 168.9 565.0]/Border[0 0 0]/Dest[93 0 R/XYZ null 818 0]>>endobj
|
||||
32 0 obj<</Subtype/Link/Rect[108.0 538.8 124.5 551.8]/Border[0 0 0]/Dest[93 0 R/XYZ null 702 0]>>endobj
|
||||
33 0 obj<</Subtype/Link/Rect[124.5 538.8 163.9 551.8]/Border[0 0 0]/Dest[93 0 R/XYZ null 702 0]>>endobj
|
||||
34 0 obj<</Subtype/Link/Rect[163.9 538.8 204.2 551.8]/Border[0 0 0]/Dest[93 0 R/XYZ null 702 0]>>endobj
|
||||
35 0 obj<</Subtype/Link/Rect[72.0 512.4 80.2 525.4]/Border[0 0 0]/Dest[99 0 R/XYZ null 818 0]>>endobj
|
||||
36 0 obj<</Subtype/Link/Rect[80.2 512.4 119.0 525.4]/Border[0 0 0]/Dest[99 0 R/XYZ null 818 0]>>endobj
|
||||
37 0 obj<</Subtype/Link/Rect[119.0 512.4 152.9 525.4]/Border[0 0 0]/Dest[99 0 R/XYZ null 818 0]>>endobj
|
||||
38 0 obj<</Subtype/Link/Rect[152.9 512.4 178.6 525.4]/Border[0 0 0]/Dest[99 0 R/XYZ null 818 0]>>endobj
|
||||
39 0 obj<</Subtype/Link/Rect[108.0 499.2 124.5 512.2]/Border[0 0 0]/Dest[99 0 R/XYZ null 715 0]>>endobj
|
||||
40 0 obj<</Subtype/Link/Rect[124.5 499.2 156.6 512.2]/Border[0 0 0]/Dest[99 0 R/XYZ null 715 0]>>endobj
|
||||
41 0 obj<</Subtype/Link/Rect[156.6 499.2 168.5 512.2]/Border[0 0 0]/Dest[99 0 R/XYZ null 715 0]>>endobj
|
||||
42 0 obj<</Subtype/Link/Rect[168.5 499.2 204.2 512.2]/Border[0 0 0]/Dest[99 0 R/XYZ null 715 0]>>endobj
|
||||
43 0 obj<</Subtype/Link/Rect[204.2 499.2 237.8 512.2]/Border[0 0 0]/Dest[99 0 R/XYZ null 715 0]>>endobj
|
||||
44 0 obj<</Subtype/Link/Rect[108.0 486.0 124.5 499.0]/Border[0 0 0]/Dest[99 0 R/XYZ null 279 0]>>endobj
|
||||
45 0 obj<</Subtype/Link/Rect[124.5 486.0 163.9 499.0]/Border[0 0 0]/Dest[99 0 R/XYZ null 279 0]>>endobj
|
||||
46 0 obj<</Subtype/Link/Rect[163.9 486.0 204.2 499.0]/Border[0 0 0]/Dest[99 0 R/XYZ null 279 0]>>endobj
|
||||
47 0 obj<</Subtype/Link/Rect[72.0 459.6 82.7 472.6]/Border[0 0 0]/Dest[105 0 R/XYZ null 818 0]>>endobj
|
||||
48 0 obj<</Subtype/Link/Rect[82.7 459.6 124.2 472.6]/Border[0 0 0]/Dest[105 0 R/XYZ null 818 0]>>endobj
|
||||
49 0 obj<</Subtype/Link/Rect[108.0 446.4 126.9 459.4]/Border[0 0 0]/Dest[105 0 R/XYZ null 735 0]>>endobj
|
||||
50 0 obj<</Subtype/Link/Rect[126.9 446.4 155.0 459.4]/Border[0 0 0]/Dest[105 0 R/XYZ null 735 0]>>endobj
|
||||
51 0 obj<</Subtype/Link/Rect[108.0 433.2 126.9 446.2]/Border[0 0 0]/Dest[105 0 R/XYZ null 430 0]>>endobj
|
||||
52 0 obj<</Subtype/Link/Rect[126.9 433.2 172.8 446.2]/Border[0 0 0]/Dest[105 0 R/XYZ null 430 0]>>endobj
|
||||
53 0 obj[10 0 R
|
||||
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990521210323Z)/Title(DRAFT - CUPS Software Security Report)/Author(Easy Software Products)>>endobj
|
||||
2 0 obj<</Type/Encoding/BaseEncoding/WinAnsiEncoding>>endobj
|
||||
3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
|
||||
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding 2 0 R>>endobj
|
||||
5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Italic/Encoding 2 0 R>>endobj
|
||||
6 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding 2 0 R>>endobj
|
||||
7 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Bold/Encoding 2 0 R>>endobj
|
||||
8 0 obj<</Type/Font/Subtype/Type1/BaseFont/Symbol>>endobj
|
||||
9 0 obj<</Subtype/Link/Rect[72.0 673.2 80.2 686.2]/Border[0 0 0]/Dest[82 0 R/XYZ null 818 0]>>endobj
|
||||
10 0 obj<</Subtype/Link/Rect[80.2 673.2 107.8 686.2]/Border[0 0 0]/Dest[82 0 R/XYZ null 818 0]>>endobj
|
||||
11 0 obj<</Subtype/Link/Rect[108.0 660.0 124.5 673.0]/Border[0 0 0]/Dest[82 0 R/XYZ null 737 0]>>endobj
|
||||
12 0 obj<</Subtype/Link/Rect[124.5 660.0 183.8 673.0]/Border[0 0 0]/Dest[82 0 R/XYZ null 737 0]>>endobj
|
||||
13 0 obj<</Subtype/Link/Rect[108.0 646.8 124.5 659.8]/Border[0 0 0]/Dest[82 0 R/XYZ null 658 0]>>endobj
|
||||
14 0 obj<</Subtype/Link/Rect[124.5 646.8 159.6 659.8]/Border[0 0 0]/Dest[82 0 R/XYZ null 658 0]>>endobj
|
||||
15 0 obj<</Subtype/Link/Rect[159.6 646.8 203.0 659.8]/Border[0 0 0]/Dest[82 0 R/XYZ null 658 0]>>endobj
|
||||
16 0 obj<</Subtype/Link/Rect[108.0 633.6 124.5 646.6]/Border[0 0 0]/Dest[82 0 R/XYZ null 434 0]>>endobj
|
||||
17 0 obj<</Subtype/Link/Rect[124.5 633.6 173.1 646.6]/Border[0 0 0]/Dest[82 0 R/XYZ null 434 0]>>endobj
|
||||
18 0 obj<</Subtype/Link/Rect[173.1 633.6 216.4 646.6]/Border[0 0 0]/Dest[82 0 R/XYZ null 434 0]>>endobj
|
||||
19 0 obj<</Subtype/Link/Rect[72.0 607.2 80.2 620.2]/Border[0 0 0]/Dest[88 0 R/XYZ null 818 0]>>endobj
|
||||
20 0 obj<</Subtype/Link/Rect[80.2 607.2 131.6 620.2]/Border[0 0 0]/Dest[88 0 R/XYZ null 818 0]>>endobj
|
||||
21 0 obj<</Subtype/Link/Rect[108.0 594.0 124.5 607.0]/Border[0 0 0]/Dest[88 0 R/XYZ null 737 0]>>endobj
|
||||
22 0 obj<</Subtype/Link/Rect[124.5 594.0 154.8 607.0]/Border[0 0 0]/Dest[88 0 R/XYZ null 737 0]>>endobj
|
||||
23 0 obj<</Subtype/Link/Rect[154.8 594.0 222.6 607.0]/Border[0 0 0]/Dest[88 0 R/XYZ null 737 0]>>endobj
|
||||
24 0 obj<</Subtype/Link/Rect[108.0 580.8 124.5 593.8]/Border[0 0 0]/Dest[88 0 R/XYZ null 540 0]>>endobj
|
||||
25 0 obj<</Subtype/Link/Rect[124.5 580.8 152.3 593.8]/Border[0 0 0]/Dest[88 0 R/XYZ null 540 0]>>endobj
|
||||
26 0 obj<</Subtype/Link/Rect[152.3 580.8 202.4 593.8]/Border[0 0 0]/Dest[88 0 R/XYZ null 540 0]>>endobj
|
||||
27 0 obj<</Subtype/Link/Rect[72.0 554.4 80.2 567.4]/Border[0 0 0]/Dest[94 0 R/XYZ null 818 0]>>endobj
|
||||
28 0 obj<</Subtype/Link/Rect[80.2 554.4 104.4 567.4]/Border[0 0 0]/Dest[94 0 R/XYZ null 818 0]>>endobj
|
||||
29 0 obj<</Subtype/Link/Rect[104.4 554.4 168.0 567.4]/Border[0 0 0]/Dest[94 0 R/XYZ null 818 0]>>endobj
|
||||
30 0 obj<</Subtype/Link/Rect[108.0 541.2 124.5 554.2]/Border[0 0 0]/Dest[94 0 R/XYZ null 737 0]>>endobj
|
||||
31 0 obj<</Subtype/Link/Rect[124.5 541.2 152.3 554.2]/Border[0 0 0]/Dest[94 0 R/XYZ null 737 0]>>endobj
|
||||
32 0 obj<</Subtype/Link/Rect[152.3 541.2 186.2 554.2]/Border[0 0 0]/Dest[94 0 R/XYZ null 737 0]>>endobj
|
||||
33 0 obj<</Subtype/Link/Rect[186.2 541.2 210.7 554.2]/Border[0 0 0]/Dest[94 0 R/XYZ null 737 0]>>endobj
|
||||
34 0 obj<</Subtype/Link/Rect[108.0 528.0 124.5 541.0]/Border[0 0 0]/Dest[94 0 R/XYZ null 679 0]>>endobj
|
||||
35 0 obj<</Subtype/Link/Rect[124.5 528.0 161.5 541.0]/Border[0 0 0]/Dest[94 0 R/XYZ null 679 0]>>endobj
|
||||
36 0 obj<</Subtype/Link/Rect[161.5 528.0 195.4 541.0]/Border[0 0 0]/Dest[94 0 R/XYZ null 679 0]>>endobj
|
||||
37 0 obj<</Subtype/Link/Rect[195.4 528.0 219.8 541.0]/Border[0 0 0]/Dest[94 0 R/XYZ null 679 0]>>endobj
|
||||
38 0 obj<</Subtype/Link/Rect[72.0 501.6 80.2 514.6]/Border[0 0 0]/Dest[100 0 R/XYZ null 818 0]>>endobj
|
||||
39 0 obj<</Subtype/Link/Rect[80.2 501.6 104.4 514.6]/Border[0 0 0]/Dest[100 0 R/XYZ null 818 0]>>endobj
|
||||
40 0 obj<</Subtype/Link/Rect[104.4 501.6 158.2 514.6]/Border[0 0 0]/Dest[100 0 R/XYZ null 818 0]>>endobj
|
||||
41 0 obj<</Subtype/Link/Rect[108.0 488.4 124.5 501.4]/Border[0 0 0]/Dest[100 0 R/XYZ null 737 0]>>endobj
|
||||
42 0 obj<</Subtype/Link/Rect[124.5 488.4 152.3 501.4]/Border[0 0 0]/Dest[100 0 R/XYZ null 737 0]>>endobj
|
||||
43 0 obj<</Subtype/Link/Rect[152.3 488.4 186.2 501.4]/Border[0 0 0]/Dest[100 0 R/XYZ null 737 0]>>endobj
|
||||
44 0 obj<</Subtype/Link/Rect[186.2 488.4 210.7 501.4]/Border[0 0 0]/Dest[100 0 R/XYZ null 737 0]>>endobj
|
||||
45 0 obj<</Subtype/Link/Rect[108.0 475.2 124.5 488.2]/Border[0 0 0]/Dest[100 0 R/XYZ null 679 0]>>endobj
|
||||
46 0 obj<</Subtype/Link/Rect[124.5 475.2 161.5 488.2]/Border[0 0 0]/Dest[100 0 R/XYZ null 679 0]>>endobj
|
||||
47 0 obj<</Subtype/Link/Rect[161.5 475.2 195.4 488.2]/Border[0 0 0]/Dest[100 0 R/XYZ null 679 0]>>endobj
|
||||
48 0 obj<</Subtype/Link/Rect[195.4 475.2 219.8 488.2]/Border[0 0 0]/Dest[100 0 R/XYZ null 679 0]>>endobj
|
||||
49 0 obj<</Subtype/Link/Rect[72.0 448.8 82.7 461.8]/Border[0 0 0]/Dest[106 0 R/XYZ null 818 0]>>endobj
|
||||
50 0 obj<</Subtype/Link/Rect[82.7 448.8 124.2 461.8]/Border[0 0 0]/Dest[106 0 R/XYZ null 818 0]>>endobj
|
||||
51 0 obj<</Subtype/Link/Rect[108.0 435.6 126.9 448.6]/Border[0 0 0]/Dest[106 0 R/XYZ null 737 0]>>endobj
|
||||
52 0 obj<</Subtype/Link/Rect[126.9 435.6 155.0 448.6]/Border[0 0 0]/Dest[106 0 R/XYZ null 737 0]>>endobj
|
||||
53 0 obj<</Subtype/Link/Rect[108.0 422.4 126.9 435.4]/Border[0 0 0]/Dest[106 0 R/XYZ null 434 0]>>endobj
|
||||
54 0 obj<</Subtype/Link/Rect[126.9 422.4 172.8 435.4]/Border[0 0 0]/Dest[106 0 R/XYZ null 434 0]>>endobj
|
||||
55 0 obj[9 0 R
|
||||
10 0 R
|
||||
11 0 R
|
||||
12 0 R
|
||||
13 0 R
|
||||
@@ -95,332 +98,356 @@
|
||||
50 0 R
|
||||
51 0 R
|
||||
52 0 R
|
||||
53 0 R
|
||||
54 0 R
|
||||
]endobj
|
||||
54 0 obj<</Dests 55 0 R>>endobj
|
||||
55 0 obj<</Kids[56 0 R]>>endobj
|
||||
56 0 obj<</Limits[(1)(ssr.shtml)]/Names[(1)57 0 R(1_1)58 0 R(1_2)59 0 R(1_3)60 0 R(2)61 0 R(2_1)62 0 R(2_2)63 0 R(3)64 0 R(3_1)65 0 R(4)66 0 R(4_1)67 0 R(4_2)68 0 R(5)69 0 R(5_1)70 0 R(5_2)71 0 R(cups-large.gif)72 0 R(ssr.shtml)73 0 R]>>endobj
|
||||
57 0 obj<</D[81 0 R/XYZ null 818 null]>>endobj
|
||||
58 0 obj<</D[81 0 R/XYZ null 735 null]>>endobj
|
||||
59 0 obj<</D[81 0 R/XYZ null 654 null]>>endobj
|
||||
60 0 obj<</D[81 0 R/XYZ null 429 null]>>endobj
|
||||
61 0 obj<</D[87 0 R/XYZ null 818 null]>>endobj
|
||||
62 0 obj<</D[87 0 R/XYZ null 735 null]>>endobj
|
||||
63 0 obj<</D[87 0 R/XYZ null 535 null]>>endobj
|
||||
64 0 obj<</D[93 0 R/XYZ null 818 null]>>endobj
|
||||
65 0 obj<</D[93 0 R/XYZ null 702 null]>>endobj
|
||||
66 0 obj<</D[99 0 R/XYZ null 818 null]>>endobj
|
||||
67 0 obj<</D[99 0 R/XYZ null 715 null]>>endobj
|
||||
68 0 obj<</D[99 0 R/XYZ null 279 null]>>endobj
|
||||
69 0 obj<</D[105 0 R/XYZ null 818 null]>>endobj
|
||||
70 0 obj<</D[105 0 R/XYZ null 735 null]>>endobj
|
||||
71 0 obj<</D[105 0 R/XYZ null 430 null]>>endobj
|
||||
72 0 obj<</D[81 0 R/XYZ null 698 null]>>endobj
|
||||
73 0 obj<</D[81 0 R/XYZ null 698 null]>>endobj
|
||||
74 0 obj<</Type/Pages/MediaBox[0 0 595 792]/Count 14/Kids[75 0 R
|
||||
78 0 R
|
||||
111 0 R
|
||||
114 0 R
|
||||
81 0 R
|
||||
84 0 R
|
||||
87 0 R
|
||||
90 0 R
|
||||
93 0 R
|
||||
96 0 R
|
||||
99 0 R
|
||||
102 0 R
|
||||
105 0 R
|
||||
108 0 R
|
||||
56 0 obj<</Dests 57 0 R>>endobj
|
||||
57 0 obj<</Kids[58 0 R]>>endobj
|
||||
58 0 obj<</Limits[(1)(5_2)]/Names[(1)59 0 R(1_1)60 0 R(1_2)61 0 R(1_3)62 0 R(2)63 0 R(2_1)64 0 R(2_2)65 0 R(3)66 0 R(3_1)67 0 R(3_2)68 0 R(4)69 0 R(4_1)70 0 R(4_2)71 0 R(5)72 0 R(5_1)73 0 R(5_2)74 0 R]>>endobj
|
||||
59 0 obj<</D[82 0 R/XYZ null 818 null]>>endobj
|
||||
60 0 obj<</D[82 0 R/XYZ null 737 null]>>endobj
|
||||
61 0 obj<</D[82 0 R/XYZ null 658 null]>>endobj
|
||||
62 0 obj<</D[82 0 R/XYZ null 434 null]>>endobj
|
||||
63 0 obj<</D[88 0 R/XYZ null 818 null]>>endobj
|
||||
64 0 obj<</D[88 0 R/XYZ null 737 null]>>endobj
|
||||
65 0 obj<</D[88 0 R/XYZ null 540 null]>>endobj
|
||||
66 0 obj<</D[94 0 R/XYZ null 818 null]>>endobj
|
||||
67 0 obj<</D[94 0 R/XYZ null 737 null]>>endobj
|
||||
68 0 obj<</D[94 0 R/XYZ null 679 null]>>endobj
|
||||
69 0 obj<</D[100 0 R/XYZ null 818 null]>>endobj
|
||||
70 0 obj<</D[100 0 R/XYZ null 737 null]>>endobj
|
||||
71 0 obj<</D[100 0 R/XYZ null 679 null]>>endobj
|
||||
72 0 obj<</D[106 0 R/XYZ null 818 null]>>endobj
|
||||
73 0 obj<</D[106 0 R/XYZ null 737 null]>>endobj
|
||||
74 0 obj<</D[106 0 R/XYZ null 434 null]>>endobj
|
||||
75 0 obj<</Type/Pages/MediaBox[0 0 595 792]/Count 14/Kids[76 0 R
|
||||
79 0 R
|
||||
112 0 R
|
||||
115 0 R
|
||||
82 0 R
|
||||
85 0 R
|
||||
88 0 R
|
||||
91 0 R
|
||||
94 0 R
|
||||
97 0 R
|
||||
100 0 R
|
||||
103 0 R
|
||||
106 0 R
|
||||
109 0 R
|
||||
]>>endobj
|
||||
75 0 obj<</Type/Page/Parent 74 0 R/Contents 76 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
|
||||
76 0 obj<</Length 77 0 R/Filter/FlateDecode>>stream
|
||||
xÚMŽ;Â0D{ŸbJ�°É&&Á%ßbs | ||||